ファイルseisekiからデータを読み出し、(1)~(5)を求めなさい。
(1)英語の平均点
(2)数学の平均点
(3)理科の経金点
(4)合計点数の平均点(英語、数学、理科の合計)の平均点
(5)合計点が平均点以上の人の番号
ファイルseisekiのフォーマット(ie001~ie040)40人分
-----------------------------------------------------------
ie001 ←生徒番号
90 ←英語の点数
87 ←数学の点数
81 ←理科の点数
ie002
78
70
99
ie003
81
99
77
・・・
-----------------------------------------------------------
去年の春から「新訂新C言語入門-ビギナー編-」を使い、C言語を勉強している大学生です。
上記のプログラムのソースコードを提出するように言われたのですが
正直に言って全く手も足も出せずに悩んでいます。
ファイルオープン後、
ie001 90 87 81 (3科目合計)
ie002 78 70 99 (〃)
ie003 81 99 77 (〃)
と一覧表示しようと考えているのですが
この時点で何の関数を使えば良いのかも分かりません・・・
申し訳ありませんがどなたかご教授くださいませんでしょうか?
ファイルからデータを読み出し、各項目平均値を求める方法
-
トモ
Re: ファイルからデータを読み出し、各項目平均値を求める方法
書き忘れていましたが、OSもコンパイルもUbuntu10.04上で行っています。
で、
-----------------------------------------
ie001 90 87 81 258
ie002 78 70 99 247
ie003 81 99 77 257
・・・
-----------------------------------------
と表示してみました。
ですが相変わらず平均値の出し方が分かりません
#include <stdio.h>
#include <stdlib.h> /* for exit*/
#include <string.h> /* for strcpy*/
struct seiseki{
char name[20];
int eigo;
int suugaku;
int rika;
int sum;
};
#define MAX 40
int main(void){
FILE *fp;
struct seiseki dt[MAX];
int i;
char buff[80];
fp = fopen("seiseki","r");
for(i=0; i<MAX; i++){
fgets(dt[i].name, 256, fp);
fgets(buff, 256, fp);
dt[i].eigo = atoi(buff);
fgets(buff, 256, fp);
dt[i].suugaku = atoi(buff);
fgets(buff, 256, fp);
dt[i].rika = atoi(buff);
dt[i].sum = dt[i].eigo + dt[i].suugaku + dt[i].rika;
printf("ie%03d %d %d %d %d\n",i+1,dt[i].eigo,dt[i].suugaku,dt[i].rika,dt[i].sum);
}
fclose(fp);
return 0;
}
-----------------------------------------
ie001 90 87 81 258
ie002 78 70 99 247
ie003 81 99 77 257
・・・
-----------------------------------------
と表示してみました。
ですが相変わらず平均値の出し方が分かりません
-
sql
Re: ファイルからデータを読み出し、各項目平均値を求める方法
(4)から、
簡単な方法ですと、構造体内に「avg(アベレージのこと)」を用意します。(平均ですので小数点以下も表示したい場合はfloatで。)
平均の計算はわかりますよね?(合計÷項目数(この場合は英数理の3?))
for分で中に合計値も計算しているのでそのあとに・・・・(ほぼ答えですが後は自力で)
printfの中も1つ増やせば・・・・・
頑張ってください!
簡単な方法ですと、構造体内に「avg(アベレージのこと)」を用意します。(平均ですので小数点以下も表示したい場合はfloatで。)
平均の計算はわかりますよね?(合計÷項目数(この場合は英数理の3?))
for分で中に合計値も計算しているのでそのあとに・・・・(ほぼ答えですが後は自力で)
printfの中も1つ増やせば・・・・・
頑張ってください!
-
sql
Re: ファイルからデータを読み出し、各項目平均値を求める方法
勘違いしていたら申し訳ないので・・・・
というのは40人分のというのであれば(各教科で)・・・・トモ さんが書きました:(4)合計点数の平均点(英語、数学、理科の合計)の平均点
#include <stdio.h>
#include <stdlib.h> /* for exit*/
#include <string.h> /* for strcpy*/
struct seiseki{
char name[20];
int eigo;
int suugaku;
int rika;
int sum;
};
#define MAX 40
int main(void){
FILE *fp;
struct seiseki dt[MAX];
int i;
char buff[80];
int math_max = 0;//数学
int math_avg = 0//数学
fp = fopen("seiseki","r");
for(i=0; i<MAX; i++){
fgets(dt[i].name, 256, fp);
fgets(buff, 256, fp);
dt[i].eigo = atoi(buff);
fgets(buff, 256, fp);
dt[i].suugaku = atoi(buff);
fgets(buff, 256, fp);
dt[i].rika = atoi(buff);
dt[i].sum = dt[i].eigo + dt[i].suugaku + dt[i].rika;
math_max += dt[i].suugaku;//数学40人分の合計
if(最後の人の番になったら)
平均を計算
printf("ie%03d %d %d %d %d\n",i+1,dt[i].eigo,dt[i].suugaku,dt[i].rika,dt[i].sum);
}
fclose(fp);
return 0;
}Re: ファイルからデータを読み出し、各項目平均値を求める方法
標準関数には、平均点を求める機能を持つものはありません。たぶん。トモ さんが書きました: この時点で何の関数を使えば良いのかも分かりません・・・
「どの関数を使うか」
ではなく、
「どういう関数を作るか」
ということが主眼であろうと思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
-
トモ
Re: ファイルからデータを読み出し、各項目平均値を求める方法
お二方とも返信いただきありがとうございました!
そのソースコードの考えは一旦捨て、もう一度考えてみました。
研磨する必要があるとは思いますが今度はなんとか通りました!
そのソースコードの考えは一旦捨て、もう一度考えてみました。
研磨する必要があるとは思いますが今度はなんとか通りました!
#include <stdio.h>
#define NUMBER 40
typedef struct {
char name[20];
double eigo;
double suugaku;
double rika;
double sum;
} pdata;
int main(void)
{
FILE *fp;
int i;
int ninzu = 0;
double sum = 0.0;
double Esum = 0.0;
double Ssum = 0.0;
double Rsum = 0.0;
pdata data[NUMBER];
if((fp = fopen("seiseki", "r")) == NULL)
printf("\aファイルをオープンできません。\n");
else {
while (fscanf(fp, "%s%lf%lf%lf", data[ninzu].name,
&data[ninzu].eigo,
&data[ninzu].suugaku,
&data[ninzu].rika) == 4) {
Esum += data[ninzu].eigo;
Ssum += data[ninzu].suugaku;
Rsum += data[ninzu].rika;
ninzu++;
}
for(i=0; i<ninzu; i++){
data[i].sum = data[i].eigo+data[i].suugaku+data[i].rika;
printf("%-10s %5.1f %5.1f %5.1f %5.1f\n",
data[i].name, data[i].eigo, data[i].suugaku, data[i].rika, data[i].sum);
}
printf("----------------------------------\n");
printf("平均 %5.1f %5.1f %5.1f %5.1f\n\n", Esum/ninzu, Ssum/ninzu, Rsum/ninzu, (Esum+Ssum+Rsum)/ninzu);
printf("平均点を越えてる人は\n");
for(i=0; i<ninzu; i++){
if((Esum+Ssum+Rsum)/ninzu <= data[i].sum){
printf("ie%03d\n",i+1);
}
}
fclose(fp);
}
return 0;
}