Skip to content

Latest commit

 

History

History
300 lines (218 loc) · 9.31 KB

05-If.md

File metadata and controls

300 lines (218 loc) · 9.31 KB

##条件分岐 条件分岐は読んで字の如く、ある条件によってプログラムの処理を分ける方法である。

今までのプログラムでは、書かれている通りに上から下までを実行するだけのプログラムで、複雑な処理をすることはできなかったが、条件分岐を使えばそれができるようになるのである。

解説することが多いのでそこそこ長くなるが頑張ってついてきてくれ。

##簡単な条件分岐

#include <stdio.h>
void main(void){
	int a=0;

  scanf("%d",&a);

  if(a==100){
    printf("入力した数字は100です\n");
  }

}

このコードを実行して、適当な整数を入力して動作を確認してみてほしい。 100を入力すると

入力した数字は100です

と表示されて、それ以外の整数だと何も表示されないだろう。

##解説 7行のifと書かれている部分が今回の重要ポイントだ。これはif文といってif(条件式)の形で使われる。

if文は、条件式を満たす(真という)なら中括弧でくくられた中身が実行され、条件式を満たさない(偽という)なら中括弧の中身を実行しない。 中括弧の中身が今はprintf関数だけだが、ここには好きな様に処理を書くことができる

条件式を変更することで色々と処理を分岐することができるという仕組みである。

今回の場合、変数aが100だったら中括弧の中身をを実行するということだ。

ちなみに条件式が真か偽か判断することを条件式の評価という。

##条件式で演算 条件式の中でも演算ができて、演算結果を使って条件分岐させることが可能なのだ。

#include <stdio.h>
void main(void){
	int a=0;

  scanf("%d",&a);

  if(a%3 == 0){
    printf("入力した数字は3で割れます\n");
  }

}

このプログラムは入力した数字が3で割れるか確認するプログラムだ。

条件式は、変数aを3で割ったあまりが0ならば真、それ以外なら偽となる

##等価演算子 さっきのif文のでは条件式に==を使っていた。これは2つの値が等しい時に真になる演算子で等価演算子という。等価演算子を表にまとめるとこうなる。

記号 説明
== 2つの値が等しいならば真。等しくないなら偽
!= 2つの値が等しくないなら真。等しいなら偽

サンプルコードも載せておく。

#include <stdio.h>
void main(void){
  int a=0;

  scanf("%d",&a);

  if(a==100){
    printf("aは100です\n");
  }
  if(a!=100){
    printf("aは100ではありません%dです\n");
  }

}

これを実行して適当な整数を入力すると、整数に応じて画面に表示される文章が変わる。

実際に自分で動かして確かめてみよう。

##関係演算子 等価演算子では2つの値が同じかを比べることができた。が、もちろんこれだけだは足らない。次は値の大きさを比べるための関係演算子の出番だ。

記号 説明
> 左の値が右の値より大きいならば真。小さいならば偽
< 左の値が右の値より小さいならば真。大きいならば偽
>= 左の値が右の値以上ならば真。以下ならば偽
<= 左の値が右の値以下ならば真。以上ならば偽

ぶっちゃけると数学の不等号と同じである。

サンプルコードはこんなかんじだ

#include <stdio.h>
void main(void){
  int a=0;

  scanf("%d",&a);

  if(a==100){
    printf("aは100です\n");
  }
  if(a<100){
    printf("aは100より小さいです\n");
  }
  if(a>100){
    printf("aは100より大きいです\n");
  }

}

実行して動作を確認してみよう。

##論理演算子 演算子系ラストを飾るのは論理演算子だ。こいつは今までの演算子とは少し勝手が違う。論理演算子は複数の条件式をつなぐ時に使われる演算子だ。

記号 読み 説明
&& かつ 右と左の条件式がどちらも真なら真。片方でも偽なら偽
|| または 右と左の条件式のどちらかが真ならば真。どちらも偽なら偽

では1つずつサンプルを載せていく。


&& のサンプルコード

#include <stdio.h>
void main(void){
  int a=0;

  scanf("%d",&a);

  if(a<=100 && a>=0){
    printf("aは0より大きく100より小さいです\n");
  }
}

このコードを実行して0~100の数字を入力すると画面に

