1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C言語の基本|初めてのプログラムを動かしながら、書き方と考え方を学ぶ

1
Last updated at Posted at 2026-06-25

C言語を基礎から順に学びたい場合は、C言語 学習ロードマップ を参照してください。

C言語を初めて学ぶ人向けに、基本的な書き方と動かし方を順番にまとめます。

C言語は、文法を読むだけでは分かりにくい言語です。

短いプログラムを書き、実行し、値を変え、結果がどう変わるかを確認すると理解しやすくなります。

この記事では、次の内容を実際に動かしながら学びます。

  • C言語はどこで使われているか
  • プログラムを書く・コンパイルする・実行する流れ
  • 文字の表示
  • 変数と計算
  • 条件分岐と複数の条件の組み合わせ
  • キーボード入力
  • 繰り返しと途中で抜ける処理
  • 配列と文字列
  • 関数
  • よくあるエラーと確認方法

この記事は、C言語の基本的な文法と、処理を組み立てる考え方を学ぶための記事です。

ポインタ、構造体、動的メモリ、ファイル操作は、次の記事以降で段階的に扱います。


C言語は何に使われているのか

C言語は、機械の中に入っている小さなコンピューターを動かすソフトで使われることが多い言語です。

このように、製品の中で機械を動かすソフトを組み込みソフトと呼びます。

身近な製品では、次のような部分でC言語やC言語に近い技術が使われることがあります。

身近なもの C言語が使われることがある部分
テレビ リモコンの受信、音量調整、映像や音の制御
エアコン 温度の取得、風量やモーターの制御
洗濯機 水量、回転、時間、ボタン操作の制御
電子レンジ 加熱時間、ボタン、表示、センサーの制御
自動車 センサーの値の取得、各部品の制御
工場の機械 モーター、センサー、装置の制御
スマートフォン アプリの下で、画面、通信、カメラ、保存などを支える土台の一部

イメージとしては、次のような位置です。

人が操作する部分
画面、ボタン、リモコン、スマホアプリ
                ↓
機器を動かすソフト
C言語が使われることがある
                ↓
機械の部品
画面、音、通信、カメラ、センサー、モーター

テレビやスマートフォンが、すべてC言語だけで作られているわけではありません。

製品の中では複数の言語やソフトが役割分担しています。

C言語は、機械の部品に近い場所を扱いたい場合や、少ないメモリで安定して動かしたい場合に使われやすい言語です。


前提

まだC言語を動かす環境を作っていない場合は、先にこちらの記事を参照してください。

Windows 11 + WSL + VS CodeでC言語を動かす

この記事では、次の状態を前提にします。

  • VS CodeでUbuntu(WSL)に接続できている
  • VS CodeでUbuntu側のフォルダーを開いている
  • ターミナルで gcc --version を実行できる
  • C言語のファイルを保存できる

最初に覚える流れ

C言語では、コードを書いただけではプログラムは動きません。

次の流れで動かします。

C言語のコードを書く
↓
保存する
↓
コンパイルする
↓
実行する
↓
結果を確認する

用語の意味は次のとおりです。

用語 意味
ソースコード 人が書くC言語のコード
コンパイル C言語のコードを、PCが実行できる形式へ変換すること
コンパイラ コンパイルを行うプログラム。今回はGCCを使う
実行ファイル コンパイル後に作られる、実際に動かせるファイル

C言語のファイル名には、通常 .c を付けます。

hello.c

この hello.c が、C言語のソースコードです。


学習用フォルダーを作る

VS CodeでUbuntu(WSL)に接続した状態で、ターミナルを開きます。

上部メニューから、次を選びます。

ターミナル → 新しいターミナル

次のコマンドを実行します。

mkdir -p ~/c-study/01-basics
cd ~/c-study/01-basics

この記事で作るファイルは、このフォルダーに保存します。


コメントとは何か

コードの中には、説明を書くためのコメントを入れられます。

コメントは、人がコードを読みやすくするための文章です。

コンパイルするときは、コメントは無視されます。

// これは1行のコメントです。
int age = 20;

この記事のソースコードには、意味が分かるようにコメントを多めに入れています。

最初はコメントを読みながら、コードの役割を追っていけば問題ありません。


