第1部 変数と配列の基本
第1部 変数と配列の基本
このワークの目標
ゲームでは、体力・得点・座標・残り時間など、たくさんの値を保存しながら処理を進めます。
このワークでは、値を保存するための変数と、複数の値をまとめて扱う配列について確認します。
- 変数名・値・アドレスを区別できる
- C言語の代表的な型を使い分けられる
- 整数・実数・文字・文字列の違いを説明できる
- 初期化と代入の違いを説明できる
- 代入による値の変化を追える
- 配列の要素を添字で指定できる
- 配列の要素への代入を追える
- 要素数と最後の添字を区別できる
1.変数とは何だろう
1-1.変数は、値を入れておく箱
プログラムで値を保存しておくものを変数と呼びます。
例えば、プレイヤーの残り体力100を保存してみましょう。
変数名:playerHp
値 :100
変数を箱として考えると、次のように表せます。
playerHp
┌──────────┐
│ 100 │
└──────────┘
playerHpは箱を見分けるための変数名、100は箱の中に入っている値です。
練習1 変数名と値を見分けよう
次の変数について、変数名と値を答えよう。
score
┌──────────┐
│ 250 │
└──────────┘
変数名:________
値 :________
練習1の模範解答を見る
変数名:score
値 :250
練習2 ゲームで使う変数を考えよう
次の値を保存するための変数名を考えよう。
| 保存したい値 | 変数名の例 |
|---|---|
| プレイヤーの残り体力 | ________ |
| 現在の得点 | ________ |
| 残り時間 | ________ |
| プレイヤーのX座標 | ________ |
練習2の解答例を見る
| 保存したい値 | 変数名の例 |
|---|---|
| プレイヤーの残り体力 | playerHp |
| 現在の得点 | score |
| 残り時間 | time |
| プレイヤーのX座標 | playerX |
別の名前でも構いません。何を保存する変数か分かる名前にしましょう。
2.C言語の変数と型
2-1.型は、変数に入れるデータの種類
C言語では、変数を作るときに型を指定します。型は、その変数にどのようなデータを入れるかを表します。
int score;
float speed;
char grade;
この例では、int、float、charが型、score、speed、gradeが変数名です。
| データ | 主に使う型 | 値の例 |
|---|---|---|
| 整数 | int |
10、0、-5 |
| 実数 | float、double |
3.5f、0.25、-1.5 |
| 文字 | char |
'A'、'x'、'7' |
| 文字列 | charの配列 |
"START"、"GAME OVER" |
2-2.整数と実数の違い
整数は、小数点を使わない数です。
int score = 100;
int enemyCount = 5;
int temperature = -3;
実数は、小数部分を扱う数です。
float speed = 3.5f;
double deltaTime = 0.016;
floatの値には、値の最後にfを付ける書き方を使います。
float speed = 3.5f;
doubleはfloatよりも細かい値を表すために使われます。このワークでは、どちらも実数を扱う型として区別できればよいものとします。
2-3.文字と文字列の違い
文字は1文字のデータです。C言語ではcharを使い、シングルクォーテーション' 'で囲みます。
char grade = 'A';
char key = 'Z';
文字列は、複数の文字が並んだデータです。ダブルクォーテーション" "で囲みます。
char title[] = "GAME START";
char name[] = "TARO";
C言語には、文字列専用の基本型はありません。文字列はchar型の配列として扱います。
name = "TARO"
添字 0 1 2 3 4
┌────┬────┬────┬────┬────┐
文字 │ T │ A │ R │ O │ \0 │
└────┴────┴────┴────┴────┘
文字列の最後には、終わりを表すヌル文字'\0'が入ります。そのため、"TARO"を保存するには5個分の要素が必要です。

