第6回 int配列 1次配列 2次配列 配列の初期化

このドキュメントは http://icrus.org/c_language_beginers_course/ 上にあります.

[課題6-1]

10個の整数1次配列を宣言し,それぞれに任意の値を代入し,それぞれを画面に表示しよう.

[プログラム例6-1]


01: #include <stdio.h>
02: void main(void){
03:     int  i, x[10];
04:
05:     x[0] = 100;
06:     x[1] = 11;
07:     x[2] = 22;
08:     x[3] = 33;
09:     x[4] = 44;
10:     x[5] = 55;
11:     x[6] = 66;
12:     x[7] = 77;
13:     x[8] = 88;
14:     x[9] = 99;
15:     for( i=0; i<MAX; i++ )
16:         printf( "x[%d]=%d\n", i, x[i] );
17:     getchar();
18: }
04行目 →変数iと配列x[10]をint(整数)に宣言します.
04行目 →x[10] xが10個の要素を持つ1次配列であることを表します.
05~24行目 →x[0]~x[9]に任意の整数を代入します.
15~16行目 →for文で10個の配列要素x[0]~x[9]を画面に表示します.

[結果6-1]

 コンパイル・実行すると次のように表示されます.
x[0]=100
x[1]=11
x[2]=22
x[3]=33
x[4]=44
x[5]=55
x[6]=66
x[7]=77
x[8]=88
x[9]=99
リターンキーを押すとプログラムは終了します.

配列xの0~9番目に,任意の整数が代入されていることが確認できます.
整数配列を宣言したいときは,次のように記述します.

int 配列名[整数値];

整数値が10なら10個分の配列(整数の入れ物)が用意されます.
それぞれの配列には番号があり,10個分の配列のときは0~9です.

**********イメージ図で説明する**************
 プログラム中で 配列名[番号](ここではx[番号],番号:0~9)と記述することで変数と同じように使うことができます.番号は1~10ではありませんので間違わないようにして下さい.
 たくさんのデータを扱うプログラムになると,今までのように全てを変数として宣言していては,大変です.例えば10この変数を使うとき,変数で宣言すると

int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9;

と宣言していたところを配列を使うと

int a[10];

で済みます.また,配列名[番号] の番号は変数,式,関数など,整数を特定できるものであれば構いませんので,プログラム例16行目のように,都合のよい要素を使うことができます.

[課題6-2]

整数1次配列を使って小さい順に,100個の素数を求めよう.

[プログラム例6-2]


01: #include <stdio.h>
02: #define MAX 1000
03: void main(void){
04:     int  num, i, sim, x[MAX];
05:
06:     num  = 0;
07:     sim  = 3;
08:     x[0] = 2;
09:     while( num<MAX ){
10:         for( i=0; i<=num; i++ ){
11:             if( sim % x[i]==0 )
12:                 break;
13:             if( i==num ){
14:                 num++;
15:                 if( num>=MAX )
16:                     break;
17:                 x[num] = sim;
18:             }
19:         }
20:         sim++;
21:     }
22:     for( i=0; i<MAX; i++ )
23:         printf( "x[%d]=%d\n", i, x[i] );
24: }

各行説明
02行目 →求めたい素数の数をMAXとします.(ここでは1000)
04行目 →変数と配列x(素数を格納する)を宣言します.
06~07行目 →変数を初期化します.
08行目 →配列xの0番目に2を代入します.(既知の素数として)
09~21行目 →変数numがMAX未満のとき繰り返すwhileループです.変数numがMAXに達すると(素数がMAX個見つかったとき)whileループから抜け出ます.変数numがMAXに達するまで,変数simをインクリメント(1を加える)していきます.
10~19行目 →変数iが変数num以下のとき繰り返すforループです.そのときに見つかっている素数の個数分繰り返します.
11~12行目 →変数simがx[i]で割り切れればforループから抜け出ます.
13~18行目 →11行目のif文で割り切れることなく,そのときの最大の素数に達したら,変数simを素数とみなし,配列の次に代入します.

[結果6-2]

コンパイル・実行すると次のように0~999番目の1000個の素数が表示されます.
x[0]=2
x[1]=3
x[2]=5
x[3]=7
x[4]=11
*** x[4]~x[994] 省略 ***
x[995]=7879
x[996]=7883
x[997]=7901
x[998]=7907
x[999]=7919
リターンキーを押すとプログラムは終了します.

