課題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;
}
三重のネストされたループで複雑なパターンを生成します。インデント制御とシンボル配置のアルゴリズムが特徴です。