null

第10回
配
列
番号でアクセスできる多数の変数
配列の概念
(array)
配列名
(配列変数)
(array variable)
a
0
1
添え字
(要素番号)
(index)
要素
(element)
2
a[2]
3
第i番目の要素を
a[i] と表記する
4
(ただし,先頭は第0番目)
要素数を n とすると,添え字は
0 から n−1 までとなる
配列の宣言と基本的な使い方
(declaration)
要素のデータ型
配列名
要素数(サイズ)
int a[5];
a[1]=20;
a[3]=a[1]*2;
printf(”%d”, a[3]);
scanf(”%d”, &a[4]);
0
a
1
2
3
4
配列の宣言
要素の代入
要素の値
要素の出力
要素の入力
配列の宣言と同時に初期化ができる
(initialization)
int a[5]={10,20,30,40,50};
0
1
2
3
4
a
初期化をおこなうときは,要素数は自明なので省力して良い
int a[]={10,20,30,40,50};
宣言文では,配列の要素数は定数とする
間違い
正しい
int N=5;
#define N 5;
double a[N];
double a[N];
C言語では要素数を変数で指定
して宣言することはできない
Nを定数として定義して,
要素数を定数で指定する
ことができる
プログラム中の多くの場所で要素数を参照するとき,
それを N としておけば,
N の値を変えるだけで要素数の変更をまとめて行える
実行文では,配列の要素を変数を含む式で指定できる
宣言文以外
の文
正しい
int i;
scanf(”%d”, i);
a[i+2]=a[i]+a[i+1];
間違い
a[i]+a[i+1]=a[i+2];
代入文の左辺は,
変数 または 配列の要素
が1個だけでなければならない
(一般の計算式は不可)
配列と for ループ の組合せは相性が良い
int i;
double sum;
double a[5];/*実数の配列*/
for(i=0; i<5; i++){
scanf(”%lf”, &a[i]);
}
a[0]~a[4]に
データ入力
for(i=0; i<5; i++){
printf(”%f¥n”, a[i]);
}
a[0]~a[4]の
データ出力
sum=0;
for(i=0; i<5; i++){
sum = sum + a[i];
}
a[0]~a[4]の
総和計算
添え字が範囲外の値にならないように注意
間違い
int i;
double a[5];
for(i=1; i<=5; i++){
scanf(”%lf”, &a[i]);
}
正しい
int i;
double a[5];
for(i=0; i<5; i++){
scanf(”%lf”, &a[i]);
}
1次元配列の応用例
音データ
s[1]
s[0]
振幅
s[2]
配列 s は各時刻の
振幅の値を表す
s[3]
s[4]
時間
【応用】 配列を用いた集合の表現
(set)
例:{1,2,…,9}の任意の部分集合 S を表現したい.
たとえば,S={2,3,5,7}
【方法1】
0
1
2
3
4
5
6
7
8
9
S
データを列挙して並べる
【方法2】 0
1
2
3
4
データの末尾を表す
5
6
7
8
9
S
添え字が集合に属していれば1,属していなければ0
関数での取扱い(数値が引数の場合)
int erase(int x)
{
x=0;
return x;
}
int main(void)
{
int a=10;
int b;
b=erase(a);
printf("%d¥n", a);
printf("%d¥n", b);
return 0;
}
x と a は異なる変数
x
0
10
a
10
x の値は
a の値のコピー
b
関数のなかで
x の値を変えても,
a の値は変わらない
実行結果
10
0
0
関数での取扱い(配列が引数の場合)
void erase(int x[])
{
x[0]=0;
x[1]=0;
}
int main(void)
{
int a[2]={10,20};
erase(a);
printf("%d¥n",a[0]);
printf("%d¥n",a[1]);
return 0;
}
仮引数には,要素数を明記しなくてもよい
実引数は,任意の要素数の配列にできる
x には a の値(番地)がコピーされる.
その結果,x と a は配列の要素を共有する.
x
間接参照 70番地
a
70番地
71番地
0
1
関数のなかで配列 x の要素の値を変えると,
配列 a の要素の値も変わる.
番地のことを,アドレス, 参照ともいう
(address) (reference)
メモリー
70番地
実行結果
0
0
この性質を使って,関数から引数の配列に値を設定することができる
2次元配列
(two-dimensional array)
a
0
1
2
3
4
0
1
2
a[2][4]
第i行,第j列の要素を a[i][j] と表記する
int a[3][5]={{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
2次元配列と 2重 for ループ の組合せは相性が良い
double a[2][2]={{1,2},
{3,4}},
b[2][2]={{1,0},
{0,2}},
c[2][2];
int i, j;
for(i=0; i<2; i++){
for(j=0; j<2; j++){
c[i][j]=a[i][j]+b[i][j];
}
}
行列の和
2次元配列の応用例
画像データ
p[0][0]
p[0][1]
p[1][0]
p[1][1]
配列 p は各座標の
ピクセルの明るさ
を表す
実際には,光の色の
三原色(赤,緑,青)
ごとに2次元配列
が必要
関数での取扱い(2次元配列が引数の場合)
void erase(int x[][2])
{
x[0][0]=0;
x[0][1]=0;
x[1][0]=0;
x[1][1]=0;
}
int main(void)
{
int a[2][2]={{1,2},
{3,4}};
erase(a);
printf("%d¥n",a[0][0]);
printf("%d¥n",a[0][1]);
printf("%d¥n",a[1][0]);
printf("%d¥n",a[1][1]);
return 0;
}
仮引数の第1軸には,
要素数を明記しなくてもよい
実引数の第1軸は,
任意の要素数の配列にできる
1次元配列の場合と同様,
配列 x の要素の値を変えると,
配列 a の要素の値も変わる.
実行結果
0
0
0
0