C言語 逆順の配列の仕方を教えてください

今、大学でC言語の課題をやっています。サンプルが与えられています。
その課題は、配列の逆順です。

for文を使って、実行結果は以下のようにならなければならなく、「並び替えの結果は再び num1, num2 に保存される」という条件なのですが、逆順になるにはどのようなプログラムを組めば良いのでしょうか?
ソースの「 /* ここに処理を書く */」にプログラムを書かなければいけないのですが、まったくの初心者でわかりません。誠にお手数ですが、教えていただければ幸いです。宜しくお願いいたします。

-----実行結果-----

C:\c_lang>reverse
--- before ---
2 4 9 10 5 3 1 7 8 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
--- after ---
6 8 7 1 3 5 10 9 4 2
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1


-----以下ソース-----
#include <stdio.h>

void print_num( int *num, int len );
void reverse_num( int *num, int len );

int main( void )
{
int num1[10]={2,4,9,10,5,3,1,7,8,6};
int num2[15]={1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15};

printf("--- before ---\n");
print_num( num1, 10 );
print_num( num2, 15 );

/* 逆順に並べ替え */
reverse_num( num1, 10 );
reverse_num( num2, 15 );

printf("--- after ---\n");
print_num( num1, 10 );
print_num( num2, 15 );

return 0;
}

void print_num( int *num, int len )
{
int i;
for( i=0; i<len; i++ ){
printf( "%d ", num[i] );
}
printf("\n");
}

void reverse_num( int *num, int len )
{
/* ここに処理を書く */
}

-----ソースここまで-----

投稿日時 - 2008-04-30 19:58:30

QNo.3988084

すぐに回答ほしいです

質問者が選んだベストアンサー

>元ソースの下部にある「 /* ここに処理を書く */」のとこだけしか記述できません。

まさにその位置へ、皆さんのヒントを実装するんです。

void reverse_num( int *num, int len )
{
}
↑大前提。これが「関数」というものですが分かりますか?

これの呼び出し元を参照すると
>reverse_num( num1, 10 );
となっています。

num1とはなんぞや、というと
>int num1[10]={2,4,9,10,5,3,1,7,8,6};

以上からreverse_num()に渡す第1引数(型: int*)には&num1[0]、
次の引数lenには要素数が渡されることになりますね。

reverse_num関数に入った直後は、
num + len が、ラストの次の要素を指すことになります。

これでもう分かりますね。仕上げはご自分で頑張って下さい。

投稿日時 - 2008-04-30 21:08:22

お礼

ありがとうございます。

とにかく、みなさまのアドバイスをもとに
やってみます。

ありがとうございました。

投稿日時 - 2008-04-30 21:49:54

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(4件中 1~4件目)

ANo.5

★身の回りのものに置き換えて考えると・・。

 ・2個のコップがあって、
   1つにビール、
   もう1つに日本酒 が入っている。
   
   これらを入れ替えたいとき、
   
 もうひとつ、空の一時待避用の『容器1つ』が必要ですよね。
 
   その容器に一旦、ビールを入れて、
   空いたコップに、日本酒を入れる。
   空いたコップに、待避したビールを入れる。
-----------------------------------------------------
★これをコードにして「所定位置」に入れる。
 
 ヒント:データ数の奇数偶数は考えなくても・・。
 
 「コロンブスの卵」かもしれないけど、すごく簡単。

>for文でプログラムを書くのと、・・

  → 先生は、次に「ソート」(参考URL等)を・・。
---------------------------------------------------------
ちなみに、「課題」を無視すれば、

 reverse_num() 関数は不要で、print_num() 関数だけで、
 (正逆のスイッチを引数で渡す)実現できます。
 
↑これじゃあ、「学習」にならん。

参考URL:http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/

投稿日時 - 2008-05-01 09:36:49

ANo.3

配列 int num[N] と int i, j があるとき、 num[i] と num[j] の内容を入れ替えるコードは書けますか?

これができれば簡単:
int i = 0;
int j = 配列の最大添え字;
while ( i < j ) {
  num[i] と num[j] を交換する。
  i++;
  j--;
}

投稿日時 - 2008-04-30 20:09:14

補足

>入れ替えるコードは書けますか?

申し訳ありません。書けないです。

さらに条件というのがありまして、
for文でプログラムを書くのと、元ソースの下部にある「 /* ここに処理を書く */」のとこだけしか記述できません。
元ソースをいじってはいけないというのが条件です。

すいません、表記してなかったですね。

投稿日時 - 2008-04-30 20:44:44

ANo.2

print_numだったら、
0,1,--,9
のところを
9,8,--0
ですね。

for( i=0; i<len; i++ )

for( i=len-1; i>=0; i-- )
に変更

投稿日時 - 2008-04-30 20:07:33

ANo.1

> 逆順になるにはどのようなプログラム

ヒントを差し上げます。
先頭の要素と最後の要素を入れ替えます。
先頭の次の要素と最後の前の要素を入れ替えます。
...
以下同様に、要素数の半分の回数だけ繰り返します。

本当にこれでよいかどうか、まずは手でやってみてください。
正しいことが確認できたら、C言語のコードで表現してみてください。

投稿日時 - 2008-04-30 20:05:33

補足

ヒントいただき誠にありがたいのですが、元ソースを触ってはいけないというのを表記するのを忘れていました。
大変申し訳ありません。

ソースの下部の「 /* ここに処理を書く */」のとこにプログラムを書くというのが条件になっています。

投稿日時 - 2008-04-30 20:31:44

あなたにおすすめの質問

[PR] お役立ち情報