1. 画面に文字を表示する

最初に、画面へ文字を表示するプログラムを作ります。

hello.c という名前でファイルを作成してください。

#include <stdio.h>

int main(void)
{
    // printf は、画面に文字や数値を表示するための命令です。
    // \n は改行を表します。
    printf("Hello, World!\n");

    // 0 は「正常に終了した」という意味です。
    return 0;
}

保存した後、ターミナルでコンパイルします。

gcc -std=c17 -Wall -Wextra -Wpedantic hello.c -o hello

コンパイルに成功すると、hello という実行ファイルが作られます。

次のコマンドで実行します。

./hello

実行結果です。

Hello, World!

コードを1行ずつ見る

#include <stdio.h>

printf を使うための準備です。

stdio.h は、文字を表示したり、キーボードから入力を受け取ったりするための機能をまとめたものです。

int main(void)

プログラムが始まる場所です。

C言語のプログラムは、基本的に main 関数から実行されます。

{

処理の始まりです。

printf("Hello, World!\n");

画面に文字を表示します。

return 0;

プログラムが正常に終わったことを表します。

}

処理の終わりです。


C言語では ; を付ける

C言語では、基本的に処理の終わりに ; を付けます。

printf("Hello, World!\n");

次のように ; を忘れると、コンパイルエラーになります。

printf("Hello, World!\n")

エラーが出たときは、表示された行だけでなく、その1行前も確認してください。

; の付け忘れは、次の行でエラーとして表示されることがあります。


文字を変えて動かす

表示する文字を、自分の好きな内容に変えてみます。

#include <stdio.h>

int main(void)
{
    // 表示する文字は " " の中に書きます。
    printf("C言語の勉強を始めました。\n");

    return 0;
}

コードを変えた後は、保存だけで終わりではありません。

もう一度コンパイルしてから実行します。

動かして確かめる

表示する文章を自分の名前や好きな言葉へ変え、保存・コンパイル・実行までをもう一度行ってください。

gcc -std=c17 -Wall -Wextra -Wpedantic hello.c -o hello
./hello

2. 変数に数値を入れて計算する

プログラムでは、数値や文字を一時的に覚えておけます。

この入れ物を変数と呼びます。

variables.c というファイルを作成してください。

#include <stdio.h>

int main(void)
{
    // int は、整数を入れるための型です。
    // quantity という名前の変数に 3 を入れます。
    int quantity = 3;

    // unit_price という名前の変数に 120 を入れます。
    int unit_price = 120;

    // 数量と単価を掛け算し、結果を total_price に入れます。
    int total_price = quantity * unit_price;

    // %d の位置に、整数の値を表示します。
    printf("数量: %d\n", quantity);
    printf("単価: %d円\n", unit_price);
    printf("合計金額: %d円\n", total_price);

    return 0;
}

コンパイルして実行します。

gcc -std=c17 -Wall -Wextra -Wpedantic variables.c -o variables
./variables

実行結果です。

数量: 3
単価: 120円
合計金額: 360円

動かして確かめる

quantityunit_priceを変え、合計金額が正しく変わるか確認してください。


変数のイメージ

次のコードを見てください。

int quantity = 3;

これは、quantity という名前の箱を作り、その中へ 3 を入れるイメージです。

quantity
┌───┐
│ 3 │
└───┘

次のコードでは、数量と単価を使って合計金額を計算しています。

int total_price = quantity * unit_price;

処理の流れは次のとおりです。

quantity      unit_price
    3      ×      120
                 ↓
                360
                 ↓
            total_price

intdouble

変数を作るときは、どの種類の値を入れるかを指定します。

最初は、次の2つを覚えれば十分です。

入れる値
int 整数 10-31200
double 小数を含む数値 3.140.1012.5

たとえば、消費税率のように小数を使う値には double を使います。

double tax_rate = 0.10;

%d は整数を表示する場所

次のコードを見てください。

printf("数量: %d\n", quantity);

%d は、整数を表示する場所です。

実行すると、quantity の値が %d の位置に入ります。

数量: %d
↓
数量: 3

文字だけを表示する場合は、%d は必要ありません。

printf("おはようございます。\n");

計算に使う記号

C言語では、次の記号で計算できます。

