はじめに
どうも! みなため(@MinatameT)です。
C言語で2次配列を初期化(初期値の設定)するとき……
- すべての要素を同じ値で初期化したい
- すべての要素を異なる値で初期化したい
といった場合があると思います。
この2つのパターンについて、例を挙げながら説明していきます。
すべての要素を同じ値で初期化したい場合
#include<stdio.h>
int main(void)
{
int score[2][3];
int a;
int b;
//0で初期化(初期値の設定)
for(a=0; a<2; a=a+1)
{
for(b=0; b<3; b=b+1)
{
score[a][b] = 0;
}
}
return(0);
}
このプログラムでは、int型の2次配列scoreを0で初期化しています。
宣言時に初期化することもできるのですが、要素数が増えると(要素数に比例して)コードを記述するのが大変になってしまいます。
例えば、int a[100][100]を宣言時に初期化しようとすると、私でも数時間かかると思いますし、何より非効率的です。骨が折れますよね。
したがって、2重のfor文で要素数の分だけのループをおこない、そこで初期化をしてしまうわけです。
ただ、上記のコードを実行しても、初期化に成功しているかどうかはわかりません。
なぜなら、初期化した結果を表示していないからです。
……ということで、初期化した結果を表示するプログラムに改良しました。
#include<stdio.h>
int main(void)
{
int score[2][3];
int a;
int b;
//0で初期化(初期値の設定)
for(a=0; a<2; a=a+1)
{
for(b=0; b<3; b=b+1)
{
score[a][b] = 0;
}
}
//配列の中身の表示
for(a=0; a<2; a=a+1)
{
for(b=0; b<3; b=b+1)
{
printf("score[%d][%d] = %d\n",a,b,score[a][b]);
}
}
return(0);
}
これを実行すると、次のようになります。
score[0][0] = 0
score[0][1] = 0
score[0][2] = 0
score[1][0] = 0
score[1][1] = 0
score[1][2] = 0
ちゃんと、0で初期化できていることがわかります!
これを、0ではなく1で初期化したい場合は……
score[a][b] = 0;
この部分を、
score[a][b] = 1;
に変更すればOKです。
すべての要素を異なる値で初期化したい場合
#include<stdio.h>
int main(void)
{
int score[2][3] = {{90,80,75},{100,85,65}}; //初期化(初期値の設定)
return(0);
}
このプログラムでは、int型の2次配列scoreを各数値で初期化しています。
score[0][0]には90、score[0][1]には80、score[0][2]には75、score[1][0]には100、score[1][1]には85、score[1][2]には65が初期値として与えられています。
ただ、上記のコードを実行しても、初期化に成功しているかどうかはわかりません。
なぜなら、初期化した結果を表示していないからです。
……ということで、初期化した結果を表示するプログラムに改良しました。
#include<stdio.h>
int main(void)
{
int score[2][3] = {{90,80,75},{100,85,65}}; //初期化(初期値の設定)
int a;
int b;
for(a=0; a<2; a=a+1)
{
for(b=0; b<3; b=b+1)
{
printf("score[%d][%d] = %d\n",a,b,score[a][b]);
}
}
return(0);
}
2重for文のループ内で、2次配列の値を(printf文で)表示しています。
これを実行すると、次のようになります。
score[0][0] = 90
score[0][1] = 80
score[0][2] = 75
score[1][0] = 100
score[1][1] = 85
score[1][2] = 65
初期化に成功していることがわかります!
ただ、このように要素数が少ない場合は良いのですが、要素数が多くなるとコードを記述するのが大変になります。
規則性があるのならfor文で一気に処理できるのでしょうが、不規則な値の場合は本当に大変です。気合いを入れて頑張るしかありません(汗)。
今回はここまでです。お疲れさまでした。