わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

プログラミング課題,新作4つ(1/2)

 年内最後の授業を終えました.
 Cプログラミングの科目です.シラバスでは「プログラミング活用1」と書いていました.
 先週までで,最低限知っておくべきCプログラミングの内容を終え,今回からは,いわば応用です.
 この機会に,学んでほしいことの1番目を,「反復処理により,答えに近づいていくこと」と設定しまして,授業で4つのプログラムを作成してもらいました.
 本日は,4つのうちのはじめの2つを取り上げます.この2つは,「二分探索」に基づいたプログラムです.
 最初のものは,授業前日23:59を提出期限とした予習課題で,プログラムコードなしで検討をしてもらいました.出題は次のとおりです.*1

 AliceとBobの二人で「数当てゲーム」をします.
 はじめに正の整数nを決めて共有しておき,次にAliceが1以上n以下の整数を1つ選び,紙に書いてBobに見せないようにします.
 Bobは1以上n以下の整数を1つ言います.Aliceはそれを聞いて,選んだ数と比較し,「大きい」「小さい」「同じ」のいずれかをBobに言います.「大きい」「小さい」の主語は,Bobが言った数です.例えばBobが「62」と言い,Aliceの選んだ数が「59」だったとき,Aliceが言うのは「大きい」です.2つの数が反対だったら,「小さい」になります.
 「大きい」または「小さい」のとき,Bobはまた別の整数を言います.
 二人でやりとりを行い,Aliceが「同じ」を言ったときには,紙に書いた数を2人で見て確認し,1回のゲームは終了です.
 1回のゲームで,Bobは,数を言う回数(試行回数と呼びます)をできるだけ少なくすることとします.
 n=99のときのBobの方針(最初にどの数を言い,Aliceの返答に対して何を言うか)を説明し,試行回数の最大値を答えなさい.

 解答と,ソースコードは…来年度以降も使用するかもしれないので,差し控えたいと思います.上記の中で,言葉の選択に迷ったのは,「方針」です.当初,ここに「方略」と書いていましたが,ふだん使わない言葉です.「方針」「概略」「ストラテジ」「アルゴリズム」「手続き」などを思い浮かべて,最終的に「方針」にしました.
 2つめのプログラム例題は,二分探索を使用した,文字列配列の検索です.配列には,"Akita"から始まって"Yamaguchi"で終わる,都道府県名のローマ字表記を辞書式順序で並べたものを格納しておきます(ただし,これを打ち込ませるのは苦行でしかありませんので,課題提出のページから,配列宣言をコピーできるようにしました).scanf("%9s", input);で獲得する入力語と,一致する文字列が,配列のどこにあるか,またはないかを,最終的な出力とします.
 数当てゲームでは,ルールに従ってプレイしていれば必ず「同じ」に至るのに対し,2つめの検索プログラムでは,そうとは限らないという特徴もあります.文字列を対象とした,「大きい」「小さい」「同じ」の判定については,ライブラリ関数のstrcmpを使用しました.

*1:二人で行う「おはじき取りのゲーム」は,第3クォーターのプログラミング科目の第7回の予習課題でした.予習課題にはAlice・Bobの名前を使用せず,授業資料のスライドで表示させました.