2016-11-16 3 views
0

Я изучаю, как использовать аргументы командной строки, чтобы получить число, чтобы определить, сколько элементов в массиве для организации. Генератор случайных чисел должен принимать номер пользователя и генерировать много случайных чисел, а затем сортировать их с помощью сортировки пузырьков. Но число не может быть меньше 2 или более 10000. Я продолжаю получать ошибку сегментации (ядро сбрасывается), или я могу ввести любое число (включая число меньше 2 или более 10000), и он ничего не делает. Я уверен, что это первая часть кода, которая неверна, а не подпрограммы и определения, но я не знаю, как ее исправить.Создание пользовательского ввода массивов для сортировки пузырьков?

#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

Я сомневаюсь, что ваш код может скомпилировать ... У вас есть функция «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'. Вы можете добавить 'else' в первый' if', а затем сделать 'while' внутри' else'. В 'while' вы будете использовать' scanf' и установите для возвращаемого значения значение 1. – 4386427

Смежные вопросы