記号 意味
+ 足し算 10 + 3
- 引き算 10 - 3
* 掛け算 10 * 3
/ 割り算 10 / 3
% 割り算の余り 10 % 3

次のコードで結果を確認できます。

#include <stdio.h>

int main(void)
{
    // 足し算
    printf("10 + 3 = %d\n", 10 + 3);

    // 引き算
    printf("10 - 3 = %d\n", 10 - 3);

    // 掛け算
    printf("10 * 3 = %d\n", 10 * 3);

    // 割り算
    printf("10 / 3 = %d\n", 10 / 3);

    // 割り算の余り
    // printf の中で % を表示するときは %% と書きます。
    printf("10 %% 3 = %d\n", 10 % 3);

    return 0;
}

実行結果です。

10 + 3 = 13
10 - 3 = 7
10 * 3 = 30
10 / 3 = 3
10 % 3 = 1

10 / 3 の結果が 3 になる点に注意してください。

int 同士の割り算では、小数点以下が切り捨てられます。

10 ÷ 3 = 3.333...
↓
int 同士で計算
↓
3

3. 小数を使って計算する

次は、消費税を含めた金額を計算します。

double.c というファイルを作成してください。

#include <stdio.h>

int main(void)
{
    // 数量と単価は、小数を使わないため int 型です。
    int quantity = 3;
    int unit_price = 120;

    // 消費税率は 0.10 のように小数を使うため double 型です。
    double tax_rate = 0.10;

    // 税抜合計を計算します。
    int total_price = quantity * unit_price;

    // 1.0 + tax_rate は、1.10 です。
    // 税抜合計に 1.10 を掛けて税込合計を求めます。
    double total_with_tax = total_price * (1.0 + tax_rate);

    printf("税抜合計: %d円\n", total_price);

    // %.0f は、小数点以下を表示しない double 用の指定です。
    printf("税込合計: %.0f円\n", total_with_tax);

    return 0;
}

コンパイルして実行します。

gcc -std=c17 -Wall -Wextra -Wpedantic double.c -o double
./double

実行結果です。

税抜合計: 360円
税込合計: 396円

%d%f の違い

printf で変数の値を表示するときは、型に合った書き方を使います。

表示方法
int %d printf("%d\n", 10);
double %f printf("%f\n", 3.14);

小数点以下を表示したくない場合は、%.0f を使います。

printf("%.0f\n", total_with_tax);

小数点以下1桁まで表示したい場合は、%.1f を使います。

printf("%.1f\n", 3.14159);

実行結果です。

3.1

動かして確かめる

quantityunit_pricetax_rateを変え、税込合計がどう変わるか確認してください。


4. 条件によって処理を変える

条件によって処理を変えるときは、if を使います。

ここでは、点数が60点以上なら合格と表示します。

if.c というファイルを作成してください。

#include <stdio.h>

int main(void)
{
    // 点数を変数に入れます。
    int score = 72;

    // score が 60 以上かを確認します。
    if (score >= 60)
    {
        // 条件が正しい場合に実行されます。
        printf("合格です。\n");
    }
    else
    {
        // 条件が正しくない場合に実行されます。
        printf("不合格です。\n");
    }

    return 0;
}

コンパイルして実行します。

gcc -std=c17 -Wall -Wextra -Wpedantic if.c -o if
./if

実行結果です。

合格です。

score の値を 45 に変えて、もう一度実行してみてください。

int score = 45;

実行結果は次のようになります。

不合格です。

if のイメージ

次のコードは、点数が60以上かどうかを確認しています。

if (score >= 60)

処理の流れは次のとおりです。

score は 72
↓
72 は 60 以上か
↓
はい
↓
「合格です。」を表示する

if は、次の形で書きます。

if (条件)
{
    条件が正しい場合の処理
}
else
{
    条件が正しくない場合の処理
}

比較に使う記号

記号 意味
== 等しい score == 100
!= 等しくない score != 0
> より大きい score > 60
>= 以上 score >= 60
< より小さい score < 60
<= 以下 score <= 60

特に注意するのは、=== の違いです。

score = 60;

これは、score60 を入れる処理です。

score == 60

これは、score60 と等しいかを確認する条件です。


