さてさて、またまた結構日が空いてしまいましたが。
今日は「配列(はいれつ)」と、「ループ操作」を記述していきます。
ここまで来たら、もう何でもできます。
かなり、ゲームっぽいこともできます。
ではでは、説明〜。
▽配列
まず、配列とは何ぞや。と。
配列とは、変数がいっぱい並んだものと考えて下さい。
いっぱいの変数を「要素(ようそ)」と呼びます。
番号で管理されます。管理番号を「添え字(そえじ)」とか呼びます。
--------------------------------------------------
int table[10];
--------------------------------------------------
こんな感じで、変数宣言します。
すると、tableという10個の要素を持つ配列が宣言されます。
--------------------------------------------------
int table[10];
table[0] = 10;
table[1] = 3;
--------------------------------------------------
アクセスは、↑こんな感じでできます。
「table[10]」だと、0〜9の10個の要素があります。
ここ注意です!
「0〜9」です。
これが、プログラマが0から数を数えちゃう職業病が発生するメカニズムです。
--------------------------------------------------
int table[10];
table[10] = 10;
--------------------------------------------------
ちなみに、↑これはできません。
Windowsでやると、強制終了します。
他のハードでやると、強制終了しないまでも、
だいたいは全然関係無い変数に値を入れちゃったり、
すごく見つけにくいバグの原因となりますので、
配列を操作する場合は、必ず、要素数の範囲内で行って下さい。
▽配列の初期化
配列は、宣言時のみ、初期化ができます。
結構、省略して書けたりするので、色々覚えて下さい。
--------------------------------------------------
int table[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
--------------------------------------------------
こう書く事で、配列が宣言されたと同時に、値が代入されます。
table[0]に0が、table[1]に1が...table[9]に9が代入されます。
初期化用に書いた数値を「初期化子(しょきかし)」と呼びます。
--------------------------------------------------
int table[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
--------------------------------------------------
初期化をする場合、宣言時の要素数を省略する事もできます。
省略すると、初期化子の数が、配列の要素数となります。
この場合は、0〜9の10個の配列です。
--------------------------------------------------
int table[] = { 0, 1, 2, 3, 4 };
--------------------------------------------------
↑こんな感じだと、tableの要素数は、0〜4の5つになります。
--------------------------------------------------
int table[10] = { 0, 1, 2, 3, 4 };
--------------------------------------------------
↑こんな感じに書くと、0〜9の10個の要素を持つ配列が宣言され、
0〜4には0〜4が、記述されていない残りの5〜9には、固定で「0」が代入されます。
--------------------------------------------------
int table[100] = { 0 };
--------------------------------------------------
全部0入れたい場合は、これでOK。
100個も0書いてられないでしょw
ちなみに、初期化子を1つも書かない場合は初期化を行いませんので、
その配列には、どんな値が入っているかは保証されません。
0を入れたい場合は、必ず上記のように初期化して下さい。
--------------------------------------------------
int table[10] = {
0, // table[0] = 0
1, // table[1] = 1
2, // table[2] = 2
3, // table[3] = 3
4, // table[4] = 4
};
--------------------------------------------------
もちろん、複数行にまたがって書いても良いですよ。
また、最後の要素の後の , は、書いても書かなくてもどっちでもOKです。
▽多次元配列
ここまで来たんで、一気に覚えちゃいましょう。
多次元配列!
2次元や3次元、いくらでも作れてしまいます!
--------------------------------------------------
int table[5][10];
--------------------------------------------------
この場合、10個要素のある配列が、5個用意された、と考えて下さい。
--------------------------------------------------
table[0][0] = 0;
table[0][1] = 1;
table[1][0] = 10;
--------------------------------------------------
アクセスの方法も、そんなに難しくなく、1次元配列と同じようにアクセスできます。
初期化は、改行したりすると、見やすくなります。
--------------------------------------------------
int table[5][10] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
};
--------------------------------------------------
--------------------------------------------------
int table[5][10] = {
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, },
{ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, },
{ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, },
{ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, },
{ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, },
};
--------------------------------------------------
{}を{}で囲っても分かりやすいかもね。
2次元までなら改行で良いけど、3次元配列までいくと
{}で括った方が良いです。見にくいので。
--------------------------------------------------
int table[][10] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
};
--------------------------------------------------
多次元配列では、一番左側の要素数だけ、省略できます。
2次元配列で説明すると、
例えば、10個初期化子があった場合、2×5の配列なのか、
5×2の配列なのか、分かんないですよね?
だから、省けるのは1つだけになってます。
▽ループ処理
さてさて、配列と一緒に使って、驚異的なパワーを発するのが、ループ処理。
ちなみに、プログラムは、基本的に、上から下に進みますけど、
ほぼ唯一、上に戻る事ができる処理です。
故に、使い間違えると、永久に下まで行かない...、
俗に言う永久ループにハマってしまったりするので注意が必要です。
▽whileループ処理
while構文から説明します。
記述は、下記のようになります
--------------------------------------------------
while( 条件文 )
{
繰り返したい制御
}
--------------------------------------------------
条件文は、if文と同じ物が使えます。
条件がTRUEの間は、{}で括った中の制御を繰り返します。
条件がFALSEになるまでずっと繰り返します。
ちなみに、このwhileは、{}の制御をする前に、条件をチェックします。
なので、条件文がいきなりFALSEだった場合、1度も{}の中の制御をしない場合もあります。
--------------------------------------------------
do
{
繰り返したい制御
} while( 条件文 )
--------------------------------------------------
これは、後チェックの書き方です。
{}の中の処理を実行した後、条件をチェックし、
TRUEなら、また{}内の処理を実行、FALSEなら、ループを抜けます。
whileの使用例)
--------------------------------------------------
int num = 0;
while( num < 10 )
{
printf("%d\n", num);
num++;
}
--------------------------------------------------
これで、numが0〜9まで、10回ループができます。
あ、説明わすれてたかも...。「++」って記号は、変数に1足す記号です。
インクリメントとも呼びます。
1引くのも「--」であります。デクリメントと呼びます。
また、break; を使って、while構文を抜ける事もできます。
--------------------------------------------------
int num = 0;
while( 1 )
{
if( num >= 10 ) break;
printf("%d\n", num);
num++;
}
--------------------------------------------------
これは、さっきと同じ挙動をします。
while(1) で永久ループを作っておいて、
{}の中で、ループを抜けるかチェックを掛けるやり方です。
何となくですが、こっちの方がポピュラーな気がします。
まぁ、とにかくwhileは、使い方を間違うと簡単に永久ループしてしまうので、
使い方には注意しましょう。
▽forループ処理
こっちは、主に回数を指定してループしたい時に使います。
まぁ、そういう使い方以外でも使えるんですが、だいたいそんな感じで使います。
記述は、下記のようになります
--------------------------------------------------
for(初期化; 条件文; ループ後処理)
{
繰り返したい制御
}
--------------------------------------------------
「初期化」は、ループに入った時に1度だけ呼び出される処理です。
「条件文」は、whileと同じくループの条件です。
TRUEの間はループし、FALSEになったらfor文を抜けます。
この条件チェックは、whileで言うと、前チェックの方です。
なので、1度も{}内の処理を行わない可能性もあります。
「ループ後処理」は、{}の1ループ処理が終わった後、
次の条件文チェック前にする処理です。
forの使用例)
--------------------------------------------------
int i;
for(i=0; i<10; i++)
{
printf("%d\n", i);
}
--------------------------------------------------
while構文より、すごく、10回ループしますよ、って感じしません?w
ループ用のカウンタとしては、よく「i」という変数が使われます。
i が 0〜9 の間、ループされます。
0〜9の10回...。
配列のあれと組み合わせると...。
となりますよね、もちろん。
▽ループと配列を応用してみる
使用例)
--------------------------------------------------
int i;
int table[10] = { 0 };
// 値を入れる
for(i=0; i<10; i++)
{
table[i] = i;
}
// 値を表示する
for(i=0; i<10; i++)
{
printf("%d\n", i);
}
--------------------------------------------------
2次元配列もごらんの通り!
--------------------------------------------------
int x;
int y;
int counter = 0;
int table[5][10] = { 0 };
// 値を入れる
for(y=0; y<5; y++)
{
for(x=0; x<10; x++)
{
table[y][x] = counter;
counter++;
}
}
// 値を表示する
for(y=0; y<5; y++)
{
for(x=0; x<10; x++)
{
printf("%d, ", table[y][x]);
}
}
--------------------------------------------------
良い感じに、2次元配列にも、値を入れ、値を表示できます!
▽練習問題
ふぅ、今日はちょっと長かったな...。
今回も練習問題出すんで、頑張って下さい。
練習問題1
要素10個の配列を宣言し、0〜9の値をそれぞれ入れ、順に表示する。
※初期化は使わない
練習問題2
scanfで任意の値を入力させる。
要素10個の配列を宣言し、要素[0]に、入力した値を、
要素[1]以降には、それぞれ「1つ前の要素の値+1」の値を入れ、順に表示する。
練習問題3
scanfで任意の値を5つ入力させる。
要素5個の配列を宣言し、入力した5つの数値を、
小さい値から順に配列に入れ、順に表示する。
練習問題4
ゲームのスコアランキングプログラムを作成する。
決まり1
全部で10位までのランキングを作成。
デフォルトで、1位から順に、100, 90, 80, 70, 60, 50, 40, 30, 20, 10ポイント
のランキングを作成しておく。
決まり2
scanfで、今回のスコアを入力する。
そのスコアを、正しい位置に挿入する。
決まり3
そのスコアを表示する。
Ex
スコア表示後、scanfで数値を入力させ、0なら「終了」、
0以外ならもう一度、スコア入力に戻る。
↓答えはコチラ
007_配列とループ.cpp