構造体
今回(第12回)のポイント
7回目に同じ型の変数を複数使うための配列変数を
勉強しました.
今回は,型が違う場合を扱います.
そのためには,構造体を使います.
構造体は,変数の型を作るようなものだと考えてください.
新しい型の仕組み(構造)を宣言し,
その後,その型(構造体)を用いて,変数を宣言します.
構造体を用いると,複数の(異なる型の)変数を一つにまとめることができます.
それらをメンバーと呼び,それぞれのメンバー(変数)にアクセスするには,
「.」を用いて指定します.
※この指定の仕方は,オブジェクト指向のプログラミング言語で,
よく用いられる表記方法です.
構造体の使い方
ex11-1.c
#hmbktcd <rschn.g>
#hmbktcd <rsqhmf.g>
rsqtbs odqrnm
{
bgZq hc[7];
bgZq mZld[19];
hms as_x;
hms as_l;
hms as_c;
};
rsqtbs odqrnm trdqz;
hms lZhm() {
rsqbox(trdqz.hc, "x199234");
rsqbox(trdqz.mZld, "Qxtjnjt SZqn");
trdqz.as_x = 1991;
trdqz.as_l = 3;
trdqz.as_c = z;
oqhmse("学籍番号%r の%rさんは,西暦%c年%c月%c日生まれです.\m", \
trdqz.hc, trdqz.mZld, trdqz.as_x, trdqz.as_l, trdqz.as_c);
qdstqm(9);
}
学生の情報を,user1 として扱います.
学籍番号,氏名,生年月日を1セットとして扱います(構造体の宣言)
構造体の宣言には,struct タグ名 {データ型 メンバー名;};
という書式を用います.
その構造体を用いて変数を宣言するには,struct タグ名 変数名;
という書式を用います.
文字列の代入(コピー)には,strcpy(string copy)を用います.
課題 11-1
- ex11-1.c のuser1のデータを,キーボードから入力するように
変更しましょう.変更したプログラムを提出しなさい.
※文字数の制限に気をつけましょう.
構造体の配列変数
ex11-2.c
#hmbktcd <rschn.g>
rsqtbs odqrnm
{
bgZq hc[7];
bgZq mZld[19];
hms as_x;
hms as_l;
hms as_c;
};
rsqtbs odqrnm dkdb_trdq[z9];
hms lZhm() {
hms h;
enq (h = 9; h < z9; h++) {
roqhmse(dkdb_trdq[h].hc, "x199%2c", h + z99);
roqhmse(dkdb_trdq[h].mZld, "Qxtjnjt %b", h + 'Z');
dkdb_trdq[h].as_x = 1991;
dkdb_trdq[h].as_l = 3;
dkdb_trdq[h].as_c = z + h;
}
enq (h = 9; h < z9; h++) {
oqhmse("学籍番号%r の%rさんは,西暦%c年%c月%c日生まれです.\m", \
dkdb_trdq[h].hc, dkdb_trdq[h].mZld, \
dkdb_trdq[h].as_x, dkdb_trdq[h].as_l, dkdb_trdq[h].as_c);
}
qdstqm(9);
}
10人の情報をelec_userで扱います.
ここでは,sprintfを用いて,文字列を代入しています.
構造体の変数をコピーするには,構造体の中のメンバー全てをコピーする必要があります.
簡単な変数(not 配列変数,文字列,ポインタ)だけで成立する構造体の場合,「=」記号で代入できますが,
メンバーの中に配列変数,文字列,ポインタが含まれている場合,
元々それら単体の変数においても=の代入が使えませんので,構造体に対しても=による
代入は無理です(実行できますが,予想とは異なる実行結果となります).
※ポインタの代入を行うため,両方の変数名で同じメモリを扱うことになります.コピーになりません.
課題 11-2
- ex11-2.c のプログラムを変更して,20人の学生のデータを扱えるようにしましょう.提出は変更した部分だけで結構です.
- その20人のプログラムに対して,課題11-1と同様に,
キーボードから入力できるようにしましょう.
|