動作環境はWindowsVista C++ 2008です。
要素数がnoのint型の配列vcの並びを逆順にする関数
void rev_intary(int vc[], int no)
を作成せよ。
#include <stdio.h>
#define NUMBER 5
void rev_intary(int vc[], int no)
{
int i;
int temp = vc[0];
for(i = 0; i < no; i++)
vc[i] = vc[no - 1 - i];
}
int main(void)
{
int i;
int ac[NUMBER];
printf(整数を%d入力してください。\n, NUMBER);
for (i = 0; i < NUMBER; i++)
{
printf(ac[%d], i + 1); scanf(%d, &ac[i]);
}
rev_intary(ac, NUMBER);
for (i = 0; i < 5; i++)
printf(ac[%d] = %d\n, i, ac[i]);
return (0);
}
一応指摘を受け直したのですが、
最後の2つがそのまま出力されます。
直したいのですが、直せませんでした。
ヒントでもいいので教えて下さい。
僕ならこうする:
void rev_intary(int vc[], int no)
{
int i = 0;
int j = no - 1;
while ( i < j ) {
int t = vc[i];
vc[i] = vc[j];
vc[j] = t;
++i;
--j;
}
}
こんな早朝までお疲れさまです
rev_intaryにテストコードを追加して
vcの配列の中がどう変わっているかを確認すれば
理解できると思いますよ
void rev_intary(int vc[], int no)
{
int i;
int j;
int temp = vc[0];
for(i = 0; i < no; i++)
{
vc[i] = vc[no - 1 - i];
/* テストコード↓ */
for (j = 0; j < NUMBER; j++)
{
printf(%d , vc[j]);
}
printf(\n);
/* テストコード↑ */
}
}
tempってなんのためにあるんでしょう
前の質問の所でも書きましたけれど、
机上のシュミレーションをして見てますか?
これってとても大事な事なんですけれど。
あなたが書いたコード通りに動作したとして
プログラム上の変数の状態はどのように変化するのでしょう?
solidさんが書かれているようにテスト用のログ表示を追加するのも
有りだと思います。デバッグの第一歩は現状把握です。
今のコードで実際にどういう事が起こっているのかを
きちんと把握しましょう。
把握できたら、その原因を調べます。
原因がわかれば、対処方法もわかるはずです。
シミュレーションしてみれば分かる。
例えば、以下のように入ってるとして、
1, 2, 3, 4, 5
以下のコードが、
------------------------------------
for(i = 0; i < no; i++)
vc[i] = vc[no - 1 - i];
------------------------------------
ループ毎にどうなるか?
i=0 : 5, 2, 3, 4, 5
i=1 : 5, 4, 3, 4, 5
i=2 : 5, 4, 3, 4, 5
i=3 : 5, 4, 3, 4, 5
i=4 : 5, 4, 3, 4, 5
i=0の時点で 1 は上書きされて、もうどこにもいない。
その辺りをどう工夫するかですな。
やっぱりスワップがわかってないんだ。
> vc[i] = vc[no - 1 - i];
これでは後ろからi番目をi番目に代入しているだけ。i番目のデータは上書きされて
消えてしまう。
επιστημηさんが提示しているように、i番目(代入先)を一旦テンポラリ変
数に退避してからこの代入を行い、この退避した値を代入元に書き戻す。これがス
ワップ処理です。επιστημηさんのコードは配列の要素番号をi,jにしてルー
プをまわしています。
> rev_intaryにテストコードを追加して
> vcの配列の中がどう変わっているかを確認すれば
> 理解できると思いますよ
うーん、スワップを書けない人に適切なログを書くことができるか疑問です。
まず、机上デバッグから。