19 演習問題(if・switch 総合)

10〜18章で学んだ内容の総合演習。
各問とも、まず自分でコードを書いてから答えを確認しよう。


📝 演習① switch 文で点数評価(+ 範囲外チェック)

点数を入力し、次の条件で評価を表示するプログラムを作れ。
score / 10 の結果を switch 文の式に使って判定する。
0〜100 の範囲外なら「エラー」と表示する。

入力出力
90〜100評価:A
70〜89評価:B
50〜69評価:C
0〜49評価:D
範囲外エラー
19_01_gradeSwitch.c
#include <stdio.h>

int main(void)
{
    int score;
    printf("点数を入力してください: ");
    scanf("%d", &score);

    /* 0〜100 の範囲外チェックを if 文で先に行う */

    /* switch (score / 10) を使って評価を分岐する */

    return 0;
}
ヒントを表示

score / 10 の値:90点なら 9、85点なら 8、70点なら 7、50点なら 5 になる。
100点のとき score / 10 = 10 なので case 10 も必要。
同じ処理を複数の case に割り当てるには case を並べて書ける:

case 7:
case 8:
    printf("評価:B\n");
    break;
答えの例を表示
#include <stdio.h>

int main(void)
{
    int score;
    printf("点数を入力してください: ");
    scanf("%d", &score);

    if (score < 0 || score > 100) {
        printf("エラー\n");
        return 0;
    }

    switch (score / 10) {
        case 10:
        case 9:
            printf("評価:A\n"); break;
        case 8:
        case 7:
            printf("評価:B\n"); break;
        case 6:
        case 5:
            printf("評価:C\n"); break;
        default:
            printf("評価:D\n");
    }
    return 0;
}

📝 演習② FizzBuzz

1〜30 の整数を順に表示する。ただし:

19_02_fizzBuzz.c
#include <stdio.h>

int main(void)
{
    int i;
    for (i = 1; i <= 30; i++) {
        /* ここに条件分岐を書く */
    }
    return 0;
}
⚠ 15の倍数の条件を最初に判定すること。3の倍数を先に書くと「FizzBuzz」が「Fizz」になる。
答えの例を表示
#include <stdio.h>

int main(void)
{
    int i;
    for (i = 1; i <= 30; i++) {
        if (i % 15 == 0) {
            printf("FizzBuzz\n");
        } else if (i % 3 == 0) {
            printf("Fizz\n");
        } else if (i % 5 == 0) {
            printf("Buzz\n");
        } else {
            printf("%d\n", i);
        }
    }
    return 0;
}

📝 演習③ 入力した数が素数かどうかを判定する

正の整数 n を入力して、素数かどうかを判定するプログラムを作れ。
素数:1 と自分自身以外に約数を持たない整数(2, 3, 5, 7, 11, ...)

19_03_isPrime.c
#include <stdio.h>

int main(void)
{
    int n, i, isPrime;
    printf("正の整数を入力してください: ");
    scanf("%d", &n);

    /* ここに判定ロジックを書く */

    return 0;
}
ヒントを表示

2 から n-1 まで順に割ってみて、割り切れるものがあれば素数でない。
フラグ変数 isPrime = 1(素数と仮定)を用意して、割り切れたら isPrime = 0 にする。

答えの例を表示
#include <stdio.h>

int main(void)
{
    int n, i, isPrime;
    printf("正の整数を入力してください: ");
    scanf("%d", &n);

    if (n <= 1) {
        printf("%d は素数ではありません\n", n);
        return 0;
    }

    isPrime = 1;
    for (i = 2; i < n; i++) {
        if (n % i == 0) {
            isPrime = 0;
            break;
        }
    }

    if (isPrime) {
        printf("%d は素数です\n", n);
    } else {
        printf("%d は素数ではありません\n", n);
    }
    return 0;
}

📝 演習④ 簡易電卓(ループ版)

2つの整数と演算子(+, -, *, /)を入力して計算し、「q」が入力されるまで繰り返すプログラムを作れ。

実行例:

計算式を入力してください(例: 10 + 3)、qで終了: 10 + 3
結果: 13
計算式を入力してください(例: 10 + 3)、qで終了: 8 / 0
0で割れません
計算式を入力してください(例: 10 + 3)、qで終了: q
終了します
19_04_calculator.c
#include <stdio.h>

int main(void)
{
    int a, b;
    char op;

    while (1) {
        printf("計算式を入力してください(例: 10 + 3)、qで終了: ");
        /* scanf で op が 'q' かどうかを先にチェックする工夫が必要 */

    }
    return 0;
}
ヒントを表示

最初に op だけ読み込んで 'q' なら break する方法がある:

scanf(" %c", &op);
if (op == 'q') { break; }
scanf("%d %c %d", /* ... */ );

または scanf("%d %c %d", &a, &op, &b) の戻り値(読めた項目数)で判定する方法もある。

答えの例を表示
#include <stdio.h>

int main(void)
{
    int a, b;
    char op;

    while (1) {
        printf("計算式を入力してください(例: 10 + 3)、qで終了: ");
        if (scanf("%d %c %d", &a, &op, &b) != 3) {
            printf("終了します\n");
            break;
        }
        switch (op) {
            case '+': printf("結果: %d\n", a + b); break;
            case '-': printf("結果: %d\n", a - b); break;
            case '*': printf("結果: %d\n", a * b); break;
            case '/':
                if (b != 0) { printf("結果: %d\n", a / b); }
                else        { printf("0で割れません\n"); }
                break;
            default: printf("無効な演算子です\n");
        }
    }
    return 0;
}