fuyu-fuyu
@fuyu-fuyu (ゆ ふ)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

基礎100本ノック演習  57

解決したいこと

まず受験者数を入力させ、次に受験者数ごとに英語、数学、国語の点数をスペースで区切って入力させる(具体的な入力方法は下記のscanfの使い方の説明、および入力データの中身を見よ)。入力が終了したら、英語、数学、国語の平均点、および各受験生の合計点を計算して表示するプログラムを作成せよ。受験者数は100人までとする。なお、データの個数とデータはファイルからリダイレクトで入力させればよいので、入力のためのメッセージは不要である(実行例を参照すること)。
今回もC#のWindowsフォームアプリケーションで作成したいです。ボタン1をクリックした際に、実行例のように各教科の平均点と個人の合計点数を表示できるようにしたいです。
各教科の平均を出すはどのように、配列に落とし込む方法がありますか?

実行例

【実行例、データファイルは下のリンクから取得せよ】
$ ./knock57 < examSmall.data
平均点 英語:46, 数学:51, 国語:55
個人合計点
0: 141
1: 114
(途中省略)
8: 96
9: 188
$ ./knock57 < examMiddle.data
平均点 英語:55, 数学:53, 国語:54
個人合計点
0: 136
1: 64
(途中省略)
48: 265
49: 167
$ ./knock57 < examLarge.data
平均点 英語:52, 数学:51, 国語:51
個人合計点
0: 151
1: 241
(途中省略)
98: 107
99: 178
$

該当するソースコード

OpenFileDialog ofDialog = new OpenFileDialog();
if(ofDialog.ShowDialog() == DialogResult.OK)
{
  MessageBox.Show(ofDialog.FileName);
  FileStream fs;
  fs = new FileStream(ofDialog.FileName.FileMode.Open);
  StreamReader r = new StreamReader(fs);
}
0

1Answer

自由に要素を追加できるリストのほうがおすすめですが、配列で実装すると以下のようになると思います。
各教科の平均は各教科の合計点をデータ数で割るだけでよいので配列は利用していません。
あとで各受験生の合計点を出すために配列を利用しました。

//1行目のデータ数を取得
var dataNum = int.Parse(r.ReadLine());

//各教科の点数を保持する変数
var english = 0;
var math = 0;
var japanese = 0;

//各受験生の合計点を保持する変数
var totalScore = new int[dataNum];

string s;
var cnt = 0;
while ((s = r.ReadLine()) != null)
{
    //スペース区切りの点数を分割
    var examScore = s.Split();

    english += int.Parse(examScore[0]);
    math += int.Parse(examScore[1]);
    japanese += int.Parse(examScore[2]);

    totalScore[cnt] = int.Parse(examScore[0]) + int.Parse(examScore[1]) + int.Parse(examScore[2]);

    cnt++;
}

var sr = new StringBuilder();
sr.AppendLine(string.Format("平均点 英語:{0}, 数学:{1}, 国語:{2}", (english / dataNum).ToString(), (math / dataNum).ToString(), (japanese / dataNum).ToString()));
sr.AppendLine("個人合計点");

for (int i = 0; i < dataNum; i++)
{
    sr.AppendLine(string.Format("{0}: {1}", i, totalScore[i]));
}

MessageBox.Show(sr.ToString());

image.png

0Like

Your answer might help someone💌