条件を増やす

80点以上なら「よくできました」、60点以上なら「合格です」と表示する場合は、else if を使います。

#include <stdio.h>

int main(void)
{
    int score = 72;

    // まず、80点以上かを確認します。
    if (score >= 80)
    {
        printf("よくできました。\n");
    }
    // 80点未満だった場合に、60点以上かを確認します。
    else if (score >= 60)
    {
        printf("合格です。\n");
    }
    // どの条件にも当てはまらなかった場合の処理です。
    else
    {
        printf("不合格です。\n");
    }

    return 0;
}

処理の流れです。

score は 72
↓
80 以上か
↓
いいえ
↓
60 以上か
↓
はい
↓
「合格です。」を表示する

複数の条件を組み合わせる

実務では、1つの条件だけではなく、複数の条件を組み合わせて判定することがあります。

このときに使う記号が、論理演算子です。

記号 読み方のイメージ 条件が正しくなる場合
&& かつ 左右の条件がどちらも正しい
` `
! ではない 条件の正しさを反対にする

たとえば、年齢が18歳以上かつ65歳未満かを確認する場合は、次のように書きます。

#include <stdio.h>

int main(void)
{
    int age = 30;

    // age が 18 以上で、かつ 65 未満かを確認します。
    if (age >= 18 && age < 65)
    {
        printf("対象年齢です。\n");
    }
    else
    {
        printf("対象年齢ではありません。\n");
    }

    return 0;
}

&& の処理の流れです。

age は 18 以上か
↓
はい
↓
age は 65 未満か
↓
はい
↓
左右の条件がどちらも正しいため、全体も正しい

次は、1から10の範囲外かどうかを確認する例です。

#include <stdio.h>

int main(void)
{
    int number = 12;

    // 1未満、または10より大きい場合に範囲外と判断します。
    if (number < 1 || number > 10)
    {
        printf("1から10までの数を指定してください。\n");
    }
    else
    {
        printf("範囲内の数です。\n");
    }

    return 0;
}

! は、条件を反対にしたい場合に使えます。

#include <stdio.h>

int main(void)
{
    int is_finished = 0;

    // !is_finished は「完了していない」という意味です。
    if (!is_finished)
    {
        printf("処理はまだ完了していません。\n");
    }

    return 0;
}

0 は「正しくない」、0以外は「正しい」として扱われます。

ただし、最初のうちは ! を多用せず、読みやすい条件式を優先してください。

動かして確かめる

score456080に変え、どの条件が実行されるか確認してください。


5. キーボードから数値を入力する

これまでは、コードの中に数値を書いていました。

次は、プログラムを実行してからキーボードで数値を入力します。

input_score.c というファイルを作成してください。

#include <stdio.h>

int main(void)
{
    // 入力される点数を入れる変数です。
    // 最初は 0 を入れておきます。
    int score = 0;

    // 画面に案内を表示します。
    printf("点数を入力してください: ");

    // キーボードから整数を1つ読み取ります。
    // 読み取れた値は score に入ります。
    //
    // &score の詳しい意味は、ポインタの記事で扱います。
    if (scanf("%d", &score) != 1)
    {
        // 数値以外が入力された場合の処理です。
        printf("整数を入力してください。\n");

        // 0 以外は、途中で終了したことを表します。
        return 1;
    }

    // 入力された点数で判定します。
    if (score >= 80)
    {
        printf("よくできました。\n");
    }
    else if (score >= 60)
    {
        printf("合格です。\n");
    }
    else
    {
        printf("不合格です。\n");
    }

    return 0;
}

コンパイルして実行します。

gcc -std=c17 -Wall -Wextra -Wpedantic input_score.c -o input_score
./input_score

実行例です。

点数を入力してください: 72
合格です。

scanf の役割

次のコードは、キーボードから整数を入力する処理です。

scanf("%d", &score);

処理の流れは次のとおりです。

キーボードから 72 を入力する
↓
scanf が 72 を読み取る
↓
score に 72 を入れる
↓
if で点数を判定する

%d は、整数を読み取る指定です。

&score は、入力した値を score に保存するために必要な書き方です。

この & はポインタに関係します。

今の段階では、整数を入力するときは次の形で書くと覚えれば十分です。

