質問 |
||
| QNo.3988084 | C言語 逆順の配列の仕方を教えてください | |
|---|---|---|
| 質問者:becks09 |
今、大学で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 ) { /* ここに処理を書く */ } -----ソースここまで----- |
|
困り度:
|
||
| 質問投稿日時: 08/04/30 19:58 |
||
回答 |
|
| ANo.5 | ★身の回りのものに置き換えて考えると・・。 ・2個のコップがあって、 1つにビール、 もう1つに日本酒 が入っている。 これらを入れ替えたいとき、 もうひとつ、空の一時待避用の『容器1つ』が必要ですよね。 その容器に一旦、ビールを入れて、 空いたコップに、日本酒を入れる。 空いたコップに、待避したビールを入れる。 ----------------------------------------------------- ★これをコードにして「所定位置」に入れる。 ヒント:データ数の奇数偶数は考えなくても・・。 「コロンブスの卵」かもしれないけど、すごく簡単。 >for文でプログラムを書くのと、・・ → 先生は、次に「ソート」(参考URL等)を・・。 --------------------------------------------------------- ちなみに、「課題」を無視すれば、 reverse_num() 関数は不要で、print_num() 関数だけで、 (正逆のスイッチを引数で渡す)実現できます。 ↑これじゃあ、「学習」にならん。 |
|---|---|
| 回答者:yama5140 | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/01 09:36 |
|
| |
| 参考URL: | http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algori... |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答20pt |
|
| ANo.4 | >元ソースの下部にある「 /* ここに処理を書く */」のとこだけしか記述できません。 まさにその位置へ、皆さんのヒントを実装するんです。 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 が、ラストの次の要素を指すことになります。 これでもう分かりますね。仕上げはご自分で頑張って下さい。 |
|---|---|
| 回答者:ddnp009 | |
| 種類:アドバイス どんな人:専門家 自信:自信あり |
|
| 回答日時: 08/04/30 21:08 |
|
| |
| この回答へのお礼 | ありがとうございます。 とにかく、みなさまのアドバイスをもとに やってみます。 ありがとうございました。 |
回答 |
|
| 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--; } |
|---|---|
| 回答者:episteme | |
| 種類:回答 どんな人:専門家 自信:自信あり |
|
| 回答日時: 08/04/30 20:09 |
|
| |
| この回答への補足 | >入れ替えるコードは書けますか? 申し訳ありません。書けないです。 さらに条件というのがありまして、 for文でプログラムを書くのと、元ソースの下部にある「 /* ここに処理を書く */」のとこだけしか記述できません。 元ソースをいじってはいけないというのが条件です。 すいません、表記してなかったですね。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.2 | print_numだったら、 0,1,--,9 のところを 9,8,--0 ですね。 for( i=0; i<len; i++ ) を for( i=len-1; i>=0; i-- ) に変更 |
|---|---|
| 回答者:noname#58357 | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/04/30 20:07 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.1 | > 逆順になるにはどのようなプログラム ヒントを差し上げます。 先頭の要素と最後の要素を入れ替えます。 先頭の次の要素と最後の前の要素を入れ替えます。 ... 以下同様に、要素数の半分の回数だけ繰り返します。 本当にこれでよいかどうか、まずは手でやってみてください。 正しいことが確認できたら、C言語のコードで表現してみてください。 |
|---|---|
| 回答者:asuncion | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/04/30 20:05 |
|
| |
| この回答への補足 | ヒントいただき誠にありがたいのですが、元ソースを触ってはいけないというのを表記するのを忘れていました。 大変申し訳ありません。 ソースの下部の「 /* ここに処理を書く */」のとこにプログラムを書くというのが条件になっています。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |