電子書籍の厳選無料作品が豊富!

今、大学で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 )
{
/* ここに処理を書く */
}

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

A 回答 (5件)

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



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

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 が、ラストの次の要素を指すことになります。

これでもう分かりますね。仕上げはご自分で頑張って下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

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

お礼日時:2008/04/30 21:49

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



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

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

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

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

参考URL:http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/al …
    • good
    • 0

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



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

この回答への補足

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

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

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

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

補足日時:2008/04/30 20:44
    • good
    • 0

print_numだったら、


0,1,--,9
のところを
9,8,--0
ですね。

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

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

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



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

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

この回答への補足

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

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

補足日時:2008/04/30 20:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!