納得C言語!
演習問題X 第5問の解答
5 平均値表示機能
解答プログラム
#include <stdio.h>
#include <stdlib.h>  //exit()で使用
//構造体の型宣言
struct point{
int ei;
int koku;
int suu;
int ri;
int sya;
};
struct student{
int s_no;
char name[256];
int s_year;
char s_class[256];
struct point s_point;
};
//プロトタイプ宣言の初期化
void show(struct student *p);
void input(struct student *p);
void file_out(struct student *p);
void file_in(struct student *p);
void avg_point(struct student *p);
int main(){
int sw=1; //switch用変数
//構造体の宣言
//ユーザより入力するので大きめの配列を確保する
struct student school[256];
//構造体ポインタを宣言し先頭アドレスを代入
struct student *p;
p=school;
printf("************成績表(プロトタイプG)************\n");
//0が入力されたら終了
while(sw!=0){
printf("何がしたいわけ!?\n");
printf("1:成績表示\n2:データ入力\n3:ファイルに書き出し\n4:ファイルの読み込み\n5:各学年ごとの平均点表示\n0:終了\n>>");
scanf("%d",&sw);
//swの値で行動を変化
switch(sw){
//成績表表示
case 1:
show(p);
break;
//データ入力
case 2:
input(p);
break;
//データをファイルへ出力
case 3:
file_out(p);
break;
//データをファイルから入力
case 4:
file_in(p);
break;
//学年ごとの平均値を求める
case 5:
avg_point(p);
break;
//終了
case 0:
printf("入力を終了します\n");
break;
//それ以外
default:
printf("指定数以外の入力です\n");
break;
}
}
return 0;
}
:
省略
:
/******************************/
/* void avg_point() */
/* 学年ごとの平均値の算出 */
/* 引数1:構造体へのポインタ */
/* 戻り値:なし */
/******************************/
void avg_point(struct student *p){
int i = 0; //ポインタカウント用
int sum = 0; //合計点
int j = 0; //人数カウント用
int k = 0; //平均値
int a = 0; //学年格納用
//aに先頭の学年を格納する
a = p->s_year;
printf("各学年ごとの平均\n");
//学籍番号が0になるまで続ける
while(((p+i)->s_year)!=0){
//学籍番号がaと同じ間続ける
while(((p+i)->s_year)==a){
//sumにsum自身と科目の合計を代入
sum = sum +
(p+i)->s_point.ei +
(p+i)->s_point.koku +
(p+i)->s_point.ri +
(p+i)->s_point.suu +
(p+i)->s_point.sya;
//ポインタカウントを進める
i++;
//人数をカウントする
j++;
}
//平均値算出
k = sum/j;
//平均点表示
printf("学年=%d 総合得点の平均=%d\n", a, k);
//各変数の初期化
sum = 0;
j = 0;
a = (p+i)->s_year;
}
}
解説
こちらも問題になっている自作関数以外の関数は省略します。
平均値の算出方法は第15回の演習問題でやりましたね。違うところは学年と役職で、学年はint型、役職はchar型(文字列)ぐらいでしょうか。また、今回問われているのは「総合得点の平均値」なので平均値を算出するときはj(人数)だけとなります。
k = sum/(j*5)
と書いてしまうかもしれませんが、これでは1科目の平均値となるので違ってしまいますね。
あとは表示させて、学籍番号が0になったら終了となります。
あとがき
ここまでやり遂げた皆さん、お疲れ様でした。
今回で「納得C言語」の連載は終了となります。
連載で学習してきたC言語の知識はC言語全体のほんの一部に過ぎません。
この先には今よりさらに高い壁が立ちはだかっております。
ここまで学習してきた皆さんなら、次のステップに進んでも問題ないでしょう。
あとはアナタの努力次第!!!
最後に…
今まで、「納得C言語」を学習して頂き本当にありがとうございました。
またどこかでお会いしましょう。