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円
動かして確かめる
quantityとunit_priceを変え、合計金額が正しく変わるか確認してください。
変数のイメージ
次のコードを見てください。
int quantity = 3;
これは、quantity という名前の箱を作り、その中へ 3 を入れるイメージです。
quantity
┌───┐
│ 3 │
└───┘
次のコードでは、数量と単価を使って合計金額を計算しています。
int total_price = quantity * unit_price;
処理の流れは次のとおりです。
quantity unit_price
3 × 120
↓
360
↓
total_price
int と double
変数を作るときは、どの種類の値を入れるかを指定します。
最初は、次の2つを覚えれば十分です。
| 型 | 入れる値 | 例 |
|---|---|---|
int |
整数 |
10、-3、1200
|
double |
小数を含む数値 |
3.14、0.10、12.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
動かして確かめる
quantity、unit_price、tax_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;
これは、score に 60 を入れる処理です。
score == 60
これは、score が 60 と等しいかを確認する条件です。
条件を増やす
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以外は「正しい」として扱われます。
ただし、最初のうちは ! を多用せず、読みやすい条件式を優先してください。
動かして確かめる
scoreを45、60、80に変え、どの条件が実行されるか確認してください。
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言語のポインタ入門」で説明します。
動かして確かめる
72、60、45を入力し、表示が変わることを確認してください。数値以外を入力した場合も試してください。
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
break と continue の違いは次のとおりです。
| 書き方 | 意味 |
|---|---|
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
動かして確かめる
quantityとunit_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_price、tax_rate
|
| 配列 | prices |
| 繰り返し | for |
| 関数 | calculate_total_price |
| 条件分岐 |
if、else
|
| 小数の計算 | double total_with_tax |
11. 基本的な書き方のルール
動くだけでなく、後から読み返しやすいコードを書くことも大切です。
最初は、次のルールを意識してください。
| 項目 | 基本 |
|---|---|
| 変数名・関数名 | 役割が分かる英語にする |
| 変数の初期値 | 宣言するときに入れる |
| 波かっこ |
if や for では省略しない |
| インデント | 処理の中身を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.c を hello という名前で実行できるようにする場合は、次のように書きます。
gcc -std=c17 -Wall -Wextra -Wpedantic hello.c -o hello
コンパイル後は、次のコマンドで実行します。
./hello
警告が出ても実行できる場合があります。
ただし、警告はミスや不具合につながる可能性があります。
エラーだけでなく、警告も出ない状態を目指してください。
13. よくあるエラー
; の付け忘れ
次のコードでは、; がありません。
int quantity = 3
コンパイルすると、次のようなエラーが出る場合があります。
error: expected ',' or ';' before ...
表示された行だけでなく、その1行前も確認してください。
変数名の間違い
次のコードでは、quantity と quantiy のつづりが違います。
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で使った&の意味につながるポインタを学びます。