Сортировка массива структур по одному полю - C (СИ)
Формулировка задачи:
как сортировку по выбранному полю реализовать на си, покажите на каком -нибудь примере? пжлста)
Решение задачи: «Сортировка массива структур по одному полю»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct PERSON {
- char * name;
- int height;
- double weight;
- }person_t;
- int name_cmp(const void * a, const void *b){
- return strcmp(((person_t*)a)->name, ((person_t*)b)->name);
- }
- int height_cmp(const void * a, const void *b){
- return ((person_t*)a)->height - ((person_t*)b)->height;
- }
- int weight_cmp(const void * a, const void *b){
- double d = ((person_t*)a)->weight - ((person_t*)b)->weight;
- return ( d < 0.0 ) ? -1 : ( d > 0.0 ) ? 1 : 0;
- }
- #define NUM_PERSONS 3
- int main(void){
- person_t persons[NUM_PERSONS] = {
- { .name = "Sidorov", .height = 173, .weight = 80.2 },
- { .name = "Petrov", .height = 182, .weight = 75.5 },
- { .name = "Ivanov", .height = 180, .weight = 99.9 }
- };
- int i;
- printf("\nUnsorted:\n");
- for ( i = 0; i < NUM_PERSONS; ++i )
- printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
- qsort(persons, NUM_PERSONS, sizeof(person_t), name_cmp);
- printf("\nSorted by name:\n");
- for ( i = 0; i < NUM_PERSONS; ++i )
- printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
- qsort(persons, NUM_PERSONS, sizeof(person_t), height_cmp);
- printf("\nSorted by height:\n");
- for ( i = 0; i < NUM_PERSONS; ++i )
- printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
- qsort(persons, NUM_PERSONS, sizeof(person_t), weight_cmp);
- printf("\nSorted by weight:\n");
- for ( i = 0; i < NUM_PERSONS; ++i )
- printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
- exit(0);
- }
Объяснение кода листинга программы
В данном коде:
- Создается структура
person_t
, которая содержит поляname
,height
иweight
. - Определяются функции сравнения
name_cmp
,height_cmp
иweight_cmp
, которые сравнивают поля структурыperson_t
для сортировки массива. - Объявляется массив
persons
типаperson_t
с тремя элементами, инициализированными значениями полейname
,height
иweight
. - Выводится список несортированных данных.
- Массив
persons
сортируется по полюname
с помощью функцииqsort
и выводится отсортированный список. - Массив
persons
сортируется по полюheight
с помощью функцииqsort
и выводится отсортированный список. - Массив
persons
сортируется по полюweight
с помощью функцииqsort
и выводится отсортированный список. - Программа завершается с помощью функции
exit
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д