内 容
- もし〜ならば・・・ if文
- もし〜ならば・・・そうでなければ... if 〜 else 〜文
- いろいろなif文
もし〜ならば・・・if文
真と偽
プログラムでは「状態」を判定するために、条件(式)をつくる必要があります。例えば、整数型の変数aの値が0より大きいかを判定するための条件式は
a > 0
と記述することができます。記号 >(より大きい) は大小関係を判定する比較演算子の一つです。変数aの値が5ならばこの条件式は成立したことになります。変数aの値が0ならば成立しません。この条件が成立した状態を
真(true)と言い、条件が成立しなかった状態を
偽(false)と言います。
条件が成立した場合にだけ処理をする
整数を入力して絶対値を求めるプログラムを考えてみましょう。絶対値はその値が正ならばその値自身となり、負ならば符号を取り除いた値になります。すなわち、「値が0より小さい」という条件が成立した場合にのみ「符号を反転する」という処理を行えば良いわけです。このような場合の処理は
if文を使うことで実現することができます。以下にプログラム例を示します。
例 if.c
#include <stdio.h>
int main(void)
{
int a;
printf("整数>> ");
scanf("%d", &a);
if (a < 0) { // 0より小さい、すなわち負の整数ならば
a = -1*a; // 符号を反転
}
printf("絶対値 %d¥n", a);
return 0;
}
構文:
if ( 条件 ) {
条件が「真」の時に処理される;
}
キーワードifの後のカッコの中に「条件(式)」を記述します。「変数aが0より小さければ」という条件式は「a<0」と表記できます。条件の評価結果が真ならば直後の波カッコ{ }内の文を処理します。偽ならば波カッコ{ }内の処理は飛ばしてその後の処理に進みます。
if文をフローチャートを使って表わすと下図のようになります。
条件が成立すれば「真(true)」、そうでなければ「偽(false)」と評価される
条件式に使える演算子
関係演算子
演算子 | 説明 | 記述例 | 説明 |
> | 大きい | a>100 | aは100より大きい |
>= | 大きいか等しい | a>=100 | aは100以上 |
< | 小さい | a<100 | aは100より小さい |
<= | 小さいか等しい | a<=100 | aは100以下 |
等価演算子
演算子 | 説明 | 記述例 | 説明 |
== | 等しい | a==100 | aが100なら |
!= | 等しくない | a!=100 | aが100でないなら |
もし〜ならば・・・そうでなければ・・・ if 〜 else〜文
if〜else文
「お買い上げ金額が5000円以上ならば500円引、そうでなければ100円引」のように、条件が真(true)の時と偽(false)の時とでは異なる処理をしたいことがあります。このような二者択一を実現するための構文には、
if(条件
){・・・
}else{...
} があります。
例 ifelse.c
#include <stdio.h>
int main(void)
{
int price;
printf("お買い上げ金額>> ");
scanf("%d", &price);
if (price >= 5000) { //5000円以上ならば
price = price - 500; //500円引き
}
else {
price = price - 100; //100円引き
}
printf("お支払い金額 %d\n", price);
return 0;
}
構文:
if ( 条件 ) {
条件が「真」の時に処理される
}
else
{
条件が「偽」の時に処理される
}
if〜else文をフローチャートを使うと下図のように表わすことができます。条件が「真」ならば文1を処理し、「偽」ならば文2を処理します。
真偽の値
C言語には真(true)か偽(false)を表すための特別な型はなく、偽を整数の0で、真を整数の0以外の値を使って表しています。
次の例では2つの整数を入力して、その大小関係の真偽を表示します。実行して、その評価結果が偽ならば0で、真ならば1で表示されることを確認してみましょう。
例 truefalse.c
#include <stdio.h>
int main(void)
{
int a,b;
printf("整数(a,b)>> ");
scanf("%d,%d", &a,&b);
printf("a==b -> %d\n", a==b);
printf("a>b -> %d\n", a>b);
printf("a<b -> %d\n", a<b);
return 0;
}
「真(true)」整数の0以外の値で、「偽(false)」は整数の1で表わされる
NOTE: c99以降では標準ライブラリに論理型と論理値を扱うためのライブラリが追加されました。ヘッダstdbool.hをインクルードすることで論理型boolが、真偽を表す論理値trueとfalseが利用できるようになります。trueは整数の1にfalseは整数の0として定義されています。
いろいろなif文
偶数と奇数
整数を入力して、「偶数」か「奇数」かを判定するプログラムを考えましょう。任意の整数は必ず「奇数」か「偶数」のいずれかの集合に含まれます。ですから、二者択一の構文を実現するif〜else文が使えることが分かります。また、その判定条件は、2で割った余りが0か1かで判定できます。以下に剰余演算子を使ったプログラム例を示します。
例 oddeven.c
#include <stdio.h>
int main(void)
{
int a;
printf("整数>> ");
scanf("%d", &a);
if (a%2==0) { //2で割り切れれば偶数
printf("偶数です。\n");
}
else {
printf("奇数です。\n");
}
return 0;
}
次も、真偽の判定は逆なりますが、同じ偶数奇数を判定するプログラムです。真と偽が整数の0と1で判定されていることから空欄アにはどんな式を入れたら良いでしょう。
例 oddeven2.c
#include <stdio.h>
int main(void)
{
int a;
printf("整数>> ");
scanf("%d", &a);
if ([[空欄ア]]) { //余りが1なら奇数
printf("奇数です。\n");
}
else {
printf("偶数です。\n");
}
return 0;
}
2つの独立した条件
整数を入力して、2の倍数ならば「2の倍数です。」、3の倍数ならば「3の倍数です。」と表示するプログラムを考えます。例えば、8が入力されれば「2の倍数」、9が入力されれば「3の倍数」になります。6ならば両方のメッセージが出力されることになります。これは、二つの事象が独立して起こりうることを示しています。このよう場合は、二者択一のif else文ではなく、それぞれの条件を別々に判定するために2つのif文を使って構成する必要があります。
multiples.c
#include <stdio.h>
int main(void)
{
int a;
printf("整数>> ");
scanf("%d", &a);
if (a%2==0) {
printf("2の倍数です。\n");
}
if (a%3==0) {
printf("3の倍数です。\n");
}
return 0;
}
三者択一
入力した整数が、「正」か「負」か「0」かを判定するプログラムを考えましょう。変数名をnとするとそれぞれの条件式は、「n>0」、「n<0」、「n==0」となります。三者択一の構文は二者択一のif〜else文を組み合わて枝分かれを2段にすることで三者択一を実現します。下図のフローチャートを見てください。まずひとつ目の判定条件「n>0」で二つに枝分かれします。判定が真ならば「正」です。偽ならばもう一つの判定条件「n<0」でさらに二つに枝分かれします。判定が真ならば「負」なり、偽ならば残りの条件である「0」と判定できます。
select3.c
#include <stdio.h>
int main(void)
{
int n;
printf("整数>> ");
scanf("%d", &n);
if (n>0) {
printf("正です。\n");
}
else if(n<0){
printf("負です。\n");
}
else{
printf("0です。\n");
}
return 0;
}
二つの条件を満たす
入力した整数が「正の偶数」かを判定するプログラムを考えてみましょう。「正の偶数」であるためには、「正」であることと「偶数」であることの二つの条件を同時に満たしていることが必要です。
nestedif.c
#include <stdio.h>
int main(void)
{
int n;
printf("整数>> ");
scanf("%d", &n);
if (n>0) { // 正である
if (n%2==0) { // 偶数である
printf("%dは、正の偶数です。\n",n);
}
}
return 0;
}
一方の条件を判定しその結果が「真」ならばもう片方の条件を判定します。もし内側のif文も「真」ならば二つの条件を満たしていることになります。if文の中にまたif文が登場する
入れ子(ネスト)構造によって条件判定を実現しています。
expand_lessBack to TOP