
はじめての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 のおすすめ本

