第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
© Copyright 2024 ExpyDoc