Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Naz17
6 / 3 / 4
Регистрация: 10.12.2017
Сообщений: 101
1

Сортировка в структуре

10.11.2018, 12:26. Просмотров 768. Ответов 4
Метки нет (Все метки)

Здравствуйте, есть такая задача: Из файла (test.txt) нужно считать данные в структуру и отсортировать.
Код написал, запускается без ошибок, но ничего не выводит. Не знаю в чём проблема.
Буду рад любой помощи.
Заранее спасибо!

Вот сам код:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct {
    char name[32];
    int date[32];
} HOMOSAPIENS;
 
HOMOSAPIENS people[5];
 
int month_by_name(const char * name) {
    static const char * months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec" };
    int i;
    
    for ( i = 0; i < sizeof(months) / sizeof(*months) && strcmp(months[i], name); ++i )
        ;
    
    return i;
}
 
int date_cmp(const char * aDate, const char * bDate) {\
    char aMonthName[4], bMonthName[4];
    int aDay, bDay, aMonth, bMonth;
    
    sscanf(aDate, "%d%3s", &aDay, aMonthName);
    aMonth = month_by_name(aMonthName);
    
    sscanf(bDate, "%d%3s", &bDay, bMonthName);
    bMonth = month_by_name(bMonthName);
    
    return ( aMonth == bMonth ) ? aDay - bDay : aMonth - bMonth;
}
 
struct HOMOSAPIENS {
    char name[64];
    char date[32];
};
 
int compare_by_date(const void * a, const void * b) {
    return date_cmp(((struct HOMOSAPIENS *)a)->date, ((struct HOMOSAPIENS *)b)->date);
}
 
int main(void) {
    int i;
    FILE *fp;
    char *fn = "test.txt";
    fp = fopen(fn, "r");
 
    for (i=0;i<5;i++){
        fscanf(fp, "\"%[ A-Za-z]\" \"%[ 0-9A-Za-z]\" ",
                people[i].name, people[i].date);
    }
    
    for (i=0;i<5;i++){
        printf("\"%s\" \"%s\"\n", people[i].name, people[i].date);
    }
    
    printf("Unsorted:\n");
    for ( i = 0; i < sizeof(people) / sizeof(*people); ++i )
        printf("%s\t%s\n", people[i].name, people[i].date);
    
    qsort(people, sizeof(people) / sizeof(*people), sizeof(*people), compare_by_date);
    
    printf("\nSorted:\n");
    for ( i = 0; i < sizeof(people) / sizeof(*people); ++i )
        printf("%s\t%s\n", people[i].name, people[i].date);
    
    return 0;
}
В файле(test.txt) данные записаны так:
"Ivan Ivanof" "23 Okt 1978"
"Petr Petrov" "07 Feb 1975"
"Sidor Sidorov" "13 Okt 1980"
"Duncan MacLeod" "28 Feb 1625"
"Obi Wan Kenobi" "01 Jan 1341"
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2018, 12:26
Ответы с готовыми решениями:

Сортировка в структуре
Ребят помогите пожалуйста реализовать в данной структуре сортировку по номеру группы по...

Сортировка в структуре
Здравствуйте, каким образом можно отсортировать структуру чтобы не терялись остальные поля мне надо...

Сортировка данных в структуре
Помогите пожалуйста тут ошибка в самой последней строчке программы. Преподаватель сказал, что мне...

Сортировка данных в структуре.
Здравствуйте. Необходимо отсортировать числовые данные в структуре. Интересует qsort. Искал на...

Сортировка по одному из полей в структуре
Задана структуру с именем info, содержащую номер, имя и фамилию, а также дату рождения человека....

4
ft4l
Невнимательный
252 / 215 / 91
Регистрация: 08.02.2013
Сообщений: 641
Записей в блоге: 1
10.11.2018, 13:12 2
Лучший ответ Сообщение было отмечено Naz17 как решение

Решение

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
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct {
    char name[32];
    char date[32];
} HOMOSAPIENS;
 
HOMOSAPIENS people[5];
 
int month_by_name(const char * name) {
    static const char * months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec" };
    int i;
    
    for ( i = 0; i < sizeof(months) / sizeof(*months) && strcmp(months[i], name); ++i )
        ;
    
    return i;
}
 
