ほぷしぃ

納得C言語!

[第18回]演習問題X 第5問の解答

演習問題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言語」を学習して頂き本当にありがとうございました。
またどこかでお会いしましょう。

ヒント ページのトップ