第14回|受け取ったドリンクを「しまう」話|C言語の変数と代入をやさしく理解する

当サイトでは、コンテンツの一部に広告を掲載しています。
第14回|受け取ったドリンクを「しまう」話|C言語の変数と代入をやさしく理解する

はじめてのC言語 | 第14回

目次

ドリンクを受け取っただけでは、まだ足りない

前回の回では、関数がドリンクを作り、
その結果を 戻り値として「受け取る」 ところまで進みました。

でも、少し立ち止まって考えてみます。

カフェでドリンクを受け取ったあと、
そのままカウンターに置きっぱなしにするでしょうか。

多くの場合は、

  • 自分のマグカップに入れる
  • トレイに乗せて席へ運ぶ

そんな行動を取るはずです。

受け取っただけでは、まだ安心できない のです。

「しまう場所」があると、あとで使える

ドリンクを自分の場所にしまっておくと、

  • 誰のものか分かる
  • あとでゆっくり飲める
  • 別の作業に集中できる

という良いことがあります。

プログラムの世界でも、
この「しまう」という考え方はとても大切です。

関数から受け取った値も、
きちんと置き場所を決めてあげる 必要があります。

C言語でいう「変数」は、受け皿のようなもの

C言語では、受け取った値を 変数 にしまいます。

ここで、ミックスジュースのレシピを例にしてみましょう。

前回までに登場した関数は、
レシピ(材料のまとまり)を作って返すものでした。

Recipe make_juice(void) {
    Recipe r;

    r.banana = 1.0;
    r.mikan  = 150.0;
    r.momo   = 120.0;
    r.milk   = 300.0;
    r.ice    = 100.0;

    return r;
}

この関数は、

  • レシピを作り
  • 最後に return r; で返しています

ここまでが、前回の「戻り値」のお話でした。

ここからが、今回のいちばん大事なポイントです。

受け取ったレシピを「しまう」

では、このレシピを受け取ったあと、
どこに置けばよいのでしょうか。

答えは 変数 です。

Recipe my_recipe = make_juice();

この1行は、次のような意味を持っています。

  • make_juice() がレシピを作り
  • そのレシピをmy_recipe という箱にしまう

my_recipe は、あとで使うためのレシピカード置き場 です。

=(イコール)は「同じ」ではなく「入れる」

ここは、初心者がよく戸惑うところです。

result = make_juice();

この = は、数学の「等しい」という意味ではありません。

プログラミングでは、右側のものを評価して、左側に入れるという動きが基本になります。

C言語では、この動きがとてもはっきりと見えます。

カフェで言えば、「作ったレシピを、このカードケースに入れてください」

という指示に近い感覚です。

左に置くのが しまう場所
右に置くのが 受け取ったもの

この向きが、とても大切です。

しまったレシピを使って表示する

一度しまったレシピは、
何度でも安心して使えます。

printf("Banana : %.1f pcs\n", my_recipe.banana);
printf("Milk   : %.0f ml\n", my_recipe.milk);

これは、

  • my_recipe という箱から
  • 必要な材料を取り出して
  • 画面に表示している

という流れです。

画面から人数を入力できるようにする

ここで、もう一歩進めてみましょう。

このプログラムでは、
何人分作るか をキーボードから入力できるようにしています。

printf("何人分作りますか?: ");
scanf("%d", &target_servings);

この2行は、
プログラムと人との会話 を作っています。

  • printf は、質問を画面に表示する
  • scanf は、キーボードから入力された数値を受け取る

今は、キーボードで入力した数値が、変数に入ると理解できれば十分です。

仕上げ|人数に合わせてレシピを調整するプログラム

ここまでで学んだことを、
すべてまとめた完成形が、次のコードです。

#include <stdio.h>

typedef struct {
    double banana;   // 本
    double mikan;    // g(缶詰)
    double momo;     // g
    double milk;     // ml
    double ice;      // g
} Recipe;

double scale_factor(int base_servings, int target_servings) {
    return (double)target_servings / (double)base_servings;
}

Recipe scale_recipe(Recipe base, double factor) {
    Recipe r;
    r.banana = base.banana * factor;
    r.mikan  = base.mikan  * factor;
    r.momo   = base.momo   * factor;
    r.milk   = base.milk   * factor;
    r.ice    = base.ice    * factor;
    return r;
}

int main(void) {
    Recipe base = {
        1.0,   // banana
        150.0, // mikan
        120.0, // momo
        300.0, // milk
        100.0  // ice
    };

    int base_servings = 2;
    int target_servings;

    printf("何人分作りますか?: ");
    scanf("%d", &target_servings);

    double factor = scale_factor(base_servings, target_servings);
    Recipe r = scale_recipe(base, factor);

    printf("\n=== MIX JUICE RECIPE CARD ===\n");
    printf("Servings: %d\n", target_servings);
    printf("----------------------------\n");
    printf("Banana      : %.1f pcs\n", r.banana);
    printf("Canned mikan: %.0f g\n", r.mikan);
    printf("Peach       : %.0f g\n", r.momo);
    printf("Milk        : %.0f ml\n", r.milk);
    printf("Ice         : %.0f g\n", r.ice);
    printf("----------------------------\n");
    printf("1) Put all ingredients in a blender.\n");
    printf("2) Blend until smooth.\n");
    printf("3) Pour into glasses and serve.\n");
    printf("============================\n");

    return 0;
}

実行イメージ

このプログラムを実行すると、
まず人数を聞かれます。

何人分作りますか?: 4

入力すると、
その人数に合わせたレシピが表示されます。

=== MIX JUICE RECIPE CARD ===
Servings: 4
----------------------------
Banana      : 2.0 pcs
Canned mikan: 300 g
Peach       : 240 g
Milk        : 600 ml
Ice         : 200 g
----------------------------
1) Put all ingredients in a blender.
2) Blend until smooth.
3) Pour into glasses and serve.
============================

まとめ|受け取る → しまう → 使う

今回の流れを、もう一度整理します。

  • 関数は、レシピを作る
  • 戻り値は、作られたドリンク
  • 変数は、しまっておく場所
  • = は、「入れる」という動作

プログラムは、

  • 作って
  • 受け取って
  • しまって
  • 使う

その繰り返しです。

この順番を意識できると、
C言語のコードが、ぐっと読みやすくなります。

「受け取って終わり」ではなく、
「しまって、また使う」。

それが、プログラムを組み立てる基本です。

次回予告

次回は、
しまっておいたレシピを、条件によって使い分ける話 に進みます。

注文に応じて動きを変える、
条件分岐(if)の世界です。

また、カフェで続きを読みましょう ☕

さらに学びたいあなたへ

📘 用途ごとに選ぶ Linux のおすすめ本

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

この記事を書いた人

のいのアバター のい UNIX Cafe 編集部

UNIX Cafe は、むずかしい言葉をできるだけ使わず、物語を読むような気持ちで気軽に学べる場所です。
プログラミングは、アイデアをコンピューターに伝えるための「ことば」。
簡単な単語と文法を覚えることで、誰でもターミナルから便利なコマンドを使えるようになります。
コーヒーを片手に立ち寄るような気持ちで、やさしいプログラミングの世界を、
そっとのぞいてみてください。

目次