ほぷしぃ

納得C言語!

[第14回]構造体(解答)

(1)解答

解答プログラム

#include <stdio.h>

//給与を格納する構造体kyuyo
struct kyuyo
{
    int kyuyo_April;    //4月分の給与
    int kyuyo_May;      //5月分の給与
    int kyuyo_June;     //6月分の給与
};

//社員情報を格納する構造体syain
struct syain
{
    int no;             //社員番号
    char *name;         //名前
    char *busyo;        //部署
    char *fp;           //役職
    struct kyuyo money; //構造体の入れ子
};

int main()
{
    int i = 0;

    printf("                         給与\n");
    printf("社員番号   氏名  部署 役職   4月   5月   6月  \n");

    //構造体syainの初期化
    struct syain list[]=
    {
        { 1,"小泉八雲"  ,"総務","部長",{435000,440000,437500}},
        { 2,"松尾芭蕉"  ,"営業","部長",{450000,470000,460000}},
        { 3,"徳川家康"  ,"技術","部長",{398000,425000,411500}},
        { 4,"坂本竜馬"  ,"営業","課長",{356000,380000,368000}},
        { 5,"上杉謙信"  ,"技術","課長",{370000,360000,365000}},
        { 6,"前田利家"  ,"技術","課長",{365000,355000,360000}},
        { 7,"樋口一葉"  ,"総務","主任",{320000,305000,312500}},
        { 8,"ヘンリー"  ,"技術","主任",{305000,310000,307500}},
        { 9,"ロマン  "  ,"技術","主任",{298000,305000,301500}},
        {10,"サミュエル","営業","係長",{276000,280000,278000}},
        {11,"ベーコン"  ,"総務",   "" ,{213000,220000,216500}},
        {12,"ハム"      ,"営業",   "" ,{250000,245000,247500}},
        {13,"チーズ"    ,"技術",   "" ,{325000,240000,327500}},
    };

    //構造体のポインタ宣言
    struct syain *p;
    //ポインタpに構造体listの先頭アドレスを代入
    p = list;

    for(i=0;i<13;i++)
    {
        //アロー演算子を使い各データを表示
        //このとき、横にすると長くなってしまうので、
        //メンバごとに改行するとわかりやすいです。
        printf("%8d%11s%8s%6s%10d%10d%10d\n",
            (p+i)->no,
            (p+i)->name,
            (p+i)->busyo,
            (p+i)->fp,
            //構造体の構造体の中はポインタを使用していないので
            //(.)で取り出す。
            (p+i)->money.kyuyo_April,
            (p+i)->money.kyuyo_May,
            (p+i)->money.kyuyo_June
            );
    }
    return 0;
}

解説

この問題はちょっとした応用問題です。
構造体一つで全部のメンバ変数を用意してもいいのです。
しかし、給与を見てもらうと一まとめにしてしまっても問題なさそうです。
こういうときは構造体の中に構造体を使用することができます。
構造体の入れ子ですね。
宣言と格納と読み出しの仕方は下のようになります。

結果

結果


(2)解答

解答プログラム

#include <stdio.h>

//給与を格納する構造体kyuyo
struct kyuyo
{
    int kyuyo_April;    //4月分の給与
    int kyuyo_May;      //5月分の給与
    int kyuyo_June;     //6月分の給与
};

//社員情報を格納する構造体syain
struct syain
{
    int no;             //社員番号
    char *name;         //名前
    char *busyo;        //部署
    char *fp;           //役職
    struct kyuyo money; //構造体の入れ子
};


int main()
{
    int i = 0;

    printf("                         給与\n");
    printf("社員番号   氏名  部署 役職   4月   5月   6月  \n");

    //構造体syainの初期化
    struct syain list[]=
    {
        { 1,"小泉八雲"  ,"総務","部長",{435000,440000,437500}},
        { 2,"松尾芭蕉"  ,"営業","部長",{450000,470000,460000}},
        { 3,"徳川家康"  ,"技術","部長",{398000,425000,411500}},
        { 4,"坂本竜馬"  ,"営業","課長",{356000,380000,368000}},
        { 5,"上杉謙信"  ,"技術","課長",{370000,360000,365000}},
        { 6,"前田利家"  ,"技術","課長",{365000,355000,360000}},
        { 7,"樋口一葉"  ,"総務","主任",{320000,305000,312500}},
        { 8,"ヘンリー"  ,"技術","主任",{305000,310000,307500}},
        { 9,"ロマン  "  ,"技術","主任",{298000,305000,301500}},
        {10,"サミュエル","営業","係長",{276000,280000,278000}},
        {11,"ベーコン"  ,"総務",   "" ,{213000,220000,216500}},
        {12,"ハム"      ,"営業",   "" ,{250000,245000,247500}},
        {13,"チーズ"    ,"技術",   "" ,{325000,240000,327500}},
    };

    //構造体のポインタ宣言
    struct syain *p;
    //ポインタpに構造体listの先頭アドレスを代入
    p = list;

    //show()関数へ構造体pの先頭アドレスを参照渡しする
    show(p);

    return 0;
}

void show(struct syain *p)
{
    //社員番号が0になるまで繰り返す
    while(p->no != 0)
    {
        //結果出力
        printf("%8d%11s%8s%6s%10d%10d%10d\n",
            p->no,
            p->name,
            p->busyo,
            p->fp,
            p->money.kyuyo_April,
            p->money.kyuyo_May,
            p->money.kyuyo_June
            );
        //ポインタの値をインクリメント(+1)する
        p++;
     }
}

解説

自作関数の引数に構造体へのポインタを渡していますね。
構造体であろうが変数であろうが、ポインタを使ったやり方は同じですね。
ただ、こちらのほうが複雑になってしまうので注意しましょう。

結果

結果


[第14回]構造体 ページのトップ [第15回]演習問題W

>