C言語プログラミング実習課題集

課題1: ランダムな学籍番号生成

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

#define NUM_ITEMS 5

int main() {
    int rand_val;
    srand(time(0));
    
    for (int count = 0; count < NUM_ITEMS; count++) {
        rand_val = rand() % 100 + 1;
        printf("20240042%04d\n", rand_val);
    }

    return 0;
}

このプログラムは1から100の乱数を生成し、学籍番号フォーマットで出力します。srand(time(0))で乱数シードを初期化し、rand()関数で乱数値を取得します。

課題2: 自動販売機シミュレータ

#include <stdio.h>

int main() {
    enum Drink { COLA=1, SPRITE, JUICE, WATER, EXIT=0 };
    int selection, qty;
    float total = 0, payment, change;

    while (1) {
        printf("\n飲料メニュー:\n");
        printf("%d. コーラ - 3元\n", COLA);
        printf("%d. スプライト - 3元\n", SPRITE);
        printf("%d. オレンジジュース - 5元\n", JUICE);
        printf("%d. ミネラルウォーター - 2元\n", WATER);
        printf("%d. 終了\n", EXIT);
        printf("選択: ");
        scanf("%d", &selection);

        if (selection == EXIT) break;
        if (selection < COLA || selection > WATER) {
            printf("無効な選択です\n");
            continue;
        }

        printf("数量: ");
        scanf("%d", &qty);
        if (qty < 0) {
            printf("数量エラー\n");
            continue;
        }

        switch(selection) {
            case COLA:
            case SPRITE: total += 3 * qty; break;
            case JUICE:  total += 5 * qty; break;
            case WATER:  total += 2 * qty; break;
        }

        printf("支払額: ");
        scanf("%f", &payment);
        change = payment - total;
        printf("合計: %.2f元\n", total);
        printf("お釣り: %.2f元\n", change);

        total = 0;
    }
    printf("取引終了\n");
    return 0;
}

列挙型を使用して飲料コードを定義し、switch文で価格計算を行います。合計金額リセットは次の取引準備のために必須です。

課題3: 信号機制御システム

#include <stdio.h>

int main() {
    const char RED = 'r', GREEN = 'g', YELLOW = 'y';
    char signal;

    while (1) {
        printf("信号入力 (r/g/y): ");
        scanf(" %c", &signal);

        if (signal == RED) {
            printf("停止!\n");
        } else if (signal == GREEN) {
            printf("進行\n");
        } else if (signal == YELLOW) {
            printf("注意\n");
        } else {
            printf("無効な信号\n");
        }
    }
    return 0;
}

定数を使用して信号コードを定義し、条件分岐で対応する動作を出力します。スペース付きの%cフォーマットで改行文字の問題を回避します。

課題4: 支出管理システム

#include <stdio.h>

int main() {
    double amount, max_expense = 0, min_expense = __DBL_MAX__, sum = 0;
    
    printf("支出入力 (-1で終了):\n");
    while (1) {
        scanf("%lf", &amount);
        if (amount == -1) break;
        
        sum += amount;
        if (amount > max_expense) max_expense = amount;
        if (amount < min_expense) min_expense = amount;
    }
    
    printf("合計支出: %.2f\n", sum);
    printf("最大支出: %.2f\n", max_expense);
    printf("最小支出: %.2f\n", min_expense);
    return 0;
}

最小値初期化にDBL_MAXを使用し、-1入力でループ終了します。実数型で正確な金額処理を実現します。

課題5: ラッキーデイ推測ゲーム

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

int main() {
    int actual_day, user_guess, attempts = 3;
    srand(time(NULL));
    actual_day = rand() % 30 + 1;

    printf("2025年4月のラッキーデイを予測\n");
    printf("推測回数: %d回 (1-30)\n", attempts);

    while (attempts > 0) {
        printf("予想日: ");
        scanf("%d", &user_guess);
        
        if (user_guess < actual_day) {
            printf("早すぎます\n");
        } else if (user_guess > actual_day) {
            printf("遅すぎます\n");
        } else {
            printf("正解!\n");
            return 0;
        }
        attempts--;
    }
    printf("正解: %d日\n", actual_day);
    return 0;
}

乱数で決定した実際の日付をユーザーに推測させるゲームです。試行回数の管理とヒント出力を実装しています。

課題6: パターン描画プログラム

#include <stdio.h>

int main() {
    int layers;
    printf("層数入力: ");
    scanf("%d", &layers);

    for (int row = 1; row <= layers; row++) {
        for (int space = 0; space < row - 1; space++) {
            printf("\t");
        }
        for (int symbol = 0; symbol < 2 * (layers - row + 1) - 1; symbol++) {
            printf(" o \t");
        }
        printf("\n");

        for (int space = 0; space < row - 1; space++) {
            printf("\t");
        }
        for (int symbol = 0; symbol < 2 * (layers - row + 1) - 1; symbol++) {
            printf("<H>\t");
        }
        printf("\n");

        for (int space = 0; space < row - 1; space++) {
            printf("\t");
        }
        for (int symbol = 0; symbol < 2 * (layers - row + 1) - 1; symbol++) {
            printf("I I\t");
        }
        printf("\n");
    }
    return 0;
}

三重のネストされたループで複雑なパターンを生成します。インデント制御とシンボル配置のアルゴリズムが特徴です。

タグ: C言語 乱数生成 条件分岐 ループ処理 実践的プログラミング

7月6日 23:04 投稿