scanf("%d", &変数名);

詳しい意味は、次の記事「C言語のポインタ入門」で説明します。

C言語のポインタ入門|「値」と「場所」を分けて考える

動かして確かめる

726045を入力し、表示が変わることを確認してください。数値以外を入力した場合も試してください。


6. 同じ処理を繰り返す

同じ処理を何回も行うときは、for を使います。

ここでは、1から10までを足して、合計を求めます。

for_sum.c というファイルを作成してください。

#include <stdio.h>

int main(void)
{
    // 合計を入れる変数です。
    // 最初は何も足していないため、0 から始めます。
    int total = 0;

    // number を 1 から 10 まで 1 ずつ増やしながら繰り返します。
    for (int number = 1; number <= 10; number++)
    {
        // 今から足す数を表示します。
        printf("%d を足します。\n", number);

        // total に number を足して、結果を total に入れ直します。
        total = total + number;
    }

    // 繰り返しが終わった後の合計を表示します。
    printf("1から10までの合計: %d\n", total);

    return 0;
}

コンパイルして実行します。

gcc -std=c17 -Wall -Wextra -Wpedantic for_sum.c -o for_sum
./for_sum

実行結果です。

1 を足します。
2 を足します。
3 を足します。
4 を足します。
5 を足します。
6 を足します。
7 を足します。
8 を足します。
9 を足します。
10 を足します。
1から10までの合計: 55

for の読み方

次の部分が、繰り返しの指定です。

for (int number = 1; number <= 10; number++)

3つに分けて読むと分かりやすくなります。

部分 意味
int number = 1 最初に number へ1を入れる
number <= 10 number が10以下の間、繰り返す
number++ 1回処理するごとに number を1増やす

number++ は、次のコードと同じ意味です。

number = number + 1;

繰り返しの流れは次のとおりです。

number = 1
↓
number は 10 以下か
↓
はい
↓
処理を実行する
↓
number を 1 増やす
↓
もう一度条件を確認する

while という繰り返しもある

for は、何回繰り返すかが分かっているときに使いやすい書き方です。

条件が正しい間だけ繰り返したい場合は、while を使います。

#include <stdio.h>

int main(void)
{
    // 繰り返しに使う変数です。
    int number = 1;

    // number が 5 以下の間、繰り返します。
    while (number <= 5)
    {
        printf("%d\n", number);

        // number を増やさないと、繰り返しが終わりません。
        number++;
    }

    return 0;
}

実行結果です。

1
2
3
4
5

while の中で number++ を書き忘れると、条件がずっと正しいままになり、処理が終わらなくなります。


break で繰り返しを途中で終える

break は、繰り返しを途中で終えるための書き方です。

たとえば、1から10まで表示する途中で、5 になったら終える場合は次のように書きます。

#include <stdio.h>

int main(void)
{
    for (int number = 1; number <= 10; number++)
    {
        printf("%d\n", number);

        // number が 5 になったら、for を終えます。
        if (number == 5)
        {
            break;
        }
    }

    return 0;
}

実行結果です。

1
2
3
4
5

break は、必要な値が見つかった場合や、正解した場合など、これ以上繰り返す必要がないときに使います。


continue で今回の処理だけを飛ばす

continue は、今回の繰り返しの残りを飛ばし、次の繰り返しへ進むための書き方です。

たとえば、1から5まで表示するときに、3 だけを表示しない場合は次のように書きます。

#include <stdio.h>

int main(void)
{
    for (int number = 1; number <= 5; number++)
    {
        // number が 3 のときは、以降の処理を飛ばします。
        if (number == 3)
        {
            continue;
        }

        printf("%d\n", number);
    }

    return 0;
}

実行結果です。

1
2
4
5

breakcontinue の違いは次のとおりです。

書き方 意味
break 繰り返しそのものを終える
continue 今回の繰り返しの残りだけを飛ばす

動かして確かめる

forの終了条件を変え、1から5までではなく1から3まで、または1から10まで表示してみてください。


7. 複数の値をまとめて扱う

同じ種類の値を複数扱うときは、配列を使います。

ここでは、5人分の点数を配列に入れます。

array.c というファイルを作成してください。

