- ベストアンサー
C言語のソートで値を入力し昇順に表示するプログラムの問題
- C言語のソートの問題なんです。値を入力する度に昇順に表示するプログラムを作ろうと思っているのですが、特定の部分でうまく動作しません。
- プログラム中の繰り返しの部分で値が正しく代入されないため、プログラムが正しく動作しません。
- どのように修正すれば良いか分からないので、助けを求めています。プログラムの修正に詳しい方、教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#include<stdio.h> /* その仕様であれば正常に動くかな。多分。*/ void swap(int *a,int *b) { int t; t=*a;*a=*b;*b=t; } int main() { int i,j,k,a[100]; for(i=0;;++i){ scanf("%d",&a[i]); if(a[i] < 0){ break; } for(j=0;j < i ;++j){ if(a[i] < a[j]){ swap(&a[i],&a[j]); } } for(k=0;k <= i;++k){ printf("%d ",a[k]); } printf("\n"); } return 0; }
その他の回答 (5)
- tig33
- ベストアンサー率50% (6/12)
ANo5に間違いがありました。 for(SortCount=0; SortCount < InCount; SortCount++) { は、 for(SortCount=0; SortCount <= InCount; SortCount++) { が正しく、 for(DispCount=0; DispCount < InCount; DispCount) { も、 for(DispCount=0; DispCount <= InCount; DispCount) { が正しい。 住みませんでした。 m(__)m
- tig33
- ベストアンサー率50% (6/12)
> 値を入力する→値を入力する度に昇順に表示する > これを不の値を入力するまで続けるという > プログラムを作ろうと思っているのですが この命題からすると、負の値を入力するまでは永遠に続くので、 とりあえず、最大100回までとし、 #define ARRAYMAX (100) int IntArray[ARRAYMAX]; void Swap(int *a, int *b) { int t; t = *a; *a = *b; *b = t; } int main() { int InVal; //入力した値 int InCount; //入力回数 int SortCount; //ソート回数 int DispCount; //表示回数 for(InCount=0; InCount < ARRAYMAX; InCount++) { //値を入力 scanf("%d", &InVal); //入力した値が負なら終わり(ループを抜ける) if( InVal < 0 ) break; //入力した値をいったん配列に格納 IntArray[InCount] = InVal; //今まで入力した値と比較しながらソート(昇順) for(SortCount=0; SortCount < InCount; SortCount++) { if( InVal < IntArray[SortCount] ) { Swap( InVal, IntArray[SortCount] ); } } //ソートした結果を表示 for(DispCount=0; DispCount < InCount; DispCount) { printf("%3d:%d\n", DispCount+1, IntArray[DIspCount] ); } } //終了 return(0); }
- yaemon_2006
- ベストアンサー率22% (50/220)
i -= (i == 100); これはいらない。
- yaemon_2006
- ベストアンサー率22% (50/220)
#include <stdio.h> int main(void) { int a[100], i, j, k, l; for(i = 0; i < 100; i ++){ scanf("%d%*c", &l); if(l < 0) break; for(j = 0; j < i && l >= a[j]; j ++) ; for(k = i; k > j; k --) a[k] = a[k - 1]; a[j] = l; } i -= (i == 100); for(j = 0; j < i; j ++) printf("%d ", a[j]); return 0; }
- VA_kitsune
- ベストアンサー率37% (3/8)
ぱっと見た限りですが、この構文では、jを使ったfor文を抜ける条件が設定されていないため、延々とif⇒swapの処理が続いています。 for(j=i+1;;++j)以下3行を正確に直したほうがいいと思います。 あと、scanfでの取得には、配列とは別の変数を用いないと分かりづらく、汎用性の低いソースになってしまうと思います。 私なら取得用にbという変数を使い、 for(j=0;j<=i;j++) if(a[j]<=b)... といった構文を作ります。
お礼
やはりjの部分がおかしかったですね この回答のおかげでどこが間違っているかが分かりました 他の方も回答していただきありがとうございました