Сортировка массива структур по одному полю - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д