図1 文字と文字列の違い
文字と文字列の見分け方
'A' // 1文字なので文字
"A" // 1文字だけに見えるが、文字列
"ABC" // 文字列
'A'と"A"は同じものではありません。
練習3 型を選ぼう
次の値を保存するのに最も適切な型を、int、float、char、charの配列から選ぼう。
| 保存したい値 | 型 |
|---|---|
プレイヤーの残り体力 100 |
______ |
プレイヤーの移動速度 3.5 |
______ |
評価を表す1文字 'A' |
______ |
プレイヤー名 "TARO" |
______ |
敵の数 8 |
______ |
練習3の模範解答を見る
| 保存したい値 | 型 |
|---|---|
プレイヤーの残り体力 100 |
int |
プレイヤーの移動速度 3.5 |
float |
評価を表す1文字 'A' |
char |
プレイヤー名 "TARO" |
charの配列 |
敵の数 8 |
int |
練習4 値の種類を答えよう
次の値が、整数・実数・文字・文字列のどれに当たるか答えよう。
| 値 | データの種類 |
|---|---|
25 |
______ |
2.5f |
______ |
'5' |
______ |
"5" |
______ |
"PLAYER" |
______ |
-10 |
______ |
練習4の模範解答を見る
| 値 | データの種類 |
|---|---|
25 |
整数 |
2.5f |
実数 |
'5' |
文字 |
"5" |
文字列 |
"PLAYER" |
文字列 |
-10 |
整数 |
'5'は数字の5ではなく、「5」という1文字です。
練習5 宣言を完成させよう
空欄へ適切な型または変数名を書こう。
____ score;
float ____;
____ grade;
char playerName[16];
次の条件を使います。
scoreには整数の得点を保存するspeedには実数の移動速度を保存するgradeには評価を表す1文字を保存するplayerNameには文字列を保存する
練習5の模範解答を見る
int score;
float speed;
char grade;
char playerName[16];
3.変数の値とアドレス
3-1.アドレスは、変数が置かれている場所
コンピュータのメモリには、データを保存する場所がたくさんあります。それぞれの場所を見分ける番号がアドレスです。
変数名 :playerHp
値 :100
アドレス:1000番地
playerHp
┌──────────────┐
1000番地│ 100 │
└──────────────┘

