2016-11-16 49 views
0

我正在學習如何使用命令行參數來獲取數字,以確定數組中有多少元素。隨機數發生器應該取用戶的號碼併產生許多隨機數,然後用冒泡排序對它們進行排序。 但是數字不能小於2或大於10,000。 我不斷收到分段錯誤(核心轉儲),或者我可以輸入任何數字(包括小於2或大於10,000的數字),它什麼都不做。 我確定它是代碼的第一部分是錯誤的,而不是子程序和定義,但我不知道如何解決它。使數組用戶輸入特定於氣泡排序?

#include <stdio.h> 


int randu(void); 
void bubble(int *, int); 
void swap(int *, int *); 
int main(int argc, char *argv[]) { 

    int num1; 

    if (argc<2) { 
    printf("Number must be between 2 and 10000.\n"); 
    printf("Enter a number to sort.\n"); 
    scanf("%d", &num1); 
    } 
    if (argc>10000) { 
    printf("Number must be between 2 and 10000.\n"); 
    printf("Enter a number to sort.\n"); 
    scanf("%d", &num1); 
    } 
    sscanf(argv[1], "%d", &num1); 


    int main(void) { 
    int x[num1], i; 
    for(i=0;i<num1;i++) 
    x[i]=randu(); 
    printf("Here are %d numbers\n", num1); 
    for (i=0;i<num1;i++) 
    printf("%d\n",x[i]); 
    } 

    } 
    int randu(void) { 
    static int seed=17; 
    seed=(25179*seed+13849)%65536; 
    return seed; 
    } 
    void bubble(int a[], int num1){ 
    int i,j; 
    for (i=0;i<num1-1;i++) 
    for(j=num1-1;i<j;j--) 
    if(a[j-1]>a[j]) 
    swap(&a[j-1],&a[j]); 
    } 
    void swap(int *a, int *b){ 
    int temp; 
    temp=*a; 
    *a=*b; 
    *b=temp; 
    } 
+0

你有一個嵌套的'主()'...哇? –

+0

我懷疑你的代碼可以編譯...你有2個'main'函數嵌套到另一箇中... – LPs

+0

由於縮進很難看到。 – Sean83

回答

1

有許多的問題與您的代碼

1)使用argc是錯誤的。 argc不是參數的值。這是參數的數量(包括程序名稱)。

2)在main內部有嵌套main。不要這樣做。

3)你從不稱呼氣泡排序功能。添加它。

所以,你的程序的輕微重寫:

int randu(void); 
void bubble(int *, int); 
void swap(int *, int *); 

int main(int argc, char *argv[]) { 

    int num1; 

    if ((argc < 2) || 
     (sscanf(argv[1], "%d", &num1) != 1) || 
     (num1 < 2) || 
     (num1 > 10000)) { 
    printf("You must give a number in range 2-10.000 as input\n"); 
    return 0; 
    } 

    int x[num1], i; 
    for(i=0;i<num1;i++) { 
    x[i]=randu(); 
    } 

    printf("Here are %d numbers\n", num1); 
    for (i=0;i<num1;i++) { 
    printf("%d\n",x[i]); 
    } 

    // Call the sort function  
    bubble(x, num1); 

    printf("Here are %d numbers sorted\n", num1); 
    for (i=0;i<num1;i++) { 
    printf("%d\n",x[i]); 
    } 
    return 0; 
} 

int randu(void) { 
    static int seed=17; 
    seed=(25179*seed+13849)%65536; 
    return seed; 
} 

void bubble(int a[], int num1){ 
    int i,j; 
    for (i=0;i<num1-1;i++) 
    for(j=num1-1;i<j;j--) 
     if(a[j-1]>a[j]) 
     swap(&a[j-1],&a[j]); 
} 

void swap(int *a, int *b){ 
    int temp; 
    temp=*a; 
    *a=*b; 
    *b=temp; 
} 

「編程5」 給出了輸出:

Here are 5 numbers 
48676 
38117 
52608 
17049 
29820 
Here are 5 numbers sorted 
17049 
29820 
38117 
48676 
52608 
+0

如果用戶在運行代碼時未輸入數字,則會停止該程序。在用戶給出一個號碼之前,我會如何讓它連續詢問一個號碼?我會將第一個if語句改爲while循環嗎? – JadC

+0

@MasoCB - 不,不要將第一個「if」更改爲「while」。你可以在第一個if中添加一個'else',然後在'else'部分中加一個'while'。在'while'中你可以使用'scanf'並檢查返回值是1。 – 4386427