第30回 |C言語で覚える、人数を変えて計算できるミックスジュースの作り方|データと関数をつなぐ仕組み

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

データと関数をつなぐ |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言語で避けて通れない「ポインタ」の考え方に進みます。
値そのものではなく「場所」を扱う感覚を、ロケーション札のイメージでゆっくり整理していきます。

復習してみよう

復習したい方は、こちらもあわせてご覧ください。

用途ごとに選ぶ C言語のおすすめ本

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

Created by UNIX Cafe

目次