情報処理Ⅱ 2007年2月2日(金)
本日のスケジュール 13:10~13:20 … 復習問題 13:20~13:25 … どうしても話しておきたいこと 13:10~13:20 … 復習問題 13:20~13:25 … どうしても話しておきたいこと 13:25~13:55 … おさらい問題 何でも参照可.周りと相談可.質問可. 採点の対象にはならない. 13:55~14:35 … おさらい問題の解説 14:35~14:40 … 試験について
どうしても話しておきたいこと size_t 「バイト数」を表すデータ型 用途 sizeof演算子で得られる値の型 void *malloc(size_t size); size_t strlen(const char *s); など,バイト数が関わるライブラリ関数の引数・戻り値の型 例えば「typedef unsigned size_t;」と定義されている. 符号なしの整数型と思えばよい.
試験の心構え しっかり準備をする. Webページでは,授業スライドだけでなく,復習問題にも 目を通しておく. 特に,「演算子」と「配列とポインタの違い」を理解しておく. Webページでは,授業スライドだけでなく,復習問題にも 目を通しておく. プログラムコードを見て,日本語で説明できるよう,訓練する. 何をするプログラムか? 何をする処理,関数,変数か?
大問3の解説(1) 解答例 コメント 35行目を char *p = argv[i]; とする. 代入は,左辺が何型か,右辺が何型かチェックする. コンパイルエラーがあったら,問題のある「行番号」だけでなく,「識別子」にも注意する.
大問3の解説(2) 解答例 コメント 先頭何文字かの2回以上の繰り返しで構成される文字列 プログラムの動作説明は,短すぎても長すぎてもよくない. 30~40字程度で書けるようにしよう.
大問3の解説(3) 解答例 コメント ./iterative Yes YesNoYes 「この入力には何を出力するか?」は試験に出さない. 出力を見て,「どんな入力を与えたらその出力になるか」を考えること(未知のプログラムを実行するときにも重要).
大問3の解説(4) 解答例 コメント 使用しているライブラリ関数はstrlen, printf 1~2行目はともに前処理指令であり,1行目はprintfを,2行目はstrlenを使用するために記述している. コメント 「ライブラリ関数」については,それを使うためにインクルードすべき「ヘッダファイル」も合わせて理解する. 入出力:stdio.h 文字列:string.h 文字情報:ctype.h その他有用な関数:stdlib.h
大問3の解説(5) 解答例 コメント r q s p 'W' 'a' 'W' 'a' 'W' 'a' '\0' 配列(特に文字列)と,その中を指し示すポインタの関係は,図示できるようにすること. 文字列を図示するとき,ヌル文字('\0')を忘れないように. r q s p 'W' 'a' 'W' 'a' 'W' 'a' '\0'
大問3の解説(5) 別解例 100: 'W' p = 100 101: 'a' q = 102 102: 'W' r = 100 103: s = 106 104: 'W' 105: 'a' 106: '\0' もちろん,試験の答案で色をつける必要はない.配列とポインタの区別 (箱の大きさなど)はあってもよい.
大問3の解説(6) 解答例(関数) int aliquot(int x, int y) { if (x % y == 0) { return 1; } else { return 0; } } コメント それぞれの仮引数の前に型を書く(「int x, y」は間違い). 「関数プロトタイプを記述しなさい」と間違えないこと.
大問3の解説(6) 解答例(関数形式マクロ) コメント #define aliquot(x, y) ((x) % (y) == 0) それぞれの引数の前に型を書いてはいけない. 置換内容には,それぞれの引数と,全体に,カッコをつける.
大問3の解説(7) 解答例 9行目を,「if (!(*p == *q && aliquot(strlen(p), q - p))) {」に置き換える. コメント プログラムの書き換え問題も出題する. 関数を新たに作って呼び出すとき,引数の対応づけ,演算子の優先順位に注意する. strlen(p)により,文字列pの長さが得られる. q - pはポインタ同士の減算で,配列の何要素分,離れているかが分かる. カッコ閉じが連続して並ぶとき,カッコが正しく対応しているか,常にチェックし,除去できないことも確認すること.
大問2の解説(1)~(5) 解答例 コメント (1)構造体 (2)下線記号 /アンダースコア / アンダライン / _ (3)return / if以外の予約語であれば何でもよい (4)英字の大小を区別する (5)ブロック コメント 「識別子」がテーマであるが,構造体や変数の話題も含めた文章にしている.広く浅く,授業で出たことを確認するとよい.
大問2の解説(6)~(10) 解答例 コメント (6)ストリーム (7)ヌル文字 / '\0' / ナル文字 (8)FILE (9)EOF (10)int コメント 「ファイル処理」がテーマで,文字列や型の話題も含めている.大文字小文字を間違えないように. バイト列を読み出しても,fgetsなどの「ライブラリ関数」は ヌル文字をつけることがある.
大問2の解説(11)~(15) 解答例 コメント (11)交換 (12)値渡し (13)char *x, char *y (14)& (15)ポインタ変数が指し示す値 コメント 「関数の値の受け渡し」がテーマ.参照渡しをするときは,ポインタの知識も不可欠である.
大問1の解答 (1) ② (2) ② (3) ② (4) ① (5) ① (6) ① (7) ② (8) ② (9) ① (10) ②
大問1の解説 (4)式の評価,暗黙の型変換,結合規則(結合の向き)に関する問題に答えられるようにすること. (7)NULLは「無効な値」を表す空ポインタ定数である. (9)クイックソートを再帰呼び出しなしで,単純選択法を再帰呼び出しを使って書くこともできるが,「プログラミングの心がけ」として,「クイックソート⇒再帰」と覚えておく. その他コメント 授業で見聞きしたことを思い出す. おさらい問題の問題文は,本番でも,表現を変えて出題するかもしれない.
試験について 実施上のルール 配点 解答解説など 日時・場所:2月9日(金)13:10~14:40 A203 日時・場所:2月9日(金)13:10~14:40 A203 持込:自筆ノート1冊と,C言語の書籍1冊のみ可 「用紙1枚」は不可(カンニング防止のため). 本やノートへの挟み込み,糊付けも不可. 「ルーズリーフ」は,バインダに綴じており,試験中取り外さないなら可. 配点 レポート:10点×2,試験:80点 解答解説など 試験問題,おさらい問題と合わせて, 2月13日(火)ごろにWebで公開する.