広告
↓発売日:2018年09月22日↓
![]() |
新品価格 |
(1)上から順番に
(2)条件で分かれ道
(3)くり返し
基本的なプログラムの仕組みは学びました。次にそれを使いこなす上で便利な機能「配列(はいれつ)」を紹介します。
今までは簡単なプログラムばかりだったので、変数も1つか2つぐらいしか使いませんでした。
でも変数が100個や200個に増えた時に全て別々に名前を付けるのは、けっこう大変ですよね!
そんな時に使うのが「配列」です!
/*十二日目 プログラム1*/
#include <stdio.h>
int main(){
int hairetu[5] = {2,4,1,0,3};
printf("hairetu[0] = %d\n",hairetu[0]);
printf("hairetu[1] = %d\n",hairetu[1]);
printf("hairetu[2] = %d\n",hairetu[2]);
printf("hairetu[3] = %d\n",hairetu[3]);
printf("hairetu[4] = %d\n",hairetu[4]);
return 0;
}
配列は変数に番号をつけて使いやすくしたものです。
まずは宣言ですね!
int hairetu[5] = {2,4,1,0,3};
「int」タイプの変数「hairetu」を5個使います!という事で「hairetu[5]」とします。
初期化は{}カッコの中に「,」コンマで区切って書くことができます。
この{}カッコを使ってまとめて初期化するやり方は最初の宣言と一緒に初期化する時だけ使えます。
使う時は
hairetu[0]
このように[ ]カッコの中に番号を書いて使います。この番号の事を添え字(そえじ)といいます。
たとえばprintf命令で表示したい時は「%d」でお尻に「hairetu[0]」というようにすれば大丈夫です。
もちろん一つずつ初期化したり内容を変更する事もできます。
int hairetu[5]; hairetu[0] = 2; hairetu[1] = 4; hairetu[2] = 1; hairetu[3] = 0; hairetu[4] = 3;
のように初期化したり、
hairetu[2] = 152;
のように一つだけ内容を変更する事もできます。
ただ数が多くて初期化忘れが多いので数が少ない時は最初に紹介した{}カッコを使ってまとめて初期化か、「for」命令などを使ってまとめて初期化か、全て「0」で大丈夫なら
int hairetu[5] = {0};
のように書けばすべて「0」で初期化できます。
あらためて添え字(そえじ)に注目してください。番号が「hairetu[0]」から始まってます。
そうです!
配列の番号は「0」から始まります!なので最後は「hairetu[4]」となりますのでご注意ください。
ここで鋭い方は気づいたかもしれませんがこの「hairetu[4]」の隣の「hairetu[5]」の内容も実は調べたり変更したりする事ができます。
が!これは
バッファオーバーフロー
というもっともやってはいけないエラーが発生するので絶対にやめましょう!
これはコンピューターは限られたメモリをムダにしないように再利用しながら動いております。
なのでプログラム上でコンピューターに「このメモリ使いますよ!」と宣言した場所以外のメモリはコンピューターを動かす上で超大事な数字が保存されていたりするのです!
やりようによってはコンピューターが壊れてしまうかもしれませんので絶対にやめておきましょう。
配列にする事によってさきほどの「添え字」を変数にする事ができます。
さきほどのプログラムをもっと簡単に書いてみましょう!
/*十二日目 プログラム2*/
#include <stdio.h>
int main(){
int hairetu[5] = {2,4,1,0,3};
int suji;
for(suji = 0;suji < 5;suji++){
printf("hairetu[%d] = %d\n",suji,hairetu[suji]);
}
return 0;
}
配列と「for」命令のよく使われるカタチです!
for(suji = 0;suji < 5;suji++){
printf("hairetu[%d] = %d\n",suji,hairetu[suji]);
}
「hairetu[suji]」で添え字を変数にして一気に配列の内容を表示してます!
こうすれば一度に100個、200個あるたくさんのデータを使えますね!
「while」命令を使った例も見てみましょう。
/*十二日目 プログラム3*/
#include <stdio.h>
int main(){
int hairetu[10] = {2,5,1,8,3,0,7,6,9,4};
int suji = 0;
while(hairetu[suji]){
printf("hairetu[%d] = %d\n",suji,hairetu[suji]);
suji++;
}
return 0;
}
まず「while」命令の条件に注目です!
while(hairetu[suji])
これも「if」命令の時に学んだ条件「1」合っている。「0」合っていない。のカタチの一つですね。
「「0」合っていない」がくればくり返しが終わる事を利用してます。それ以外はくり返します。
なれないウチは変に感じるかと思いますが、そのまま覚えましょう!
もちろん
while(hairetu[suji] != 9)
のように普通に条件を指定する事もできます。
注意点として上記のようなプログラムの場合、目的の数がなかった場合無限ループになるので前回学んだ「if~break」でカッコ{}を抜ける対策などが必要です。
広告
続けて配列をちょっとパワーアップさせた2次元配列を学んでいきたいと思います。
「にじげん!」って聞いただけでいっきにレベルアップしそうな感じですが、ご安心ください。ただ配列が束(たば)になっただけの話です。
オセロのマスとか将棋のマスのような平面を想像してください。
int hairetu[6][4];
例えば「hairetu[6][4]」という2次元配列だとすると「縦6マス×横4マス」のような平面を想像します。
こんな感じですね。このそれぞれのマスに数字とかを入れていくイメージで考えるとわかりやすいかと思います。
2次元の場合も配列番号の最初は[0][0]から始まりますので、この場合の終わりは[5][3]になります。
ではプログラムを作ってみましょう!
/*十二日目 プログラム4*/
#include <stdio.h>
int main(){
int hairetu[3][2];
hairetu[0][0] = 1;
hairetu[0][1] = 2;
hairetu[1][0] = 3;
hairetu[1][1] = 4;
hairetu[2][0] = 5;
hairetu[2][1] = 6;
printf("[0][0] = %d:[0][1] = %d\n",hairetu[0][0],hairetu[0][1]);
printf("[1][0] = %d:[1][1] = %d\n",hairetu[1][0],hairetu[1][1]);
printf("[2][0] = %d:[2][1] = %d\n",hairetu[2][0],hairetu[2][1]);
return 0;
}
まず2次元配列の宣言ですが、
int hairetu[3][2];
このようになります。配列[縦]×[横]のようなイメージで作りましょう。
次に初期化ですが、ちょっとめんどくさいやり方をしてます。
hairetu[0][1] = 2;
このように場所を一つ一つ選んで数を入れる事ができます。
まとめて初期化する方法もありますので次のプログラムで説明いたします!
どの番号がどのマス目になるのかみたいに「printf」命令などでいろいろな場所を表示してみて2次元配列をイメージできるようにしてみてください。
最初の方にやったクリスマスツリーを書くプログラムを配列と「for」命令を使って書き直しましょう!
/*十二日目 プログラム5*/
#include <stdio.h>
int main(){
int tree[9][9] = {
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0},
{0,0,0,9,9,9,0,0,0},
{0,0,9,9,9,9,9,0,0},
{0,9,9,9,9,9,9,9,0},
{0,0,0,0,9,0,0,0,0},
{0,0,9,9,9,9,9,0,0},
{0,0,0,9,9,9,0,0,0},
{0,0,0,0,0,0,0,0,0}
};
int suji1,suji2;
for(suji1=0;suji1<9;suji1++){
for(suji2=0;suji2<9;suji2++){
if(tree[suji1][suji2] == 9)printf("□");
else if(tree[suji1][suji2] == 1)printf("☆");
else printf("■");
}
printf("\n");
}
return 0;
}
2次元配列をまとめて初期化してます。
int tree[9][9] = {
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0},
{0,0,0,9,9,9,0,0,0},
{0,0,9,9,9,9,9,0,0},
{0,9,9,9,9,9,9,9,0},
{0,0,0,0,9,0,0,0,0},
{0,0,9,9,9,9,9,0,0},
{0,0,0,9,9,9,0,0,0},
{0,0,0,0,0,0,0,0,0}
};
このように一列一列を{}カッコで囲む事によって平面のように2次元配列を初期化できます。
初期化の時だけこの書き方はできます!
{}カッコの間を「,」コンマで区切っているのと、最後の列だけは{}カッコの後「,」コンマが付かないので注意してください。
次に2重ループが使われてます。これもなれないと最初はややこしいと思います。
for(suji1=0;suji1<9;suji1++){
for(suji2=0;suji2<9;suji2++){
(ループ中の命令);
}
}
ループのイメージですがこのプログラムで言うと
まず外側のループを通りこして先に内側のループで横一列のラインを作ります。
その1
■■■■■■■■■
一列作った所で一度内側のループを抜けて縦のラインを一つだけ進めてから、再び内側のループに入ります。
その2
■■■■■■■■■
■■■■☆■・・・
後はくり返しですね!
その3
■■■■■■■■■
■■■■☆■■■■
■■■□□□■■■
■■□□□・・・
内側のループが終わったら外側のループを一つ進めるというのを想像しましょう!
そしてループの最中に条件に合う所の数字を絵柄に置きかえます。
if(tree[suji1][suji2] == 9)printf("□");
else if(tree[suji1][suji2] == 1)printf("☆");
else printf("■");
2次元配列の全ての内容を2重ループで調べる。その内容の条件が合えば置きかえる。これがポイントですね!
配列はプログラムを組む上でスゴイ大事なテクニックです。何回も練習して身につけましょう!
広告
↓発売日:2016年02月29日↓
![]() |
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
![]() |
新品価格 |
↓発売日:2018年03月09日↓
![]() |
新品価格 |
↓発売日:2017年06月14日↓
![]() |
新品価格 |
↓発売日:2018年05月21日↓
![]() |
新品価格 |
↓発売日:2017年12月07日↓
![]() |
新品価格 |
↓発売日:2017年02月08日↓
![]() |
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
![]() |
新品価格 |