プロが教えるわが家の防犯対策術!

5人の学生の成績を,構造体Scoreの配列に 保存するプログラムを作成します.
・main関数で各学生の合計点,合計が最高の学生
・calcAvg関数で英語,数学,物理の平均点 を求めていきます.

ここまでやったのですが、出力するとファイルが開けませんと出てきてしまいます。
どこが違うか教えていただけないでしょうか。
#include<stdio.h>
#include<stdlib.h>

typedef struct
{
char name[32];
int english;
int math;
int physics;
}Score;

void calcavg(Score *p)
{
double eng_avg = 0;
double mat_avg = 0;
double phy_avg = 0;

int i;

for (i = 0; i < 5; i++) {
eng_avg += (p + i)->english;
mat_avg += (p + i)->math;
phy_avg += (p + i)->physics;
}
printf("5人の英語の平均点は%.1fです\n", eng_avg / 5);
printf("5人の数学の平均点は%.1fです\n", mat_avg / 5);
printf("5人の物理の平均点は%.1fです\n", phy_avg / 5);
}

int main(void)
{
int i;
Score s[5];
FILE *fp = fopen("scores.txt", "rt");
if (!fp) {
printf("ファイルが開けません");
exit(0);
}
for (i = 0; i < 5; i++)
fscanf(fp,"%s %d %d %d", s->name, &s->english, &s->math, &s->physics);

for (i = 0; i < 5; i++)
printf("%sさんの英語の点は%d,数学の点は%d,物理の点は%dです\n", s->name, s->english, s->math, s->physics);

int highest = 0;
int max_total = 0;
for (i = 0; i < 5; i++) {
int total = max_total + s[i].english + s[i].math + s[i].physics;
printf("%sさんの合計点は%dです\n", s[i].name, total);
if (highest < total)
highest = i;
}
printf("最も成績がよい学生は%sさんです\n", s[highest].name);

calcavg(s);
fclose(fp);
return 0;
}

質問者からの補足コメント

  • "r"でもファイルが開けませんとでてしまいました

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/05/25 19:12
  • つらい・・・

    ファイルの部分はもともと示されており、そこは動かせないのであっていると思います。
    なのにできないのです

    No.3の回答に寄せられた補足コメントです。 補足日時:2020/05/25 23:38

A 回答 (3件)

ファイルオープンの処理は問題ありません。


どうしても開けない場合はファイルを絶対パス指定にするとか
例えば、Cドライブ直下なら
FILE *fp = fopen("C:\\score.txt", "rt");
のように。

fscanfの処理に誤りがあります。正しく取り込みできません。
3教科の合計点の計算と、合計が最高の学生の更新がうまくいっていないですね。
(highestとmax_totalの更新が正しくできていない)

ファイルオープン後~calcavg()呼び出し前を以下のようにすれば、当方の環境では動作確認できています。

for (i = 0; i < 5; i++)
fscanf(fp, "%s %d %d %d", s[i].name, &s[i].english, &s[i].math, &s[i].physics);

for (i = 0; i < 5; i++)
printf("%sさんの英語の点は%d,数学の点は%d,物理の点は%dです\n", s[i].name, s[i].english, s[i].math, s[i].physics);

int highest = 0;
int max_total = 0;
for (i = 0; i < 5; i++) {
int total = s[i].english + s[i].math + s[i].physics;
printf("%sさんの合計点は%dです\n", s[i].name, total);
if (max_total < total) {
max_total = total;
highest = i;
}
}
printf("最も成績がよい学生は%sさんです\n", s[highest].name);
    • good
    • 0

scores.txt


とかいうファイルが「しかるべきところ」になければそうなる.

本当に「正しい, あるべきばしょ」にあるんですか? それはどうやって確認しましたか?

といちおう書いてはおくけど,
https://oshiete.goo.ne.jp/qa/11661753.html
(and others) も考慮すると
・マイクロソフトの処理系は捨てる
・統合環境は使わない
のが適切ではないかとすら思うなぁ....
この回答への補足あり
    • good
    • 1

scores.txtは準備しているのか



"rt"ではなく
"r"
この回答への補足あり
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A