MSBOOKS

プログラミングとか深層学習とか日常の出来事とか

【C言語入門】part4 : if文,else if文,else文

前回は演算子と四則演算,scanf文についてやりました.
今回はif文,else if文,else文についてやっていきます.

if文,else if文(条件分岐)

前回,敵のダメージを計算式で実現しました.でも初期値によってはマイナスの体力になってしまうことがありますよね.HPがマイナスになることは普通はありえません.そんなときにHPがマイナスだったら,0にするといった条件に応じた処理をしたいときにif文(直訳でもしも~ならば)を使います.例えば以下のような図の処理を実現することを考えます.
f:id:msteacher:20190103225627p:plain
まずはこの流れをプログラムで実際に書くと,どう動くのかを見てみましょう.
・test4-1.c

#include <stdio.h>
int main(void){
   int enemyHP;
   printf("敵のHPを入力してね:");
   scanf("%d",&enemyHP);
   printf("今の敵のHP:%d\n",enemyHP);
   printf("敵は3のダメージを受けた!\n");
   if((enemyHP - 3) >= 0){
      enemyHP = enemyHP - 3;
   }
   else if((enemyHP - 3) < 0){
      enemyHP = 0;
   }
   printf("今の敵のHP:%d\n",enemyHP);
   return 0;
}

・実行結果

C:\Users\ユーザ名\Desktop>test4-1
敵のHPを入力してね:2
今の敵のHP:2
敵は3のダメージを受けた!
今の敵のHP:0

C:\Users\ユーザ名\Desktop>test4-1
敵のHPを入力してね:5
今の敵のHP:5
敵は3のダメージを受けた!
今の敵のHP:2

実行結果を見ると,たしかにenemyHP-3の結果がマイナスになるときはelse ifの条件に入り,0を代入し,HPがマイナスになるのを避けられていることがわかります.else if文とは,if文を満たさず,else if文の条件式を満たしたときこの{}の内側に書いた処理をします.else if文は1つだけでなく複数つなげて書くこともでき,でなくてこの条件式を満たしたら~っと様々な処理を書くことができます.
if文の書き方はこのようになります.
・if文

if(条件式1){
   処理1; //もし条件式1を満たしたらこの処理をする
}
else if(条件式2){
   処理2; //もし条件式1を満たさず,条件式2を満たしたらこの処理をする
}

この文は以下のような流れで処理を選択,実行していきます.
f:id:msteacher:20190103230929p:plain
条件式は"変数1 (関係演算子) 変数2"のように変数1と2の間に関係演算子が挟まる形(a>bのようなもの)をしています.この左右の変数を比較する関係演算子は以下のようなものがあります.

・==:等しい(イコール)
・!=:等しくない(ノットイコール)
・<:より小さい(未満)
・<=:以下
・>:より大きい
・>=:以上
イコールが代入のときは=でよかったものが,条件式で書くときは==になるのが特に注意が必要ですね.

else文

この書き方もう少しうまく書くことができるのですが,それを説明するためこの条件の満たすゾーンを視覚的に示すために数直線を以下に載せます.
f:id:msteacher:20190103231243p:plain
この①の処理を満たさなかった場合,②に入る条件は①以外という書き方をしても同じ意味ですね.そういった〇〇以外(else文)という書き方に書き換えたプログラムが以下になります.
・test4-2.c

#include <stdio.h>
int main(void){
   int enemyHP;
   printf("敵のHPを入力してね:");
   scanf("%d",&enemyHP);
   printf("今の敵のHP:%d\n",enemyHP);
   printf("敵は3のダメージを受けた!\n");
   if((enemyHP - 3) >= 0){
      enemyHP = enemyHP - 3;
   }
   else{
      enemyHP = 0;
   }
   printf("今の敵のHP:%d\n",enemyHP);
   return 0;
}

・実行結果

C:\Users\ユーザ名\Desktop>test4-2
敵のHPを入力してね:2
今の敵のHP:2
敵は3のダメージを受けた!
今の敵のHP:0

C:\Users\ユーザ名\Desktop>test4-2
敵のHPを入力してね:5
今の敵のHP:5
敵は3のダメージを受けた!
今の敵のHP:2

同じ結果が得られていることがわかりますね.else文はif文で満たさなかった場合はどんな場合でもelse文の処理に入ることを示します.図に書くと先ほどの違いがよくわかると思います.
f:id:msteacher:20190103231832p:plain
else文の書き方はこのようになります.
・else文

if(条件式1){
   処理1; //もし条件式1を満たしたらこの処理をする
}
else{
   処理2; //もし条件式1を満たさなかった場合は必ずこの処理をする
}

