
中学生に説明するためのC++予習(6)
※コードの実行にはオンラインコンパイラの https://www.onlinegdb.com/ のサービスを使っています。
6.配列(陣列)
教科書第六章は配列の話。
たとえば、int a[5]; と宣言すれば a[0],a[1],a[2],a[3],a[4] の5つがint型変数として使えるようになる。この宣言の場合、a[0]からa[4]までで5つだから、a[5]は使えないことに注意。
#include <iostream>
using namespace std;
int main()
{
int a[5];
for(int i=0; i<5; i++){
cout << "a[" << i << "]=" << a[i] <<endl;
}
return 0;
}
これやってみると。
a[0]=0
a[1]=0
a[2]=0
a[3]=0
a[4]=0
今回はたまたま全部0になったけれど、必ず0になるものだと期待しては駄目。値を代入して(初期化して)使わなければならない。
初期化の話
確実に何かの値にしたいなら、(0だと混乱するので10にしてみる)
#include <iostream>
using namespace std;
int main()
{
//宣言
int a[5];
//初期化
for(int i; i<5; i++){
a[i]=10;
}
//表示
for(int i=0; i<5; i++){
cout << "a[" << i << "]=" << a[i] <<endl;
}
return 0;
}
これで実行結果
a[0]=10
a[1]=10
a[2]=10
a[3]=10
a[4]=10
になる。他にもいくつか「初期化」方法がある。
一つ一つ代入するとか・・(もちろん個々に初期値を変えたっていい)
#include <iostream>
using namespace std;
int main()
{
//宣言
int a[5];
//初期化
a[0] = 10;
a[1] = 11;
a[2] = 12;
a[3] = 13;
a[4] = 14;
//表示
for(int i=0; i<5; i++){
cout << "a[" << i << "]=" << a[i] <<endl;
}
return 0;
}
結果
a[0]=10
a[1]=11
a[2]=12
a[3]=13
a[4]=14
これよりちょっといい感じの初期化方法。宣言時に値を渡す。
#include <iostream>
using namespace std;
int main()
{
//宣言と初期化
int a[5] = {100, 101, 102, 103, 104};
//表示
for(int i=0; i<5; i++){
cout << "a[" << i << "]=" << a[i] <<endl;
}
return 0;
}
実行結果
a[0]=100
a[1]=101
a[2]=102
a[3]=103
a[4]=104
これは宣言と同時にする場合だけ。次のような分けて書く書き方はできない。
//宣言と初期化・・ダメな例
int a[5];
a[5]= {100, 101, 102, 103, 104};
宣言時に要素を渡す場合、要素数省略できる。
//宣言と初期化・・これはOK
int a[]= {100, 101, 102, 103, 104};
じゃあ、要素数を「明記」していて、渡す要素の数と食い違っていたらどうなる?
明記した要素数>渡した要素の数
//宣言と初期化・・これはOK
int a[5]= {100, 101, 102};
結果
a[0]=100
a[1]=101
a[2]=102
a[3]=0
a[4]=0
指定されなかった分は0で初期化される。これはたまたま0が入っていたのではなく0で初期化される。
ということは、要素数だけ指定して、全部書かなかったら・・・つまり
//宣言と初期化・・これはOK
int a[5]= {};
これだと全部0で初期化される。0で初期化するならこれでもいい。
a[0]=0
a[1]=0
a[2]=0
a[3]=0
a[4]=0
では、逆に明記した要素数<渡した要素の数だったら?
//宣言と初期化・・これは駄目
int a[3]= {100, 101, 102, 103, 104};
これは駄目、コンパイルエラーになりました。

二次元配列
教科書ではその後は、一次元配列の操作、その後に二次元配列、と続くのですが、中学一年生で二次元配列はどうなんだろ?まだ早いんじゃないかな?
vector
教科書をさらに読み進むとSTL(標準テンプレートライブラリ)のvectorというのが出てきました。
int a[1000]といったふうに静的に宣言するとメモリをどっさり食うから、動的に扱えるようにするとかなんとか説明されている。
うん、趣旨はわかる。でも中学一年生にはとりあえずいらないと思う。本人がメモリをどっさり食うような配列を操作する必要が出てきたときに改めて見直せばいいんじゃないかな。
とはいえ、負けたようで(中学生くんではなく)自分が悔しいので(笑)ちょっとだけやってみます。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//宣言と初期化・・STL利用
vector<int> a ={101,102,103,104,105};
//表示
for(int i=0; i<5; i++){
cout << "a[" << i << "]=" << a[i] <<endl;
}
return 0;
}
あるいは
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//宣言と初期化・・STL利用
vector<int> a ={101,102,103,104,105};
//表示
for(int i=0; i<a.size(); i++){
cout << "a[" << i << "]=" << a[i] <<endl;
}
return 0;
}
実行結果
a[0]=101
a[1]=102
a[2]=103
a[3]=104
a[4]=105
うん、同じように使えるのは分かりました。