23章 配列

http://www.geocities.jp/ky_webid/c/023.html

配列までやってきました。

難しそうな感じがしますが、まだここらへんは大丈夫そうです。

気合と根性で乗り切りましょう。

問題1

素数10のint型配列に、2から始まる2のべき乗を順番に格納し、それを逆の順番で表示するプログラムを作って下さい。

これ、思ったより難しかったです。2のべき乗ってのがミソですね。

int main() {
    int array[10];
    int i,num = 2;
    
    for(i=0;i<10;++i){
        array[i] = num;
        num *= 2;
    }
    
    for(i=0;i<10;++i){
        printf("%d\n",array[9-i]);
    }
    
    return 0;
}
$ main
1024
512
256
128
64
32
16
8
4
2

また、逆順に表示するというのも結構やりにくかったですね。

答え合わせ
/* 値を表示していくループ */
for(i=9; i>=0; --i)  /* 配列の末尾から先頭 */
{
    printf( "%d\n", array[i] );
}

なるほど。初期値を配列の最後の要素に設定してデクリメントしていくわけですね。

こっちの方が綺麗です。覚えました。

問題2

以下の2つの配列を作り、それらの値を交換するプログラムを作って下さい。結果が分かるように表示まで行ってください。

int array1[5] = { 20, 50, 70, 30, 40 };
int array2[5] = { 40, 10, 60, 30, 80 };

入れ替えですか。難しくはなさそうですね。

int main () {
    int array1[5] = { 20, 50, 70, 30, 40 };
    int array2[5] = { 40, 10, 60, 30, 80 };
    int tmp,i;
    
    for(i=0;i<5;++i){
        tmp = array1[i];
        array1[i] = array2[i];
        array2[i] = tmp;
    }
    
    printf("array1 = ");
    for(i=0;i<5;++i){
        printf("%d ",array1[i]);
    }
    
    printf("\narray2 = ");
    for(i=0;i<5;++i){
        printf("%d ",array2[i]);
    }
    
    return 0;
}
$ main
array1 = 40 10 60 30 80
array2 = 20 50 70 30 40

入れ替えるとき最初tmpを使わずにやってしまいそうになりました。危なかったです。

問題3

キーボードから整数の入力を繰り返し受け取り、それを配列に順番に格納していきます。配列の要素数は 10とします。これを超える個数の入力を受け取らないように、また途中で負数を入力された時点で、入力処理を打ち切るように作って下さい。最後に、配列に格納されている値を、画面に表示して下さい。

キーボードからの入力と配列のコラボレーションですね。チャレンジしてみます。

int main () {
    int array[10];
    int i,j;
    
    for(i=0;i<10;++i){
        scanf("%d",&array[i]);
        if ( array[i] < 0 ) {
            break;
        }
    }
    
    printf("array = ");
    for(j=0;j<i;++j){
        printf("%d ",array[j]);
    }
    
    return 0;
}
$ main
123
34
454
46
0
78
55
332
10
2222
array = 123 34 454 46 0 78 55 332 10 2222

$ main
100
200
-1
array = 100 200

できました。

実はといいますと初めの実装では配列の中身を表示する際にjを用意せずに実装してました。下記のような感じです。

    printf("array = ");
    for(i=0;i<10;++i){
        printf("%d ",array[i]);
    }

これ、一見うまくいくように見えるのですが、負の値を入力して中断した場合に、値が設定されてない配列が表示されてしまい、なんか意味のわからない出力になっていますのです。

$ main
1
2
3
3
-1
array = 1 2 3 3 -1 -703980765 -2 4222638 4222658 0

うわーーーっ。って感じです。

初期化されてない値を参照するとよくわからない値が出るのでちゃんとチェックして処理しなければなりませんね。

答え合わせ

解答例では入力受付をdo whileで制御してますね。

また配列数の10という値をdefine MAXで定義してるところもナイスだと思いました。

なるほど、用途が同じ数値定数などはこうやってdefineで一括管理してしまう方が、後で変更があったときにそこだけを書き換えれば済むので便利なわけですね。