ページ 11

並びを逆順にする関数

Posted: 2014年5月22日(木) 23:06
by ねこ
要素数noであるint型の配列vcの並びを逆順にする関数rev_intaryを作りました。
それをmain関数で表示して確かめようとしましたが入力したままの順で表示されてしまいます。
どこが間違いなのでしょうか・・・?
お願いします・・・!


#include <stdio.h>

#define NUM 5

void rev_intary(int vc[],int no)
{
int i;
int temp=0;
for(i=0;i<(no/2);i++)
{
temp=vc;
vc=vc[no-i];
vc=temp;
}
}

int main(void)
{
int i;
int num[NUM];
printf("整数を%dつ入力してください。\n",NUM);
for(i=0;i<NUM;i++)
{
printf("整数%d:",i+1); scanf("%d",&num);
}

rev_intary(num,NUM);
for(i=0;i<NUM;i++) printf("%d\n",num);

return 0;
}

Re: 並びを逆順にする関数

Posted: 2014年5月22日(木) 23:19
by みけCAT
とりあえず、コードを提示するときはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。

Re: 並びを逆順にする関数

Posted: 2014年5月22日(木) 23:22
by みけCAT
配列の要素を交換するところがおかしいようです。
・vc[no-i]の値が更新されていません。vcにも結局元の値を代入しています。
・そもそもno-iというインデックスは間違いです。例えばi=0のとき、vc[no]という確保された範囲の外にアクセスしてしまいます。

Re: 並びを逆順にする関数

Posted: 2014年5月22日(木) 23:31
by ねこ
アドバイスを受け少し直してみました・・・!
まだ表示がおかしいようですが、今度はどこが間違っていますでしょうか・・・><?
さきほどはコードが見にくくなっていてすみませんでした!

コード:

#include <stdio.h>


#define NUM 5

void rev_intary(int vc[],int no)
{
	int i;
	int temp=0;
	for(i=0;i<(NUM/2);i++)
	{
		temp=vc[i];
		vc[i]=vc[NUM-i];
		vc[NUM-i]=temp;
	}
}

int main(void)
{
	int i;
	int num[NUM];
	printf("整数を%dつ入力してください。\n",NUM);
	for(i=0;i<NUM;i++)
	{
		printf("整数%d:",i+1);	scanf("%d",&num[i]);
	}
	
	rev_intary(num,NUM);
	for(i=0;i<NUM;i++) printf("%d\n",num[i]);
	
	return 0;
}

Re: 並びを逆順にする関数

Posted: 2014年5月22日(木) 23:36
by みけCAT
・インデックス指定の間違いが実質修正されていません。
・せっかくrev_intary関数の引数にnoがあるのに、その情報が使用されていません(コンパイラと設定によっては警告の対象のはずです)

Re: 並びを逆順にする関数

Posted: 2014年5月22日(木) 23:48
by box
今回は要素数が
5
なので、
[0]と[4]を入れ替える
[1]と[3]を入れ替える
[2]と[2]を入れ替える
必要があります。

さて、これら3回の入れ替え操作において、
入れ替え対象の要素番号の合計と
もともとの要素数
との間に、どういう関係があるでしょうか。

Re: 並びを逆順にする関数

Posted: 2014年5月22日(木) 23:53
by みけCAT
box さんが書きました:今回は要素数が
5
なので、
[0]と[4]を入れ替える
[1]と[3]を入れ替える
[2]と[2]を入れ替える
必要があります。
[2]と[2]を入れ替える必要はありません。
すなわち、for文のi<(no/2)という条件は間違っていないと思います。

Re: 並びを逆順にする関数

Posted: 2014年5月23日(金) 00:01
by box
みけCAT さんが書きました: [2]と[2]を入れ替える必要はありません。
ご指摘いただかなくても、私はわかっています。

[0]と[4]の入れ替え
[1]と[3]の入れ替え
だけだと、入れ替え対象の要素間の関係性が見えづらいかな?
と思ったので、あえて
[2]と[2]の入れ替え
も書いただけのことです。ムダなことは承知の上です。

Re: 並びを逆順にする関数

Posted: 2014年5月23日(金) 00:06
by ねこ
皆様、ご丁寧にありがとうございます。
今一生懸命調べながら考えています。
noが使われていないのがおかしいのはなるほど!と思いました。
[no-i]というインデックスが間違いとのことですが、どのように使えばよいのかまだわかっていません・・・。
頭が足らなく恥ずかしいのですが、もしよろしければ、もう少し手ほどきをお願いできないでしょうか・・・?
お願いいたします・・・!

Re: 並びを逆順にする関数

Posted: 2014年5月23日(金) 00:10
by みけCAT
指摘されているとおり、
vc[0]とvc[4]
vc[1]とvc[3]
(vc[2]とvc[2])
を入れ替えたいです。
仮にvcとvc[x]を入れ替えるとすると、iとxの関係は

コード:

i x
0 4
1 3
2 2
です。
この時、iからxを求める計算式はどうなるでしょうか?no(=5)を使って表してみてください。
ヒントは、iの一次式になるということです。

Re: 並びを逆順にする関数

Posted: 2014年5月23日(金) 00:19
by ねこ
i=-x+no・・・でしょうか・・・?

Re: 並びを逆順にする関数

Posted: 2014年5月23日(金) 00:25
by みけCAT
ねこ さんが書きました:i=-x+no・・・でしょうか・・・?
違います。それはx=no-iと同じです。実際に代入して検算しましたか?
x = (iの1次式) の形で表してみてください。