• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語のソートの問題なんですが)

C言語のソートで値を入力し昇順に表示するプログラムの問題

このQ&Aのポイント
  • C言語のソートの問題なんです。値を入力する度に昇順に表示するプログラムを作ろうと思っているのですが、特定の部分でうまく動作しません。
  • プログラム中の繰り返しの部分で値が正しく代入されないため、プログラムが正しく動作しません。
  • どのように修正すれば良いか分からないので、助けを求めています。プログラムの修正に詳しい方、教えてください。

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

  • ベストアンサー
回答No.1

#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; }

noname#107977
質問者

お礼

やはりjの部分がおかしかったですね この回答のおかげでどこが間違っているかが分かりました 他の方も回答していただきありがとうございました

その他の回答 (5)

  • tig33
  • ベストアンサー率50% (6/12)
回答No.6

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)
回答No.5

> 値を入力する→値を入力する度に昇順に表示する > これを不の値を入力するまで続けるという > プログラムを作ろうと思っているのですが この命題からすると、負の値を入力するまでは永遠に続くので、 とりあえず、最大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); }

回答No.4

  i -= (i == 100);  これはいらない。  

回答No.3

#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; }

回答No.2

ぱっと見た限りですが、この構文では、jを使ったfor文を抜ける条件が設定されていないため、延々とif⇒swapの処理が続いています。 for(j=i+1;;++j)以下3行を正確に直したほうがいいと思います。 あと、scanfでの取得には、配列とは別の変数を用いないと分かりづらく、汎用性の低いソースになってしまうと思います。 私なら取得用にbという変数を使い、 for(j=0;j<=i;j++) if(a[j]<=b)... といった構文を作ります。

関連するQ&A