情報科学演習
2016.01.18
Back to index page
- 本日の作業内容
- 小テストについて
文字列配列に関する小テストを実施します.テストの時の席配置で柱の部分を避けて座ってください.
- 宿題の結果について
今回は再びインデントの不備が多く見られました.プログラミング中は制御構造を意識して入力する際に字下げにも気をつけてください.
以下はいつものように問題のあるプログラムの例です.参考にしてください.
for(i = 0; i <= 1; i++){
for(j = 0; j <= 14; j++)
ary[i][j] = 0;
}
|
for 文を使用して初期化する姿勢はいいのですが,今回の課題ではこのような初期化は不要です.複合演算子を使用して自己代入するような場合には必須ですが.
int ary[2][15]= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
|
最悪な初期化.
for(i=1;i<=7;i++){
printf("%3d ",ary[0][2*i-2]);
printf("%3d ",ary[1][2*i-1]);
}
|
このように二つの printf を使うのはスマートでは無いので,減点です.
printf("%d %d ",ary[0][2*k],ary[1][2*k+1]);
|
printf は一つですが, %d が二つなのでやはり減点です.
for(j=1;j<=14;j=j+2)
ary[0][j] = ary[1][j];
|
別に配列の値の入れ換えをするようには指示していません.
for(i=0;i<=14;i++){
int k=i%2;
switch (k) {
case 0: printf("%d ",ary[0][i]);
break;
default: printf("%d ",ary[1][i]);
}
|
インデントもぼろぼろですが,それ以上にややこしいことを考えてしまって無駄です.
インデントに問題のあるもの: b1506 b1507 b1510 b1515 b1519 b1520 b1528 b1536 b1547 b1552 b1556 b1557 b1567 b1570 b1477 b1281 b1287 b1288
ハイフンラインが無いもの: b1511
学生番号がおかしいもの: b1553
- 初期化
C言語の変数の初期値に関しては統一の規定が無いために,教室環境のように自動的に0を入れてくれるものや,広く普及しているGCC(GNU C Compiler)のように不定のままのものなど,多様な仕様が存在しています.
そのため,みなさんは初期値を入れる(初期化する)こと無しに変数を使うという悪い癖が身についてしまっている可能性があります.これについては,Yahoo知恵袋などでも紹介されていますので,良く読んでおいて,以後は注意してください.
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1421060754
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1449816014
初期化を忘れることを防ぐためには何度も書いていますが,以下のようにオプションを利用してください.
$ cc -Wuninitialized hoge.c
実際に採点する環境はGCCを使用しているので,初期化が行われていないのに複合演算子を使用した場合,間違った答えが出てきます.自分で気づかないうちに減点されるので,うっかりミスは致命的です.
- 前回の復習
配列以前に,変数の値の入れ換えができない人が見られました.値の入れ換えは数値や文字の並べ変えを理解する際の基本ですので,これができないと実際のプログラミング課題に困難が生じます.復習や質問をしっかり行って理解を深めて下さい.
- 文字列配列
C言語では文字列(abc や shimane のような文字の組)は配列
となります.それぞれの文字は配列の要素として利用可能です.文字列に関して
は以下のような注意が必要です.
- ヌル文字
文字列の最後には文字列の終わりを意味するヌル文字 \0 があります.
これは目には見えませんが,必ず付いているものです.ですので,配列の要素の
個数は文字数+1にしておく必要があります.
実際にNULL文字が存在するのかは以下のようなプログラムで確認することが出来
ます.
#include <stdio.h>
main()
{
int i;
char str[4]="abc";
for(i=0; i<=4; i++)
printf("%c", str[i]);
printf("\n");
return(0);
}
|
このプログラムでは,for 文で実際には存在しない配列 str の4文字目までを出力することになっています.しかし,そこにはNULL文字が入っているのですが,NULL文字自体は通常の端末では目に見えません.そこで,標準出力(画面)への出力結果を整形して表示するページャと呼ばれるソフトにその表示処理を預けてみると,確認できます.
$ ./a.out | less
通常の実行コマンドの後に縦棒 | に続けて標準のページャソフトである less を指定することで,UNIXのパイプという機能を使用して出力を渡すことができます.結果はどうでしたでしょうか?
なお,less を終了するには,キーボードから q を入力してください.文字列配列を使用したプログラムの実行は,このように必ず処理を less に渡すようにしてください.これでうっかりミスが防止できます.
- 文字としての数字
見た目には区別しにくいですが,char 型で定義すると数字も文字にな
り,四則演算はできなくなります.注意してください.次の配列は数値です.
int ary[2] = {1, 2};
printf("%d\n", ary[0]+ary[1]);
|
しかし,次のものは文字なので,計算には使用できません.
char str[3] = {'1', '2', '\0'};
printf("%d\n", str[0]+str[1]);
|
- static 宣言
教科書のp.59からは初期化のところで,auto (省略可)と static
の宣言の話が出てきます.この授業の範囲では auto で構
いませんので,特別に宣言することは不要です.
- %s と %c
教科書では配列の要素としての文字列を printf を用いて出力する際
に %s を使用しています.教科書のp.21にあるように,%s
は「文字列」を表示させるものです.一方,文字列の中の「一文字」を出力する
際には %c を使用します.この違いに注意してください.本日の実習
では,%s と %c の両方を使用します.
#include <stdio.h>
main()
{
int i;
char str[4]="abc";
for(i=0; i<=3; i++)
printf("%c", str[i]);
printf("\n");
printf("%s\n", str);
return(0);
}
|
これも以前に書きましたが,二重引用符 " " で囲まれたものは文字列です.ですので,目に見えないヌル文字が最後についています.一方,引用符 ' ' で囲まれたら1文字です.ですので,その場合にはヌル文字はついていません.
- 実習
実習の演習問題予習用はこちらです.
- 次回の予習範囲
次回も文字列です.文字列を集めた配列が2次元配列になることにも注意して予習してください.
- 宿題
授業の終わりに宿題の案内をします.ただし,問題を見ることができるのは19日以降です.レポート提出システムから閲覧してください.
目次ページに戻る