else文は条件式を書かないのがポイントですね.本格的なプログラムを書くときは例外的な数値が入力されたときに,変な動作をしないようにするために書いたりします.

複数の条件式を用いる

もし,複数の条件を組み合わせたい場合は"条件式1 (論理演算子) 条件式2"のように論理演算子を使います.
・&&:論理積(左右のどちらの条件式も同時に満たされているとき,数学だと"かつ")
・||:論理和(左右の条件式のどちらかが満たされているとき,数学だと"または")
たとえば以下のような数直線のように〇〇以上かつ〇〇未満といった処理をするプログラムを書きたいときに有効です.
f:id:msteacher:20190103235212p:plain
このような処理をするプログラムの例を以下に示します.
・test4-3.c

#include <stdio.h>
int main(void){
   int enemyHP;
   printf("敵のHPを入力してね:");
   scanf("%d",&enemyHP);
   printf("今の敵のHP:%d\n",enemyHP);
   printf("敵は3のダメージを受けた!\n");
   if((enemyHP - 3) >= 0 && (enemyHP - 3) < 100){
      enemyHP = enemyHP - 3;
   }
   else if((enemyHP - 3) < 0){
      enemyHP = 0;
   }
   else if((enemyHP - 3) >= 100){
      printf("強すぎる設定はズルいよ!さようなら!\n");
      enemyHP = 0;
   }
   printf("今の敵のHP:%d\n",enemyHP);
   return 0;
}

・実行結果

C:\Users\ユーザ名\Desktop>test4-3
敵のHPを入力してね:2
今の敵のHP:2
敵は3のダメージを受けた!
今の敵のHP:0

C:\Users\ユーザ名\Desktop>test4-3
敵のHPを入力してね:104
今の敵のHP:104
敵は3のダメージを受けた!
強すぎる設定はズルいよ!さようなら!
今の敵のHP:0

様々な条件式を組み合わせることで,色々な条件下(例えば,雨が降っていて敵のHPが50以上だったら攻撃力が2倍になる)でも1つのif文で書くことができます.このような処理は少し複雑なプログラムになるので,実行結果から雰囲気を理解してみましょう.
・test4-4.c

#include <stdio.h>
int main(void){
   int enemyHP;
   int rain;
   int attack = 3;
   printf("敵のHPを入力してね:");
   scanf("%d",&enemyHP);
   printf("雨が降っていたら1,雨が降ってなかったら2を入力してね:");
   scanf("%d",&rain);
   printf("今の敵のHP:%d\n",enemyHP);
   //雨が降っていて,敵のHPが50以上の場合は攻撃(attack)を2倍にする
   if(rain == 1 && enemyHP >= 50){
      attack = attack * 2;
   }
   //これより下はtest4-2.cとほぼ同じ
   printf("敵は%dのダメージを受けた!\n",attack);
   if((enemyHP - attack) >= 0){
      enemyHP = enemyHP - attack;
   }
   else{
      enemyHP = 0;
   }
   printf("今の敵のHP:%d\n",enemyHP);
   return 0;
}

・実行結果

C:\Users\ユーザ名\Desktop>test4-4
敵のHPを入力してね:5
雨が降っていたら1,雨が降ってなかったら2を入力してね:1
今の敵のHP:5
敵は3のダメージを受けた!
今の敵のHP:2

C:\Users\ユーザ名\Desktop>test4-4
敵のHPを入力してね:50
雨が降っていたら1,雨が降ってなかったら2を入力してね:1
今の敵のHP:50
敵は6のダメージを受けた!
今の敵のHP:44

C:\Users\ユーザ名\Desktop>test4-4
敵のHPを入力してね:50
雨が降っていたら1,雨が降ってなかったら2を入力してね:2
今の敵のHP:50
敵は3のダメージを受けた!
今の敵のHP:47

このプログラムの流れを図に示すと以下になります.
f:id:msteacher:20190104002628p:plain
これらの知識を組み合わせていくことでより面白いゲームを作ることができそうですね.
if文など条件式のプログラムは自分で書いてみないと理解ができないところになるので,ぜひ練習問題を解いてみてください.
お疲れさまでした.

練習問題

・問題1-1
 主人公のHPを表す整数型変数(heroHP)を定義し,キーボード入力から受け付け,その変数へ代入した後,敵から3ダメージを受けた後,もし主人公のHPが0以上であればそのままHPを代入し,それでなくもし主人公のHPが0未満であればHPに0を代入し,最後に主人公のHPを表示するプログラム(test4-5.c)を作成してみよう.(前回のtest3-6.cと今回のtest4-1.cが参考になると思います)
