第26回 | 受け取った値を「しまう」話|C言語の変数と代入をやさしく理解する|データと関数をつなぐ仕組み

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

System Note $ cat /proc/ai-disclosure

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

受け取った値を「しまう」話|C言語の変数と代入をやさしく理解する

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

目次

はじめに

前回は、関数が計算した値を戻り値として返すしくみを学びました。

今回は、その戻り値を変数にしまい、あとから使う流れを見ていきます。

戻り値は、受け取って終わりではありません。
変数に入れておくことで、表示したり、計算したり、次の処理に使ったりできます。

変数は、値を入れておく場所

C言語では、値を入れておく場所を変数と呼びます。

前回の関数を使って、まずは値段を受け取る例を見てみます。

int calculate_drink_price(void) {
    int price = 500;
    price = price + 100;
    return price;
}

この関数は、計算した値段を return price; で返します。

返ってきた値を使いたいときは、次のように変数へ入れます。

int price = calculate_drink_price();

この1行で、calculate_drink_price() が返した値を、price という変数にしまっています。

型と変数名をセットで書く

変数を作るときは、型と変数名を書きます。

int price;

これは、int 型の値を入れるために、price という名前の変数を用意する、という意味です。

  • int は、整数を入れる型
  • price は、変数の名前

作ると同時に値を入れることもできます。

int price = calculate_drink_price();

このように、変数を作ることと、値を入れることを同時に書けます。

= は「同じ」ではなく「代入」

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

C言語では、=代入を表します。

右側を計算して、その結果を左側の変数に入れる。

たとえば、次の1行を見てみます。

int price = calculate_drink_price();
  • 右側の calculate_drink_price() を実行する
  • 戻り値として 600 が返ってくる
  • その値を左側の price に入れる

この向きが大切です。
代入では、左側に「値を入れられる場所」が必要です。

変数に入れると、あとで使える

変数に入れた値は、あとから何度でも使えます。

#include <stdio.h>

int calculate_drink_price(void) {
    int price = 500;
    price = price + 100;
    return price;
}

int main(void) {
    int price = calculate_drink_price();

    printf("ドリンクの値段は %d 円です\n", price);

    if (price > 500) {
        printf("少し高めのドリンクです\n");
    }

    return 0;
}

ここでは、price を2回使っています。

  • 1回目は、値段を表示するため
  • 2回目は、値段が高めかどうか判断するため

戻り値を変数に入れておくと、このように次の処理へつなげられます。

レシピデータも、変数にしまえる

ここからは、少し発展です。

整数だけでなく、構造体のようなまとまったデータも変数に入れられます。

ミックスジュースの材料を、Recipe という構造体でまとめてみます。

typedef struct {
    double banana;
    double mikan;
    double momo;
    double milk;
    double ice;
} Recipe;

Recipe は、材料の量をひとまとめにした型です。

この型を使うと、次のようにレシピデータを変数へ入れられます。

Recipe my_recipe = make_juice();

この1行では、make_juice() が返した Recipe 型のデータを、my_recipe という変数に入れています。

  • Recipe は、変数の型
  • my_recipe は、変数名
  • make_juice() は、Recipe 型の値を返す関数

整数の戻り値でも、構造体の戻り値でも、基本は同じです。
返ってきた値を、型の合う変数に入れます。

しまったデータを使う

構造体の中の値を使うときは、. を使ってメンバーを指定します。

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

my_recipe.banana は、my_recipe の中にある banana の値を表します。

変数にしまっておくことで、あとから必要な値を取り出して使えるようになります。

人数に合わせてレシピを調整する

最後に、変数と代入を使って、人数に合わせたレシピを作るプログラムを見てみます。

ここでは、2人分の基本レシピをもとに、入力された人数に合わせて材料の量を変えます。

#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 result;

    result.banana = base.banana * factor;
    result.mikan  = base.mikan  * factor;
    result.momo   = base.momo   * factor;
    result.milk   = base.milk   * factor;
    result.ice    = base.ice    * factor;

    return result;
}

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("何人分作りますか?: ");

    if (scanf("%d", &target_servings) != 1) {
        printf("数値を入力してください。\n");
        return 1;
    }

    if (target_servings <= 0) {
        printf("人数は1以上で入力してください。\n");
        return 1;
    }

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

    printf("\n=== MIX JUICE RECIPE CARD ===\n");
    printf("Servings: %d\n", target_servings);
    printf("----------------------------\n");
    printf("Banana      : %.1f pcs\n", scaled.banana);
    printf("Canned mikan: %.0f g\n", scaled.mikan);
    printf("Peach       : %.0f g\n", scaled.momo);
    printf("Milk        : %.0f ml\n", scaled.milk);
    printf("Ice         : %.0f g\n", scaled.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;
}

このコードでは、代入が何度も出てきます。

  • Recipe base = ... で、基本レシピを変数に入れる
  • double factor = ... で、倍率を変数に入れる
  • Recipe scaled = ... で、調整後のレシピデータを変数に入れる

値を受け取り、変数にしまい、必要な場所で使う。
この流れが、プログラムを組み立てる基本です。

実行イメージ

何人分作りますか?: 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 の考え方を見ていきます。

次回予告

次回は、しまっておいた値を使いながら、処理をひとまとまりにする「関数」を見ていきます。同じ作業を何度も書くのではなく、名前を付けたレシピカードとして呼び出す感覚をつかんでいきましょう。

復習してみよう

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

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

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

この記事を書いた人

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

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

Created by UNIX Cafe

目次