図2 変数名・値・アドレスの関係
| 名前 | 意味 | 例 |
|---|---|---|
| 変数名 | 変数を指定するための名前 | playerHp |
| 値 | 変数に保存されているデータ | 100 |
| アドレス | 変数が置かれている場所 | 1000番地 |
値が同じでも、別の場所に置かれていれば別の変数です。
a b
┌──────────────┐ ┌──────────────┐
1000番地│ 10 │ 1004番地│ 10 │
└──────────────┘ └──────────────┘
練習6 変数名・値・アドレスを答えよう
score
┌──────────────┐
2000番地│ 500 │
└──────────────┘
- 変数名は何ですか。 ________
- 値はいくつですか。 ________
- アドレスは何番地ですか。 ________
練習6の模範解答を見る
score- 500
- 2000番地
練習7 正しい説明を選ぼう
x y
┌──────────────┐ ┌──────────────┐
3000番地│ 5 │ 3004番地│ 5 │
└──────────────┘ └──────────────┘
-
xとyは同じ変数である -
xとyの値は同じである -
xとyのアドレスは同じである -
xとyは別の場所にある
練習7の模範解答を見る
-
xとyは同じ変数である -
xとyの値は同じである -
xとyのアドレスは同じである -
xとyは別の場所にある
4.宣言・初期化・代入
4-1.宣言とは
変数の型と名前を指定して、変数を用意することを宣言と呼びます。
int score;
この文では、int型の変数scoreを宣言しています。この時点では、scoreへ最初の値を指定していません。
4-2.初期化とは
変数を用意するときに、最初の値を入れることを初期化と呼びます。
int score = 0;
ゲーム開始時の得点を0にする処理は初期化です。
4-3.代入とは
変数へ値を入れることを代入と呼びます。
score = 100;
矢印の右側にある100を、左側の変数scoreへ入れます。それまで入っていた値は、新しい値に置き換わります。
代入前 代入後
score = 100;
┌──────────┐ ┌──────────┐
│ 0 │ → │ 100 │
└──────────┘ └──────────┘
=の左側にある変数へ、右側の値を入れます。数学の「左右が等しい」という意味とは異なります。
4-4.初期化と代入の違い
int score = 0; // 宣言と同時に最初の値を入れるので初期化
score = 100; // 宣言済みの変数へ値を入れるので代入
どちらにも=が使われていますが、変数を宣言するときに最初の値を入れる処理が初期化です。
4-5.代入の向きに注意しよう
a = b;
これは、bの値をaへ代入するという意味です。
代入前:aは3、bは8
a = b;
代入後:a = 8、b = 8
bの値8がaへコピーされます。bの値は変化しません。
練習8 宣言・初期化・代入を見分けよう
次の各行が、宣言・初期化・代入のどれに当たるか答えよう。
| 処理 | 種類 |
|---|---|
int score; |
______ |
int playerHp = 100; |
______ |
score = 500; |
______ |
float speed = 3.5f; |
______ |
speed = 5.0f; |
______ |
練習8の模範解答を見る
| 処理 | 種類 |
|---|---|
int score; |
宣言 |
int playerHp = 100; |
初期化 |
score = 500; |
代入 |
float speed = 3.5f; |
初期化 |
speed = 5.0f; |
代入 |
int playerHp = 100;とfloat speed = 3.5f;は、宣言と初期化を同時に行っています。
練習9 代入後の値を答えよう
int a = 4;
int b = 7;
a = b;
a = ____
b = ____
練習9の模範解答を見る
a = 7
b = 7
練習10 値の変化を順番に追おう
int a = 5;
int b = 2;
a = 8;
b = a;
a = 3;
処理が1行終わるたびに、aとbの値を表へ書こう。まだ値が入っていない欄には「―」を書こう。
| 実行した処理 | a | b |
|---|---|---|
| 実行前 | ― | ― |
int a = 5; |
__ | __ |
int b = 2; |
__ | __ |
a = 8; |
__ | __ |
b = a; |
__ | __ |
a = 3; |
__ | __ |
練習10の模範解答を見る
| 実行した処理 | a | b |
|---|---|---|
| 実行前 | ― | ― |
int a = 5; |
5 | ― |
int b = 2; |
5 | 2 |
a = 8; |
8 | 2 |
b = a; |
8 | 8 |
a = 3; |
3 | 8 |
b = a;を実行した時点の8がbへコピーされます。その後でaを3に変えても、bは8のままです。
練習11 ゲーム中の処理を見分けよう
| 処理 | 初期化/代入 |
|---|---|
| ゲーム開始時に、得点を0にする | ______ |
| 敵を倒したので、得点を100に変える | ______ |
| ゲーム開始時に、残り時間を60秒にする | ______ |
| ダメージを受けたので、体力を80に変える | ______ |
練習11の模範解答を見る
| 処理 | 初期化/代入 |
|---|---|
| ゲーム開始時に、得点を0にする | 初期化 |
| 敵を倒したので、得点を100に変える | 代入 |
| ゲーム開始時に、残り時間を60秒にする | 初期化 |
| ダメージを受けたので、体力を80に変える | 代入 |
5.配列とは何だろう
5-1.同じ種類の変数をまとめよう
5人分の得点を別々の変数で保存すると、次のようになります。
score0、score1、score2、score3、score4
同じ種類の複数の値は、配列を使うとまとめて扱えます。
配列名:score
┌────┬────┬────┬────┬────┐
│ 80 │ 65 │ 90 │ 75 │ 60 │
└────┴────┴────┴────┴────┘
配列の中にある一つ一つの箱を要素と呼びます。
5-2.添字は0から始まる
配列の各要素を指定する番号を添字と呼びます。この授業では、添字を0から数えます。
配列名:score
添字 0 1 2 3 4
┌────┬────┬────┬────┬────┐
値 │ 80 │ 65 │ 90 │ 75 │ 60 │
└────┴────┴────┴────┴────┘
score[0] の値は80
score[2] の値は90
score[4] の値は60
要素が5個ある配列では、最後の添字は4です。
最後の添字 = 要素数-1
練習12 配列の要素を読もう
配列名:data
添字 0 1 2 3 4
┌────┬────┬────┬────┬────┐
値 │ 12 │ 7 │ 20 │ 5 │ 14 │
└────┴────┴────┴────┴────┘
data[0]の値は、____です。data[2]の値は、____です。- 値が5の要素は、
data[__]です。 - 最後の要素は、
data[__]です。 - この配列の要素数は、____個です。
練習12の模範解答を見る
- 12
- 20
data[3]data[4]- 5個
5-3.配列の要素へ代入する
配列の要素も、変数と同じように値を代入できます。
int data[4] = {4, 6, 2, 8};
data[1] = 9;
代入後は{4, 9, 2, 8}となり、添字1の要素だけが9に変わります。
練習13 代入後の配列を書こう
int data[5] = {3, 8, 5, 1, 6};
data[2] = 9;
data[4] = data[0];
data[0] = 7;
すべての処理が終わった後の配列を書こう。
data = [__, __, __, __, __]
練習13の模範解答を見る
最初 [3, 8, 5, 1, 6]
data[2] = 9; [3, 8, 9, 1, 6]
data[4] = data[0]; [3, 8, 9, 1, 3]
data[0] = 7; [7, 8, 9, 1, 3]
5-4.配列の要素とアドレス
配列の各要素にもアドレスがあります。配列の要素は、メモリ上に順番に並べて置かれます。
配列名:data
添字 0 1 2 3
┌──────┬──────┬──────┬──────┐
値 │ 10 │ 20 │ 30 │ 40 │
└──────┴──────┴──────┴──────┘
アドレス 4000番地 4004番地 4008番地 4012番地

