Создать функцию сортировки массива
Код рабочий. Необходимо его модифицировать, переместив сортировку массива 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
→ Ссылка
Есть несколько вопросов к самому коду:
- Почему вы не вынесли размер самого массива, что наплодило кучу магических чисел.
- Какой смысл вообще в этой сортировке, если в дальнейшем вы даже не используете данные из неё? У вас худший студент это всегда последний в массиве, а лучший - первый.
- Глобальный массив, фу
- Какой смысл выводи "\n", если студент не прошел по минимальному баллу?
- Да и если считать лучшего студента, то нужно проверить, что у него проходной по всем предметам, иначе какой он лучший.
Чуток поколдовал, получился такой код:
#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 );
...
}
О ней чуть подробнее простым языком можно прочитать здесь: тык