これで,1000個の素数を求めることがでました.短いプログラムですので,ここまでの知識を総動員すれば,プログラムが何をしているのか理解できると思います.アルゴリズムの詳しい説明は省きますので,もし理解できなくても「今までの知識と1次配列を使うとこのようなこともできるのか!」と思っておいて,先に進んで下さい.理解できた方は,10000個の素数を求めるプログラム,または,さらに素早く素数を求められるアルゴリズムなどを考えてみてください.

[課題6-3]

3×2の整数2次配列を宣言すると同時に任意の値に初期化しそれぞれの要素の値を画面に表示してみましょう.

[プログラム例6-3]


01: #include <stdio.h>
02: void main(void){
03:     int  i, j;
04:     int  x[3][2]={{2,5},{6,8},{9,2}};
05:
06:     for( i=0; i<3; i++ )
07:         for( j=0; j<2; j++ )
08:             printf( "x[%d][%d]=%d\n",i, j, x[i][j] );
09: }

各行説明
4行目→3×2の2次行列を宣言し,要素の値を初期化します.
7~9行目→変数i,jで2重のforループになっています.変数i,jそれぞれにインクリメント(1を加える)しながら,関数printf()を実行していきます.

[結果6-3]

 コンパイル・実行すると次のよう表示されます. x[0][0]=2
x[0][1]=5
x[1][0]=6
x[1][1]=8
x[2][0]=9
x[2][1]=2
リターンキーを押すとプログラムは終了します.
意図通りに2次元の配列が宣言され,初期化されていることがわかります.

**********イメージ図で説明する**************

[課題6-4]

10×10の整数2次配列を利用してかけ算九九の表を完成させよう.

[プログラム例6-3]


01: #include <stdio.h>
02: 
03: void main(void){
04:     int  i, j;
05:     int  x[10][10];
06:
07:     for( i=0; i<10; i++ )
08:         for( j=0; j<10; j++ )
09:             x[i][j] = i*j;
10:
11:     for( i=0; i<10; i++ ){
12:         for( j=0; j<10; j++ )
13:             printf( "%2d ", x[i][j]
);
14:         printf( "\n" );
15:     }
16:     getchar();
17: }

行説明
05行目→10×10の2次配列を宣言します.
07~09行目→変数i,jの2重のforループで,変数i,jそれぞれにインクリメント(1を加える)しながら,配列x[i][j]にかけ算九九の値を代入しながら,
11~15行目→変数i,jで2重のforループで,変数i,jそれぞれにインクリメント(1を加える)しながら,関数printf()を実行していきます.
"%2d "→2桁を使って整数を表示します.その後,空白を1つ空けます.桁をそろえてきれいに出力する工夫です.
14行目→1行(x[i][0]~x[i][9])を表示し終わるとprintf("\n");で復改します.

[結果6-4]

コンパイル・実行すると次のよう表示されます.


 0  0  0  0  0  0  0  0  0  0
 0  1  2  3  4  5  6  7  8  9
 0  2  4  6  8 10 12 14 16 18
 0  3  6  9 12 15 18 21 24 27
 0  4  8 12 16 20 24 28 32 36
 0  5 10 15 20 25 30 35 40 45
 0  6 12 18 24 30 36 42 48 54
 0  7 14 21 28 35 42 49 56 63
 0  8 16 24 32 40 48 56 64 72
 0  9 18 27 36 45 54 63 72 81

リターンキーを押すとプログラムは終了します.
2次配列を使ってかけ算九九の表がきれいにできました.0の段~九の段まで表示してあります.

[文法6]配列

宣言のしかた

int 配列名[整数値];
int 配列名[整数値]={値,値,・・・};
int 配列名[整数値1][整数値2];
{ 整数値1の個数 }
int 配列名[整数値1][整数値2]={{値,値,・・・・・・・・},{値,値,・・・},・・・};
{整数値2の個数}
(1) int x[10]; と配列宣言すると,使用できる配列要素はx[0]~x[9]の10個です.
(2) 2次元配列では,2組の[]で囲った添字を使います.さらに添字を増やせば3次元,4次元が可能です.
(3) 添字は整数値でなければなりません.
(4) 2次配列を初期化するときは ①int x[3][2]={{2,5},{6,8},{9,2}};
とも
②int x[3][2]={2,5,6,8,9,2};
とも書けますが,①の方が意味が取りやすく,お奨めします.
(5) int型だけでなく,全ての型で配列を宣言し利用できます.

このドキュメントは http://icrus.org/c_language_beginers_course/ 上にあります.

2017,1 ssatoh@

足立工科大学 工学部 情報通信工学科