C++言語講座 第1章 7回 配列とインクリメント、デクリメント
配列
配列
今まで、一つのプログラムの中で使うオブジェクトの数は、せいぜい1個か2個程度でした。しかし、実際にプログラムを組むときには、もっと多くのオブジェクトを使います。同じような用途に10個のint型のオブジェクトを使うとしましょう。以下のように宣言します。
1 int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
これで、int型のオブジェクトが10個出来ました。これ全部に0を代入しましょう。
1 x0 = 0; x1 = 0; x2 = 0; …
流石に嫌になってきます。10個なら良いものの、100個だったら? 1000個だったら? 考えるのも嫌になってしまいます。
このような時のために、C++には複数のオブジェクトを一気に扱う方法が用意されています。配列(array)です。配列は以下のように宣言します。
1 int x[10];
これだけで、x[0]、x[1]、x[2]、…、x[9]という10個のオブジェクトが一気に宣言されたことになります。[ ] の中の数字を添字(そえじ;index)と言い、x[0] からx[9]までのそれぞれのオブジェクトを、配列の要素(element) と呼びます。
ここで忘れてはいけないことがあります。添字は0から始まるという事です。宣言のときには x[10] と書きましたが、実際に宣言されるのは x[0]~x[9] までです。間違えやすいので注意しましょう。
まあ、ちょっとした例を見てみましょう。
[List 1]
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 int x[4]; // x[0]~x[3]を宣言
7
8 x[0] = 10;
9 x[1] = 20;
10 x[2] = 30;
11 x[3] = 40;
12
13 int i;
14 cout << "何番目の要素を表示しますか? ";
15 cin >> i;
16
17 cout << i << "番目の要素は" << x[i] << endl;
18
19 return 0;
20 }
OKですか? つまり、配列 x の「0番目」の要素 x[0] に 10 を代入するには、
x[0] = 10;
としていますね。そして、int型のオブジェクト i を使って、
cout … << x[i]
とすると、「i番目」の要素を表示できるわけです。例えば i に 2 が代入されていれば、表示されるのは x[2] 、つまり 30 です。
配列の初期化
しかし、一々
1 x[0] = 10;
2 x[1] = 20;
と書いていたのでは、面倒で仕方がありません。そこで、配列は初期化のときだけは一気に代入できるようになっています。例えば、以下のように書きます。
1 int x[5] = {10, 20, 30, 40, 50};
最後の ; を忘れないようにしましょう。
これを使って、簡単なプログラムを組んでみましょう。皆さんは一年間の月の名前を英語で全部、すらっと言えますか? えーと、じゃにゅありぃ、ふぇぶるありぃ、…10月はなんだったっけ? と。というわけで、何月の名前でも英語で教えてくれるプログラムを作ってみたいと思います。
[List 2]
1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 int main()
6 {
7 string name[12] = {"January", "February", "March",
8 "April", "May", "June",
9 "July", "August", "September",
10 "October", "November", "December"};
11
12 int month;
13 cout << "何月の名前を表示しますか?(1~12) ";
14 cin >> month;
15
16 if (month < 1 || 12 < month)
17 cout << "そんな月はありません!!" << endl;
18 else
19 cout << name[month - 1] << endl;
20
21 return 0;
22 }
いいですか? 配列 name には1月から12月まで、順に月の名前が入っています。 month に整数を入力してもらい、name[month - 1] を表示しています。ところで、何故 name[month - 1] などと、month から 1 引いているか分かりますか? 配列の添字は 0 から始まるということを思い出して下さい。つまり、「January」は name[0] に、「February」は name[1] に…というように、数字で表した月から 1 引いた要素に、月の名前が入っているわけです。だから、
name[month - 1]
としているのですね。
配列の内容を全部表示する
配列の全ての要素を一気に表示するにはどうしたら良いでしょう?
1 cout << x[0] << endl;
2 cout << x[1] << endl;
3 cout << x[2] << endl;
4 :
と一々書いていく方法も確かにありますが、あまり綺麗ではありません。こういう時にはループを使いましょう。[List 2]を少し改造します。
[List 3]
1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 int main()
6 {
7 string name[12] = {"January", "February", "March",
8 "April", "May", "June",
9 "July", "August", "September",
10 "October", "November", "December"};
11
12 int month;
13 cout << "何月の名前を表示しますか?(1~12) ";
14 cin >> month;
15
16 if (month < 1 || 12 < month)
17 cout << "そんな月はありません!!" << endl;
18 else
19 cout << name[month - 1] << endl;
20
21 cout << "ちなみに、全ての月は順番に…" <<endl;
22
23 int i = 0;
24 while (i < 12) {
25 cout << i + 1 << "月は" << name[i] << endl;
26 i += 1;
27 }
28
29 return 0;
30 }
新たに加わったのは、最後のループ
1 int i = 0;
2 while (i < 12) {
3 cout << i + 1 << "月は" << name[i] << endl;
4 i += 1;
5 }
です。ループの中では、簡単に言えば、name[i] 、つまり i+1 月の名前を表示しています。
1 int i = 0;
としているので、最初は i は 0 です。一度 name[i] を表示してから、
1 i += 1;
で、i に 1 を足しています。(i += 1 は i = i + 1 の省略でしたね) そして、
i < 12
つまり、i が 12 未満の間だけ、ループを実行し続けます。こうして、1月から 12月までの名前を全て表示しているわけです。
インクリメントとデクリメント
[List 3]のループは実はもう少し簡単になります。
[List 4]
1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 int main()
6 {
7 string name[12] = {"January", "February", "March",
8 "April", "May", "June",
9 "July", "August", "September",
10 "October", "November", "December"};
11
12 int month;
13 cout << "何月の名前を表示しますか?(1~12) ";
14 cin >> month;
15
16 if (month < 1 || 12 < month)
17 cout << "そんな月はありません!!" << endl;
18 else
19 cout << name[month - 1] << endl;
20
21 cout << "ちなみに、全ての月は順番に…" <<endl;
22
23 int i = 0;
24 while (i < 12) {
25 cout << i + 1 << "月は" << name[i] << endl;
26 i++;
27 }
28
29 return 0;
30 }
どこが変わったか分かりますか? [List 3]では
i += 1;
と書いていたのが、
i++;
に変わっています。
i = i + 1;
を省略して、
i += 1;
と書いていましたが、これは更に、
i++;
と省略することが出来ます。この ++ はインクリメント(increment)と呼ばれ、「1を足す」という意味をもっています。
反対に、「1を引く」という意味をもった演算子もあります。
i = i - 1;
を省略すると、
i -= 1;
と書け、更に、
i--;
と書けます。この -- はデクリメント(decrement)と呼ばれ、1を引きたいときに使います。
これで分かったでしょうか。「C++」という名前の由来です。C++の元は「C」という言語です。C に 1 (少し)を足した、つまり、Cを少し拡張した、という意味でC++という名前なのです。
宿題
ちょっと宿題を出しましょう。ここで説明した「インクリメント」と「デクリメント」。実は、2種類ずつあります。
i++ や i-- (後置インクリメント/デクリメント)
と
++i や --i (前置インクリメント/デクリメント)
です。このふたつの違いはここでは説明しません。C++関連の本やインターネットで違いを調べてみましょう。
