配列の要素の並びを反転するプログラム

プログラミング

配列の要素の並びを逆転させるプログラム。

配列のを引数として渡すやり方の復習と計算方法も兼ねて。

コード全体

#include <iostream>

void change_array(int v[], int n) {
    int i, n_count;
    int box;

    n_count = n / 2;    //例えばn=7なら、7/2=3.5だが、n_countは整数型なので、=3となる。

    for (i = 0; i < n_count; i++) {         //nが3未満、すなわち2まで実行されれば、三回交換される。
        box = v[i];
        v[i] = v[n - i - 1];
        v[n - i - 1] = box;
    }
}

void print_array(const int v[], int n) {
    int i;
    printf("{");
    for (i = 0; i < n; i++) {
        printf("%3d", v[i]);
    }
    printf("}\n");
}

int main()
{
    int min = 0;
    int tensu[] = {1,2,3,4,5,6};
    int number = 6;

    print_array(tensu, number);
    
    printf("配列内の並びを逆転した配列は以下の通りです。\n");

    change_array(tensu, number);
    print_array(tensu, number);

}

意味

簡単に意味をメモ。

文中にもあるが、配列の中身を並び替える場合は、要素数全部を並び替えるのだが、
「交換する」という手法でやる場合、お互いに対極に位置する数を交換することになる。

ただここで注意すべきことが一つある。

{ 1 , 2 , 3 , 4 , 5 }
のように奇数個の要素数の場合は3を中心に交換が行われる

しかし、
{ 1 , 2 , 3 , 4 , 5 , 6 }
のように要素数が偶数個の場合は、中心はない。

この点に注意すると以下のようなプログラムになる。

void change_array(int v[], int n) {
    int i, n_count;
    int box;

    n_count = n / 2;    //例えばn=7なら、7/2=3.5だが、n_countは整数型なので、=3となる。

    for (i = 0; i < n_count; i++) {         //nが3未満、すなわち2まで実行されれば、三回交換される。
        box = v[i];
        v[i] = v[n - i - 1];
        v[n - i - 1] = box;
    }
}

要素数をnとして読み込んだわけだが、例えば要素数がn=7だった場合は、
1-7、2-6、3-5を交換し、4が中心になる。
配列の要素番号で言えば、それぞれからマイナス1して、
0-6、1-5、2-4、3中心、となる。

つまり、交換する回数は要素数÷2したときの整数部分、となる。

1回なら0回
2回なら1回
3回なら1回
4回なら2回
5回なら2回
6回なら3回
7回なら3回

これより、n / 2 で交換回数が求まるわけなのだが、これでは3.5とかになる、と思うかもしれないが、
nはint型で宣言しているので、割り切れるうちの整数分が残るのである。

これで「n_count = n / 2」の意味が分かるだろう。

注意点

配列の要素を入れ替える際に注意すべき点が一つある。

for (i = 0; i < n_count; i++) {         
        box = v[i];
        v[i] = v[n - i - 1];
        v[n - i - 1] = box;
    }

それはこの部分である。

入れ替える際や回数は「i< n_count」としているので未満、なって配列の要素と合うのだが、
交換する際はnと配列の要素が合わないので注意。

v[n]という配列は存在しない。

ちなみにミスすると以下のようなエラーが出る。

「配列の要素数がオーバーしてます。」
とか書いてくれればわかりやすいんだけどね。。。。

まぁエラー箇所が分かるだけ感謝。

まとめ

特になし。

配列と要素を用いた計算の場合はwhile文よりfor文のほうがあっているのかなぁ~と思った。

タイトルとURLをコピーしました