- ベストアンサー
配列プログラムのバグ
入力した正の整数を読み込み、小さい順に並べ替える配列のプログラムを作りたいのですが、以下のプログラムで結果がくるってしまいます。 色々な数値を入力してみたところ、入力した数字のうち、どれかが0に なってしまうようなのですが、いまいち理解できません。 どこを修正すればいいのでしょうか? #include<stdio.h> int main(void){ int a[255],b,i=0,j,k; while(i<255){ printf("正整数:\n"); scanf("%d",&a[i]); if(a[i]==0) break; else if(a[i]<0){ printf("正の整数ではありません"); return 0; } i++; } for(k=0;k<=i;k++){ for(j=0;j<=i;j++){ if(a[j]>a[j+1]){ b=a[j]; a[j]=a[j+1]; a[j+1]=b; } } } printf("入力された整数は小さい順に"); for(j=0;j<=i;j++){ printf("%d,",a[j]); } printf("です。"); return 0; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ざっと見、ループ回数が間違っている。 for(k=0;k<i-1;k++){ for(j=k+1;j<i;j++){ if(a[k]>a[j]){ b=a[j]; a[j]=a[k]; a[k]=b; } } } for(j=0;j<i;j++){ printf("%d,",a[j]); }
その他の回答 (1)
- yama5140
- ベストアンサー率54% (136/250)
>入力した数字のうち、どれかが 0 になってしまうようなのですが、いまいち理解できません。 3個の数( 8, 1, 4 )と、ストッパー?の 0 を入力した場合、 i a[] 0 8 1 1 2 4 3 0 while( i < 255 ){ printf( "正整数:\n" ); scanf( "%d", &a[i] ); if( a[i] == 0 ) break; このときの、i は 3 if( a[i] < 0 ){ else は不要 printf( "正の整数ではありません" ); return 0; } i++; } for( k = 0; k <= i; k++ ){ i は 3 だから、8, 1, 4, 0 をソート。 ☆「どれかが 0 になってしまう」のではなく、「ストッパーの 0 を加えて」並べ替える、となります。 修正 A案:並べ替え・出力部分の for 文の <= を < とする(「並べ替え部分」は、No.1 さんの方法が効率的)。 B案:出力部分の for 文の j=0 を j=1 とする(ただし「小さい順」のみ有効)。
お礼
ありがとうございます、ちゃんと動きました。