Сортировка массива структур по одному полю - C (СИ)

Узнай цену своей работы

Формулировка задачи:

как сортировку по выбранному полю реализовать на си, покажите на каком -нибудь примере? пжлста)

Решение задачи: «Сортировка массива структур по одному полю»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct PERSON {
  6.     char * name;
  7.     int height;
  8.     double weight;
  9. }person_t;
  10.  
  11. int name_cmp(const void * a, const void *b){
  12.     return strcmp(((person_t*)a)->name, ((person_t*)b)->name);
  13. }
  14.  
  15. int height_cmp(const void * a, const void *b){
  16.     return ((person_t*)a)->height - ((person_t*)b)->height;
  17. }
  18.  
  19. int weight_cmp(const void * a, const void *b){
  20.     double d = ((person_t*)a)->weight - ((person_t*)b)->weight;
  21.     return ( d < 0.0 ) ? -1 : ( d > 0.0 ) ? 1 : 0;
  22. }
  23.  
  24. #define NUM_PERSONS 3
  25.  
  26. int main(void){
  27.     person_t persons[NUM_PERSONS] = {
  28.         { .name = "Sidorov", .height = 173, .weight = 80.2 },
  29.         { .name = "Petrov", .height = 182, .weight = 75.5 },
  30.         { .name = "Ivanov", .height = 180, .weight = 99.9 }
  31.     };
  32.     int i;
  33.    
  34.     printf("\nUnsorted:\n");
  35.     for ( i = 0; i < NUM_PERSONS; ++i )
  36.         printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
  37.    
  38.     qsort(persons, NUM_PERSONS, sizeof(person_t), name_cmp);
  39.     printf("\nSorted by name:\n");
  40.     for ( i = 0; i < NUM_PERSONS; ++i )
  41.         printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
  42.        
  43.     qsort(persons, NUM_PERSONS, sizeof(person_t), height_cmp);
  44.     printf("\nSorted by height:\n");
  45.     for ( i = 0; i < NUM_PERSONS; ++i )
  46.         printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
  47.    
  48.     qsort(persons, NUM_PERSONS, sizeof(person_t), weight_cmp);
  49.     printf("\nSorted by weight:\n");
  50.     for ( i = 0; i < NUM_PERSONS; ++i )
  51.         printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
  52.        
  53.     exit(0);
  54. }

Объяснение кода листинга программы

В данном коде:

  1. Создается структура person_t, которая содержит поля name, height и weight.
  2. Определяются функции сравнения name_cmp, height_cmp и weight_cmp, которые сравнивают поля структуры person_t для сортировки массива.
  3. Объявляется массив persons типа person_t с тремя элементами, инициализированными значениями полей name, height и weight.
  4. Выводится список несортированных данных.
  5. Массив persons сортируется по полю name с помощью функции qsort и выводится отсортированный список.
  6. Массив persons сортируется по полю height с помощью функции qsort и выводится отсортированный список.
  7. Массив persons сортируется по полю weight с помощью функции qsort и выводится отсортированный список.
  8. Программа завершается с помощью функции exit.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы