今、大学で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
質問者が選んだベストアンサー
>元ソースの下部にある「 /* ここに処理を書く */」のとこだけしか記述できません。
まさにその位置へ、皆さんのヒントを実装するんです。
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
このQ&Aは役に立ちましたか?
1人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(4件中 1~4件目)
★身の回りのものに置き換えて考えると・・。
・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
配列 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
> 逆順になるにはどのようなプログラム
ヒントを差し上げます。
先頭の要素と最後の要素を入れ替えます。
先頭の次の要素と最後の前の要素を入れ替えます。
...
以下同様に、要素数の半分の回数だけ繰り返します。
本当にこれでよいかどうか、まずは手でやってみてください。
正しいことが確認できたら、C言語のコードで表現してみてください。
投稿日時 - 2008-04-30 20:05:33
ヒントいただき誠にありがたいのですが、元ソースを触ってはいけないというのを表記するのを忘れていました。
大変申し訳ありません。
ソースの下部の「 /* ここに処理を書く */」のとこにプログラムを書くというのが条件になっています。
投稿日時 - 2008-04-30 20:31:44
あなたにおすすめの質問
- c言語の文字列の逆順のプログラムがわ... c言語の文字列の逆順のプログラムがわかりません
- mysql_field_lenの返り... mysql_field_lenの返り値がvarcharで3倍になる
- -----Original Mess... -----Original Message-----
- Num Lock Num Lock
- Num lock Num lock
- \"%s\"の使いかたについて \"%s\"の使いかたについて
- 文字数の逆順 文字数の逆順
- mysql_num_rows()のエ... mysql_num_rows()のエラーについて
- POP befor SMTPの設定方... POP befor SMTPの設定方法。
- BrowseForFolderで逆順... BrowseForFolderで逆順表示



