ここまでは「上から順に実行される」プログラムを書いてきた。
この章では条件によって処理を分岐させる方法を学ぶ。
if (条件式) {
/* 条件が真(0以外)のときに実行される処理 */
}
条件式が 0 以外なら真(ブロック内を実行)、0 なら偽(スキップ)。
比較・論理演算子は 09章で学んだ内容をそのまま使う。
#include <stdio.h>
int main(void)
{
int score;
printf("点数を入力してください: ");
scanf("%d", &score);
if (score >= 70) {
printf("合格です¥n");
}
printf("プログラム終了¥n");
return 0;
}
実行例(85 を入力した場合):
点数を入力してください: 85 合格です プログラム終了
実行例(60 を入力した場合):
点数を入力してください: 60 プログラム終了
if ブロック内の文が1つだけなら {} を省略できる。
しかし省略すると次の落とし穴にはまりやすい。
/* 意図:x が正のときだけ両方の printf を実行したい */
if (x > 0)
printf("正の数¥n");
printf("処理終了¥n"); /* ← {} がないのでここは常に実行される */
2つ目の printf はインデントされているように見えても、if の外にある。
x が 0 以下でも「処理終了」は常に表示される。
{} を書く習慣を身につけよう。if (条件式) {
/* 真のときの処理 */
} else {
/* 偽のときの処理 */
}
#include <stdio.h>
int main(void)
{
int score;
printf("点数を入力してください: ");
scanf("%d", &score);
if (score >= 70) {
printf("合格¥n");
} else {
printf("不合格¥n");
}
return 0;
}
点数を入力してください: 65 不合格
3つ以上に分岐したいときは else if を使う。
条件は上から順に評価され、最初に真になった1つだけが実行される。
if (条件式1) {
/* 条件1が真のとき */
} else if (条件式2) {
/* 条件1が偽で条件2が真のとき */
} else {
/* 全部偽のとき */
}
#include <stdio.h>
int main(void)
{
int score;
printf("点数を入力してください: ");
scanf("%d", &score);
if (score >= 90) {
printf("A評価¥n");
} else if (score >= 70) {
printf("B評価¥n");
} else if (score >= 50) {
printf("C評価¥n");
} else {
printf("D評価¥n");
}
return 0;
}
点数を入力してください: 75 B評価
score >= 50 を最初に書くと 90点でも「C評価」になる。09章で学んだ論理演算子を条件式に組み合わせて使う。
#include <stdio.h>
int main(void)
{
int age, height;
printf("年齢を入力してください: ");
scanf("%d", &age);
printf("身長(cm)を入力してください: ");
scanf("%d", &height);
if (age >= 12 && height >= 140) {
printf("乗車可能です¥n");
} else {
printf("乗車できません¥n");
}
return 0;
}
年齢を入力してください: 14 身長(cm)を入力してください: 135 乗車できません
if 文の中に if 文を書くことができる。これをネスト(入れ子)と呼ぶ。
#include <stdio.h>
int main(void)
{
int score;
printf("点数を入力してください: ");
scanf("%d", &score);
if (score >= 0 && score <= 100) { /* まず範囲チェック */
if (score >= 70) {
printf("合格¥n");
} else {
printf("不合格¥n");
}
} else {
printf("無効な点数です¥n");
}
return 0;
}
年齢を入力して区分を表示するプログラムを作れ。
#include <stdio.h>
int main(void)
{
int age;
printf("年齢を入力してください: ");
scanf("%d", &age);
/* ここに if 文を書く */
return 0;
}
#include <stdio.h>
int main(void)
{
int age;
printf("年齢を入力してください: ");
scanf("%d", &age);
if (age <= 12) {
printf("子ども¥n");
} else if (age <= 19) {
printf("未成年¥n");
} else {
printf("大人¥n");
}
return 0;
}
整数を入力し、0〜100 の範囲にあるか判定するプログラムを作れ。
#include <stdio.h>
int main(void)
{
int x;
printf("整数を入力してください: ");
scanf("%d", &x);
/* ここに if 文を書く */
return 0;
}
範囲外の条件:x < 0 || x > 100
#include <stdio.h>
int main(void)
{
int x;
printf("整数を入力してください: ");
scanf("%d", &x);
if (x < 0 || x > 100) {
printf("無効な値です¥n");
} else {
printf("入力値は %d です¥n", x);
}
return 0;
}
身長(cm)と体重(kg)を入力して BMI を計算し、判定結果を表示するプログラムを作れ。
BMI = 体重(kg) ÷ (身長(m) × 身長(m))
#include <stdio.h>
int main(void)
{
double height_cm, weight, bmi;
printf("身長(cm)を入力してください: ");
scanf("%lf", &height_cm);
printf("体重(kg)を入力してください: ");
scanf("%lf", &weight);
/* ここに BMI 計算と if 文を書く */
return 0;
}
cm を m に変換する:height_m = height_cm / 100.0;(height_m は先頭で宣言)
BMI の計算:bmi = weight / (height_m * height_m);
#include <stdio.h>
int main(void)
{
double height_cm, weight, bmi, height_m;
printf("身長(cm)を入力してください: ");
scanf("%lf", &height_cm);
printf("体重(kg)を入力してください: ");
scanf("%lf", &weight);
height_m = height_cm / 100.0;
bmi = weight / (height_m * height_m);
printf("BMI = %.1f¥n", bmi);
if (bmi < 18.5) {
printf("低体重¥n");
} else if (bmi < 25.0) {
printf("普通体重¥n");
} else {
printf("過体重¥n");
}
return 0;
}
Q1. 次のコードで score = 65 のとき、出力されるものはどれか。
if (score >= 90) {
printf("A¥n");
} else if (score >= 70) {
printf("B¥n");
} else {
printf("C¥n");
}
正解:ウ
65 は 90 未満・70 未満なので最後の else ブロックが実行される。
Q2. 次のコードで x = -1 のとき「処理終了」は出力されるか。
if (x > 0)
printf("正の数¥n");
printf("処理終了¥n");
正解:イ
{} がないため if が管理するのは直後の1文だけ。
2つ目の printf は if の外にあり、条件に関係なく常に実行される。
Q3. else if の条件評価について正しいものはどれか。
正解:イ
上から順に評価し、最初に真になった時点でそのブロックを実行し、残りはスキップする。
Q4. 次のコードで age = 15、height = 145 のとき出力されるものはどれか。
if (age >= 12 && height >= 140) {
printf("乗車可能¥n");
} else {
printf("乗車不可¥n");
}
正解:ア
age >= 12(15 ≥ 12:真)かつ height >= 140(145 ≥ 140:真)なので AND 条件が成立する。
| 構文 | 使いどころ |
|---|---|
if (条件) { } | 条件が真のときだけ実行したい処理がある |
if ~ else { } | 真と偽で別々の処理をしたい |
if ~ else if ~ else | 3つ以上に分岐したい |
&& / || の組み合わせ | 複数条件を一度に判定したい |
{} は必ず書く | 省略によるバグを防ぐ |