Previous: 構造体の配列
Up: 構造体 II
Next: 復習
Previous Page: 構造体の配列
Next Page: 復習
標準関数 strcpy() は、文字列をコピーする関数である。
例8 char str1[50]; char str2[50]; ... strcpy( str1, "kanayama"); strcpy( str2, str1);
この例では、配列 str[] に文字列 "kanayama" がコピーされる。 更に、次の行で、 str1 から str2 へのコピーを行っているが、 str1 には、その前のコピーで、 "kanayama" がコピーされているので、 結局、 str2 にも "kanayama" がコピーされる。
但し、 strcpy() は、文字数などは数えないので、コピーされる配列は十分な 大きさを自分で注意して確保しなければならない。
また、ファイルの先頭に、 #include <string.h> を追加して置かなければ ならない。
標準関数 sscanf() は、文字列を指定した書式に従って、指定した変数に 読み込む関数である。従って、 scanf() が標準入力に対して行うのと同じ事を 文字列に対して行う。
例9 char buf[256]; int p1, p2;gets(buf); sscanf(buf, "%d %d", &p1, &p2 );
この例では、標準入力から文字列として、 buf[] にまず読み込む。 この時、例えば、 34 23 と入力されたとしよう。すると、配列 buf に、0番目から順に、'3','4',' ','2','3' と文字として入っている訳である。 即ち、文字列としては、"34 23" として入っている。これを、 sscanf() で、書式指定に { "整数 34 が、整数変数 p2 に整数 23 が代入されることになる。
従って、先の学生の成績ならば、次のようなデータがあったとき、
kanayama 70 65 yamada 80 90 hokusei 60 60 suzuki 65 70
次のプログラムで、名前、前期の成績、後期の成績として読み込むことが出来る。
例10 main(){ struct Test { char name[30]; int zenki; int kouki; }; struct Test g[100]; /* 一応、100人分 */ char buf[256]; int i=0;while (gets(buf)!=NULL){ sscanf( buf, "%s %d %d", g[i].name, &g[i].zenki, &g[i].kouki); i++; }
for (j=0; j<i; j++){ printf("%s, %d, %d\n", g[j].name, g[j].zenki, g[j].kouki); } }
但し、データの名前と成績の間は1個の半角のスペースでなければならない。
課題18
cd c を実行した後で( /c に移動した後で )、以下の課題を やってみよ。
構造体 Point は、以下の通りである。
struct Point { int x; int y; };
この構造体をメンバーに持つ構造体 sankaku を作成せよ。 但し、構造体 sankaku は、三角形の3つの頂点座標をメンバーに持つ構造体 である。
課題 18.1 の宣言を用いて、三角形の面積を計算せよ。 但し、三角形の面積 S は、 3つの頂点の座標を (x_1, y_1), (x_2, y_2), (x_3, y_3) とした場合、次の式で計算される。 <pre> S = | (x_3 - x_1) (y_2 - y_1) - (x_2 - x_1) (y_3 - y_1)| / 2 </pre>
3頂点には、 (1,1), (5,3), (4,2) を用いよ。
例10を実行して見よ。
課題 17.4 を改造し、一度に100人までの通年成績をつけられるようにせよ。 但し、課題 18.3 のように、構造体型の配列を使うと共に、データは、 次のようなものであるとする。
kanayama 940101 keijo 1 70 65 25 yamada 930102 eijo 3 80 90 30 hokusei 940103 keijo 2 80 60 15 suzuki 940211 keijo 1 65 70 10
データは、前から順に、名前、学籍番号、学科、組、前期成績、後期成績、出席回数 の7個である。
出力は、名前、学籍番号、通年成績の順で、1人1行の形式で出力するようにせよ。
作成したプログラムをメイルで金山まで送りなさい。題は、kadai18 とする事。