• ベストアンサー

C言語のプログラムについて質問です。

C言語のプログラムについて伺いたいことがあるんですが5人くらいの名前、数学、英語、国語の点数を入力して各教科の最高点、最低点、平均点、それぞれの数+英+国の合計点を表示するプログラムを構造体を使って作りたいと思っています。 もしよろしければ事細かに教えていただけないでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.3

ソースを載せます ============ ソースはここから ======================== // 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人) 以上です

takoppachi
質問者

お礼

ありがとうございます。とてもわかりやすかったです。

その他の回答 (3)

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.4

No.3です。 お恥ずかしいことです。 コメントに誤記があります #define SUBJECT_COUNT 3 // 強化の数 は #define SUBJECT_COUNT 3 // 教科の数 の誤りです。 ごめんなさい

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 5人くらい 5人ではなく「5人くらい」とのことですが、これは具体的にはどうしたいのでしょうか?

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

その問題を解くために、ご自分で書かれたソースコードを見せてください。 途中まででもかまいません。

takoppachi
質問者

補足

まだ途中で構造体についてすごい微妙なのであってるかどうかわからないのですがまだほとんど初めのほうだけしか書いていませんが #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); } ここまではとりあえずこうかなと思って書いてみました。 どうでしょうか?

関連するQ&A

  • C言語の課題について

    データファイル(txtファイル) に生徒30人分の出席番号、数学 、英語の点数が入っていて、数 学と英語の点数は0点から100点 (整数)です。 このデータを元にして ・構造体型配列に出席番号、数 学、英語の点数を格納する ・国語の得点を70点から100点間 での整数の一様乱数によって格 納する ・各学生の平均点、偏差値を求 める ・偏差値が最もよい学生の出席 番号、数学、英語、国語の得点 、平均点、偏差値と合計点が181 点から210点、211点から240点 、241点から270点、271点から3 00点の学生の人数を数えてその 度数分布をtxtファイルへと出力 する 条件 ・平均点、偏差値を求める箇所 はmain関数から独立させる。 ・国語を入れるときに使用する 乱数は出席番号下4桁により初期 化したものを使うこと。頭の0は 除く(例120012-3→123) ・配列を因数とする関数は使用 可能 ・度数分布を作る際は、if文を使 用しないこと ・合計点が181~300点に含まれ ることは既知である ・txtファイルへの出力は以下の ようにすること。 High score: No. | math: , Eng , Jap | Ave: , D ev 181-200(10): ********** 211-240(17):**************** このような課題が出されたのですが、どのような順序でプログラムを書いていけばいいかが分かりません なのでどのような順序でプログラムを書いていけばいいか教えて下さい

  • ソースプログラム!!

    ある点数(1~100)を入力して、その合計点を求めるプログラムを作っています。 ・入力する国語の点数の範囲を調べる   正しい範囲 0~100点まで   誤り    上記以外の点 ・正しい範囲なら、合計点をもとめる操作  誤りなら誤り文を表示して、その点数を省く操作 が基本で、プラス ・正しい点数を入力した人数を数え上げる ・5人分の繰り返しを終了したら正しい点数の合計点と人数を使って平均点を求める ・合計点と平均点を並べて表示する。正しい点数の人数も表示する(項目名をつけて) さらに、 ・上記5名の中から最高点と最低点を求める ・求めた最高点と最低点を表示する というものなのですが、基本でここまでできています。 どなたか、上の機能を作って完成させていただけるか、 やり方を教えていただけませんか main() { int kokugo,cnt,t_kokugo; t_kokugo=0; for(cnt=1;cnt<=5;cnt++) { printf("国語の点数="); scanf("%d",&kokugo); t_kokugo=t_kokugo+kokugo; } printf("国語合計点=%d\n",t_kokugo);

  • どうしても作れないプログラムがあります。

    仕様としては 学生の名前と国語、英語の成績を5人分キーボードから入力するプログラムで国語、英語、合計点それぞれの観点で、最高点の学生の名前と成績(国語、英語、合計点)を表示させたいです。 該当者が複数いた場合は、任意の1人でかまいません。 なお、学生1人分のデータは構造体として表現し、名前は63byte(¥0 含まず)以下で表現できるもので、各教科の成績は0~100 点の整数で表現できるものでお願いします。 ※使用言語はC言語です。 よろしくお願いします。

  • 点数の高い順に表示するプログラムについて

    C言語に関する質問です。      英語  数学  国語 田中   50   70   50 佐藤   60   60   80 吉田   70   40   60 以上のような外部ファイルがあります。 これをscanfで取得した後、 ・3人の3教科の合計点を計算する ・3教科の点数の高い順に表示する の作業を行うプログラムを組みたいのですが、どのように記述すればよいでしょうか? 迅速な回答をお願いします。

  • C言語プログラムの作成方法がわかりません

    キーボードから5人の点数を入力すると平均点を表示するようにし、平均点以上の学生の点数を表示させるC言語のプログラムの作成方法を教えてください

  • -1を使う???

     私は今C言語の学習をしています。しかし以下の問いのプログラムがなかなか出来ません・・・。どうか助けてください。お願いしますm(__)m 【問】while文とif文を使う問題 (1)キーボードから各教科のテストの点数を入力し、その合計と平均点を出力しなさい。ただし、入力データの終わりには-1を使うようにして、何科目でも対応できるようにすること。 (2)(1)と同様にキーボードから各教科のテストの点数を入力し、80~100までは優、65~79までは良、50~64までは可、0~49までは不可とし、それぞれの各科目数を出力しなさい。 (3)(1)と同様にキーボードから各教科のテストの点数を入力し、最高点と最低点を出力しなさい。 私は(1)に対してまず、科目数が決められている場合の合計と平均を求めるプログラムを作りました。 そのあと、それを何科目でも対応できるようにfor文を使い書き換えました。 そしてif文をつかって-1が入力されたら、breakとしました。しかしそれではwhile文をまったく使っていないのです・・・。どうしたらいいのでしょう? 何科目にでも対応させるというのは・・・?

  • 構造体と関数について質問です

    私はC言語の勉強を始めて2ヶ月の初心者です。 課題に取り組んでいるのですが、まったく進めないので助けていただきたいと思い質問しました。 課題 A君B君C君の3人の国語・算数・理科・社会の点数を入力し、それぞれの合計点と平均点、1番高かった教科を表示する。 というものです。 構造体はstruct subjectData member[3]で 関数は入力をする関数と合計点を出す関数平均点を出す関数最高点を出す関数を使ってということなんですが、まったくわからなく手がつけられないもので、質問させていただきました。 参照渡しを使えということも言われ、参考書をみて戦っているんですがどうも理解ができません。 解説とソースを載せていただけたら助かります。 どなたかよろしくお願いします!

  • tiny basicでプログラム作成

    次の問題のプログラムをtiny basicで作成してみてくだい。 理科、数学、国語、音楽、体育の点数を読み込み、5科目の平均点を計算し、平均点が60点以上で合格、60点以下なら不合格と表示するプログラムをつくりなさい。 各科目の点数は、理科50点、数学80点、国語40点、音楽60点、体育64点とする。

  • C言語を使った~

    今日、九州工業大学でC言語を初めて使いました。 内容は、計算などがメインです。 例えば、 『国語、数学、英語の3教科の平均点を出せるようにし、  60点以下の場合は不合格と判別させるようにしなさい』 といったものです。 クラスではPCが得意なので大学生から指導内容外(switch文など)も習い、C言語に少し慣れました。 大学に入るとC言語は大切だと知ったので家でも身につけたいと思ったのですが、 何を使ったらいいのか 何を開けばいいのか などがわかりません。 なぜなら、大学ではLINUXを使っていたからです。 そもそもWindowsでもC言語を使ってあれこれできるのでしょうか。 上で述べた疑問、 大学ではC言語のどこを知っておくといいのかなどのご指導願います。

  • C言語のプログラムについて

    ファイル"data\d.dat"にはテストの各問の点数が以下のフォーマットで記録されている。     学生番号  問1の点数  問2の点数  問3の点数  問4の点数  問5の点数 これを入力し、学生ごとの合計点と、間ごと合計点を求めて表示する(整列前)。次に、間の合計点の 降順に左から右に向かって整列し、さらに、学生の合計点で降順に整列して表示する(整列後)。 <実行例> 整列前 番号  問1  問2  問3  問4  問5  合計 1001  20   30   40   41   90   230 1002  50   30   24    0   95   199 1003  20   33   55   35   90   233 1004  93   55   56   61   90   355 1005  20   50   51   44   90   255 合計 203  198   236   181  455 整列後 番号  問5  問3  問1  問2  問4  合計 1004  90   56   93   55   61   355 1005  90   51   20   50   44   255 1003  90   55   20   33   35   233 1001  90   49   20   30   41   230 1002  95   25   50   30    0   199 合計 455   236  203  198   181 このプログラムを作成したいのですが fscanfでdata-d.datを読み込み横に合計を表示させるのはわかりました。 しかし、縦の合計もだし、その結果から整列して表示させることができずに 困っています。分かるかた教えてください><

専門家に質問してみよう