自分のセンスや笑いの好みに影響を受けた作品を教えて

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

A 回答 (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]);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/03 09:08

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報