2014-11-10 2 views
0

Я пытаюсь сортировать элементы в массиве от наименьшего до самого большого, который пользователь вводит вместе с размером. Это мой код до сих пор:Сортировка массива в C

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define MAXVALUES 20 

void sort(int *A[], int n) { 
    int i, tmp, j; 
    for (i = 0; i <= (n - 2); i++) { 
     for (j = (i + 1); j <= (n - 1); j++) { 
      if (*A[i] > *A[j]) { 
       tmp = *A[i]; 
       *A[i] = *A[j]; 
       *A[j] = tmp; 
      } 
     } 
    } 
    return; 
} 

int main(int argc, char *argv[]) { 
    int n, A[MAXVALUES], i; 
    printf("Enter an array and no. of elements in array: "); 
    scanf("%d%d", &A[MAXVALUES], &n); 
    sort(A[MAXVALUES], n); 
    printf("Ordered array is: \n"); 
    for (i = 0; i <= (n - 1); i++) { 
     printf(" %d", A[i]); 
    } 
    return 0; 
} 

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

+2

'зсапЕ ("% d% D", & A [MAXVALUES] ...' я не думаю, что вы действительно хотите иметь в виду, это –

+0

ваш 'scanf' выглядит. подозрительный –

ответ

1

scanf("%d%d", &A[MAXVALUES], &n); проблема

Это не так, как вы читаете массив. Сначала вы читали n, после того, что внутри цикла вы читаете каждый элемент, как scanf("%d", &A[i]);, где я есть индекс от 0 к n

EDIT:

scanf("%d", &n); 

int i = 0; 

for(i = 0; i < n; i++) 
{ 
    scanf("%d", &A[i]); 
} 

Это то, что вы хотите.

1

Вы не можете использовать scanf() для чтения всего массива сразу.

Это:

scanf("%d%d", &A[MAXVALUES], &n); 

Смысла нет; он передает scanf() адрес элемента после последнего в A, вызывая неопределенное поведение. Звонок sort() в равной степени сломан.

Для чтения в нескольких номерах используйте цикл. Кроме того, конечно, вы должны прочитать нужную длину сначала, прежде чем читать в самих номерах.

0

Во-первых, я расскажу вам несколько вещей о вашей функции сортировки. То, что вы хотите, принимает массив (который в C представляется с помощью указателя на тип элементов, которые находятся в этом массиве, в вашем случае int) и размер массива (int) (необязательно вы можете использовать метод сортировки как аргумент, но для простоты рассмотрим, как вы хотите сортировать вещи от самого низкого до самого высокого). То, что делает ваша функция, - это указатель на массив целых чисел и целое число (второй аргумент очень правильный, или, другими словами, это то, что мы хотели), но первое немного сложнее. Хотя функция сортировки может быть написана для правильной работы с этим списком аргументов, она неудобна и не нужна. Вы должны пройти либо int A [], либо int * A. Таким образом, ваш заголовок функции будет:

void sort1(int *A, int n); 
void sort2(int A[], int n); 

Если вы сделаете это, однако, вы должны отказаться от некоторых разыменования в теле функции. В частности, я имею в виду
if (*A[i] > *A[j]) { tmp = *A[i]; *A[i] = *A[j]; *A[j] = tmp; }, который должен стать
if (A[i] > A[j]) { tmp = A[i]; A[i] = A[j]; A[j] = tmp; }

Вы должны проверить операторы [] и * (разыменования) старшинство http://en.cppreference.com/w/c/language/operator_precedence
Теперь, чтобы адаптироваться к этим изменениям (и далее правильно некоторый код) ваш главный будет выглядеть так:

int main(int argc, char *argv[]) 
{ 
int A[MAXVALUES], n; 
do{ 
printf("n="); scanf("%d", &n); 
}while(n < 0 || n > 20); 
int i; 
for(i = 0; i < n; ++i) 
scanf("%d", &A[i]); //this will read your array from standard input 
sort(A, n); //proper sort call 
for(i = 0; i < n; ++i) 
printf(" %d", A[i]); 
printf("\n"); //add a newline to the output 
return 0; 
} 
Смежные вопросы