情報処理II

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