はじめに
配列はプログラムでとても便利に使える仕組みですが、丁寧に扱わないとわかりにくいエラーを起こす原因にもなり得ます。
しっかりと扱い方を覚えてプログラムに役立てましょう!
配列とは
配列とはデータの塊のことです。
変数が名前をつけた箱を一つ用意するものだとすると、配列は名前をつけた大きな箱を用意することができ、その中に番号を割り振った小さな箱をいくつも用意することのできるものです。
要するに、配列は名前をつけたデータの塊を番号によって管理できるということです。
配列の定義について
配列は次のように定義します。
データ型 配列の名前[要素数];
要素数はデータの数のことで、先ほどの例でいうと小さな箱の数のことです。
また、この要素数は定義する時のみにしか変えることができず、後から増やしたりすることができないので注意してください。
例えば「int型の要素数が3の配列」であれば
int a[3];
といったようにすることで定義できます。
配列の初期化について
初期化の方法
配列の初期化は次のようにして行います。
データ型 配列名[要素数] = {データ, データ, ..., データ};
例えば「int型の要素数3の配列に10,30,20の順にデータを挿入して初期化」であれば
int a[3] = {10,30,20};
といったようにすることで初期化できます。
また、次のように要素に対してデータが足りない状態で、初期化をすると3つ目の要素には「0」が挿入されます。
int a[3] = {10,30};
これはC++の仕様で初期化の際にデータの指定がない場合には「0」を挿入することになっているからです。
この仕様を利用すると、次のようにして配列の要素全てに「0」を挿入することができます。
データ型 配列名[要素数] = {};
char型配列の初期化と文字列について
char型配列の初期化で文字列を挿入する場合、通常の初期化に加えて次のようにして初期化することができます。
char 配列名[要素数] = "文字列";
具体的には次のようにします。
char a[12] = "Helloworld!";
このように初期化すると、配列の要素の先頭から順に「H」,「e」,…,「!」,「null」というデータが挿入されます。
最後の「null」というのは文字列の終わりを示す記号のようなもので、文字列の最後に存在するものです。そのためchar型配列に文字列を挿入する際には「null」の分も要素数に加える必要があります。
つまり、文字列に含まれる文字が11だったとするとchar配列の要素数は12にする必要があるということです。
また、通常通り初期化する場合にも、文字列として扱いたい場合には、次のようにして最後に「null」を挿入する必要があります。
char a[3] = {'h','i','\0'};
「null」は「\0」と表記して使います。
これらのメリットは配列名を書くだけで文字列として扱うことができる点です。
例えば上の要素数3の配列「a」を次のようにして標準出力すると、「hi」と表示されます。
std::cout << a << std::endl;
初期化は必ずしましょう!
ここで、配列については必ず初期化するという癖をつけておきましょう。
できない場合も存在しますが、例外を除いた場合には初期化を行なっておいたほうが良いです。
理由をざっくりと説明すると、PCのメモリなどの都合によって配列に最初から意味のわからない数値が入ってしまうからです。
配列を定義するだけだと、自動的に意図しない数値が配列の各要素に入った状態になるため取り扱いが非常にややこしくなります。
要素数を書かないで初期化する
今までの例のような一次元配列であれば要素数を書かずに初期化することが可能です。
要素数を省いて初期化すると、次のような形になります。
データ型 配列名[] = {データ,データ,...,データ};
具体的には次のように初期化すると、要素数は自動で「3」になります。
int a[] = {10,30,20};
また、次のようにchar型配列に文字列を挿入して初期化すると「null」を含めた要素数を勝手に用意してくれます。
char a[] = "Helloworld!";
配列の扱い方
さて、配列が定義できたところで扱い方についてです。
配列の各要素に格納されたデータは次のように、配列名と要素の番号によって管理します。
配列名[要素の番号]
ここで、要素の番号は「0」から始まるということに注意してください。
例えば次のようなプログラムの場合、「10」が出力されます。
#include <iostream> int main(){ int a[3] = {10,30,20}; //要素数3のint型配列aに10,30,20,を挿入して初期化 std::cout << a[0] << std::endl; //標準出力 return 0; }
また、最初に定義した配列の要素数を超えた要素を扱うことはできません。
例えば次のようなプログラムはコンパイルは通りますが、実行するとエラーが起こります。
#include <iostream> int main(){ int a[3] = {10,30,20}; //要素数3のint型配列aに10,30,20,を挿入して初期化 for(int i = 0;i < 4;i++){ //繰り返し処理 std::cout << a[i] << std::endl; //int型配列aの要素iを出力 } return 0; }
配列「a」は要素数が3つですので「0」「1」「2」しか要素の番号に入れてはいけません、しかしこのプログラムではループ処理で「3」を要素の番号に入れてしまっているのでエラーが起こるというわけです。
これはよくやりがちなミスなので、配列は定義した要素数を超えて扱うことはできず、要素の番号は「0」から始まるということをしっかりと覚えてください。
最後に
今回はここまでです。
多次元配列についてはまた別の記事で書きます。
最後に演習問題に取り組んで理解度を深めてください。
演習問題
演習問題1
次のように初期化された配列がある。
int score[10] = {98,65,72,68,88,78,82,92,62,80};
この配列に格納された整数値の平均を求めて標準出力で画面に表示せよ。
演習問題2
次の要件を満たすプログラムを作成せよ。
- char型配列「str」に「HelloWorld!」の文字列を挿入して初期化する。
- char型配列「r_str」にchar型配列「str」の偶数番目の要素の文字を挿入する。
- char型配列「r_str」に格納された文字を標準出力し「Hlool!」と表示させる。
演習問題1解答
いくつかの解答があると思われるが、解答例として以下のプログラムを用意した。
#include <iostream> int main(){ int score[10] = {98,65,72,68,88,78,82,92,62,80}; //要素数10のint型scoreを初期化 double ave = 0; for(int i = 0;i < 10;i++){ ave += score[i]; //double型変数aveにint型配列scoreの要素「i」を加算 } std::cout << ave/10 << std::endl; //aveを10で除算したものを表示 return 0; }
演習問題2解答
いくつかの解答があると思われるが、解答例として以下のプログラムを用意した。
#include <iostream> int main(){ char str[] = "HelloWorld!"; //char型配列strの初期化 char r_str[7] = {}; //char型配列r_strの初期化 for(int i = 0;i < 12;i++){ if(i%2 == 0){ r_str[i/2] = str[i]; //偶数番目の場合、文字を挿入する } if(i == 11){ r_str[i/2 + 1] = '\0'; //最後にnullを挿入する } } std::cout << r_str << std::endl; return 0; }
コメント