• ベストアンサー

正の正数値を読み込み、0が入力されたらそれらの整数を小さい順に表示するプログラム

ヒントは「まず数字を読み込んだらすでに記憶している最後の要素から先頭に向かって大小の比較を行なう。 読み込んだ数字の方が小さかったら既に記憶されている配列の要素を一つ後ろにずらし(ここがよくわかりません)配列の一つ前の要素と比較を行なう。(何と比較するのかわかりません) 読み込んだ数字の方が大きかったら、終了処理をし、次の数字を読み込む。」 です。 何から手をつけていいのかわからないんで、他のヒントとか頂けたらうれしいです。 よろしくおねがいします。

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

  • ベストアンサー
noname#30727
noname#30727
回答No.2

配列がint a[100] だとします。 a[0] = 1 a[1] = 3 a[2] = 5 今、上のように値が入っていて、2が入力されたとしたら a[0] = 1 a[1] = 2 a[2] = 3 a[3] = 5 結果的に、値の3と5を移動させて空いた場所に2を入れる事になりますよね? この移動させる事をヒントでは「ずらす」と呼んでいます。 値の1はずらしていませんが、これは入力された2と比較してより小さかったから、それ以上ずらす必要がなかったのです。 最初のヒントは、ずらすときは配列の最後の要素からずらしていかないとうまくいかないよと教えてくれています。

newcolleger
質問者

お礼

0を入力して終了させる方法わかりました。 ありがとうございました。

その他の回答 (3)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.4

「小さい順」を省略して「正の正数値を読み込み、0が入力されたらそれらの整数を*入力された*順に表示するプログラム」なら作成できるのでしょうか。 ひとまず並べ替えは省略して、入力・蓄積・出力だけのプログラムを作成して、ここで添削してもらってはいかがでしょう。 このレベルから作成できないようであれば、ヒントどころか答えを要求しているも同然ですよ。

newcolleger
質問者

お礼

#include<stdio.h> int main(void); int main(void) { int a[10]; int i,j,k; for(i=0;i<10;i++) for(j=0;j<10;j++) a[i]=0; for(i=0;i<10;i++){ printf("正整数を入力してください。\n"); scanf("%d",&a[i]); } for(i=0;i<10;i++){ for(j=i+1;j<10;j++){ if(a[i]>a[j]){ k=a[i]; a[i]=a[j]; a[j]=k; } } } printf("入力された整数は小さい順に"); for(i=0;i<10;i++){ printf("%d ",a[i]); } printf("\n"); return(0); } 回答してくださった方々どうもありがとうございます。 0が入力されたら終了するプログラムをどこに挿入すればいいのかわかりません。 よろしくおねがいします。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.3

ヒントは「挿入ソート」ですね。

newcolleger
質問者

お礼

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

  • onakyuu
  • ベストアンサー率45% (36/80)
回答No.1

以下のようなことをするプログラムを書けばよいでしょう。 例として 6,3,2,5,0 という入力なら まず6が入力されて 6 となります。次に3なので 6,3 となりますが、3<6なので3を前にもって行きます 3,6 となります。さらに2が入力されて 3,6,2 ですが、2<6なので 3,2,6 さらに2<3なので 2,3,6 となります。次に5が入力されて 2,3,6,5 ですが、5<6なので 2,3,5,6 となり5>3なのでこのままです。 最後に0が入力されると終了するわけです。

関連するQ&A