- ベストアンサー
C言語のプログラムについて質問です。
C言語のプログラムについて伺いたいことがあるんですが5人くらいの名前、数学、英語、国語の点数を入力して各教科の最高点、最低点、平均点、それぞれの数+英+国の合計点を表示するプログラムを構造体を使って作りたいと思っています。 もしよろしければ事細かに教えていただけないでしょうか。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ソースを載せます ============ ソースはここから ======================== // Seiseki.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" // 人数を定義します #define STUDENT_COUNT 5 // 成績を格納する領域です // 構造体配列でも作れますが、教科を通じての合計を取るのであれば // 2次元配列のほうが適しています #define SUBJECT_COUNT 3 // 強化の数 // 各教科のインデックス #define MATHEMATICS 0 // 数学 #define ENGLISH 1 // 英語 #define JAPANEASE 2 // 国語 // データ格納域 // 2次元配列です // 1次元目で生徒を識別します // 2次元目で科目を識別します static int SCORE[STUDENT_COUNT][SUBJECT_COUNT]; // 指定教科の最高点を求めます // 成績は既にSCOREに格納済みとします static int GetHighScore(int SubJect) { int i; // 生徒用 // 最初の生徒の成績を基準とし // それを超えたら最高得点(仮)を更新します // 全生徒分チェックし終わった時点の最高得点(仮) // が真の最高得点です int n = SCORE[0][SubJect]; // 仮の最高得点 // 先頭の生徒の得点はチェックしたので // 2番目以降をチェックします for (i = 1; i < STUDENT_COUNT; ++i) { if (SCORE[i][SubJect] > n) { n = SCORE[i][SubJect]; } } return n; } // 指定教科の最低点を求めます // 成績は既にSCOREに格納済みとします static int GetLowScore(int SubJect) { int i; // 生徒用 // 最初の生徒の成績を基準とし // それを超えたら最低得点(仮)を更新します // 全生徒分チェックし終わった時点の最低得点(仮) // が真の最高得点です int n = SCORE[0][SubJect]; // 仮の最低得点 // 先頭の生徒の得点はチェックしたので // 2番目以降をチェックします for (i = 1; i < STUDENT_COUNT; ++i) { if (SCORE[i][SubJect] < n) { n = SCORE[i][SubJect]; } } return n; } // 指定教科の平均点を求めます // 成績は既にSCOREに格納済みとします // 小数点以下も戻したいのでdoubleとします static double GetAve(int SubJect) { int i; // 生徒用 int s = 0; // 合計用 // 合計を算出します for (i = 0; i < STUDENT_COUNT; ++i) { s += SCORE[i][SubJect]; } // 平均点を戻します // 分母に1.0を掛けているのは、浮動小数点演算を行わせるためです // s / STUDENT_COUNTだと小数点以下は切り捨てられます // (例え戻り値がdoubleでもです) return s / (STUDENT_COUNT * 1.0); } // 個人の合計得点を算出します static int GetPersonalTotal(int Student) { int s = 0; // 合計用 int i; // 合計を算出します for (i = 0; i < SUBJECT_COUNT; ++i) { s += SCORE[Student][i]; } return s; } int main(int argc, _TCHAR* argv[]) { int i; // 成績を入力させます for (i = 0; i < STUDENT_COUNT; ++i) { printf("%d番目の生徒の数学の成績を入力してください : ", i + 1); scanf("%d", &SCORE[i][MATHEMATICS]); printf("%d番目の英語の成績を入力してください : ", i + 1); scanf("%d", &SCORE[i][ENGLISH]); printf("%d番目の国語の成績を入力してください : ", i + 1); scanf("%d", &SCORE[i][JAPANEASE]); } // 結果を表示します printf("数学成績(最高, 最低, 平均) = %d, %d, %.1f\n", GetHighScore(MATHEMATICS), GetLowScore(MATHEMATICS), GetAve(MATHEMATICS)); printf("英語成績(最高, 最低, 平均) = %d, %d, %.1f\n", GetHighScore(ENGLISH), GetLowScore(ENGLISH), GetAve(ENGLISH)); printf("国語成績(最高, 最低, 平均) = %d, %d, %.1f\n", GetHighScore(JAPANEASE), GetLowScore(JAPANEASE), GetAve(JAPANEASE)); for (i = 0; i < STUDENT_COUNT; ++i) { printf("%d番目の生徒の総得点 : %d\n", i + 1, GetPersonalTotal(i)); } return 0; } ======================= ソースはここまで ========================== わかりやすさを重視して書きました。 その為、プログラムは処理速度的にも、行数的にも 非効率になっています。 ご了承ください。 詳細は、ソースのコメントを参照してください 生徒数を5人から変更したい場合は #define STUDENT_COUNT 5 を修正してください (ex. #define STUDENT_COUNT 10 で10人) 以上です
その他の回答 (3)
- BLK314
- ベストアンサー率55% (84/152)
No.3です。 お恥ずかしいことです。 コメントに誤記があります #define SUBJECT_COUNT 3 // 強化の数 は #define SUBJECT_COUNT 3 // 教科の数 の誤りです。 ごめんなさい
- jacta
- ベストアンサー率26% (845/3158)
> 5人くらい 5人ではなく「5人くらい」とのことですが、これは具体的にはどうしたいのでしょうか?
- asuncion
- ベストアンサー率33% (2127/6289)
その問題を解くために、ご自分で書かれたソースコードを見せてください。 途中まででもかまいません。
補足
まだ途中で構造体についてすごい微妙なのであってるかどうかわからないのですがまだほとんど初めのほうだけしか書いていませんが #include <stdio.h> struct stdent { char name[15]; int jpn; int eng; int math; }; struct stdent getData(void); struct stdent addData(struct stdent, struct stdent, struct stdent); struct stdent aveData(struct stdent, struct stdent, struct stdent); //void printData(struct stdent, struct stdent); main() { struct stdent []Ver; struct stdent answer1, answer2; int i; for(i = 0; i < 5; i++){ [i]Ver = getData(); } answer1 = addData([i]Ver); answer2 = aveData([i]Ver); return 0; } struct stdent getData(void) { scanf("%d", &inputVer.num); printf("Name? "); scanf("%s" inputVer.name); printf("Japanese? "); scanf("%d", &inputVer.jpn); printf("English? "); scanf("%d", &inputVer.eng); printf("Math? "); scanf("%d", &inputVer.math); return(inputVer); } ここまではとりあえずこうかなと思って書いてみました。 どうでしょうか?
お礼
ありがとうございます。とてもわかりやすかったです。