情報処理Ⅱ 2005年1月25日(火) レポート課題2の解説
この解説の読み方 問題文 用意していた解答 別解 解説など 課題の所在 http://www.wakayama-u.ac.jp/~takehiko/ ipii2004/20041221/rook-queen.c.txt
設問1(1) このプログラムファイルはセミコロンが消去されているので,コンパイルに失敗する.セミコロンを補って,正しく動くようにしたとき,補ったセミコロンの数を答えなさい. 54個 前処理の行にはつかない. 関数の終わりの「}」のあとにもつかない. for文では,カッコの中にセミコロンがつく.
設問1(2) またその数であることを(第三者が)確認できる方法をひとつ挙げなさい. Emacsの置換機能(query-replace)で,; を ; に置き換える. [Esc] < [Esc] % ; [Enter] ; [Enter] ! セミコロン挿入前と挿入後の二つのファイルサイズを求め,その差を計算する. ファイルサイズを求めるコマンドは,wc. ファイルを読み込んでセミコロンの数を出力するプログラムを自作する. セミコロンを挿入した各行に,何番目のセミコロンか,コメントをつける.
設問2(1) これは何をするプログラムか,簡潔に記述しなさい. チェス盤にルークまたはクイーンの駒を,それぞれ当たることなく配置するプログラムである. チェス盤の一辺の長さおよび配置する駒の数は,定数TABLE_SIZEにより与えられる. 4×4の盤面に4個のルークを配置する方法は24通り,クイーンは2通りであることがわかる.
設問2(2) ルークの駒の動き,クイーンの駒の動き rook queen
設問2(3) ルークを,当たることなく4個配置した例 クイーンが配置できたならば,それをすべてルークに置き換えると,ルークの配置となる.逆は言えない. ルークは,3個まで置けたら,残り1個の位置は自動的に決まる.クイーンは,3個置いたものの,最後にどこにも置けないことがある. rook
設問3(1) cc -DTABLE_SIZE=6 -o rook-queen rook-queen.c を実行してから./rook-queenを実行すると何が出力されるか,説明しなさい. チェス盤の一辺の長さおよび配置する駒の数が変更され, 6×6の盤面に6個のルーク配置する方法とクイーンを配置する方法が出力される. 上のようにコンパイルすると,rook-queen.cの4行目の評価が(既にTABLE_SIZEが定義されているので)偽となり,5行目の定数定義が行われなくなる.
設問3(2) 盤面と配置の例 5×5にクイーンを 5個置く例 6×6にルークを 6個置く例 rook rook rook rook rook queen rook queen rook queen rook queen rook queen rook 5×5にクイーンを 5個置く例 6×6にルークを 6個置く例
設問3(3) 6を5に変えてコンパイル・実行をするとどうなるか,説明しなさい. ルークの配置の数は,TABLE_SIZEの階乗である. cc -DTABLE_SIZE=6 -o rook-queen rook-queen.c としたとき 6×6の盤面,ルークは720通り,クイーンは4通り cc -DTABLE_SIZE=5 -o rook-queen rook-queen.c としたとき 5×5の盤面,ルークは120通り,クイーンは10通り ルークの配置の数は,TABLE_SIZEの階乗である. クイーンの配置の数は,チェス盤のサイズが大きくなっても,必ずしも増えないことがわかる.
設問4(1) プログラムファイルの中で,除去可能なカッコ(「(」と「)」, 「{」と「}」,「[」と「]」のいずれか.ただし文字列中とコメント内を 除く)を見つけ,何行目のどこにあるかを解答しなさい. 省略できる「(」と「)」 87行目の左から3番目の「(」と,それに対応する「)」のみ省略できる.すなわち, if ((*(p->check))(p)) { は if ((*p->check)(p)) { と書ける. 演算子「->」は,「*」よりも優先順位が高いため.
設問4(2) 省略できる「{」と「}」 21行目の「{」と27行目の「}」 22行目~26行目は「一つの文」だから 22行目の「{」と24行目の「}」 24行目の「{」と26行目の「}」 37行目の「{」と39行目の「}」 48行目の「{」と52行目の「}」 49行目の「{」と51行目の「}」 65行目の「{」と67行目の「}」 ただし,上述のいずれの「{」と「}」も,省略しない習慣にするほうがよい.
設問4(3) 省略できる「[」と「]」 Cの文法上, 「[」と「]」を省略して同じ動作になることはない. このプログラムでは,95行目の「[]」を省略しても問題なくコンパイルでき,正しく動く. main関数の中で,argvを使用していないため.
気になったこと ステープラで右上を綴じているレポートがあった. 標準は「左上」. 標準的な綴じ位置 おかしな綴じ位置 情報処理Ⅱ レポート