• ベストアンサー

配列プログラムのバグ

入力した正の整数を読み込み、小さい順に並べ替える配列のプログラムを作りたいのですが、以下のプログラムで結果がくるってしまいます。 色々な数値を入力してみたところ、入力した数字のうち、どれかが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; }

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

  • ベストアンサー
  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

ざっと見、ループ回数が間違っている。 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]); }

Flieger
質問者

お礼

ありがとうございます、ちゃんと動きました。

その他の回答 (1)

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.2

>入力した数字のうち、どれかが 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 とする(ただし「小さい順」のみ有効)。

関連するQ&A

専門家に質問してみよう