2016-07-16 3 views
-2
#include<stdio.h> 
void swa(int *, int *); 
int main() 
{ 
    int i,j,arr[10]; 
    arr[10]= (10,20,30,40,50); 
    printf("ascending order"); 
    for(i=0;i<5;i++) 
    { 
     for(j=i+1;j<5;j++) 
     { 
      if (arr[i]<arr[j]); 
      swa(&arr[i],&arr[j]); 
     } 
    } 
     for(i=0;i<5;i++) 
     { 
      printf("%d",arr[i]); 
     } 
     return 0; 
} 
void swa(int *x,int *y) 
{ 
    int t; 
    t=*x; 
    *x=*y; 
    *y=t; 
} 

このコードは、出力にガベージ値を与えています。スワッピングにswaという関数を使用してこのプログラムを変更するにはどうすればよいですか?配列を昇順に並べ替える私のプログラムはなぜガベージ値を生成するのですか?

+0

で次のように見ることができます'swa'の代わりに。 – Pang

+1

ソートを開始する前にガベージ値がないかどうかチェックしましたか?'arr [10]'は有効なインデックスではなく、思っているように配列全体を表現するものでもありません。 '(10,20,30,40,50)'は '50'に相当することにも注意してください。それは配列を初期化する方法ではありません。 @dasblinkenlightによる回答を参照してください。 –

+1

言い換えれば、何かがコンパイルされても、それが実際に行うべきことを意味するわけではありません。 –

答えて

0

それはブレースリストを使用して宣言されたときに、配列を初期化することができます。

このように配列

int i,j,arr[10]; 
arr[10]= (10,20,30,40,50); 

を初期化するには、この試みは無効です。右辺第2のステートメントに実際に存在ステートメント

if (arr[i]<arr[j]); 
        ^^ 

が空がある場合、この50

に割り当てられているコンマ演算子とインデックス10の配列の存在しない素子を用いていますセミコロンが間違って配置されているためにサブステートメント削除する必要があります。

また、ifステートメントの条件では、昇順ではなく降順で並べ替えることを指示しています。

また、あなたのプログラムでは、例えば数字5のようなマジックナンバーを使用するのは面倒なプログラミングスタイルです。

プログラムは

#include <stdio.h> 

void swap(int *x, int *y) 
{ 
    int tmp = *x; 
    *x = *y; 
    *y = tmp; 
} 

#define N 10 

int main(void) 
{ 

    int arr[N] = { 10, 20, 30, 40, 50 }; 
    size_t i, j; 

    size_t n = 0; 
    while (n < N && arr[n] != 0) ++n; 

    printf("descending order:"); 

    for (i = 0; i < n; i++) 
    { 
     for (j = i + 1; j < n; j++) 
     { 
      if (arr[i] < arr[j]) swap(&arr[i], &arr[j]); 
     } 
    } 

    for (i = 0; i < n; i++) printf(" %d", arr[i]); 
    printf("\n"); 

    return 0; 
} 

その出力は、関数がスワップのためであるならば、あなたは本当に `swap`または` swapInts`または `swapIntegers`という名前を付けなければならない

descending order: 50 40 30 20 10 
3

あなたのコードはかなり近いですが、次の3つのミスを犯しました:あなたはあなたのif後にセミコロンを入れ

    • あなたはコンマ式を使って配列を初期化、および
    • あなたはスワップされています間違った方向に並べ替えられます(配列は降順でソートされます)。つまり、

    間違いが解決策を生み出すでしょう。間違った場所でのアレイの

    int i,j,arr[10] = {10,30,50,40,20}; 
    

    Demo.

  • 0
    1. のinit:初期化は宣言の一部として起こる、と中括弧を使用する必要があります。
    2. ソートが正しくありません
    3. セミコロン後のifスワップを防ぐステートメント。

    に変更し、それを:

    int i,j,arr[10]= {10,20,30,40,50}; 
    
         printf("ascending order"); 
    
         for(i=0;i<5;i++) 
         { 
          for(j=i;j<(5-i-1);j++) 
          { 
           if (arr[j]>arr[j+1]) 
           swa(&arr[j],&arr[j+1]); 
          } 
         } 
         for(i=0;i<5;i++) 
         { 
          printf("%d ",arr[i]); 
         } 
    
    関連する問題