【9時間目】条件分岐のif文
条件分岐(じょうけんぶんき)は、C言語だけでなく、すべてのプログラムにおいて超基本的な要素です。しっかりとマスターしましょう!
trueとfalse
プログラミングで条件分岐をやる前に、必ず知っておかなければならないことがあります。それは、true(トゥルー)とfalse(フォルス)です。意味合い的には、例えば「Yes」と「No」とか、「はい」と「いいえ」とか、などと表せると思います。
C言語の発展プログラミング言語に、「C++」というのがありますが、C++では、true、falseをプログラムで直接書くことができます。しかし、C言語ではtrue、falseというキーワードは用意されていません。そこで、C言語での「はい」、「いいえ」の判定の仕方に、「1」か「0」かという方法が使われます。
基本的な使い方
基本形はこの形になります。一行目はif(条件文)と書きます。これがif文です。条件文とありますが、これは例えば「変数hogeの中身は3か?」とか「変数fooは変数hogeよりも小さい数字か?」などといった「はい」か「いいえ」で答えられる疑問文が与えられます。
そしてそのあと、「はい」の時に実行してほしい部分を{ ... }で囲みます。
もしも、「いいえ」の時に実行してほしい部分があれば、そのあとにelse { .... }を付けることができます。else(エルス)文と言いますが、これは省略することもできます。
条件文はどう書くの?
条件文は、基本的には二つの値を比較します。これが一番簡単な使い方でしょう。ではまず、比較演算子(ひかくえんざんし)というのを下に示しましょう。
記号 | 意味 | 使い方 |
---|---|---|
== | 等しい | A == B |
!= | 等しくない | A != B |
< | 右が大きい | A < B |
<= | 右が大きいか等しい | A <= B |
> | 右が小さい | A > B |
>= | 右が小さいか等しい | A >= B |
ざっとこんな感じでしょうか。「等しい」のイコールは2つ(==)必要だということを忘れないでくださいね。
習うより慣れよ、実際にコードを打ってみよう。
では、前回までで金額を入力してもらいましたが、その金額に応じてなにか動作を変えるプログラムを作ってみましょう。
例えば、持っているお金が1000円だけだったとしましょう。では、税込みで1000円以上だと「お金が足りません!」と教えてくれるようにコードを変えてみましょう。前回のプログラムにif文を追加します。
条件文zeikomi > 1000となっていますね。つまり、変数zeikomiの中身が、1000よりも大きいか?と聞いて、「はい」ならそのあとの{ ... }を実行します。つまり画面に、「お金が足りません!」と表示してくれます。もし、「いいえ」なら、つまり1000以下だったら、今回はelse文を書いていないので、何もせずにif文を通過します。では実行してみましょう。
ちゃんと、1000円を超えてしまったときは「お金が足りません!」と教えてくれるようになりましたね。これでプログラムは少し優秀になりました!
エラーチェックをしてみよう
scanf関数を勉強したときに「試しに文字を入れたらどうなる?」という話をしましたね。では、もう一度試しに文字を入れてみましょう。
このように0円で計算されています。zeinuki変数を0で初期化してたからですね。またさらに、「マイナスの値を入れてみたらどうなる?」というのもやってみましょう
このように問題なく計算できてしまいます。そこで、zeinukiが0以下の数字の場合、「正確な値を入力してください」とエラーメッセージを出すようにプログラムを変えてみましょう。
さて、みなさんはどういったコードを書いたでしょうか。いろいろな書き方はあると思いますが、私はこのようなコードにしました。あえて、「zeinukiが0以下」を「zeinukiが0より大きくなかった場合」としています。最初は素直にこの逆を書いても大丈夫です。if文の書き方になれるのが第一です。では実行してみましょう。
これで文字を入れたときも、マイナスの数字を入れたときも、エラー文を返すようになりましたね。これでプログラムはバグにも強くなりました。どんどん機能が広がると楽しいですね。
さて、C言語に限らず、こういったプログラミングには「何通りかの書き方」が存在します。外見上動きはするものの、書き方によっては「時間がかかる」ものや、「メモリをたくさん使う」などといった差が生じてくるのもあります。プログラマーは常に、特にC言語を扱うものとしては、「できるだけ速く」、「できるだけ省メモリで」を目指してプログラミングしています。
しかし困ったことに、ほとんど「時間」も「メモリ量」も変わらないけど、何通りかの書き方ができるときもあります。この時は最後、「コードの可読性」、つまり他人がそのコードを見たときにできるだけ読みやすくわかりやすく、というのを目指すようになっています。一番わかりやすいのは「変数の名前」ですよね。変数名hogeと変数名zeikomiと変数名zeikomi_kingakuを比べてみましょう。まずhogeは最悪です。全くもって意味がわかりません。zeikomiで、税込みの金額かな?と推測できるでしょう。しかし、「税込みの…何?」と言われるかもしれません。zeikomi_kingakuとしておけば、一目で、「ああ、税込み金額ね」と理解できると思います。
プログラムはたくさんの人が書いていて、それぞれがどんな名前を付けるか、どんなif文を書くか、いろいろバラバラだと思います。そして、「なぜそんな名前を付けたの?」とか「なぜそうif文を書いたの?」と聞けば、「○○だから」と必ず答えが返ってきます。その感覚が自分と違えば、度々、宗教戦争に発展します。
そこで、例えば会社などでひとつのソフトを作り上げるときに、それらの書き方を定めて、それに従ってプログラミングしよう!ということがあります。これをコーディング規約やスタイルガイドなどと呼びます。あのGoogle先生もスタイルガイドを公開しています。どう書こうか細かいことで迷ったらぜひ参考にしてください。
Google C++ スタイルガイド 日本語全訳この時間のまとめ
if文はif( 条件文 )から始める
条件文は左と右を比較して、「true」か「false」(「はい」か「いいえ」)をたずねる。
「true」なら、そのあとの{ ... }が実行される。
「false」なら、さらにそのあとのelse { ... }が実行される。これは省略できる。
書き方はたくさんあるけど、「速く」「軽く」「読みやすい」コードを目指そう!
複数の条件の時はどうすればいいの?
今回は長くなってしまったので、とりあえずここまでにしておきましょう。新しい事柄がたくさん出てきますが大丈夫でしょうか。
次は、その条件が複数ある時はどうすればいいのか、についてやっていきたいと思います。たとえば、「zeikomiが1000以上で、かつzeikomiが2000以内」などです。確かに、if文を2重に書けばどうにかなりそうですが、もっとかしこい書き方があります。次回はそれを勉強したいと思います。
お疲れ様でした!