Отсортировать структуру по дате рождения - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д