図3 配列の添字・値・アドレスの関係
この図のアドレスは説明用の例です。
練習14 値とアドレスを見分けよう
上の図を見て答えよう。
data[1]の値は、____です。data[1]のアドレスは、____番地です。- 4008番地にある要素は、
data[__]です。 - 4008番地に保存されている値は、____です。
練習14の模範解答を見る
- 20
- 4004番地
data[2]- 30
5-5.配列の範囲に注意しよう
要素数が5個の配列で使える添字は、0から4までです。data[5]は6番目を表すため、この配列の範囲外です。
練習15 範囲外の添字を見つけよう
要素数が6個の配列enemyHpで使えるものには○、範囲外のものには×を書こう。
| 要素 | ○/× |
|---|---|
enemyHp[0] |
__ |
enemyHp[1] |
__ |
enemyHp[5] |
__ |
enemyHp[6] |
__ |
enemyHp[-1] |
__ |
練習15の模範解答を見る
| 要素 | ○/× |
|---|---|
enemyHp[0] |
○ |
enemyHp[1] |
○ |
enemyHp[5] |
○ |
enemyHp[6] |
× |
enemyHp[-1] |
× |
要素数が6個なので、使える添字は0から5までです。
6.穴埋め問題
問題1 用語を完成させよう
- 値を保存しておくものを( ① )という。
- 変数の型と名前を指定して用意することを( ② )という。
- 変数を用意するときに最初の値を入れることを( ③ )という。
- 変数へ値を入れることを( ④ )という。
- 変数が置かれている場所を表す番号を( ⑤ )という。
- 同じ種類の複数の値をまとめて扱う仕組みを( ⑥ )という。
- 配列の各要素を指定する番号を( ⑦ )という。
問題1の模範解答を見る
- ① 変数
- ② 宣言
- ③ 初期化
- ④ 代入
- ⑤ アドレス
- ⑥ 配列
- ⑦ 添字
問題2 配列の穴を埋めよう
配列名:item
添字 0 1 2 3 4
┌────┬────┬────┬────┬────┐
値 │ 2 │ 5 │ 1 │ 4 │ 3 │
└────┴────┴────┴────┴────┘
item[__] の値は5
item[3] の値は__
値が3の要素は item[__]
要素数は__個
最後の添字は__
問題2の模範解答を見る
item[1] の値は5
item[3] の値は4
値が3の要素は item[4]
要素数は5個
最後の添字は4
7.まとめ問題
問題1 ゲーム開始時のデータを用意しよう
次の条件でゲームを開始します。
- プレイヤーの体力は100
- 得点は0
- 残り時間は60秒
- 3体の敵の体力は、それぞれ30、50、40
(1)変数を初期化しよう
int ______ = 100;
int ______ = 0;
int ______ = 60;
(2)敵の体力を配列で表そう
配列名:enemyHp
添字 0 1 2
┌────┬────┬────┐
値 │ │ │ │
└────┴────┴────┘
(3)値を変更しよう
______ = 80;
______ = 100;
enemyHp[__] = 20;
(4)最後の値を答えよう
プレイヤーの体力:____
得点 :____
残り時間 :____
enemyHp[0] :____
enemyHp[1] :____
enemyHp[2] :____
まとめ問題1の模範解答を見る
int playerHp = 100;
int score = 0;
int time = 60;
int enemyHp[3] = {30, 50, 40};
playerHp = 80;
score = 100;
enemyHp[1] = 20;
最後の値は次のとおりです。
playerHp = 80
score = 100
time = 60
enemyHp = [30, 20, 40]
問題2 値の変化をトレースしよう
int x = 2;
int y = 6;
int data[4] = {4, 8, 3, 7};
x = y;
data[1] = x;
y = data[2];
data[3] = y;
x = 5;
| 実行した処理 | x | y | data[0] | data[1] | data[2] | data[3] |
|---|---|---|---|---|---|---|
| 初期状態 | 2 | 6 | 4 | 8 | 3 | 7 |
x = y; |
||||||
data[1] = x; |
||||||
y = data[2]; |
||||||
data[3] = y; |
||||||
x = 5; |
まとめ問題2の模範解答を見る
| 実行した処理 | x | y | data[0] | data[1] | data[2] | data[3] |
|---|---|---|---|---|---|---|
| 初期状態 | 2 | 6 | 4 | 8 | 3 | 7 |
x = y; |
6 | 6 | 4 | 8 | 3 | 7 |
data[1] = x; |
6 | 6 | 4 | 6 | 3 | 7 |
y = data[2]; |
6 | 3 | 4 | 6 | 3 | 7 |
data[3] = y; |
6 | 3 | 4 | 6 | 3 | 3 |
x = 5; |
5 | 3 | 4 | 6 | 3 | 3 |
8.学習チェック
- 変数名と値を区別できる
- 整数・実数・文字・文字列を区別できる
- 値に合ったC言語の型を選べる
- 宣言・初期化・代入を区別できる
- 値とアドレスを区別できる
- 初期化と代入の違いを説明できる
-
a = b;の代入方向が分かる - 複数の代入を上から順番に追える
- 配列の要素を添字で指定できる
- 要素数から最後の添字を求められる
- 配列の範囲外の添字を見つけられる
- 配列への代入を追える