Создать функцию сортировки массива

Код рабочий. Необходимо его модифицировать, переместив сортировку массива sum в отдельную функцию. Заранее спасибо.

#include <stdio.h>
#include <string.h>
#include <locale.h>

struct student {
    char name[20];
    int roll;
    int math;
    int physics;
    int history;
    int english;
    int programming;
} s[5];

int main() {
    setlocale(LC_ALL, "rus");
    printf("\n Минимальный проходной балл: ");
    int min_mark;
    scanf("%i", &min_mark);
    int sum[5];
    int i;
    for (i = 0; i < 5; ++i) {
        s[i].roll = i + 1;
        printf("\n № %d", s[i].roll);
        printf("Введите имя студента (на англ): ");
        scanf("%s", s[i].name);
        printf("Введите оценку по математике: ");
        scanf("%i", &s[i].math);
        printf("Введите оценку по физике: ");
        scanf("%i", &s[i].physics);
        printf("Введите оценку по истории: ");
        scanf("%i", &s[i].history);
        printf("Введите оценку по английскому: ");
        scanf("%i", &s[i].english);
        printf("Введите оценку по программированию: ");
        scanf("%i", &s[i].programming);
        printf("\n");
        sum[i] = s[i].math + s[i].physics + s[i].history + s[i].english + s[i].programming;
    }
    printf("===========================================================================\n");
    for (i = 0; i < 5; ++i) {
        if (s[i].math >= min_mark && s[i].physics >= min_mark && s[i].history >= min_mark &&
            s[i].english >= min_mark && s[i].programming >= min_mark) {
            printf("№ %d\t", i + 1);
            printf(" Имя:  ");
            puts(s[i].name);
            printf("\t %d", sum[i] / 5);
        } else
            printf("\n");
    }
    for (i = 0; i < 5; ++i) {
        for (int j = i + 1; j < 5; ++j) {
            if (sum[i] < sum[j]) {
                int a = sum[i];
                sum[i] = sum[j];
                sum[j] = a;
            }
        }
    }
    printf("Лучший студент: \n");
    puts(s[0].name);
    printf("Худший студент: \n");
    puts(s[4].name);
    return 0;
}

Ответы (1 шт):

Автор решения: Dafter

Есть несколько вопросов к самому коду:

  1. Почему вы не вынесли размер самого массива, что наплодило кучу магических чисел.
  2. Какой смысл вообще в этой сортировке, если в дальнейшем вы даже не используете данные из неё? У вас худший студент это всегда последний в массиве, а лучший - первый.
  3. Глобальный массив, фу
  4. Какой смысл выводи "\n", если студент не прошел по минимальному баллу?
  5. Да и если считать лучшего студента, то нужно проверить, что у него проходной по всем предметам, иначе какой он лучший.

Чуток поколдовал, получился такой код:

#include <stdio.h>
#include <locale.h>

#define COUNT_STUDENTS 5

struct student {
    char name[20];
    int roll;
    int math;
    int physics;
    int history;
    int english;
    int programming;
};

int main() {
    setlocale(LC_ALL, "rus");
    int min_mark;
    printf("\nМинимальный проходной балл: ");
    scanf("%i", &min_mark);
    int sum[COUNT_STUDENTS];
    struct student students[COUNT_STUDENTS];
    for (int i = 0; i < COUNT_STUDENTS; ++i) {
        students[i].roll = i + 1;
        printf("\n № %d", students[i].roll);
        printf("Введите имя студента (на англ): ");
        scanf("%students", students[i].name);
        printf("Введите оценку по математике: ");
        scanf("%i", &students[i].math);
        printf("Введите оценку по физике: ");
        scanf("%i", &students[i].physics);
        printf("Введите оценку по истории: ");
        scanf("%i", &students[i].history);
        printf("Введите оценку по английскому: ");
        scanf("%i", &students[i].english);
        printf("Введите оценку по программированию: ");
        scanf("%i", &students[i].programming);
        printf("\n");
        sum[i] = students[i].math + students[i].physics + students[i].history + students[i].english +
                 students[i].programming;
    }
    printf("===========================================================================\n");
    int sum_best_student = sum[0], index_best_student = 0,
            sum_worse_student = sum[0], index_worse_student = 0;
    for (int i = 0; i < COUNT_STUDENTS; ++i) {
        if (sum_worse_student > sum[i]) {
            sum_worse_student = sum[i];
            index_worse_student = i;
        }
        if (students[i].math >= min_mark && students[i].physics >= min_mark && students[i].history >= min_mark &&
            students[i].english >= min_mark && students[i].programming >= min_mark) {
            printf("№ %d\t", students[i].roll);
            printf(" Имя:  ");
            puts(students[i].name);
            printf("\t %d\n", sum[i] / COUNT_STUDENTS);
            if (sum_best_student < sum[i]) {
                sum_best_student = sum[i];
                index_best_student = i;
            }
        }
    }
    printf("Лучший студент: \n");
    puts(students[index_best_student].name);
    printf("Худший студент: \n");
    puts(students[index_worse_student].name);
    return 0;
}

Всё ещё жиденько, но жить можно.

Если вы так уверены, что ваш код делает всё верно, а вам нужно лишь вынести сортировку, то вот, держите:

void sort(int *mas, int size) {
    for (int i = 0; i < size; ++i) {
        for (int j = i + 1; j < size; ++j) {
            if (mas[i] < mas[j]) {
                int a = mas[i];
                mas[i] = mas[j];
                mas[j] = a;
            }
        }
    }
}

Можете убрать size, на свое усмотрение, заменив на любимую 5.

Также можно использовать функцию qsort из библиотеки stdlib:

#include <stdlib.h>
...
// Функция для сортировки
int cmp(const void *a, const void *b) {
    return *(int*)b - *(int*)a;
}
...
int main(){
    ...
    qsort(sum, 5, sizeof(int), cmp );
    ...
}

О ней чуть подробнее простым языком можно прочитать здесь: тык

→ Ссылка