納得C言語!
(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++;
}
}
解説
自作関数の引数に構造体へのポインタを渡していますね。
構造体であろうが変数であろうが、ポインタを使ったやり方は同じですね。
ただ、こちらのほうが複雑になってしまうので注意しましょう。
結果