ファイルからデータを読み出し、各項目平均値を求める方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
トモ

ファイルからデータを読み出し、各項目平均値を求める方法

#1

投稿記事 by トモ » 12年前

ファイル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: ファイルからデータを読み出し、各項目平均値を求める方法

#2

投稿記事 by トモ » 12年前

書き忘れていましたが、OSもコンパイルもUbuntu10.04上で行っています。

コード:

#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: ファイルからデータを読み出し、各項目平均値を求める方法

#3

投稿記事 by sql » 12年前

(4)から、
簡単な方法ですと、構造体内に「avg(アベレージのこと)」を用意します。(平均ですので小数点以下も表示したい場合はfloatで。)
平均の計算はわかりますよね?(合計÷項目数(この場合は英数理の3?))
for分で中に合計値も計算しているのでそのあとに・・・・(ほぼ答えですが後は自力で)
printfの中も1つ増やせば・・・・・
頑張ってください!

sql

Re: ファイルからデータを読み出し、各項目平均値を求める方法

#4

投稿記事 by sql » 12年前

勘違いしていたら申し訳ないので・・・・
トモ さんが書きました:(4)合計点数の平均点(英語、数学、理科の合計)の平均点
というのは40人分のというのであれば(各教科で)・・・・

コード:

#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;
}

box
記事: 2002
登録日時: 15年前

Re: ファイルからデータを読み出し、各項目平均値を求める方法

#5

投稿記事 by box » 12年前

トモ さんが書きました: この時点で何の関数を使えば良いのかも分かりません・・・
標準関数には、平均点を求める機能を持つものはありません。たぶん。
「どの関数を使うか」
ではなく、
「どういう関数を作るか」
ということが主眼であろうと思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

トモ

Re: ファイルからデータを読み出し、各項目平均値を求める方法

#6

投稿記事 by トモ » 12年前

お二方とも返信いただきありがとうございました!
そのソースコードの考えは一旦捨て、もう一度考えてみました。
研磨する必要があるとは思いますが今度はなんとか通りました!

コード:

#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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る