こんにちは､ そしてようこそ｡
お前ら､ また挑戦するのか？
自分でもわかっています｡
ループの話が終わったので､ ループを応用してみましょう｡
問題を解決する方法を考えてみよう｡
そこで､ 今回のチャレンジでは､ 数字当てクイズプログラムを作成します｡
かなりカッコよくなりそうです｡
ちょっとしたゲームになりそうです｡
これから起こることは､ あなたのプログラムが0から20までの乱数を生成することです｡
その乱数を生成した後､ それが何であるかをユーザーに推測してもらうのです｡
だから､ ユーザーは0から20までの数字しか入力できないようにする必要がある｡
もし､ 50という数字のように当てようとしたら､ エラーを表示して､
おい､ 0から20までの数字しか入力できないぞと言うわけです｡
それが一つの条件ですね｡
しかし､ ユーザーが実際に推測を行い､ それが有効な推測であった場合､
その後､ 高すぎたのか､ 低すぎたのかをユーザーに伝えることになるのです｡
あるいは､ 正解していたら､ 正解しているから勝てるという表示をする｡
今､ 彼らは正しい数字を当てることができる回数が決まっているのです｡
5回までしか数字を当てられない｡
5回でゲームに負ける｡
だから､ このゲームは正しい数字を当てることが重要なんだ｡
0から20までの任意の数で､ ユーザーからの入力を検証し､ 20から0まで入力されたことを確認したい｡
そして､ もし彼らが何かを入力し､ 5回以下の挑戦しかできなかったら､ 「これは高すぎました」「これは推測される数字より低すぎました」と言うことになります｡
そして､ これらがプログラムの基本的な条件であり､
基本的な数字当てゲームです｡
さて､ 出力はどうなっているのでしょう｡
私がどのようにデザインしたかを知っていただくために､ 以下をご覧ください｡
これです｡ 最初にプログラムを起動したとき､ 小さなメッセージが表示されました｡
これは推測の域を出ないと言ったんだ､ ただ､ 彼らは何が起こっているのか知っている｡
そして､ 「0から20までの数字を選びましたので､ 当ててください」と伝えました｡
残り5回の挑戦で当てることができます｡
そして､ 推測を入力してくださいと言いました｡
推測を入力することになっていた｡
12と入力されたので､ 申し訳ありませんが12は間違いです､ 私の数字はそれより少ないです､
とプリントアウトしました｡
そして､ あと4回のトライが残っていることを表示しました｡
そして､ 彼らは8という推測を入力し､ 私は､ まあ､ 8も間違っている､
私の数はそれ以下だ､ と言いました｡
そして､ 残り3トライと言ったのに､ 4トライを入力されました｡
4は間違いだと言ったんだ｡
そして､ 残り2回の挑戦で､ ようやく私の番号を当て､
それが2だったのです｡
正解の数字を当てたら､ 「おめでとう､ 当てましたね」と言い､
まだ2回トライが残っていたので､ そのゲームに勝ちました｡
基本的なタイプの単純なゲームで､ if文を使ったり､ whileループを使ったりする必要があります｡
つまり､ ユーザーが正しく推測するか､
試行回数が5回を超えるまで入力を求め続けなければならないので､ この中でループを使う必要があるのです｡
ですから､ このようなプログラムを始めるには､ どのようにプログラムを作るかを紙に書き出すのが一つの方法です｡
そして､ その問題をどのように攻略するのかを紙に書き出すと､ 解決しやすくなるので､
そうすることをお勧めします｡
そして､ 疑似コードで書き出すことができるので､
あくまで英語ですが､ どこにループがあるのか､ どこに条件をチェックするためのif文があるのかを特定したいのです｡
なぜなら､ この出力を見ると､ チェックしなければならない条件がたくさんあるのです｡
whileループは条件チェック､ forループは正解か試行回数が5回以上ならループを抜けるかどうかのチェックをしています｡
入力されたものを検証するための条件も用意することになる｡
だから､ ちょっと､ 今､ 数字を入力しましたよ､
というif文があるんですね｡
また､ 0と20の間でない場合は､ ネストされたループが必要な場合があります｡
なぜなら､ あなたが推測した正しい数字ではなく､
有効な数字を入力するまで､ 別の数字を入力するよう求め続けたいからです｡
だから､ このプログラムでは外側のループを見ることができた｡
外側のループは､ 正しい数字を当てることに成功するか､
試行回数に成功するまで数字を入力させるループとなる｡
0から20の間で有効な数字でない場合､ ユーザーに有効な数字を入力するよう求め続ける内部ループを見ることができました｡
そして､ if文を見て､ 基本的に数値が低すぎるか､ 高すぎるか､
等しいかをチェックすることができます｡
外側のループでは､ 正解かどうか､ 数字が等しいかどうかなど､
複数の終了条件があるので､ break文の使用は良いケースかもしれません｡
なぜなら､ break文は複数の出口があるときに使うものだと覚えておいてください｡
そこで､ 外側のループの中に､ 「正しく当てられたら飛び出す」というような仕掛けを作ることができます｡
そして､ whileループやforループの外側のループ自体で､
試行回数が5回以上かどうかという条件xを設定します｡
それがひとつのデザインアプローチです｡
いろいろと申し上げました｡
あとは､ すべてを自由に使えることだ｡
この乱数発生器以外を学んだのなら
これは新しいですね｡
if文やループ､ 変数の宣言など､
いいところは全部知っていますよね｡
ディスプレイに出力する方法は知っていても､ 乱数発生器のやり方は知りませんよね｡
ということで､ そのコードをお渡しします｡
乱数を生成する必要があります｡
なぜなら､ プログラムを実行するたびに､ 彼らが推測できる新しい数字を用意したいからです｡
0から20までの乱数を生成するには､ 次のような手順で行います｡
まず､ stdlibという2つのライブラリを追加でインクルードする必要があります｡ h､ 時間 h.
そこで､ これらのincludeディレクティブをファイルの先頭に追加したいと思います｡
Sdtlib. hを使うと､ 乱数を生成できるsrand関数が使えるようになります｡
時間です｡ h では､ 乱数の種を時刻で指定することができ､ 現在の時刻を取得することができます｡
ですから､ プログラムの外側に追加のライブラリを入れるということは､ 何らかの追加機能を実行したいことを意味しているに過ぎません｡
cに付属する標準的なライブラリのすべてについて話をしたわけではありませんが､
現在時刻を取得するためのものと､ これから使う乱数を生成するための2つの素晴らしいライブラリが付属しています｡
そこで､ この最初の2つのディレクティブを先頭に含んでいます｡
それから､ メイン関数の中にtime_tという変数を作ります｡
tという名前をつけるだけでいいので､ それを追加します｡
time変数を追加したら､ srand関数を使って乱数発生器を初期化することができます｡
それで､ どうするかというと､ スランドと言うわけです｡
これはランダムジェネレータの種を提供し､ 初期化に使用されるだけです｡
そして､ この行をコピーして､ srand ((unsigned)) と time､ そしてアンパサンドtを渡すだけです｡
このコードが何をするのか理解する必要もなく､ ただコピーして貼り付けるだけです｡
しかし､ これはランダムを生成しているのであって､ 乱数発生器を初期化しているのです｡
乱数発生器を初期化した後､ 数字を生成する必要があります｡
そして､ 数字を生成するためにすることは､ randと言い､
randという名前の関数を呼び､ %21と言う｡ これは0から21の間になるようにするためのモジュールで､
ハードコードされた21を使っています｡
その乱数を整数に格納し､ その数値と比較して､ 正しく推測できたかどうかループを抜けるようにします｡
また､ 印刷が低すぎるか高すぎるかを判断するために､
uhと比較する数字になります｡
だから､ これはとても楽しいことなんです｡
繰り返しになりますが､ if文､ ループの構成､ break文､
内側と外側のループ､ 入れ子のループなど､ 多くの素晴らしい概念に触れることができます｡
では､ 頑張って､ 楽しんで､ 次回の講義で解決策を提示します｡
ありがとうございます｡