int date_cmp(const char * aDate, const char * bDate) {\
    char aMonthName[4], bMonthName[4];
    int aDay, bDay, aMonth, bMonth;
    
    sscanf(aDate, "%d%3s", &aDay, aMonthName);
    aMonth = month_by_name(aMonthName);
    
    sscanf(bDate, "%d%3s", &bDay, bMonthName);
    bMonth = month_by_name(bMonthName);
    
    return ( aMonth == bMonth ) ? aDay - bDay : aMonth - bMonth;
}
 
 
int compare_by_date(const void * a, const void * b) {
    return date_cmp(((HOMOSAPIENS *)a)->date, ((HOMOSAPIENS *)b)->date);
}
 
int main(void) {
    int i;
    FILE *fp;
    char *fn = "test.txt";
    fp = fopen(fn, "r");
 
    for (i=0;i<5;i++){
        fscanf(fp, "\"%[ A-Za-z]\" \"%[ 0-9A-Za-z]\" ",
                people[i].name, people[i].date);
    }
    
    for (i=0;i<5;i++){
        printf("\"%s\" \"%s\"\n", people[i].name, people[i].date);
    }
    
    printf("Unsorted:\n");
    for ( i = 0; i < sizeof(people) / sizeof(*people); ++i )
        printf("%s\t%s\n", people[i].name, people[i].date);
    
    qsort(people, sizeof(people) / sizeof(*people), sizeof(*people), compare_by_date);
    
    printf("\nSorted:\n");
    for ( i = 0; i < sizeof(people) / sizeof(*people); ++i )
        printf("%s\t%s\n", people[i].name, people[i].date);
    
    return 0;
}
1
Naz17
6 / 3 / 4
Регистрация: 10.12.2017
Сообщений: 101
10.11.2018, 13:17  [ТС] 3
ft4l, Не работает.
Вот так оно выглядит:
0
Миниатюры
Сортировка в структуре  
ft4l
Невнимательный
252 / 215 / 91
Регистрация: 08.02.2013
Сообщений: 641
Записей в блоге: 1
10.11.2018, 15:46 4
Не знаю почему, у меня не работает только если сохраняю test.txt в кодировке utf-8 c BOM (BiteOrderMarker)
А так всё рабртает, пробовал и 32-битное т 64х
Код
J:\x>cl test2.c -link /subsystem:console
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.30729.207 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

test2.c
Microsoft (R) Incremental Linker Version 9.00.30729.207
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:test2.exe
/subsystem:console
test2.obj

J:\x>test2
"Ivan Ivanof" "23 Okt 1978"
"Petr Petrov" "07 Feb 1975"
"Sidor Sidorov" "13 Okt 1980"
"Duncan MacLeod" "28 Feb 1625"
"Obi Wan Kenobi" "01 Jan 1341"
Unsorted:
Ivan Ivanof     23 Okt 1978
Petr Petrov     07 Feb 1975
Sidor Sidorov   13 Okt 1980
Duncan MacLeod  28 Feb 1625
Obi Wan Kenobi  01 Jan 1341

Sorted:
Obi Wan Kenobi  01 Jan 1341
Petr Petrov     07 Feb 1975
Duncan MacLeod  28 Feb 1625
Sidor Sidorov   13 Okt 1980
Ivan Ivanof     23 Okt 1978
Текст такой-же, латиница
1
Naz17
6 / 3 / 4
Регистрация: 10.12.2017
Сообщений: 101
10.11.2018, 20:28  [ТС] 5
ft4l, Неловко получилось. Я конкретно затупил, вместо того, чтоб назвать файл test, я написал test.txt.
В итоге получилось test.txt.txt
А так, спасибо всё работает!
0
10.11.2018, 20:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2018, 20:28

Сортировка в структуре "Монастырь"
как исравить ети ошибки ? #include &lt;stdio.h&gt; #include &lt;string.h&gt; /* Описание структуры, которая...

Сортировка в структуре "Автомобиль"
int _tmain(int argc, _TCHAR* argv) { setlocale(LC_ALL, &quot;rus&quot;); const int n = 6; int...

условие в структуре
нужен поиск для вывода дисциплин заканчивающихся экзаменом#include &lt;stdio.h&gt; // определение...


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

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

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