#include <stdio.h>

int main(void)
{
    // 同じ種類の値を並べて入れたものが配列です。
    // scores には 5人分の点数が入っています。
    int scores[] = { 72, 88, 65, 91, 77 };

    // 配列に入っている点数の数です。
    int score_count = 5;

    // 合計を入れる変数です。
    int total = 0;

    // index を 0 から 4 まで変えながら、配列の中身を順番に見ます。
    for (int index = 0; index < score_count; index++)
    {
        // scores[index] は、今見ている1つの点数です。
        printf("%d人目: %d点\n", index + 1, scores[index]);

        // 今見ている点数を合計に足します。
        total = total + scores[index];
    }

    // 合計を表示します。
    printf("合計: %d点\n", total);

    // 平均は小数になることがあるため、double で計算します。
    printf("平均: %.1f点\n", (double)total / score_count);

    return 0;
}

コンパイルして実行します。

gcc -std=c17 -Wall -Wextra -Wpedantic array.c -o array
./array

実行結果です。

1人目: 72点
2人目: 88点
3人目: 65点
4人目: 91点
5人目: 77点
合計: 393点
平均: 78.6点

配列のイメージ

次のコードが配列です。

int scores[] = { 72, 88, 65, 91, 77 };

配列の中身は、次のように番号で取り出します。

番号       0    1    2    3    4
        ┌────┬────┬────┬────┬────┐
scores  │ 72 │ 88 │ 65 │ 91 │ 77 │
        └────┴────┴────┴────┴────┘
書き方
scores[0] 72
scores[1] 88
scores[2] 65
scores[3] 91
scores[4] 77

C言語の配列は、0番目から始まります。

人に見せるときは、index + 1 として1人目、2人目のように表示できます。

printf("%d人目: %d点\n", index + 1, scores[index]);

(double) の意味

次のコードでは、平均を小数で表示しています。

(double)total / score_count

total は整数ですが、平均には小数が含まれる場合があります。

393 ÷ 5
↓
78.6

そのため、total を一時的に double として扱い、小数の計算をしています。

(double)total

%.1f は、小数点以下1桁まで表示する指定です。

printf("%.1f\n", 3.14159);

実行結果です。

3.1

動かして確かめる

配列の値を1つ変え、合計と平均がどう変わるか確認してください。


8. 文字列を扱う

文字を1つ扱う場合は char 型を使います。

char initial = 'A';

ただし、名前やメッセージのように複数の文字をまとめて扱う場合は、char の配列を使います。

このような文字の並びを、文字列と呼びます。

string.c というファイルを作成してください。

#include <stdio.h>

int main(void)
{
    // char の配列に文字列を入れます。
    // " " で囲むと、複数の文字をまとめて扱えます。
    char name[] = "Yamada";

    // %s は、文字列を表示するための指定です。
    printf("こんにちは、%sさん。\n", name);

    return 0;
}

コンパイルして実行します。

gcc -std=c17 -Wall -Wextra -Wpedantic string.c -o string
./string

実行結果です。

こんにちは、Yamadaさん。

文字列と配列の関係

次のコードは、文字列を入れた char 型の配列です。

char name[] = "Yamada";

見えない最後の位置には、文字列の終わりを表す特別な値が自動的に入ります。

番号       0    1    2    3    4    5    6
        ┌────┬────┬────┬────┬────┬────┬────┐
name    │ Y  │ a  │ m  │ a  │ d  │ a  │ 終端 │
        └────┴────┴────┴────┴────┴────┴────┘

最初のうちは、文字列は「char を並べた配列」と考えれば十分です。

文字列は、後続の記事でファイルから1行を読み込むときにも使います。

動かして確かめる

nameを自分の好きな半角英字の名前へ変え、表示を確認してください。


9. 処理を関数に分ける

プログラムが長くなると、役割ごとに処理を分けた方が読みやすくなります。

このまとまった処理を関数と呼びます。

function.c というファイルを作成してください。

#include <stdio.h>

// 数量と単価を受け取り、合計金額を返す関数です。
int calculate_total_price(int quantity, int unit_price)
{
    // 受け取った数量と単価を掛け算します。
    int total_price = quantity * unit_price;

    // 計算した合計金額を、呼び出した場所へ返します。
    return total_price;
}

