2015-06-03 4 views
-2

Эта программа вводит вводимые числа от пользователя и сортирует их по возрастанию.Сортировка списка целых чисел в порядке возрастания - C

Когда пользователь нажимает «Enter» без ввода целого числа, программа перестает принимать цифры и сортирует цикл.

Моя программа не перестает принимать цифры, она застревает в бесконечном цикле чисел. Почему это?

#include <stdio.h> 
#include "genlib.h" 

SortIntegerArray() 
{ 
    int i, k, n, Array[200]; 

    for (i = 0; i < 200; ++i) 
    { 
     for (k = i+1; k < 200; ++k) 
     { 
      if (Array[i] > Array[k]) 
      { 
       n = Array[k]; 
       Array[i] = Array[k]; 
       Array[k] = n; 
      } 
     } 
    } 
} 


main() 
{ 

    int i, k, n, Array[200], number; 

    i = 0; 
    n = 0; 

    printf("Enter numbers\n"); 
    number = GetInteger(); 

    for (i = 0; i < 200; ++i) 
    { 
     if (number == "") 
     { 
      break; 
     } 
      scanf("%d", &Array[i]); 
      } 


    printf("The input array is: %d", Array[200]); 

    SortIntegerArray(); 

    printf("The sorted array is: %d", Array[200]); 

} 
+0

Пожалуйста, отредактируйте ваш вопрос, чтобы включить реализацию 'GetInteger()'. Спасибо за улучшение ссылочного значения вопроса и привлечение его к ответственности! –

+0

Вы должны получить сообщение компилятора о строке 'number ==" "'. Это ошибка. Это хорошая идея, чтобы исправить все проблемы, которые вызывают сообщения компилятора (даже если он говорит только «предупреждение»), прежде чем пытаться запустить программу. –

+0

В этой программе также есть несколько других основных ошибок; мы надеемся, что любой учебный ресурс, который вы используете, содержит некоторое описание того, как использовать массивы и как передавать параметры в функции. –

ответ

1

попробовать этот код

char buf[32]; 
fgets(buf, sizeof(buf), stdin); 
if (sscanf(buf, "%d", &Array[i]) != 1) 
    break; 
+1

«fgets» также должен быть проверен на успех (иначе конец ввода приведет к чтению неинициализированного 'buf') –

0

GetInteger возвращает целое число, поэтому if (number == "") никогда не вычисляться верно и цикл никогда не сломается.

scanf возвращает количество прочитанных элементов, которое будет равно нулю, если пользователь ничего не вводит. Поэтому вместо этого вы можете использовать возвращаемое значение для разрыва цикла.

Я не уверен, что делает GetInteger, но это не выглядит так, как будто это действительно необходимо, так как вы заполняете свой массив для сортировки в цикле for с помощью scanf.

for (i = 0; i < 200; ++i) 
{ 
    if (scanf("%d", &Array[i]) < 1) 
    { 
     break; 
    } 

} 
+0

Он хочет, чтобы вход в пустую строку прервал цикл, вместо того, чтобы вводить 200 чисел (или несколько слов). Ввод пустой строки не приведет к тому, что scanf вернет 0. –

+0

да, это не работает, можете ли вы показать альтернативу, если вы можете подумать об одном? – user4967427

+0

«scanf возвращает количество прочитанных элементов, которое будет равно нулю, если пользователь ничего не вводит», неверно. 'scanf ("% d ", ...)' будет возвращать 1, если он будет успешным, 0, если встречается нечисловой ввод без пробела, а 'EOF' - это конец файла, который встречается без номера. Если ничего не введено, 'scanf()' does _not_ return - он ждет и ждет. – chux

0

Прежде чем когда-либо будет сортировать что-нибудь в вашей функции, вы должны передать массив вашей функции. Печать или сортировка Array[200] не имеет смысла. Вы должны перебрать более Array[i] (или некоторый индекс), чтобы фактически получить доступ к отдельным членам. Когда вы передаете Array функции сортировки, вы также должны передать количество элементов в массиве (нет способа определить количество элементов в функции иначе (если вы не используете элемент часового и т. Д.)

Это, как говорится, ваша функция сортировки также неправильная коррекция с помощью простого BubbleSort, приводится следующий пример:.

#include <stdio.h> 
// #include "genlib.h" 

int *SortIntegerArray (int *array, int n) 
{ 
    int i, j; 
    for (i = 0; i < n; i++) { 
     for (j = 0; j < (n-1); j++) { 
      if (array[j] > array[j + 1]) { 
       int temp; 
       temp = array[j + 1]; 
       array[j + 1] = array[j]; 
       array[j] = temp; 
      } 
     } 
    } 
    return array; 
} 


int main (void) 
{ 

    int i, n, number; 
    int Array[200] = {0}; 
    i = n = number = 0; 

    printf ("\nEnter number of elements for array below:\n\n"); 
    printf (" number of elements: "); 
    scanf (" %d", &n); 

    printf ("\nEnter the array values:\n\n"); 
    for (i = 0; i < n; i++) 
    { 
     printf (" input: "); 
     scanf (" %d", &Array[i]); 
    } 

    printf ("\nThe array values are:\n\n"); 
    for (i = 0; i < n; i++) 
     printf (" Array[%3d] : %d\n", i, Array[i]); 

    SortIntegerArray (Array, n); 

    printf ("\nThe sorted array values are:\n\n"); 
    for (i = 0; i < n; i++) 
     printf (" Array[%3d] : %d\n", i, Array[i]); 

    printf ("\n"); 

    return 0; 
} 

Input/Output

$ ./bin/sort_loop 

Enter number of elements for array below: 

    number of elements: 6 

Enter the array values: 

    input: 9 
    input: 2 
    input: 5 
    input: 3 
    input: 8 
    input: 4 

The array values are: 

    Array[ 0] : 9 
    Array[ 1] : 2 
    Array[ 2] : 5 
    Array[ 3] : 3 
    Array[ 4] : 8 
    Array[ 5] : 4 

The sorted array values are: 

    Array[ 0] : 2 
    Array[ 1] : 3 
    Array[ 2] : 4 
    Array[ 3] : 5 
    Array[ 4] : 8 
    Array[ 5] : 9 

Если вы ВГА e любые вопросы, дайте мне знать.

+0

это очень полезно спасибо! Один вопрос, однако, есть способ сортировать это, не спрашивая количество элементов? Я не должен спрашивать, сколько элементов им нужно, просто должен ждать, пока они будут продолжать вводить цифры, пока они не нажмут «Enter» – user4967427

+0

Существует несколько трюков, но нет прямого способа передать «массив» функции, а затем определить количество элементов. Зачем? ** Распаковка указателя. ** Когда массив передается в качестве аргумента, он будет ** распадаться ** на указатель. (Например, 'int array []' распадается на 'int * array') Кроме того, что же касается случая, когда в массив добавлено менее 200 значений? Единственный прямой способ передать эту информацию - передать заполненный номер. Один трюк, который позволит вам передать только массив, заключается в том, чтобы использовать какой-либо тип контрольной суммы, чтобы пометить конец данных (например, '-999999' или' NULL' для указателя на указатель на массив) –

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