C言語学習 whileでのループとswitchの分岐 | 風はぐるぐる 横寄

風はぐるぐる 横寄

女装を世の中に広め、男性のファッションとして定着させる!
”女装の伝道師”toメイドのブログ
Unityを使用したゲーム制作もしています。

今回は更に進んでループの処理と、ユーザーからの入力による分岐をやった。

と、その前に。
少し記述が変わってるので、その点を。

scanf()関数→fgets()関数に変更:
公開するためのプログラムでscanf()を使うのはやめた方がいいらしい。
なんでも、参考書等でscanf()関数を使っているのは説明する側が楽なのでそのようにしているだけなんだとか。

ユーザーに入力をさせるならgets()関数を使う……という情報があったものの、こちらも現在は使用が推奨されていない。
gets()関数は使えないわけではないけど、文字数の制限云々の関係で使い勝手がよくないらしく……
(実際に実行しようとすると、エラーにはならないが警告がでる)

最終的にfgets()関数を使用することになった。


ということで、ループのwhileと分岐のswitchを使用して処理を記述。
(プログラムが長くなってきているので、今回からは重要と思われる部分のみ掲載)


whileのループ条件は常に真を意味する1 (※1) とし、無限ループに。

fgets()関数でユーザーからの入力を受け取り、sscanf_s()関数で数値に変換し、int型の変数iに代入。
(変数iを使用するため、上の行に宣言を追加しています)

入力を受け取る変数selはchar型、要素数50の配列に変更。

(fgets()関数は受け取る値が文字列──つまりchar型なので、数値を扱う場合はint型に変換する必要がある。
ので、下にsscanf_s()という型変換の関数を記述して数値……int型に変換している)

代入された変数iを元にswitch文で分岐。


受け取った値が半角数字の1、2、3、4、5、であれば各数字を選択した旨の文を表示してbreakでswitch文を抜ける。
switch文の次にあるbreakによってwhileによるループを抜けてプログラム終了。



それ以外の数値ならエラー文を表示して再度入力させる(continueで処理を中断し、ループの最初……fgets()関数に戻る)。
全角で入力した場合や何も入力しなかった場合も同じようにエラーで弾く。


これで1~5の各分岐の部分を乱数によって決定される数値を判定するプログラムに書き換えれば、とりあえずゲームっぽくはなると思われる。


switch文以外にやってみたこと。

最初は全てif文で記述してみた(※2)。
結論からいうと、複数の条件による複数の分岐でこの方法はめんどくさい。
数値が1より小さい時、または5より大きい時はエラーを表示、1~5の範囲内ならその値を元に分岐云々……

記述自体が長くなる上にプログラムがめちゃくちゃで非常に読みづらくなった。
更に条件が重なってる部分があったのか、思うように分岐してくれない。
極めつけには例外実験で全角文字を入力したらエラー文(Visual Cによるものではなく、自分が記述したエラー文)のところでループしまくり、暴走状態になった。
(コードは削除したので試した証拠はなくなってしまったけど……)

と、このようにいいことなどまるで無かったので、単純に処理ができると思われるswitch文を使った。


今回はここまで。
次はswitchでの分岐の部分を乱数によって決定された数値を参照するものに書き換えて、正解か否かを判定するようにしてみる。
……結局判定はまた次になってしまったorz


※1 条件にあてはまる、という意味。
while文は条件にあてはまる限り繰り返し実行されるので、常に条件にあてはまる……つまり無限ループとなる。
(この場合はループ終了のきっかけのようなものを作るため、文中のどこかに必ずbreakを入れないと、×ボタンで閉じない限り終了することができなくなってしまうので注意が必要)

補足(のようなもの)。
プログラムでは条件の成立・不成立を1と0で表すようになっていて、1が真=あてはまる、で0が偽=あてはまらない、という意味になる。
(場合によってはtrueとfalseが使われることもあるけど、大抵は1と0で表される)

豆知識(?)
ちなみに、スイッチのオン・オフでもこの1と0が使われる。

オンなら1で、オフなら0。
パソコン等の電源ボタンの付近に、○に縦棒が突き刺さったような記号らしきものがあると思うけど、これは上記の1と0が由来になっている。
(これは学生時代にパソコン関係の授業で聞いた覚えがある)

ゲームでのフラグ関係にもこのやり方が使われている。

それ以前に、コンピュータというものは処理を1と0でしか表現できないという特徴があるけど……ここでは割愛する。


※2 一見すると無意味で時間が無駄になると思えることでも、敢えてやってみるようにしている。
今回のif文を例にすると、if文で記述するという事がどれだけ面倒で時間のかかることなのか……実感というか、自分の身をもって思い知るために敢えてやった。
そうすることで「ここでif文を使うのはマズイな」とすぐに判断できるようになると考えている。
(人間は身をもって経験しないと、想像だけでは分からない、頭に入りにくい。いちばん早いのは実際にやってみること、経験してみることだ、とどこかで聞いた記憶がある)

自己鍛錬というか「とりあえず経験はしとこう」という……よくわからないけどそんな感じ。