本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。
第30回 |C言語で覚える、人数を変えて計算できるミックスジュースの作り方|データと関数をつなぐ仕組み

はじめてのC言語 | 第30回
はじめに|人数が変わっても計算し直せるレシピにする
カフェでミックスジュースを作るとき、2人前、3人前、5人前のように人数が変わることがあります。
人数が変わるたびに、材料の量を手で計算し直すのは面倒です。
C言語では、材料名、基本の量、単位を配列にまとめておくと、人数に合わせて材料量を計算できます。
今回は、ミックスジュースのレシピを例にして、配列と for 文を組み合わせる考え方を確認します。
今回作るプログラム
このプログラムでは、次の処理を行います。
- 基本のレシピを2人前として用意する
- 作りたい人数を入力する
- 人数に応じた倍率を計算する
- 各材料の必要量を表示する
材料は、バナナ、みかんの缶詰、桃の缶詰、ミルク、氷の5種類にします。
配列で材料をまとめる
このレシピでは、材料ごとに次の3つの情報を持ちます。
- 材料名
- 基本2人前の量
- 単位
今回は、これらを別々の配列として用意します。
重要なのは、同じ番号の要素どうしが同じ材料を表すという点です。
names[0]はバナナbase_amounts[0]はバナナの基本量units[0]はバナナの単位
この方法では、3つの配列の順番を必ずそろえる必要があります。
順番がずれると、材料名と量や単位の対応が崩れます。
レシピカードのコード
juice_recipe.c という名前で保存します。
#include <stdio.h>
int main(void) {
const int base_people = 2;
int target_people;
const char *names[] = {
"バナナ",
"みかんの缶詰",
"桃の缶詰",
"ミルク",
"氷"
};
const char *units[] = {
"本",
"g",
"g",
"ml",
"g"
};
double base_amounts[] = {
1.0,
150.0,
120.0,
300.0,
100.0
};
int item_count = sizeof(base_amounts) / sizeof(base_amounts[0]);
int i;
printf("人数: ");
if (scanf("%d", &target_people) != 1) {
printf("input error\n");
return 1;
}
if (target_people <= 0) {
printf("人数は1以上にしてください\n");
return 1;
}
double factor = (double)target_people / base_people;
printf("=== ミックスジュース レシピカード ===\n");
printf("%d人前の材料\n", target_people);
printf("----------------------------------\n");
for (i = 0; i < item_count; i++) {
double amount = base_amounts[i] * factor;
printf("%s: %.1f %s\n", names[i], amount, units[i]);
}
printf("----------------------------------\n");
printf("1) すべての材料をミキサーに入れる\n");
printf("2) なめらかになるまで回す\n");
printf("3) グラスに注いで完成\n");
return 0;
}
実行例
コンパイルします。
clang juice_recipe.c -o juice_recipe実行します。
./juice_recipe実行例です。
人数: 3
=== ミックスジュース レシピカード ===
3人前の材料
----------------------------------
バナナ: 1.5 本
みかんの缶詰: 225.0 g
桃の缶詰: 180.0 g
ミルク: 450.0 ml
氷: 150.0 g
----------------------------------
1) すべての材料をミキサーに入れる
2) なめらかになるまで回す
3) グラスに注いで完成コードを読み解く
const char *names[] の意味
const char *names[] は、文字列を指すポインタの配列です。
ここでは、材料名の文字列を一覧として持つために使っています。
第10回で学んだように、C言語の文字列は char の並びです。
このコードでは、文字列リテラルを指す形で材料名を管理しています。
同じ番号どうしがセット
このコードでは、同じ添字の要素が同じ材料を表します。
names[0]: バナナbase_amounts[0]: バナナの量units[0]: バナナの単位
この方法は分かりやすい一方で、配列の順番をそろえる必要があります。
材料を追加するときは、3つの配列に同じ順番で追加します。
item_count の求め方
材料の個数は、次の式で求めています。
int item_count = sizeof(base_amounts) / sizeof(base_amounts[0]);sizeof(base_amounts) は配列全体のサイズです。sizeof(base_amounts[0]) は要素1個分のサイズです。
配列全体のサイズを要素1個分のサイズで割ることで、要素数を求めています。
これにより、材料数を直接 5 と書かずに済みます。
倍率を計算する
基本のレシピは2人前です。
作りたい人数を入力し、次の式で倍率を計算します。
double factor = (double)target_people / base_people;(double) を付けているのは、小数を含む計算にするためです。
たとえば3人前なら、2人前の 1.5 倍になります。
for 文で材料を順番に処理する
材料の数だけ繰り返して、必要量を計算します。
for (i = 0; i < item_count; i++) {
double amount = base_amounts[i] * factor;
printf("%s: %.1f %s\n", names[i], amount, units[i]);
}この1つのループで、材料名、計算後の量、単位を順番に表示しています。
材料を追加するときの注意
材料を追加する場合は、1箇所だけではなく、関連する配列すべてに追加します。
namesに材料名を追加するunitsに単位を追加するbase_amountsに基本量を追加する
3つの配列の順番をそろえることが重要です。
順番がずれると、材料名と量や単位が対応しなくなります。
このような対応のずれを防ぎたい場合は、構造体で「材料名、量、単位」を1つにまとめる方法もあります。
構造体を使うと、1つの材料に関する情報を1つのまとまりとして扱えます。
今回のまとめ
- 配列を使うと、同じ種類のデータをまとめて扱える
- 複数の配列を使う場合は、同じ添字どうしの対応を守る必要がある
for文を使うと、材料を順番に処理できるsizeofを使うと、配列の要素数を計算できる- 人数を入力すれば、人数に応じた材料量を計算できる
配列は、同じ種類のデータを整えて並べるための道具です。
今回のように、材料名、量、単位を対応させて扱うと、人数が変わっても同じ処理の流れで計算できます。
次回予告
次回は、C言語で避けて通れない「ポインタ」の考え方に進みます。
値そのものではなく「場所」を扱う感覚を、ロケーション札のイメージでゆっくり整理していきます。
復習してみよう
復習したい方は、こちらもあわせてご覧ください。