int main(void)
{
    // 数量と単価を変数に入れます。
    int quantity = 3;
    int unit_price = 120;

    // calculate_total_price を呼び出します。
    // 戻ってきた合計金額を total_price に入れます。
    int total_price = calculate_total_price(quantity, unit_price);

    // 結果を表示します。
    printf("合計金額: %d円\n", total_price);

    return 0;
}

コンパイルして実行します。

gcc -std=c17 -Wall -Wextra -Wpedantic function.c -o function
./function

実行結果です。

合計金額: 360円

関数のイメージ

この部分が、合計金額を計算する関数です。

int calculate_total_price(int quantity, int unit_price)

処理の流れは次のとおりです。

main
↓
数量と単価を渡す
↓
calculate_total_price
↓
掛け算する
↓
合計金額を返す
↓
main

次の部分で関数を呼び出しています。

int total_price = calculate_total_price(quantity, unit_price);

コードを見るだけで、「合計金額を計算している」と分かりやすくなります。


関数に分ける判断基準

次のような場合は、関数に分けると読みやすくなります。

  • 同じ処理を複数回使う
  • 処理に名前を付けると、何をしているか分かりやすい
  • main 関数が長くなってきた
  • 計算や判定を、ひとまとまりの処理として扱える

関数名は、何をする処理かが分かる名前にします。

calculate_total_price
calculate_average
print_result
is_even

動かして確かめる

quantityunit_priceを変え、関数が返す合計金額が変わることを確認してください。


10. ここまでの内容をまとめて使う

ここまで学んだ変数、配列、繰り返し、条件分岐、関数を使って、買い物の合計を求めるプログラムを作ります。

先ほどの関数の例でも calculate_total_price という名前の関数を作りましたが、あれは「数量 × 単価」を計算する版でした。今回は配列を受け取って、価格をすべて足し合わせる版です。別のソースファイルとして作るため、名前が同じでも問題ありません。

shopping_summary.c というファイルを作成してください。

#include <stdio.h>

// 配列に入っている価格をすべて足し、合計金額を返す関数です。
int calculate_total_price(int prices[], int price_count)
{
    // 合計金額は 0 円から始めます。
    int total_price = 0;

    // 配列の先頭から最後まで、価格を1つずつ取り出します。
    for (int index = 0; index < price_count; index++)
    {
        // 今見ている価格を合計に足します。
        total_price = total_price + prices[index];
    }

    // 計算した合計金額を返します。
    return total_price;
}

int main(void)
{
    // 5つの商品価格を入れた配列です。
    int prices[] = { 120, 250, 480, 150, 300 };

    // 配列に入っている商品の数です。
    int price_count = 5;

    // 消費税率です。
    double tax_rate = 0.10;

    // 関数を使って税抜合計を計算します。
    int total_price = calculate_total_price(prices, price_count);

    // 税込合計を計算します。
    double total_with_tax = total_price * (1.0 + tax_rate);

    // 計算結果を表示します。
    printf("税抜合計: %d円\n", total_price);
    printf("税込合計: %.0f円\n", total_with_tax);

    // 税込金額が1,000円以上かを判定します。
    if (total_with_tax >= 1000.0)
    {
        printf("1,000円以上の買い物です。\n");
    }
    else
    {
        printf("1,000円未満の買い物です。\n");
    }

    return 0;
}

コンパイルして実行します。

gcc -std=c17 -Wall -Wextra -Wpedantic shopping_summary.c -o shopping_summary
./shopping_summary

実行結果です。

税抜合計: 1300円
税込合計: 1430円
1,000円以上の買い物です。

このプログラムには、ここまで学んだ内容が入っています。

内容 該当箇所
変数 total_pricetax_rate
配列 prices
繰り返し for
関数 calculate_total_price
条件分岐 ifelse
小数の計算 double total_with_tax

11. 基本的な書き方のルール

動くだけでなく、後から読み返しやすいコードを書くことも大切です。

最初は、次のルールを意識してください。

項目 基本
変数名・関数名 役割が分かる英語にする
変数の初期値 宣言するときに入れる
波かっこ iffor では省略しない
インデント 処理の中身を4スペース下げる
コメント 処理の意図や理由を書く
コンパイル 警告が出ない状態を目指す

