質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

4388閲覧

平均点の表示(成績管理システム、構造体、ファイル)

741s

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/07/09 21:28

前提・実現したいこと

大学の講義で構造体で個人データ(名前、学籍番号、3教科の得点)を表し、データをファイルから読み込む。その後、平均点の計算や得点順にソートする処理を行うプログラムを作成しています。

平均点を出力したいのですのですが計算結果が表示されず「nan」と出てきます。

平均点を求める関数内とmain関数内のどちらに問題があるのかわかりません。
どなたかご教示よろしくお願いいたします。

出力結果

ファイル読み込み:1 終了:0  :Mami h567 60.0 80.0 70.0 Momo h878 80.0 90.0 70.0 Kinoshita h698 90.0 60.0 70.0 ファイル読み込み:1 終了:0  :平均点を表示しますか? はい:1 いいえ:2  :数学の平均点はnanです。英語の平均点はnanです。物理の平均点はnanです。

該当のソースコード

/*成績管理システム*/ #include<stdio.h> #include<string.h> #include<math.h> #define NAME_LEN 128 #define NUM_LEN 64 #define NUMBER 5 /*学生を表す構造体*/ typedef struct{ char name[NAME_LEN]; //名前 char number[NUM_LEN]; //学籍番号 double math; //数学の得点 double eng; //英語の得点 double phy; //物理の得点 }Student; /*x,yで指す学生の入れ替え*/ void swap_Student(Student *x,Student *y) { Student temp = *x; *x = *y; *y = temp; } /*3教科それぞれの平均点を求める*/ void sum_Student(Student a[],int n,double *ave1,double *ave2,double *ave3) { int i=0; double sum1=0; double sum2=0; double sum3=0; for(i=0;i<n;i++){ sum1 += a[i].math; sum2 += a[i].eng; sum3 += a[i].phy; } *ave1 = sum1/n; *ave2 = sum2/n; *ave3 = sum3/n; } /*ファイルの読み込み*/ int out_file(Student a[]) { FILE *fp; int i = 0; if((fp = fopen("File1","r")) == NULL) printf("\aファイルをオープンできません\n"); else{ while(fscanf(fp,"%s %s %lf %lf %lf",a[i].name,a[i].number,&a[i].math,&a[i].eng,&a[i].phy)==5){ printf("%-10s %-10s %5.1f %5.1f %5.1f\n",a[i].name,a[i].number,a[i].math,a[i].eng,a[i].phy); i++; } fclose(fp); } return i; } int main(void) { int a; int flag=0; int i=0; int cnt=0; double ave1; double ave2; double ave3; Student human[40]; do{ printf("ファイル読み込み:1 終了:0  :"); scanf("%d",&flag); if(flag==1) out_file(human); }while(flag!=0); printf("平均点を表示しますか? はい:1 いいえ:2  :"); scanf("%d",&a); if(a==1){ sum_Student(human,cnt,&ave1,&ave2,&ave3); printf("数学の平均点は%3.1lfです。",ave1); printf("英語の平均点は%3.1lfです。",ave2); printf("物理の平均点は%3.1lfです。",ave3); } return 0; }

補足情報(FW/ツールのバージョンなど)

paiza.ioという無料サイトでC言語で作成

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

平均点を求める関数内とmain関数内のどちらに問題があるのかわかりません。

全部一気に動作検証を行うことは、ビッグバンテストなどと呼ばれて、あまりいいこととはされていません。

途中経過を出力させて、どこまで正常に動作しているか確認しましょう。

投稿2020/07/09 21:50

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

741s

2020/07/09 22:10

アドバイスありがとうございます! コメントアウトして分割して確認してみます。
guest

0

ベストアンサー

関数 out_file() が返すStudent数を捨てています。

※ cntが0のまま。

投稿2020/07/09 23:11

編集2020/07/09 23:19
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

741s

2020/07/09 23:28 編集

ご回答ありがとうございます! cnt=out_file()に変更しましたところ表示されました。 誠にありがとうございました。
episteme

2020/07/09 23:21

え? ソートなんかしてないのに?
741s

2020/07/09 23:26

申し訳ございません。間違えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問