- 本日の作業内容
- アンケートについて
教育開発センターより1年生に対してメンター制度を含む学習支援に関するアン
ケートを依頼されていますので,授業時間中に記入して提出してください.
- メンター学習室について
今週もメンター学習室は水曜日と金曜日の4コマ目に開設されます.期末試験前
の最後の機会ですので,実習課題など良くわからない部分をしっかり学習してく
ださい.
- 小テストの結果について
提出されたプログラムですが,コンパイルエラーや実行時にセグメンテーション
フォールトで落ちるものなどがたくさんありました.以前から言っているように,
実行できないプログラムは採点できませんので,提出をしないで下さい.小テス
トは出席表明では無いので,無駄な提出は要りません.
以下は解答の中の問題となるポイントを列挙したものですが,いずれも今後とも
出そうなものなので,各自理解して注意して下さい.
Hello world!\ufffd\u96c0\ufffd$ESC"\u30a8\ufffd^A \ufffd\u96c0\ufffd$ESC"\u30a8\ufffd^A
|
配列の要素の無い部分を無理矢理表示させようとして,値が無いために変なバイ
ナリーデータが表示されている例です.実際の画面では漢字混じりのぐちゃぐちゃ
な文字が出ています.
for(i=0; i<=15; i++){
printf("%c" ,a[0][i]);
}
|
これも同じような例なのですが,配列の文字数を超えて出力させたため,以下の
ように変な文字が付いて来ています.
これは画面に出ているそのままですが,実行画面にこれが出たら減点対象なので,
注意して下さい.
char str[19]= "\"Hello, world!\"";
|
これは出題の意図を正しく理解していないものです.Hello, world!
という文字列を配列の要素に指定したのに,2重引用符まで要素に入れています.
static char a[14] = "Hello, world!";
printf("\"%13s \"\n", a[14]);
|
これも同じようなものですが,要素の文字数が13しか無いのに,配列の14番目の
要素(NULL文字よりもさらに後)を表示させようとしているので,要素が無いこと
になっています.また,%s で表示させようとしているので,上の例と
結果が違って下のようになっています.
括弧に囲まれた null は文字列を表示したのではなく,要素が無いこ
とを教えてくれているものです.
printf("Hello,world!\n");
|
これは絶対にやっちゃダメ,なやりかたです.多少なりともプログラムの基本部
分が正しくなっていれば部分点をつけることもありますが,このようにまったく
問題の趣旨に反して,結果だけつじつまあわせするものは0点です.
printf("%14d\n",a[1][14]);
|
文字列を表示するのに,%d という整数値表示の記号を使用しています.
これもまた文字数が表示命令と合っていない例で,最後に変な記号が表示されま
す.また,配列の要素が0番から始まることを忘れて,1番目の要素から表示する
ようにプログラムされていたので,先頭の H が抜けています.
- 宿題の結果について
いつものように問題のある答案の例です.参考にしてください.
printf("\n");
for(i=1;i<=7;i++){
b=rand()%7+1;
for(j=1;j<8;j++){
if(d[j]==b){
b=rand()%7+1;
j=0;
}
}
d[i]=b;
printf("%c",a[b-1]);
}
|
不要な2重のループや if 文が使用されています.冗長です.
for(i=0;i<=7;i++){
a = rand() % (8-i)+i;
printf("%c",kazu[a]);
kazu[a] = kazu[i];
}
|
上のものは正しくシャッフルされていません.上書きしているだけなので,文
字の重複や不足が生じます.
for(i=0; i<=8; i++){
a=rand() % (9-i)+i;
printf("%c", kazu[a]);
kazu[a]=kazu[i];
}
|
文字の入れ換えでなく上書きになっているので,こちらも文字の過不足が生じま
す.
for(i=0; i<=5; i++){
j = rand() % 6;
num = str[i];
str[i] = str[j];
str[j] = num;
}
|
発生させる乱数の範囲が毎回同じなので,厳密なシャッフルになっていません.これは
確率的には全く元の文字列と同じに戻ることもありえます.
for(i=0;i<7;i++){
for(j=0;j<7;j++){
ran1=rand()%2;
if(ran1==0){
tmp=str[i];
str[i]=str[j];
str[j]=tmp;
}
}
}
|
これも最初のものと同じように冗長です.
for(i=0;i<9;i++){
printf("%c",str[i]);
}
printf("\n");
for(i=0;i<9;i++){
a=rand()%(9-i)+i;
b=str[i];
str[i]=str[a];
str[a]=b;
printf("%c",str[i]);
}
|
何度指摘してもインデントの直らない人がいます.
static char a, str[7]={"nawate"};
|
この授業の受講者にはnawateさんが2人いたようです.
char str[6]="abcde";
for(i=0;i<=5;i++)
printf("%c",str[i]);
|
これが小テストの部分にも書いておいた問題のあるものです.文字数が5なのに for
文で6個の出力を指示しているので,最後に ^@ が表示され
るのですが,GNOME端末で実行するだけでは「見えない」のです.注意して下さい.今回
の宿題でも大量に出ました.
NULL文字のような空白文字を表示させるには,以下のように実行して確認すると
良いです.
$ ./a.out | less
less というのは長いテキストを1ページずつ表示してくれるフィルタ
型のソフトです.縦棒 | は「パイプ」といって,前のコマンドの実
行結果を後ろのコマンドに渡してくれるものです.
less コマンドは実行するとページを表示したままになりますので,終
了するためには q をキーボードでタイプしてください.
- 前回の復習
- 要素の個数
配列の要素の個数に関する混乱が多く見られました.また,添字と個数の違いも
問題となりそうな人が多くいるようです.次のような注意が必要ですので,気を
付けてください.
int ary[5] = {0, 1, 2, 3, 4};
|
のとき,配列の要素の総数は5個ですが,最後の要素は「4番目」です.先頭が0
番目であることを常に意識してください.一方,
のとき,要素の個数は5個ですが,最後の要素はNULL文字( \0 )である
ので,文字の総数は4文字です.なので,配列の「最後の文字」である d
は「3番目」の要素です,それを表示しようと思うと,
for(i=0; i<=3; i++)
printf("%c", str[i]);
|
のように変数 i の範囲を0から3にしておかなければいけません.
- NULL文字
教科書のp.67に文字列の配列の作成法の基本として,
とありますが,これが基本で一番わかりやすいので,この方法を使用するように
しましょう.なぜなら,p.66にあるような1文字ずつの要素定義では,
m[5] = {'b', 'o', 'o', 'k', '\0'};
|
のように,必ず最後にNULL文字 \0 が必要になるのですが,これを忘
れると画面に変な文字が出てくるからで,余計な心配をしなくても良いように,
2重引用符で囲む形の方を使うことをお薦めします.
m[4] = {'b', 'o', 'o', 'k'};
printf("%s\n", m);
|
で試してみましょう.
- 文字コード
前回の実習で教科書のp.143から始まるASCIIコード表を利用する問題を出しまし
たが,教科書の例題2.4の記憶がまったく抜けている人が実に多くいました.授
業は,内容の積み重ねでどんどん発展していくので,習ったことは復習を通して
しっかり身につけておいてください.
で,実際にやることは単純で,
のように,printf の中において,%c に数字を渡してやれば,
その数字を文字コードと理解してその文字を表示する,ということだけです.上
の例では,97を渡していますが,これはアルファベット小文字の a に
なります.この部分は変数であっても,配列の要素であっても構いません.
- 期末試験の準備
来週はいよいよ期末試験です.本日は,そのための模擬テストの形式で,解答用
紙の利用法を実習課題で学習します.それ以外の注意事項は以下のようになりま
すので,よく読んでおいてください.
- 試験時間について
解答準備や退室作業などありますので,実際の試験時
間は80分になる予定です.
- 遅刻について
C7クラスの人は16:10分までに入室できるよう準備しておいてください.それ以
降の入室また遅刻は認められませんので,遅れないように注意してください.
- 途中退室
C6クラスの人は途中退室は出来ませんので,最後まで720教室に居てください.
気分が悪くなった場合には別途対応しますので,その場合には手を挙げて教えて
ください.
- 携帯電話について
携帯電話は電源を切って鞄の中に入れておいてください.鳴動したり
すると不正行為とみなしますので,注意してください.
- 電子メールについて
解答用紙の提出は電子メールで行いますが,電子メールの利用は提出時(試験終
了5分前)に限定します.その時間以外に電子メールアプリが起動している場合に
は不正行為とみなしますので,注意してください.
- クラス入れ換え
C6クラスの試験が終了すると,受講生全員前のスペースに集合してもらいます.
そして,前の扉からエレベーターホールの方向へのみ移動可能ですので,東側エ
レベータもしくは非常階段を使用して移動してください.
C7クラスの人は必ず西側のエレベータを使用し,C6クラスの試験終了後,教室後方のドアが開いたら入室を開始し
て,後ろのスペースに待機していて下さい.C6クラスの学生が退室した後に着席
可能です.
- 履物
C6クラスの人は入室時に履物を教室前方の三和土に置くか,自分で保管するようにしてください.退
室時には下足箱の方には進めません.
- 提出時間厳守
試験終了の合図をして以降の解答の提出は認められませんので,必ず時間内に提
出してください.
- コンパイル不能および動作不能の答案について
コンパイルできない答案や,動作させると適切に動かない,終了しないなどの不
備のある答案は採点しませんので,注意してください.
- 解答用紙
解答用紙自体がC言語のプログラムにすで
になっていますので,扱いに注意してください.
学生番号と名前は試験前にあらかじめ準備しておいてください.また,コメント
行の部分も消さないでください.もちろん,printf の行は消してはダ
メです.
- 提出方法
提出方法はいつもの通りです.件名が違っていると採点しませんので,そこも注
意してください.今回の件名は以下のようになります.
test_c6_120213_s1140** (C6クラス)
test_c7_120213_s1140** (C7クラス)
- 実習
実習の演習問題は当日ご案内します.