2016-12-04 99 views
1

我編寫了一個廣義的C語言程序,它給出一系列數字,按升序排序偶數,按降序排列奇數,並將所有偶數置於數組的起始部分,然後奇數數字。我的排序功能給出了意想不到的輸出

Example: 2, 5, 1, 0, 4, 7, 9, 3, -2, 10, 20, 15 
Expect: -2, 0, 2, 4, 10, 20, 15, 9, 7, 5, 3, 1 

需要6個功能。解決方案必須僅使用提到的函數提供。不應聲明全局變量。使用適當的數據類型,返回類型和函數參數。

  1. Input() - 取元素和值作爲來自用戶的輸入的總數。將值存儲在「輸入」數組中。
  2. SortEven() - 按升序排序的偶數並將其存儲在一個名爲「甚至」
  3. SortOdd()陣列 - 地方 - 在一個名爲「奇」
  4. Merge()數組降序排列,並將它們存儲排序奇數數組的起始部分中的所有偶數都命名爲「結果」,然後是奇數。
  5. Display() - 顯示「結果」數組的內容。
  6. main() - 調用Input()模塊開始執行。

計劃:

#include <stdio.h> 

int main() { 
    input(); 
} 
int input() { 
    int n; 
    printf("Enter The Number Of Elements You Want To Enter : "); 
    scanf("%d", &n); 
    int a[n], i, ev = 0, od = 0; 
    for (i = 0; i < n; i++) { 
     printf("Enter Number : "); 
     scanf("%d", &a[i]); 
     if (a[i] % 2 == 0) { 
      ev++; 
     } else { 
      od++; 
     } 
    } 
    sorteven(a, ev, od, n); 
} 
int sorteven(int a[], int ev, int od, int n) { 
    int i, j = 0, swap, even[ev]; 
    for (i = 0; i < n; i++) { 
     if (a[i] % 2 == 0) { 
      even[j] = a[i]; 
      j++; 
     } 
    } 
    for (i = 0; i < ev - 1; i++) { 
     for (j = 0; j < ev - i - 1; j++) { 
      if (even[j] > even[j + 1]) { 
       swap = even[j]; 
       even[j] = even[j + 1]; 
       even[j + 1] = swap; 
      } 
     } 
    } 
    sortodd(a, ev, od, n, even); 
} 
int sortodd(int a[], int ev, int od, int n, int even[]) { 
    int i, k = 0, swap, odd[od], j; 
    for (i = 0; i < n; i++) { 
     if (a[i] % 2 != 0) { 
      odd[k] = a[i]; 
      k++; 
     } 
    } 
    for (i = 0; i < od - 1; i++) { 
     for (j = 0; j < od - i - 1; j++) { 
      if (odd[j] < odd[j + 1]) { 
       swap = odd[j]; 
       odd[j] = odd[j + 1]; 
       odd[j + 1] = swap; 
      } 
     } 
    } 
    merge(a, ev, od, n, even, odd); 
} 
int merge(int a[], int ev, int od, int n, int even[], int odd[]) { 
    int merge[n], i; 
    for (i = 0; i < ev; i++) { 
     merge[i] = even[i]; 
    } 
    for (i = ev; i < n; i++) { 
     merge[i] = odd[i]; 
    } 
    display(merge, n); 
} 
int display(int merge[], int n) { 
    int i; 
    printf("OUTPUT : "); 
    for (i = 0; i < n; i++) { 
     printf(" %d ", merge[i]); 
    } 
} 
+0

歡迎SO,你寫什麼預期結果,但你是怎麼獲得?你用調試器檢查了中間結果嗎? –

+0

當我輸入1,2,3,4,5時,我得到的輸出是2,4,1,0,49 –

+0

有一件事可能會有所幫助:在'main()'函數之前爲函數聲明原型。例如,'int input(void);'和'int sorteven(int a [],int evenCount,int oddCount,int totalCount);'。否則,你的數組將作爲int來傳遞,如果sizeof(int)!= sizeof(int *)',代碼將無法正常工作。 –

回答

2

當在源代碼中尋找,問題位於merge()功能。 sorteven()sortodd()都很好地實現,但是當合並兩個子陣列時,for(i=ev;i<n;i++)是不正確的。

要在even[]陣列的末尾添加odd[]陣列,寫:

int j; 
// point to the first item of odd[] 
for(i=ev,j=0;i<n;i++,j++) 
{ 
    merge[i]=odd[j]; 
} 

代替:

odd[0]odd[od-1]分配和定義。

for(i=ev;i<n;i++) 
{ 
    merge[i]=odd[i]; 
} 

產出:

{ 2, 5, 1, 0, 4, 7, 9, 3, -2, 10, 20, 15 }; 

是:

OUTPUT : -2 0 2 4 10 20 15 9 7 5 3 1 
+0

哦,我明白謝謝你! :) –

+0

@SyedHussain,很樂意幫助你...現在,如果答案符合,不要忘記接受或投票! –

相關問題