情報処理II

情報処理Ⅱ
第14回
2006年1月23日(月)
本日のスケジュール


14:50~14:55 … 復習問題
14:55~15:30 … おさらい問題




何でも参照可.周りと相談可.質問可.
採点の対象にはならない.
15:30~16:15 … おさらい問題の解説
16:15~16:20 … 試験について
2
本日授業を欠席した人へ

1年生・再履修者共通


配布資料を渡すので,A-510まで
• Webでも読める
• 来る場合,メール連絡あるとありがたい
再履修者で,月7・8限に授業がある人


口頭で,本日の課題を指示するので,メールで回答すること.
1年生と,再履修者でもA-510まで配布資料を取りに来ない
人からは,回答メールがあっても出席点としない.
3
試験の心構え

しっかり準備をする.



Webページの復習問題には目を通しておく.
プログラムコードを見て,出題意図を把握する.


特に,「データ型の表現できる範囲」「演算子の種類と優先順
位」「配列とポインタの使い分け」を理解しておく.
何の話(2重ループ,文字列,関数と変数,再帰)か?
プログラムコードを見て,日本語で説明できるよう,訓練する.


何をするプログラムか?
何をする関数,変数,型か?
4
大問3の解説(1)

解答例


29行目を return 0; とする.
コメント


関数が,値を返して関数処理を終了するとき,
return(値); または return 値; と書く.
returnは関数ではなく制御文のキーワードであることに注意.
コンパイルエラーがあったら,問題のある「行番号」だけでなく,
コンパイラが出力している「識別子」にも注意する.
5
大問3の解説(2)

解答例


先頭から順に見ても,末尾から逆順に見ても,同じ文字の並び
になる文字列.
コメント


「palindrome = 回文」で安心しないこと.
プログラムの動作説明は,40字程度の1文で書けるようにしよ
う.
6
大問3の解説(3)

解答例



./palindrome aba Yes
./palindrome Yes NooN
コメント


「この入力には何を出力するか?」は試験に出さない.
出力を見て,「どんな入力を与えたらその出力になるか」を考え
ること(未知のプログラムを実行するときにも重要).
7
大問3の解説(4)

解答例


2行目は前処理指令の一つであり,11行目でライブラリ関数
の strlen を使用するために記述している.
コメント

「ライブラリ関数」については,それを使うためにインクルードす
べき「ヘッダファイル」も合わせて理解する.
• 入出力:stdio.h
• 文字列:string.h
• 文字情報:ctype.h
• その他有用な関数:stdlib.h
8
大問3の解説(5)

解答例



変数pは,文字列(コマンドライン引数の各語)が与えられるた
びに,その先頭を参照するポインタ変数であり,26行目でその
文字列を出力する際までその値を保持する.
変数qの初期値はpと同じ文字列の先頭であるが,14~19行
目で回文の検査をする際,一つずつ次の文字を参照していく.
コメント


変数名,関数名,プログラムを主語とした書き方に慣れること.
二つのものが指定されているとき,その違いが際立つように説
明する.
9
大問3の解説(6)

解答例


誤答例


while (q < r && *q == *r) {
while (q < r && *q != *r)
コメント


C言語の多彩な演算子を確認する.ただし丸暗記する必要は
ない.
forやwhileの条件は,反復を打ち切る条件ではなく,反復を
維持する条件である.
10
大問2の解説(1)

解答例


0
2
4
6
8
1 2 3 4
3 4 5
5 6
7
コメント


ループの変数の範囲に注意すること.
「i + j」が別のものに変わっても,出力内容が答えられるよ
うに.
11
大問2の解説(2)

解答例


誤答例


W a k a
W a k a y
コメント

文字列を参照するポインタ変数pについて
• 「*p」は参照先の値(文字)
• 「p++」は参照位置を次(右)に進めること
• 「p--」,「p+=2」は?
12
大問2の解説(3)

解答例


x = 1, y = 2
x = 1, y = 2
コメント

swap関数内の変数x, yと,呼び出し側のそれらは別物
• 呼び出し元のx, yの値は,swapのx, yに渡される.
• swapのx, yの値は,呼び出し元に返らない.
13
大問2の解説(4)

解答例


x = 1, y = 2
x = 2, y = 1
コメント


呼び出し元の「swap(x, y);」は,「{int tmp = x; x =
y; y = tmp;};」に置き換えられる.
• tmpは,そのブロックの中だけのローカル変数.
• 最後のセミコロンは,空文であり,文法上問題ない.
関数形式マクロと関数プロトタイプを理解しておくこと.
14
大問2の解説(5)

解答例


factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
120
コメント

再帰の打ち切り条件に注意(この問題では,factorial(1)
からfactorial(0)を呼び出すことはない).
15
大問1の解答
(1) ②
(2) ③
(3) ①
(4) ②
(5) ①
(6) ②
(7) ②
(8) ①
(9) ②
(10) ①
(11)
(12)
(13)
(14)
(15)
①
②
②
①
②
16
大問1の解説





(3)0.1は,有限桁数の2進数で誤差なく表現できない.
(6)単項演算子は「++」と「--」に限り,オペランドの右にも付
けられるが,左に付けるのと効果が異なる.
(11)関数や変数が増えると,オーバーヘッドが生じて,処理
速度は低下する.(しかしそれは,現在のハードウェア・ソフト
ウェア技術からすると微々たるものである.)
(15)構造体に限らず,「関数内のauto変数のオブジェクト
のポインタを返す関数」を定義してはならない.
コメント



授業で見聞きしたことを思い出す.
おさらい問題の問題文は,本番でも,表現を変えて出題するか
もしれない.
迷ったら,「プログラミングの心がけ」で選ぶ.
17
試験について

実施上のルール



配点


日時:2月3日(金)13:10~14:40
持込:自筆ノート1冊と,C言語の書籍1冊のみ可
• 「用紙1枚」は不可(カンニング防止のため).
本やノートへの挟み込み,糊付けも不可.
• 「ルーズリーフ」は,バインダに綴じており,試験中取り外さ
ないなら可.
出席:5点,レポート:10点×2,試験:75点
解答解説など

2月6日(月)ごろにWebで公開する.
18