・実行結果例

C:\Users\ユーザ名\Desktop>test4-5
主人公のHPを入力してね:5
今の主人公のHP:5
主人公は敵から3のダメージを受けた!
今の主人公のHP:2

C:\Users\ユーザ名\Desktop>test4-5
主人公のHPを入力してね:2
今の主人公のHP:2
主人公は敵から3のダメージを受けた!
今の主人公のHP:0

・問題1-2
 問題1-1で作ったプログラムを改良し,最後の主人公のHPが0であれば"主人公は倒れた!"と表示し,それ以外である(HPが0より大きい)場合は"まだ主人公は戦える!"と表示できるようにしてみよう.(test4-6.c)
・実行結果例

C:\Users\ユーザ名\Desktop>test4-6
主人公のHPを入力してね:5
今の主人公のHP:5
主人公は敵から3のダメージを受けた!
今の主人公のHP:2
まだ主人公は戦える!

C:\Users\ユーザ名\Desktop>test4-6
主人公のHPを入力してね:2
今の主人公のHP:2
主人公は敵から3のダメージを受けた!
今の主人公のHP:0
主人公は倒れた!

・問題2
 年齢を入れる整数型変数ageを定義し,以下の要件を満たすお酒を買うときのコンビニのレジのプログラム(test4-7.c)を作成してみよう.

①初めに年齢を入力してもらうよう促す.
②その年齢によって以下のように処理を変える.
 1:もし年齢が18歳以上かつ120歳未満であれば"お買い上げありがとうございます!"と表示する
 2:もし年齢が0歳以上かつ18歳未満であれば"18歳未満の方は購入できません!"と表示する
 3:もし年齢が0歳未満または120歳以上であれば"不正な年齢が入力されました!"と表示する
 ※3は条件式を書かずelse文で書いても良い.
・実行結果例

C:\Users\ユーザ名\Desktop>test4-7
*** コンビニレジシステム起動 ***
ほろよい もも 350ml ×1個
年齢を入力してください:15
18歳未満の方は購入できません!
*** コンビニレジシステム終了 ***

C:\Users\ユーザ名\Desktop>test4-7
*** コンビニレジシステム起動 ***
ほろよい もも 350ml ×1個
年齢を入力してください:20
お買い上げありがとうございます!
*** コンビニレジシステム終了 ***

C:\Users\ユーザ名\Desktop>test4-7
*** コンビニレジシステム起動 ***
ほろよい もも 350ml ×1個
年齢を入力してください:-5
不正な年齢が入力されました!
*** コンビニレジシステム終了 ***

練習問題の解答例

・問題1-1
 ・test4-5.c

#include <stdio.h>
int main(void){
   int heroHP;
   printf("主人公のHPを入力してね:");
   scanf("%d",&heroHP);
   printf("今の主人公のHP:%d\n",heroHP);
   printf("主人公は敵から3のダメージを受けた!\n");
   if((heroHP - 3) >= 0){
      heroHP = heroHP - 3;
   }
   else if((heroHP - 3) < 0){
      heroHP = 0;
   }
   printf("今の主人公のHP:%d\n",heroHP);
   return 0;
}

・問題1-2
 ・test4-6.c

#include <stdio.h>
int main(void){
   int heroHP;
   printf("主人公のHPを入力してね:");
   scanf("%d",&heroHP);
   printf("今の主人公のHP:%d\n",heroHP);
   printf("主人公は敵から3のダメージを受けた!\n");
   if((heroHP - 3) >= 0){
      heroHP = heroHP - 3;
   }
   else if((heroHP - 3) < 0){
      heroHP = 0;
   }
   printf("今の主人公のHP:%d\n",heroHP);
   //これより下がtest4-5.cに追加したもの
   if(heroHP == 0){
      printf("主人公は倒れた!\n");
   }
   else{
      printf("まだ主人公は戦える!\n");
   }
   return 0;
}

・問題2
 ・test4-7.c

#include <stdio.h>
int main(void){
   int age;
   printf("*** コンビニレジシステム起動 ***\n");
   printf("ほろよい もも 350ml ×1個\n");
   printf("年齢を入力してください:");
   scanf("%d",&age);
   if(age >= 18 && age < 120){
      printf("お買い上げありがとうございます!\n");
   }
   else if(age >= 0 && age <18){
      printf("18歳未満の方は購入できません!\n");
   }
   else{
      printf("不正な年齢が入力されました!\n");
   }
   printf("*** コンビニレジシステム終了 ***\n");
   return 0;
}