変数名は役割が分かる名前にする

次のような変数名では、何を表しているか分かりにくくなります。

int a = 3;
int b = 120;
int c = a * b;

次のように書くと、役割が分かります。

int quantity = 3;
int unit_price = 120;
int total_price = quantity * unit_price;

変数は初期化する

次のコードでは、total に最初の値が入っていません。

int total;

この状態で計算すると、想定しない値が使われることがあります。

合計を計算する変数なら、最初に 0 を入れます。

int total = 0;

波かっこは省略しない

C言語では、処理が1行だけなら波かっこを省略できます。

if (score >= 60)
    printf("合格です。\n");

ただし、後から処理を追加したときにミスが起きやすくなります。

最初から波かっこを付ける方が安全です。

if (score >= 60)
{
    printf("合格です。\n");
}

12. コンパイル時の警告を確認する

この記事では、次のコマンドでコンパイルしています。

gcc -std=c17 -Wall -Wextra -Wpedantic ファイル名.c -o 実行ファイル名

それぞれの意味は次のとおりです。

オプション 内容
-std=c17 C17のルールでコンパイルする
-Wall 基本的な警告を表示する
-Wextra 追加の警告を表示する
-Wpedantic 規格から外れた書き方を確認しやすくする
-o 作成する実行ファイル名を指定する

たとえば、hello.chello という名前で実行できるようにする場合は、次のように書きます。

gcc -std=c17 -Wall -Wextra -Wpedantic hello.c -o hello

コンパイル後は、次のコマンドで実行します。

./hello

警告が出ても実行できる場合があります。

ただし、警告はミスや不具合につながる可能性があります。

エラーだけでなく、警告も出ない状態を目指してください。


13. よくあるエラー

; の付け忘れ

次のコードでは、; がありません。

int quantity = 3

コンパイルすると、次のようなエラーが出る場合があります。

error: expected ',' or ';' before ...

表示された行だけでなく、その1行前も確認してください。


変数名の間違い

次のコードでは、quantityquantiy のつづりが違います。

int quantity = 3;

printf("%d\n", quantiy);

コンパイルすると、次のようなエラーが出ます。

error: ‘quantiy’ undeclared

変数名は、大文字と小文字も区別されます。

int total_price = 100;

int Total_Price = 100;

は別の名前です。


実行ファイルが見つからない

次のように表示される場合があります。

./hello: No such file or directory

主な原因は次のどちらかです。

  • コンパイルに失敗していて、実行ファイルが作られていない
  • 別のフォルダーで実行している

現在のフォルダーにあるファイルは、次のコマンドで確認できます。

ls

次のように表示されれば問題ありません。

hello
hello.c

hello が実行ファイルです。


14. 基本を定着させるには

各章の「動かして確かめる」で、値や条件を変えて実行してみてください。

複数の知識を組み合わせる問題は、次の記事へ分けています。

C言語の基礎練習問題集|入力・条件分岐・繰り返し・配列の最大値まで


まとめ

この記事では、C言語の基本的な書き方と動かし方を学びました。

文字を表示する
↓
変数に値を入れる
↓
計算する
↓
条件によって処理を変える
↓
キーボードから入力する
↓
繰り返す
↓
配列と文字列を扱う
↓
関数に処理を分ける

最初は、すべてを暗記する必要はありません。

次の流れを繰り返すことが大切です。

コードを書く
↓
保存する
↓
コンパイルする
↓
実行する
↓
結果を見る
↓
値や条件を少し変える
↓
もう一度動かす

C言語では、コードの1文字違いでエラーになることがあります。

ただし、エラーは失敗ではありません。

修正する場所を教えてくれる情報です。

エラー文を読み、該当行とその前後を確認しながら、少しずつ直していく流れに慣れていきましょう。


次の記事

次は、ここまでの基本文法を組み合わせる練習問題へ進みます。

C言語の基礎練習問題集|入力・条件分岐・繰り返し・配列の最大値まで

練習問題のあとに、scanfで使った&の意味につながるポインタを学びます。

C言語のポインタ入門|「値」と「場所」を分けて考える

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?