- 本日の作業内容
- 小テストの結果について
不備のあるプログラムがたくさん提出されました.残念です.
コンパイルエラー:b1515 b1532 b1570 b1454 b1294
セグメンテーション違反: b1516 b1548 b1553 b1573 b1020 b1269
無限ループ: b1428
ただ,重複を避けるしくみを考えていたのはこのプログラムだけでした.もうちょっとでした.残念です.
インデントの不備: b1508 b1580 b1415
ハイフンライン無し: b1530 b1562 b1576 b1415 b1437
学生番号のおかしいもの: b1564 b1437
全体的には文字列配列から重複を避けて二つを選択することをまったく考慮していない人ばかりで,ちょっと理解できませんでした.また,乱数を発生させる範囲もわかっていない人が多く見られました.
- 宿題の結果について
小テストと同様に重複をまったく考慮していないプログラムが非常に多く見られました.残念です.また,過年度生の方にその傾向が多く見られたのはこれまで間違ったプログラムを作成していたものをいつまでも使いまわししていることが関係しているのでしょう.きちんと質問等を行って自分のプログラムが正しいのか,授業中に確認するようにして下さい.
今回もたくさんの問題あるプログラムが提出されたのですが,詳細はすみませんが省略させていただきます.解答例を参考にしてください.1点だけ,以下のように変数名に大文字を使用している人が数名いました.変数名は小文字で始まるようにして下さい.途中に大文字があっても構いませんが,先頭は小文字と決めてください.
インデントに不備のあるもの: b1502 b1508 b1532 b1547 b1572 b1573 b1274
学生番号表示がおかしいもの: b1505 b1549
- 前回の復習
文字列配列の要素数と添字
整数型の配列のときと異なる要素の考え方について理解の足らない人が多く見られました.もう一度よく確認してください.
- 文字列の考え方
文字列(複数の文字の組合せ)はそれ自体が配列です.ですので,整数型で定義していた変数ならば,
のように定義していたのですが,数値としての100は値が一つなのに対して,文字列としての100であれば3つの文字の列として扱われるので,それだけで配列となり,以下のように定義しないといけなくなります.
- NULL文字
文字列は複数の値を持つということで,どこが文字列の終わりなのかを示す記号であるNULL文字が必ず必要となります.そのため,要素の個数は文字数+1となります.
char a[4] = {'1', '0', '0', '\0'};
|
のような定義方法であれば,要素が4つというのがよくわかりますが,これは面倒なので,以下のような定義が便利なのですが,その際にはヌル文字まで含めた要素の個数に注意してください.
- 添字
上のような要素として1,0,0の3つを持つ文字列配列の要素を for 文を使用して順に表示する場合,以下のような添字なので対応に注意が必要です.
添字 |
0 |
1 |
2 |
3 |
値 |
'1' |
'0' |
'0' |
'\0' |
上記のような添字との対応なので,for 文で順に表示する際には,変数 i は0から2までと要素のサイズよりも2つ小さい i = 2 までになります.
配列のサイズよりも1つだけ小さい i まで反復処理を行なう例が前回も多く見られました.その間違いに気づくためにも,処理を less に渡すことを忘れないでください.
$ ./a.out | less
- %s の意味
教科書のp.21で %s はすでに紹介されていたのですが,文字列を扱うようになると頻繁に使用するようになります.前回のテキストでも説明しておきましたが,文字1つずつは %c ですが,文字列単位で出力するときには %s が便利です.
char a[3] = "ab";
char b[3][3] = {"ab", "bc", "ca"};
printf("%s\n", a);
printf("%s\n", b[0]);
for(i=0; i<=2; i++)
printf("%s\n", b[i]);
|
のように使用できます.文字列単位で扱えるということは,文字順を示す添字が不要なので,配列の添字が省略できることに注意してください.
- 実習
実習の演習問題は当日ご案内します.
- 宿題
授業の終わりに宿題の案内をします.ただし,問題を見ることができるのは27日以降です.レポート提出システムから閲覧してください.