★データ構造(配列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です。