aは0より大きく100より小さいです

と表示され、それ以外の数字だと何も表示されない。

まず、条件式の左辺が評価され、次に右辺が評価される。左辺と右辺は&&演算子で結ばれているので、どちらも真ならば条件式全体としての評価が真になってif文がが実行されるというわけだ。


次は||のサンプルだ

|| のサンプルコード

#include <stdio.h>
void main(void){
  int a=0;

  scanf("%d",&a);

  if(a>100 || a<0){
    printf("aは0より小さいか100より大きいです\n");
  }
}

このプログラムを実行して100より大きいか0より小さい数字を入力すると

aは0より小さいか100より大きいです

と表示される。

これは&&の時と少し違って、左辺か右辺、どちらかの条件が真なら条件式全体としての評価が真になる。それ以外は&&の時と変わらない。

##else文 条件式の評価が真の時と偽の時で処理を分けたい場合があると思う。これを実現するのがelse文だ。

#include <stdio.h>
void main(void){
  int a=0;

  scanf("%d",&a);

  if(a==100){
    printf("aは100です\n");
  }
  else{
    printf("aは100ではありません%dです\n");
  }

}

else文はif文と対になっていないといけないことに注意しよう。つまりelse文は単体では使えなくて、必ずif文の後に来る。

上のサンプルコードでは、ifで変数aの値が100か確認している。この条件が偽の場合、つまりa!=100の時にelse文の中身が実行されるわけだ。

##else-if ここまでで条件が真と偽の2通りの条件分岐ができた。が、これだけじゃやっぱり足らない。実際には3通りも4通りも処理を分岐させたくなることがある。

こいつを実現するのがelse if文だ。

##else ifを使ったプログラム 以下のプログラムは、課金額を入力すると無課金・微課金・重課金・廃課金のどれなのか教えてくれるソシャゲーマーにありがたいプログラムだ。

#include <stdio.h>
void main(void){
  int money=0;

  scanf("%d",&money);

  if(money==0){
    printf("無課金です\n");
  }
  else if(money<100000){
    printf("微課金です。ゲームを楽しんでください\n");
  }
 else if(money<500000){
		printf("重課金です。一度お金の使い方を考えましょう\n");
 }
 else{
		printf("廃課金です。ようこそこちらの世界へ\n歓迎しよう盛大にな\n");
 }

}

こいつもelse文と同じで、一番上のif文からツリー上に接続されている。一番上のif文の条件式が偽だったら2番目のelse if文の条件式が評価され、それも偽なら次のelse if文に行くといった具合だ。

そして、どこかのelse if文で条件が真になったばあい、それより下のelse if文の条件式は評価されずに全部すっ飛ばされる。

##別にこれif文でもいいんじゃないですかね

さて、これ別にif文何個も並べれば良くないかと思った人もいると思う。 if文だけで同じプログラムを書くとこんなかんじになる。

#include <stdio.h>
void main(void){
  int money=0;

  scanf("%d",&money);

  if(money==0){
    printf("無課金です\n");
  }
  if(money > 0 && money<=100000){
    printf("微課金です。ゲームを楽しんでください\n");
  }
 if(money>100000 && money<=500000){
		printf("重課金です。一度お金の使い方を考えましょう\n");
 }
 if(money>500000){
		printf("廃課金です。ようこそこちらの世界へ\n歓迎しよう盛大にな\n");
 }

}

####なんてこった条件式が長い!! そうなのだ、if文だけで実装しようとするとその都度金額の範囲を確認しないといけないため、いちいち条件式を書かなくてはいけない。

しかし、else if文は、一つ前の条件式が偽になっていることを用いて、下限の条件を記述する必要がなくなっているため、条件式が短くなっているのである。 条件式が短いということはそれだけ、記述ミスによるバグ発生率も下がるのでいいコトずくめなのだ。

##演習問題 問題1
2つの整数a,bを読み込んで、大きい方を出力するプログラムを書きなさい。同じ数字の場合は、同じと出力しなさい

入力例
5 9

出力例
9

入力例
5 5

出力例
同じ

問題2
入力された整数が奇数か偶数か判別するプログラムを書きなさい。

入力例
5

出力例
奇数です

答え