Skip to main content

第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      │
        └──────────────┘
  1. 変数名は何ですか。 ________
  2. 値はいくつですか。 ________
  3. アドレスは何番地ですか。 ________
練習6の模範解答を見る
  1. score
  2. 500
  3. 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 │
       └────┴────┴────┴────┴────┘
  1. data[0]の値は、____です。
  2. data[2]の値は、____です。
  3. 値が5の要素は、data[__]です。
  4. 最後の要素は、data[__]です。
  5. この配列の要素数は、____個です。
練習12の模範解答を見る
  1. 12
  2. 20
  3. data[3]
  4. data[4]
  5. 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 値とアドレスを見分けよう

上の図を見て答えよう。

  1. data[1]の値は、____です。
  2. data[1]のアドレスは、____番地です。
  3. 4008番地にある要素は、data[__]です。
  4. 4008番地に保存されている値は、____です。
練習14の模範解答を見る
  1. 20
  2. 4004番地
  3. data[2]
  4. 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. 変数の型と名前を指定して用意することを( ② )という。
  3. 変数を用意するときに最初の値を入れることを( ③ )という。
  4. 変数へ値を入れることを( ④ )という。
  5. 変数が置かれている場所を表す番号を( ⑤ )という。
  6. 同じ種類の複数の値をまとめて扱う仕組みを( ⑥ )という。
  7. 配列の各要素を指定する番号を( ⑦ )という。
問題1の模範解答を見る
  1. ① 変数
  2. ② 宣言
  3. ③ 初期化
  4. ④ 代入
  5. ⑤ アドレス
  6. ⑥ 配列
  7. ⑦ 添字

問題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;の代入方向が分かる
  • 複数の代入を上から順番に追える
  • 配列の要素を添字で指定できる
  • 要素数から最後の添字を求められる
  • 配列の範囲外の添字を見つけられる
  • 配列への代入を追える