Отсортировать структуру по дате рождения - C (СИ)
Формулировка задачи:
С
Помогите отсортировать структуру по дате рождения, и если можна сделать поист в структуре по номеру телефона.
Благодарю за внимание.
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "conio.h"
#include "iostream"
struct note
{
char name[30];
char number[15];
char date[10];
} m[3];
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
struct note x;
int n;
int i, j;
int min;
for (n=0; n<3; n++){
printf("%d. Введите: Имя_Фамилию, номер телефона и дату рождения >",n+1);
scanf("%s",m[n].name);
if (!strcmp(m[n].name,"***")) break;
scanf("%s",&m[n].number);
scanf("%s",&m[n].date);
}
for (i=0; i<n; i++)
printf("%s %s %s\n",m[i].name,m[i].number,m[i].date);
printf("---------------------------------------------\n");
return 0;
}Решение задачи: «Отсортировать структуру по дате рождения»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int gdays(const char* date);
int cmp_date(const void* a, const void* b);
struct note {
char name[30];
char number[15];
char date[12];
} m[3];
int main(void) {
int i;
struct note* iter, *end;
char number[15];
// пример для демонстрации
strcpy(m[0].name, "Anna");
strcpy(m[0].number, "22-33-44");
strcpy(m[0].date, "1990.08.12");
strcpy(m[1].name, "Boris");
strcpy(m[1].number, "32-56-78");
strcpy(m[1].date, "1983.01.01");
strcpy(m[2].name, "Alex");
strcpy(m[2].number, "11-22-90");
strcpy(m[2].date, "1989.01.10");
// сортируем по-дате, по возрастанию возраста человека
qsort((void*)m, sizeof(m)/sizeof(struct note), sizeof(struct note), &cmp_date);
puts("name\tphone\t\tdate");
for(i = 0; i < sizeof(m)/sizeof(struct note); i++)
printf("%s\t%s\t%s\n", m[i].name, m[i].number, m[i].date);
// найти по тел-номеру человека
strcpy(number, "32-56-78");
iter = m;
end = m + sizeof(m)/sizeof(struct note);
while(iter != end) {
if(! strcmp(iter->number, number)) { // если нашли выводим человека
printf("\nname: %s, year: %s\n", iter->name, iter->date);
break;
}
*iter++;
}
// в случае неудачи вывести что такого нет человека с таким номером
if(iter == end)
printf("Not found !!!\n", number);
getchar();
return 0;
}
int gdays(const char* date) {
int year = 0, mon = 0, day = 0;
if(sscanf(date, "%4d.%2d.%2d", &year, &mon, &day) == 3)
return year*365 + mon*30 + year;
return 0;
}
int cmp_date(const void* a, const void* b) {
struct note* pa = (struct note*) a;
struct note* pb = (struct note*) b;
// сортировка от самого старшего возраста к меньшему, по убыванию
// return (gdays(pa->date) < gdays(pb->date)) ? -1 : 1;
// а вот так наоборот по возрастанию
return (gdays(pa->date) < gdays(pb->date)) ? 1 : -1;
}
Объяснение кода листинга программы
Код представляет собой программу на языке C, которая работает с массивом структур note и выполняет следующие действия:
- Инициализация массива структур note с данными о трех людях: Анне, Борисе и Алексе.
- Сортировка массива структур note по дате рождения в порядке возрастания возраста человека. Для этого используется функция qsort, которая принимает указатель на начало массива, размер массива в элементах, размер одного элемента и указатель на функцию сравнения. В данном случае, функция сравнения cmp_date сравнивает даты рождения по возрастанию возраста человека.
- Вывод отсортированного массива на экран.
- Поиск человека по номеру телефона. Для этого используется цикл while, который проходит по всем элементам массива и сравнивает номер телефона с искомым номером. Если номер найден, выводится информация о найденном человеке.
- Функция gdays, которая принимает дату рождения в формате ГГГГ.ММ.ДД и возвращает количество дней в году человека с такой датой рождения.
- Функция cmp_date, которая сравнивает две даты рождения и возвращает -1, если первая дата рождения старше второй, и 1, если первая дата рождения младше второй. Эта функция используется в функции сортировки qsort.