質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

1回答

1556閲覧

C言語で構造体と関数を使用して単位の合計とGPAを計算するプログラムを作成したい

Ktsu

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/12/28 16:59

前提・実現したいこと

C言語(visual studio)で簡易的な単位の合計とGPAを出力するプログラムを作成したいです。
単位の合計を計算する関数とGPAを計算する関数を作成し、mainにtotal(単位の合計)とave(GPA)を渡したいのですが現状ではmainにこの2つの関数を入れると以降の動作が行われなくなります。
ここに質問の内容を詳しく書いてください。

(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

1>C:\Users\2123119\Downloads\あああああ\ああああああ2\DUT13-06 70\DUT13-06 70.c(30,20): warning C4047: '関数': 間接参照のレベルが 'int **' と 'int *' で異なっています。
1>C:\Users\2123119\Downloads\あああああ\ああああああ2\DUT13-06 70\DUT13-06 70.c(30,14): warning C4024: 'Tocre': の型が 2 の仮引数および実引数と異なります。
1>C:\Users\2123119\Downloads\あああああ\ああああああ2\DUT13-06 70\DUT13-06 70.c(31,18): warning C4047: '関数': 間接参照のレベルが 'double **' と 'double *' で異なっています。
1>C:\Users\2123119\Downloads\あああああ\ああああああ2\DUT13-06 70\DUT13-06 70.c(31,14): warning C4024: 'Toeva': の型が 2 の仮引数および実引数と異なります。

エラーメッセージ

該当のソースコード

ソースコード #include <stdio.h> typedef struct Grades { char name[81]; char number; int Detocr;//申告総単位数 int credit[5]; double evaS; double evaA; double evaB; double evaC; double eva0;//単位を取得できない評価 double evaN; }Gr; int enterdata(Gr data[5]); int Tocre(Gr data[], int *total[]); double Toeva(Gr data[], double *ave[]); int main() { Gr data[5]; int loop, total; double ave; enterdata(data); Tocre(data, &total); Toeva(data, &ave); for (loop = 0; loop < 5; loop++) { printf("~学籍番号:%d 名前:%sさんの成績~\n", data[loop].number ,data[loop].name); printf("申告総単位数は%dでした\n", data[loop].Detocr); printf("今期に取得することができた単位数は%d単位でした\n", total[loop]); printf("今期のGPAは%lfでした\n", ave[loop]); } return 0; } int enterdata( Gr data[5]) { int loop, loop2; for (loop = 0; loop < 1; loop++) { printf("%d人目", loop + 1); printf("名前:"); scanf("%s", &data[loop].name); printf("学籍番号:"); scanf("%hhd", &data[loop].number); printf("申告総単位数:"); scanf("%d", &data[loop].Detocr); printf("それぞれの単位数の総数を入力してください\n"); for (loop2 = 0; loop2 < 5; loop2++) { if (loop2 == 4) { printf("単位%d:", loop2+2); scanf("%d", &data[loop].credit[loop2]); } else { printf("単位%d:", loop2 + 1); scanf("%d", &data[loop].credit[loop2]); } } printf("評価基準のアルファベットがそれぞれいくつあるかを入力してください\n"); printf("評価S:"); scanf("%lf", &data[loop].evaS); printf("評価A:"); scanf("%lf", &data[loop].evaA); printf("評価B:"); scanf("%lf", &data[loop].evaB); printf("評価C:"); scanf("%lf", &data[loop].evaC); printf("評価0:"); scanf("%lf", &data[loop].eva0); printf("評価N:"); scanf("%lf", &data[loop].evaN); } return 0; } int Tocre(Gr data[], int *total[]){ int loop0, loop, loop2; for (loop0 = 0; loop0 < 5; loop0++) { *total[loop0] = 0; } for (loop = 0; loop < 1; loop++) { for (loop2 = 0; loop2 < 5; loop2++) { *total[loop] = *total[loop] + data[loop].credit[loop2]; } } return 0; } double Toeva(Gr data[], double *ave[]) { int loop; for (loop = 0; loop < 5; loop++) { *ave[loop] =*ave[loop] + (data[loop].evaS * 4) + (data[loop].evaA * 3) + (data[loop].evaB * 2) + (data[loop].evaC * 1); *ave[loop] = *ave[loop] / data[loop].Detocr; } return 0; }

試したこと

どこで止まるかの確認。ネット検索。
ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/12/28 17:56 編集

ご質問は編集できますので、エラーメッセージは、ソースコードと同じように表示されるよう(「エラーメッセージ」という文字列を置き換える形で)ご提示ください。
jimbe

2021/12/28 18:06

> 試したこと > どこで止まるかの確認。ネット検索。 で、結果何が分かったのでしょうか。
dodox86

2021/12/29 04:25

> プログラムを作成したい > mainにこの2つの関数を入れると以降の動作が行われなくなります。 > 発生している問題・エラーメッセージ 1>C:\Users\2123119\Downloads\あああああ\ああああああ2\DUT13-06 70\DUT13- ... 結局、質問は何なのでしょう。
guest

回答1

0

int型の配列なのかint型なのかごちゃごちゃになっているところがあります。
main関数内でavetotalはint型の変数として定義していますが、for文内では配列として使用しています。
おそらく配列として使いたいのだと思うので、配列として定義し直して、dataと同じ渡し方にするといいと思います。
関数の引数の書き方も変わってくると思います。

とりあえずコンパイル通るようにしておいたコードを貼っておきます。(内容は確認していません)

#include <stdio.h> typedef struct Grades { char name[81]; char number; int Detocr;//申告総単位数 int credit[5]; double evaS; double evaA; double evaB; double evaC; double eva0;//単位を取得できない評価 double evaN; }Gr; int enterdata(Gr data[5]); // int Tocre(Gr data[], int *total[]); // double Toeva(Gr data[], double *ave[]); int Tocre(Gr data[], int *total); double Toeva(Gr data[], double *ave); int main() { Gr data[5]; // int loop, total; int loop, total[10]; // double ave; double ave[10]; enterdata(data); // Tocre(data, &total); // Toeva(data, &ave); Tocre(data, total); Toeva(data, ave); for (loop = 0; loop < 5; loop++) { printf("~学籍番号:%d 名前:%sさんの成績~\n", data[loop].number ,data[loop].name); printf("申告総単位数は%dでした\n", data[loop].Detocr); printf("今期に取得することができた単位数は%d単位でした\n", total[loop]); printf("今期のGPAは%lfでした\n", ave[loop]); } return 0; } int enterdata( Gr data[5]) { int loop, loop2; for (loop = 0; loop < 1; loop++) { printf("%d人目", loop + 1); printf("名前:"); scanf("%s", data[loop].name); printf("学籍番号:"); scanf("%s", data[loop].number); printf("申告総単位数:"); scanf("%d", &data[loop].Detocr); printf("それぞれの単位数の総数を入力してください\n"); for (loop2 = 0; loop2 < 5; loop2++) { if (loop2 == 4) { printf("単位%d:", loop2+2); scanf("%d", &data[loop].credit[loop2]); } else { printf("単位%d:", loop2 + 1); scanf("%d", &data[loop].credit[loop2]); } } printf("評価基準のアルファベットがそれぞれいくつあるかを入力してください\n"); printf("評価S:"); scanf("%lf", &data[loop].evaS); printf("評価A:"); scanf("%lf", &data[loop].evaA); printf("評価B:"); scanf("%lf", &data[loop].evaB); printf("評価C:"); scanf("%lf", &data[loop].evaC); printf("評価0:"); scanf("%lf", &data[loop].eva0); printf("評価N:"); scanf("%lf", &data[loop].evaN); } return 0; } // int Tocre(Gr data[], int *total[]){ int Tocre(Gr data[], int *total){ int loop0, loop, loop2; for (loop0 = 0; loop0 < 5; loop0++) { // *total[loop0] = 0; total[loop0] = 0; } for (loop = 0; loop < 1; loop++) { for (loop2 = 0; loop2 < 5; loop2++) { // *total[loop] = *total[loop] + data[loop].credit[loop2]; total[loop] = total[loop] + data[loop].credit[loop2]; } } return 0; } // double Toeva(Gr data[], double *ave[]) { double Toeva(Gr data[], double *ave) { int loop; for (loop = 0; loop < 5; loop++) { // *ave[loop] =*ave[loop] + (data[loop].evaS * 4) + (data[loop].evaA * 3) + (data[loop].evaB * 2) + (data[loop].evaC * 1); // *ave[loop] = *ave[loop] / data[loop].Detocr; ave[loop] = ave[loop] + (data[loop].evaS * 4) + (data[loop].evaA * 3) + (data[loop].evaB * 2) + (data[loop].evaC * 1); ave[loop] = ave[loop] / data[loop].Detocr; } return 0; }

投稿2021/12/28 18:50

編集2021/12/29 06:17
kyokio

総合スコア560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/12/29 04:47

> scanf("%s", &data[loop].name); も直されたほうが良いのでは。
kyokio

2021/12/29 06:17

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問