C言語入門|4章の練習問題

4章では、プログラムに「選択(if)」と「繰り返し(while)」の考え方を導入し、
条件によって動作を変える方法や、ある処理を何度も繰り返す方法を学びました。

コンピュータは、与えられた条件式を 真(true)か偽(false)か で判断し、
その結果に応じて処理を切り替えます。
たとえば「雨が降っていれば傘を持つ」という日常の判断も、
プログラム世界では if 文として表現できます。

条件式は「値と値を比較した結果」であり、
必ず true または false のどちらかになります。

よく使う比較演算子と論理演算子

演算子読み方説明
==等しい左右の値が一致するか
!=等しくない左右の値が異なるか
>, <大小比較大きい・小さい
>=, <=以上・以下境界含む比較
&&かつ両方とも true なら true
||またはどちらか true なら true
!否定true ⇔ false を反転

if 文の書式と意味

書式

if (条件式) {
    文;
}

意味

  • 条件式が true → { } 内の処理を実行
  • false → 何もしない(または else があればそちらに進む)

while 文の書式と動き

書式

while (条件式) {
    文;
}

動き

  1. 条件式を評価
  2. true なら文を実行 → 再び条件式へ戻る
  3. false になったら終了

ループ処理を作るのに欠かせません。

短絡評価(ショートサーキット)

(age >= 18) && (month == 8)

age が 18 未満なら、
前半が false と分かった時点で後半(月の比較)を評価しません。
これが 短絡評価(minimal evaluation) です。

擬似言語との比較

C言語擬似言語特徴
if(条件){文}if 条件 文 endif{} の代わりに end を使う
while(条件){文}while 条件 文 endwhile同上
do{文}while(条件);do 文 while 条件ほぼ同じ
for(3項)for 条件の説明 endfor擬似言語は自然文で指定

switch や goto は擬似言語には存在しません。

サンプルプログラム

プロジェクト名:4-9-1 ソースファイル名: sample4-9-1.c

#include <stdio.h>

int main(void) {
    int score = 75;

    if (score >= 80) {
        printf("とても良い成績です!\n");
    } else {
        printf("次はもっとがんばりましょう。\n");
    }

    return 0;
}

4章の練習問題

【練習4-1】

次の条件式が評価している内容を日本語で答えてください。
不適切な条件式は × と記してください。

(1) score > 90
(2) flag == false
(3) name == "taro"
(4) a % 2 == 0 && b > 10
(5) value

【解答例と解説】

番号日本語の説明解説
(1)score が 90 より大きいか調べている適切
(2)flag が false と等しいか適切
(3)×文字列比較は == では行えない
(4)a が偶数 かつ b が 10 より大きいか適切
(5)変数 value の値は true(0以外)か適切

【練習4-2】

次の内容を判定する条件式を記述してください。

(1) 変数 mode が 'A' と等しい
(2) x と y の差が 5 の倍数
(3) hp が 0 より大きく、かつ alive が true
(4) n の値が 1・3・5 のいずれか
(5) a と b の値が一致しない(否定演算子を使用)

【解答例と解説】

(1) mode == 'A'
(2) (x - y) % 5 == 0
(3) hp > 0 && alive == true
(4) n == 1 || n == 3 || n == 5
(5) !(a == b)

【練習4-3】

次の if 文に、追加した printf が期待通りに動かない原因を説明し、修正してください。

} else
    printf("雨の日は読書をします\n");
    printf("感想をSNSに書きます\n");  // ←追加
return 0;

【解答例と解説】

発生している現象

else のブロックだと思っていた処理が、
実際には 2 行目だけ if/else に属しておらず、常に表示されてしまう

原因

C言語では、ブロック( { } )を書かなければ、1行だけが if/else の対象になるため。

修正版

} else {
    printf("雨の日は読書をします\n");
    printf("感想をSNSに書きます\n");
}

【練習4-4】

次の内容のプログラムを作成してください。

(1) 「朝ごはんを食べます」と表示する
(2) bool 型 hungry を宣言し、true または false を代入
(3) hungry が true なら「おかわり!」、false なら「もう結構です」と表示
(4) 最後に「いってきます」と表示

【解答例】

プロジェクト名:4-9-2 ソースファイル名: sample4-9-2.c

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    printf("朝ごはんを食べます\n");

    bool hungry = true;

    if (hungry) {
        printf("おかわり!\n");
    } else {
        printf("もう結構です\n");
    }

    printf("いってきます\n");

    return 0;
}

【練習4-5】

次を満たす while 文のプログラムを作成してください。

(1) int speed = 100 で開始
(2) speed を表示
(3) 「速度を下げますか? Yes=1 No=0」を表示し入力を受け付ける
(4) 1 が入力されたら speed を 5 下げて (2) に戻る
(5) 0 なら「調整終了」と表示して終了

【解答例】

プロジェクト名:4-9-3 ソースファイル名: sample4-9-3.c

#include <stdio.h>

int main(void) {
    int speed = 100;
    int ans;

    while (1) {
        printf("速度:%d\n", speed);
        printf("速度を下げますか? Yes=1 No=0\n");
        scanf("%d", &ans);

        if (ans == 0) {
            printf("調整終了\n");
            break;
        }

        speed -= 5;
    }

    return 0;
}

【練習4-6】

次の複雑な条件式について、短絡評価がどのように働くかを説明してください。

(age > 18) && (level / bonus > 2)

【解答例と解説】

  • age が 18 以下の場合
    → 前半が false と確定するため、
    後半の level / bonus は計算されない(短絡評価)
  • その結果、
    bonus が 0 の可能性があっても除算エラーが回避されることがある。

短絡評価は、計算の効率化や安全性にも役立つ。