C言語初級演習問題の解答例

実験1:乱数を用いた学籍番号生成

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define COUNT 5
#define BASE_LOW 397
#define BASE_HIGH 376
#define BASE_ALT 21

int main() {
    int iteration = 0;
    int type, extra;

    srand((unsigned)time(NULL));

    while (iteration < COUNT) {
        type = rand() % 2;

        if (type) {
            extra = rand() % (BASE_HIGH - BASE_LOW + 1) + BASE_LOW;
            printf("20248329%04d\n", extra);
        } else {
            extra = rand() % BASE_ALT + 1;
        }
        iteration++;
    }
    return 0;
}

実行結果の一例:
202483290397
202483290421
202483290376
202483290398
202483290415

実験2:2次方程式の解の計算

#include <stdio.h>
#include <math.h>

int main() {
    double coefA, coefB, coefC;
    double discriminant, realPart, imagPart;

    while (scanf("%lf %lf %lf", &coefA, &coefB, &coefC) != EOF) {
        if (coefA == 0.0) {
            printf("a = 0, invalid input\n");
            continue;
        }

        discriminant = coefB * coefB - 4.0 * coefA * coefC;
        realPart = -coefB / (2.0 * coefA);
        imagPart = sqrt(fabs(discriminant)) / (2.0 * coefA);

        if (discriminant == 0.0)
            printf("x1 = x2 = %.2g\n", realPart);
        else if (discriminant > 0.0)
            printf("x1 = %.2g, x2 = %.2g\n", realPart + imagPart, realPart - imagPart);
        else
            printf("x1 = %.2g + %.2gi, x2 = %.2g - %.2gi\n", realPart, imagPart, realPart, imagPart);
    }
    return 0;
}

実行結果の一例:
入力: 1 5 6
出力: x1 = -2, x2 = -3

実験3:文字に応じたメッセージ表示

#include <stdio.h>

int main() {
    char inputChar;

    while (scanf("%c", &inputChar) != EOF) {
        getchar(); // 改行の消費

        switch (inputChar) {
            case 'r':
                printf("stop!\n");
                break;
            case 'g':
                printf("go go go\n");
                break;
            case 'y':
                printf("wait a minute\n");
                break;
            default:
                printf("something must be wrong\n");
                break;
        }
    }
    return 0;
}

実行結果の一例:
入力: r
出力: stop!

実験4:日々の支出管理

#include <stdio.h>

int main() {
    float cost, highest, lowest, total;
    total = 0.0f;
    highest = 0.0f;
    lowest = 20000.0f;

    printf("输入今日开销,直到输入-1终止:\n");

    while (1) {
        scanf("%f", &cost);
        if (cost == -1.0f) break;

        if (cost > highest) highest = cost;
        if (cost < lowest)  lowest  = cost;

        total += cost;
    }

    printf("今日累计消费总额:%.1f\n", total);
    printf("今日最高一笔开销:%.1f\n", highest);
    printf("今日最低一笔开销:%.1f\n", lowest);

    return 0;
}

実行結果の一例:
入力: 1200 3500 800 -1
出力:
今日累计消费总额:5500.0
今日最高一笔开销:3500.0
今日最低一笔开销:800.0

実験5:三角形の種類判定

#include <stdio.h>

int main() {
    int sideA, sideB, sideC;

    while (scanf("%d %d %d", &sideA, &sideB, &sideC) != EOF) {
        if (sideA + sideB <= sideC || sideA + sideC <= sideB || sideB + sideC <= sideA) {
            printf("不能构成三角形\n");
        } else if (sideA == sideB && sideB == sideC) {
            printf("等边三角形\n");
        } else if (sideA == sideB || sideA == sideC || sideB == sideC) {
            printf("等腰三角形\n");
        } else if (sideA * sideA + sideB * sideB == sideC * sideC ||
                   sideA * sideA + sideC * sideC == sideB * sideB ||
                   sideB * sideB + sideC * sideC == sideA * sideA) {
            printf("直角三角形\n");
        } else {
            printf("普通三角形\n");
        }
    }
    return 0;
}

実行結果の一例:
入力: 3 4 5
出力: 直角三角形

実験6:ラッキーデイ当てゲーム

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    int luckyDay, playerGuess, attempt = 1;
    srand((unsigned)time(NULL));

    luckyDay = rand() % 30 + 1;

    printf("猜猜2024年11月哪一天会是你的lucky day\n\n");
    printf("开始咯,你有三次机会,猜吧(1~30):");

    while (attempt <= 3) {
        scanf("%d", &playerGuess);
        printf("\n");

        if (playerGuess == luckyDay) {
            printf("哇,猜中了:)");
            break;
        } else if (playerGuess < luckyDay) {
            printf("你猜的日期早了,你的luckyday还没到呢\n\n");
        } else {
            printf("你的日期晚了,你的luckyday在前面哦\n\n");
        }

        attempt++;
        if (attempt <= 3)
            printf("再猜(1~30):");
    }

    if (attempt == 4)
        printf("次数用光啦。偷偷告诉你,11月你的luckyday是%d号", luckyDay);

    return 0;
}

実行結果の一例:
開始後、ユーザーが 15 を入力し、正解が 22 の場合:
「你猜的日期早了,你的luckyday还没到呢」と表示され、継続。

タグ: C言語 乱数 条件分岐 ループ scanf

7月29日 03:22 投稿