Сортировка массива структур по разным полям - C (СИ)
Формулировка задачи:
Имеется массив студентов. Подскажите, пожалуйста, как сортировать их по полю "курс" и полю "фамилия" .
Заранее благодарна.
Листинг программы
- #include <stdio.h>
- struct student
- {char surname[20];
- char name[10];
- char fathername[10];
- char pol[1];
- int vozrast;
- char cyrs[2];};
- int main()
- {struct student A[5]
- printf("Введите информацию о cтудентах\n");
- printf("Фамилия имя отчество пол возраст курс\n");
- for (i=0;i<5;i++)
- {scanf(%s%s%s%s%d%d",&A[i].surname,&A[i].name,&A[i].fathername,&A[i].pol,&A[i].vozrast,&A[i].cyrs;
- printf(%s%s%d,&A[i].surname,&A[i].name,&A[i].cyrs)}
Решение задачи: «Сортировка массива структур по разным полям»
textual
Листинг программы
- #include <stdio.h>
- #include <conio.h>
- #include <stdlib.h>
- const int n=3;
- struct student
- {
- char surname[20];
- char name[10];
- char fathername[10];
- char pol[1];
- int vozrast;
- int cyrs;
- };
- int cmp(const void * a, const void *b) {
- struct student * pa = (struct student *)a;
- struct student * pb = (struct student *)b;
- return ( pa->cyrs == pb->cyrs ) ? pa->surname - pb->surname : pa->cyrs - pb->cyrs;
- }
- int main()
- {
- struct student a[n];
- for(int i=0;i<n;i++)
- {
- scanf("%s%s%s%s%d%d",a[i].surname,a[i].name,a[i].fathername,a[i].pol,&a[i].vozrast,&a[i].cyrs);
- }
- puts("Ne Otsortirovaniy");
- puts("\n");
- for(int i=0;i<n;i++)
- {
- printf(" %s %s %s %s %d %d ",a[i].surname,a[i].name,a[i].fathername,a[i].pol,a[i].vozrast,a[i].cyrs);
- puts("\n");
- }
- qsort(a, n, sizeof(struct student), cmp);
- puts("Otsortirovaniy");
- puts("\n");
- for(int i=0;i<n;i++)
- {
- printf(" %s %s %s %s %d %d ",a[i].surname,a[i].name,a[i].fathername,a[i].pol,a[i].vozrast,a[i].cyrs);
- puts("\n");
- }
- return 0;
- }
Объяснение кода листинга программы
- #include
Включает в программу функции для работы с консолью (stdio). - #include
Включает в программу функции для работы с клавиатурой и мышью (conio). Сейчас этот заголовочный файл считается устаревшим и удалён в новых версиях C. - #include
Включает в программу функции для работы с памятью (stdlib). - const int n=3; Объявляет константу n типа int со значением 3.
- struct student Объявляет структуру с именем
student
. - int cmp(const void a, const void b) Функция сравнения двух структур типа
student
с использованием операторов строгого сравнения и меньшего оператора. Возвращает значение типа int. - int main() Функция main() является точкой входа в программу.
- struct student a[n]; Объявляет массив структур типа
student
с именемa
и размером n. - for(int i=0;i<n;i++) Цикл for для обхода всех элементов массива
a
. - scanf(
%s%s%s%s%d%d
,a[i].surname,a[i].name,a[i].fathername,a[i].pol,&a[i].vozrast,&a[i].cyrs); Заполняет поля структурыstudent
с помощью функции scanf(). - puts(
Ne Otsortirovaniy
); Выводит на экран строкуNe Otsortirovaniy
. - for(int i=0;i<n;i++) Цикл for для обхода всех элементов массива
a
. - printf(
%s %s %s %s %d %d
,a[i].surname,a[i].name,a[i].fathername,a[i].pol,a[i].vozrast,a[i].cyrs); Выводит на экран значения полей структурыstudent
. - puts(
\n
); Выводит на экран символ новой строки. - qsort(a, n, sizeof(struct student), cmp); Сортирует массив структур
a
с помощью функции qsort(). - puts(
Otsortirovaniy
); Выводит на экран строкуOtsortirovaniy
. - for(int i=0;i<n;i++) Цикл for для обхода всех элементов массива
a
. - printf(
%s %s %s %s %d %d
,a[i].surname,a[i].name,a[i].fathername,a[i].pol,a[i].vozrast,a[i].cyrs); Выводит на экран значения полей структурыstudent
. - puts(
\n
); Выводит на экран символ новой строки. - return 0; Возвращает 0, что означает успешное завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д