ほぷしぃ

納得C言語!

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

演習問題X 第1問の解答


1 成績表の構造体を作る

解答プログラム

#include <stdio.h>

//構造体型宣言科目の点数
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;    //科目の点数(構造体)
};

int main(){
    int i=1;

    //構造体の宣言と初期化
    struct student school[] = {
        {1,  "伊藤博文",   3, "A", {88, 66, 84, 67, 74}},
        {2,  "墨田清隆",   3, "A", {88, 52, 74, 69, 60}},
        {3,  "山縣有朋",   3, "B", {90, 51, 80, 56, 83}},
        {4,  "松方正義",   3, "B", {53, 81, 64, 87, 69}},
        {5,  "大隈重信",   3, "C", {67, 94, 89, 66, 54}},
        {6,  "桂太郎",     3, "C", {95, 88, 59, 99, 77}},
        {7,  "西園寺公望", 2, "A", {87, 98, 94, 86, 83}},
        {8,  "山本権兵衛", 2, "A", {86, 64, 61, 60, 86}},
        {9,  "寺内正毅",   2, "A", {87, 81, 75, 73, 95}},
        {10, "原敬",       2, "B", {97, 93, 73, 96, 81}},
        {11, "高橋是清",   2, "B", {57, 91, 80, 68, 95}},
        {12, "加藤友三郎", 2, "C", {61, 97, 75, 73, 88}},
        {13, "清浦奎吾",   2, "C", {88, 83, 85, 63, 81}},
        {14, "加藤高明",   2, "C", {52, 69, 62, 69, 50}},
        {15, "若槻禮次郎", 2, "C", {61, 78, 56, 75, 55}},
        {16, "田中義一",   1, "A", {78, 91, 70, 98, 54}},
        {17, "濱口雄幸",   1, "B", {97, 91, 77, 63, 89}},
        {18, "犬飼毅",     1, "B", {66, 52, 88, 61, 95}},
        {19, "斎藤寛",     1, "C", {79, 95, 66, 59, 100}},
        {20, "岡田啓介",   1, "C", {83, 50, 99, 89, 94}},
        {0, " ",0, " ", {0, 0, 0, 0, 0}}
    };

    //構造体へのポインタを宣言
    struct student *p;

    //ポインタへ先頭アドレスを代入
    p=school;
    printf("                  |       点数\n");
    printf("学籍番号     氏名 学年クラス | 英語 国語 数学 理科 社会\n");
    printf("-------------------------------------------------------------------\n");

    //学籍番号が0になるまで続ける
    for(i=1;((p+i)->s_no)!=0;i++){

        //printfで1行で書こうとすると横に長くなってしまい、わかりにくくなります。
        //なので、このように複数行に分けるとわかりやすいです。
        printf("%7d  %10s  %d   %s  |  %d  %d  %d  %d  %d \n",
            (p+i)->s_no,
            (p+i)->name,
            (p+i)->s_year,
            (p+i)->s_class,
            (p+i)->s_point.ei,
            (p+i)->s_point.koku,
            (p+i)->s_point.suu,
            (p+i)->s_point.ri,
            (p+i)->s_point.sya
            );
        }

    return 0;
}

解説

まず、点数を格納する構造体の型を宣言します。
次に、生徒情報を格納する構造体の型を宣言します。このとき、点数の構造体の型宣言を先に行わないとエラーとなってしまいますね。
それは、生徒情報の構造体の型宣言で宣言されていない型があるとどんな型なのかわからないからです。
次に、構造体の宣言と初期化を行います。ここは構造体の回でもやりましたね。
あとは表示させるだけです。


ヒント ページのトップ 第2問