Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/26: Рейтинг темы: голосов - 26, средняя оценка - 4.73
letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
1

Сортировка массива структур по одному полю

21.11.2011, 23:23. Просмотров 5037. Ответов 6
Метки нет (Все метки)

как сортировку по выбранному полю реализовать на си, покажите на каком -нибудь примере? пжлста)
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2011, 23:23
Ответы с готовыми решениями:

Сортировка массива структур по полю
Здравствуйте! Условие: Для книг, хранящихся в библиотеке, задаются...

Сортировка Хоара массива структур по любому полю
Требуется отсортировать массив структур по выбранному полю. Недосортировка...

Сортировка массива структур по полю в алфавитном порядке
Доброго время суток,уважаемые. Прошу помощи в написании кода) Имеется массив...

Сортировка массива структур по одному из полей
Задание 1.Описать структуру с именем STUDENT, содержащую следующие поля: •...

Сортировка массива структур по одному из полей по алфавиту
Вечер добрый. Нужна помощь в реализации сортировки массива структур(а точнее,...

6
easybudda
Модератор
Эксперт CЭксперт С++
10209 / 6108 / 1536
Регистрация: 25.07.2009
Сообщений: 11,607
22.11.2011, 00:17 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от letnjaja Посмотреть сообщение
как сортировку по выбранному полю реализовать на си
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#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);
}
1
letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
22.11.2011, 01:11  [ТС] 3
спасибо большое, вы могли бы прокомментировать эти строчки? что, да как тут работает, спасибо
C
1
2
3
4
5
6
7
8
9
10
11
12
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;
}
Добавлено через 2 минуты
и еще вопросик, если я хочу задать в структуре дату, я могу так записать:
int dd;
int mm;
int yy; или как лучше это сделать?
0
easybudda
Модератор
Эксперт CЭксперт С++
10209 / 6108 / 1536
Регистрация: 25.07.2009
Сообщений: 11,607
22.11.2011, 01:29 4
letnjaja, функция qsort() четвёртым параметром принимает указатель на функцию, принимающую два константных указателя на сравниваемые объекты и возвращающую отрицательное целое, если первый объект меньше, положительное целое, если первый объект больше, ноль, если объекты равны. Внутри функции нужно правильно привести указатель void* к указателю нужного типа. Ну а дальше всё должно быть очевидно.
По поводу даты, если устраивает, что даты будут не раньше 1 января 1970 года и не дальше, чем примерно на 15 лет вперёд, я бы стандартный time_t использовал...
0
letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
22.11.2011, 01:46  [ТС] 5
C
1
return ( d < 0.0 ) ? -1 : ( d > 0.0 ) ? 1 : 0;
а что здесь значат ? и :
0
letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
27.11.2011, 19:48  [ТС] 6
я хочу в вышеприведенном коде поменять это:
C
1
2
3
4
5
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 }
        };
на ввод данных структуры из файла, получилось так, но не так как надо :d может я в 1ой строке неправильно записала или еще что-то...
C
1
2
3
4
5
6
7
8
person_t persons[NUM_PERSONS]= {"file.txt"};
        if((in=fopen("file.txt","r"))==NULL){
                 printf("nevozmowno otkritj fail\n");
                 }
                 else {
                      for (i = 0; i <NUM_PERSONS ; i++)
printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
};
0
easybudda
Модератор
Эксперт CЭксперт С++
10209 / 6108 / 1536
Регистрация: 25.07.2009
Сообщений: 11,607
27.11.2011, 20:44 7
Цитата Сообщение от letnjaja Посмотреть сообщение
C
1
person_t persons[NUM_PERSONS]= {"file.txt"};
Смело... Что бы по-вашему это значило? У меня в примере массив инициализируется при объявлении, чтобы на этом не заморачиваться. При чтении из файла нужно или узнать каким-либо образом, сколько структур находится в файле (в случае бинарного файла можно его размер разделить на размер структуры), создать динамический массив соответствующего размера и заполнять его, или создать массив заданного размера и пытаться считать в него соответствующее количество структур...

Не по теме:

Странное чувство, что в теме постов больше было...

1
27.11.2011, 20:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2011, 20:44

Сортировка пузырьком массива структур по одному из полей
Помогите сделать символьную сортировку пузырьком для &quot;avtor&quot; , заранее спасибо)...

Быстрая сортировка структуры по одному полю
Задача такова: Составить программу, в которой будет таблица, которая будет...

Ввод, вывод массива структур, поиск по заданному пользователем полю
Здравствуйте. Необходимо написать 3 функции. Ввод, вывод массива структур,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru