[← 演習のページへ戻る]
サンプルプログラム 3 の内容整数を SIZE 個読み込み,それらを順に配列 a へ格納する.その後に整数 m, n を読み込み,m 番目の数と n 番目の数を入れ替える. なお,SIZE はマクロとして定義する. 1: #include <stdio.h> 2: 3: #define SIZE 5 4: 5: int main(void){ 6: int a[SIZE], i, m, n, tmp; 7: 8: printf("%d 個の整数を入力してください:\n", SIZE); 9: for ( i = 0; i < SIZE; i++ ){ 10: scanf("%d", &a[i]); 11: } 12: 13: printf("何番目と何番目を交換しますか:\n"); 14: scanf("%d %d", &m, &n); 15: 16: tmp = a[m-1]; 17: a[m-1] = a[n-1]; 18: a[n-1] = tmp; 19: 20: printf("%d 番目と %d 番目を交換した結果:\n", m, n); 21: for ( i = 0; i < SIZE; i++ ){ 22: printf("%3d", a[i]); 23: } 24: printf("\n"); 25: 26: return 0; 27: } プログラムの基本的な流れこのサンプルプログラムの内容は大まかに次のようになっています:
m 番目の数,n 番目の数既に説明しましたが,配列の添字は 0 から始まります.したがって,
16-18 行目: tmp = a[m-1]; a[m-1] = a[n-1]; a[n-1] = tmp;15: 16: tmp = a[m-1]; 17: a[m-1] = a[n-1]; 18: a[n-1] = tmp; 19:二つの変数の内容を入れ替えるという問題は,一見すると簡単そうなのですが,初めてだと間違いやすいところでもあります. まずは簡単な例を使って説明します. いま,x と y という二つの変数があり,それらの値を入れ替えたいとします. 例えば,x に 3, y に 5 が入っているとすると,
x = y; y = x;でできるのでは?と思うかもしれません. しかし残念ながら,これでは失敗します. なぜなら, x = y;を実行した時点で,それまでの x の値は y の値で上書きされてしまいます. つまり,それまで x に入っていた 3 という値は,もうどこにもありません. y に入っていた 5 という値に上書きされてしまい,x, y とも同じ値を持つことになります:
tmp = x; x = y; y = tmp;と書きます. これを順を追って見ていくと, 最初は
次に, x = y; により,
ただ,元の x の値は tmp の方にとってあるので,y = tmp; として,無事に目的を達成できます:
サンプルプログラムでは x が a[m-1],y が a[n-1] になっています. |