[PR]子育てママさんへ:3年毎に15万円うけとれる女性保険?


データ構造(配列3)★


変数では変数同士で値の代入が可能でした。

ここでは、配列同士での値の代入について説明します。

次のプログラムを打ち込んで、実行してみてください。


<sample program 063-01>

#include <stdio.h>

int main( void )
{
    int data1[5] = { 1, 2, 3, 4, 5 };
    int data2[5];

    int i;

    data2 = data1;

    for( i=0; i<5; i++ ) {
        printf( "data2[%d] = %d\n", i, data2[i] );
    }

    return 0;
}

配列data1に初期値を設定し、空の配列data2に代入(コピー)しようとしています。

しかし、コンパイル時にエラーメッセージが表示されますね。

 main.cpp(8) : error C2106: '=' : 左のオペランドが、左辺値になっていません。

これは、配列同士の代入はできないというメッセージだと思ってください。

イメージ的には一気に代入できそうな気がしますが、実際はできないのです。

では、どのようにすればできるようになるのでしょうか。

配列の各要素は「変数」ですから、1つずつ順番に代入することで配列全体をコピーすることができます。


<sample program 063-02>

#include <stdio.h>

int main( void )
{
    int data1[5] = { 1, 2, 3, 4, 5 };
    int data2[5];

    int i;

    for( i=0; i<5; i++ ) {
        data2[i] = data1[i];
    }

    for( i=0; i<5; i++ ) {
        printf( "data2[%d] = %d\n", i, data2[i] );
    }

    return 0;
}

<実行結果 VC++ Express Edition>

     data2[0] = 1
data2[1] = 2
data2[2] = 3
data2[3] = 4
data2[4] = 5 続行するには何かキーを押してください・・・

for文を使って繰り返しながら1つずつ代入します。

これで配列全体をコピーできました。


では、1つ問題を出します。

これまでやってきたことをすべて思い出しながら考えてください。


配列data1(要素数5個)に初期値{ 1, 2, 3, 4, 5 }を設定する。

配列data2を準備し、data1の内容を逆順にコピーして、結果を表示する。

代入する際にはfor文を使うこと!

<実行結果 VC++ Express Edition>

     data2[0] = 5
data2[1] = 4
data2[2] = 3
data2[3] = 2
data2[4] = 1 続行するには何かキーを押してください・・・









































解答例です。


<sample program 063-03>

#include <stdio.h>

int main( void )
{
    int data1[5] = { 1, 2, 3, 4, 5 };
    int data2[5];

    int i;

    for( i=0; i<5; i++ ) {
        data2[i] = data1[4-i];
    }

    for( i=0; i<5; i++ ) {
        printf( "data2[%d] = %d\n", i, data2[i] );
    }

    return 0;
}

<実行結果 VC++ Express Edition>

     data2[0] = 5
data2[1] = 4
data2[2] = 3
data2[3] = 2
data2[4] = 1 続行するには何かキーを押してください・・・

data1の内容を代入する際に、添え字を「4−i」にしています。

iは0から1ずつ増えていきますので、iと4−iの関係は以下のようになります。

 i 4−i
 −−−−−
 0  4
 1  3
 2  2
 3  1
 4  0

これを配列の添え字として書いてみると、

 data2[0] = data1[4];
 data2[1] = data1[3];
 data2[2] = data1[2];
 data2[3] = data1[1];
 data2[4] = data1[0];

このようになります。

data1の4番目の要素がdata2の1番目に代入され、data1の3番目の要素がdata2の1番目に代入され・・・と続いていきます。

図1 逆順に代入のイメージ

もちろん別の方法もあります。


<sample program 063-04>

#include <stdio.h>

int main( void )
{
    int data1[5] = { 1, 2, 3, 4, 5 };
    int data2[5];

    int i;

    for( i=0; i<5; i++ ) {
        data2[4-i] = data1[i];
    }

    for( i=0; i<5; i++ ) {
        printf( "data2[%d] = %d\n", i, data2[i] );
    }

    return 0;
}

<実行結果 VC++ Express Edition>

     data2[0] = 5
data2[1] = 4
data2[2] = 3
data2[3] = 2
data2[4] = 1 続行するには何かキーを押してください・・・

添え字の扱いを逆にしただけですね。

他にも方法はあります。


<sample program 063-05>

#include <stdio.h>

int main( void )
{
    int data1[5] = { 1, 2, 3, 4, 5 };
    int data2[5];

    int i;
    int j;

    for( i=0, j=4; i<5; i++, j-- ) {
        data2[j] = data1[i];
    }

    for( i=0; i<5; i++ ) {
        printf( "data2[%d] = %d\n", i, data2[i] );
    }

    return 0;
}

<実行結果 VC++ Express Edition>

     data2[0] = 5
data2[1] = 4
data2[2] = 3
data2[3] = 2
data2[4] = 1 続行するには何かキーを押してください・・・

変数jを新しく用意して、初期値に4を設定し、繰り返すごとに1減らしながら添え字として使うという方法です。

※for文の説明時に「,」で区切ることで、初期値と増分は複数書けると説明しました。
(個人的にはあまり好きではない書き方ですが・・・)

他にもwhile文を使う等のバリエーションはありますが、とりあえず逆順に入っていればOKです。


次へ

戻る

目次へ


[PR]看護師6万人以上が利用!:転職成功させてハッピーな毎日