//Program To Input Values Into An Array And Sort Them In Ascending Order
#include<stdio.h>
//Function To Print The Array Values
void print(int tab[],int n)
{
int i;
printf("The Values Are : n");
for(i=0;i<n;i++)
{
printf("%d ",tab[i]);
}
printf("n");//Line Jumping For Better Output
}
//Function To Swap The Values In The Array
void swap(int* x,int* y)
{
int temp=*x;
*x=*y;
*y=temp;
}
//Function To Sort The Values In The Array By Using Previous Function
void sort(int tab[],int n)
{
int i,j;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(tab[i]>tab[j])
{
swap(&tab[i],&tab[j]);//Swaps The Value Of Index i With The Value Of Index j In The Array
}
}
}
}
//Main Code
int main()
{
int i,n,tab[100];
printf("Give The Number Of Elements In The Array:");
scanf("%d",&n);
while(n<=0)
{
printf("The Number Of Elements MUST Be Superior To 0!n");
printf("Give The Number Of Elements In The Array:");
scanf("%d",&n);
}
printf("Insert %d Values :n",n);
for(i=0;i<n;i++)
{
scanf("%d",&tab[i]);
}
print(tab,n);//Prints The Values In The Array
sort(tab,n);//Sorts The Values In The Array
printf("SORTING....n");
print(tab,n);//Prints The Values In The Array
return 0;
}
2 ответа
Общие наблюдения
Хорошая работа по созданию функций и наименованию функций. Имена переменных, вероятно, можно было бы улучшить, например n
можно переименовать в item_count
или же array_element_count
.
Отступ несоответствующий. Это могло привести к проблемам во время обслуживания кода.
Отсутствующая функция
Как указано выше, вы проделали довольно хорошую работу по созданию функций, но пропустили одну, вход массива также должен быть функцией.
Логический порядок печати
Положить printf("SORTING...n");
перед звонком в sort()
функция.
Комментарии
Поскольку вы хорошо поработали над именованием функций, большинство ваших комментариев не нужны. Например //Swaps The Value Of Index i With The Value Of Index j In The Array
действительно ничего не добавляет.
Аргументы в пользу функции обмена
Вместо того, чтобы передавать 2 указателя на значения и менять местами значения, я мог бы передать массив и 2 индекса и использовать нотацию массива в функции подкачки для перемещения значений.
Отсутствует проверка ошибок
Код для ввода массива правильно проверяет, что значение размера массива больше 0, но не проверяет, что размер массива меньше максимального размера.
То, что вы реализовали, называется Пузырьковая сортировка; стоит упомянуть, что в комментарии sort()
в помощь читателям.
int main()
Неплохо, но мы можем быть более конкретными, показав, что main()
не принимает аргументов:
int main(void)
У нас тут проблема:
int n; scanf("%d",&n); while(n<=0)
Если scanf()
не может преобразовать ввод как десятичное (например, если пользователь пишет four
в качестве ввода), затем n
будет неинициализированный. Это плохо, так как это означает, что ваша программа имеет Undefined Behavior, что, в свою очередь, означает, что она может вообще ничего.
Однако мы можем это обнаружить. scanf()
возвращает количество успешно выполненных преобразований, поэтому нам просто нужно использовать это возвращаемое значение, чтобы определить, n
содержит допустимое значение:
if (scanf("%d", &n) != 1) {
fputs("Not a valid number!n", stderr);
return 1;
}
Мы могли бы не беспокоиться о негативном n
используя беззнаковый тип (unsigned int
, наверное).
Это дизайнерское решение, но я думаю, вы должны разрешить использовать массив нулевой длины (пустой) в качестве входных данных. Сортировать действительно легко! И с беззнаковым n
, означает, что все значения действительны.
Очевидно другой scanf()
также нуждается в проверке возвращаемого значения.
Я думал, что пузырьковая сортировка меняет местами только соседние ячейки. Эта сортировка не меняет местами j на j + 1, она меняет местами i на j.
— pacmaninbw
@pacmaninbw, вы, наверное, правы, и это только подтверждает важность эффективного общения с читателем! Я думаю это на самом деле Сортировка вставкой, но мы видим, как легко неправильно прочитать код.
— Тоби Спейт
я бы предпочел
void swap(int* x, int* y)
или более общийvoid swap(void* x, void* y, size_t n)
. В качествеvoid swap(int* a, int x, int y)
слишком конкретен и не совсем полезен. (Я предпочитаю.)— тш