@Retr0Hacker

Как сортировать данные структуры по дате, если дата задаётся символьной строкой?

Ввести последовательность записей с информацией о некоторых европейских странах. Дата государственного праздника задается символьной строчкой в форме День Месяц, например 24 августа. Распечатайте введенный список в виде таблицы. Затем переставить данные в календарном порядке по дате основного государственного праздника и еще раз напечатать.

Вопрос:
Как сортировать данные структуры по дате, если дата задаётся символьной строкой?

Вот мой код:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define N 25

int main()
{
	int count, n;

	struct country {
		char name[35];
		double population;
		char holl[25];
		char date[20];
	}list[N], per, * po1, * po2;

	system("chcp 1251");
	printf("Кол-во стран- ");
	scanf_s("%d", &n); 
	getchar();
	printf("\nДані: \n");
	for (count = 0; count < n; count++) {
		printf(" %d. Название страны: ", (count + 1));
		gets_s(list[count].name);
		printf(" %d. Население: ", (count + 1));
		scanf_s("%lf", &list[count].population);
		getchar();
		printf(" %d. Гос. праздник: ", (count + 1));
		gets_s(list[count].holl);
		printf(" %d. Дата: ", (count + 1));
		gets_s(list[count].date);
		printf("\n");
		rewind(stdin);
	}

	printf("\n\t\t\t\t\tТаблиця данных:\n\n");
	printf("  Название\t\tНаселение\t\tГос.праздник\t\t\tДата");
	for (count = 0; count < n; count++) {
		printf("\n %d. %s\t\t%.1lf\t\t%s\t\t%s", (count + 1), (list + count)->name, list[count].population, (list + count)->holl, (list + count)->date);
	}

	for (count = 0; count < n; count++) {
		po1 = list; 
		po2 = list + 3;
		for (; po2 < list + n - count; po1++, po2++)
			if (po1->date < po2->date) {
				per = *po1;
				*po1 = *po2;
				*po2 = per;
			}
	}
	printf("\n\n\t\t\Отсортированные данные(по дате):\n\n");
	printf("  Название\t\tНаселение\t\Гос.праздник\t\t\tДата");
	for (count = 0; count < n; count++) {
		printf("\n %d. %s\t\t%.1lf\t\t%s\t\t%s", (count + 1), (list + count)->name, list[count].population, (list + count)->holl, (list + count)->date);
	}
}
  • Вопрос задан
  • 154 просмотра
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как сортировать данные структуры по дате, если дата задаётся символьной строкой?

Строки вида yyyymmdd можно сортировать с помощью qsort сравнивая их функцией strcmp.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
1. Строки сравниваются с помощью strcmp. Когда вы сравниваете так как у вас в коде, то вы сравниваете значения указателей, а не то на что указывают эти указатели.
2. Чтобы сравнить числа в строковом представлении, строки должны быть одинаковой длинны, т.е. число в строковом представлении с меньшим количеством знаков должно быть дополнено слева нулями до длины большего числа (или дополнять оба числа до какой-то фиксированной длины).
3. Когда у вас "склеено" несколько чисел в строку (каждое из чисел дополнено нулями), то порядок склейки для сортировки должен быть от большей сущности к меньшей. В вашем примере в начале строки должен идти месяц, а затем день.
Только применив все три пункта вы сможете правильно отсортировать подобные строки.
Все это кратко изложил jcmvbkbc в своем ответе.

Но! Вам ничего не мешает сразу же при вводе преобразовывать дату в числовое представление и сортировать уже числа. Это будет гораздо быстрее, чем решать проблемы с текстовой сортировкой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы