Отсортировать структуру по дате рождения - 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 и выполняет следующие действия:

  1. Инициализация массива структур note с данными о трех людях: Анне, Борисе и Алексе.
  2. Сортировка массива структур note по дате рождения в порядке возрастания возраста человека. Для этого используется функция qsort, которая принимает указатель на начало массива, размер массива в элементах, размер одного элемента и указатель на функцию сравнения. В данном случае, функция сравнения cmp_date сравнивает даты рождения по возрастанию возраста человека.
  3. Вывод отсортированного массива на экран.
  4. Поиск человека по номеру телефона. Для этого используется цикл while, который проходит по всем элементам массива и сравнивает номер телефона с искомым номером. Если номер найден, выводится информация о найденном человеке.
  5. Функция gdays, которая принимает дату рождения в формате ГГГГ.ММ.ДД и возвращает количество дней в году человека с такой датой рождения.
  6. Функция cmp_date, которая сравнивает две даты рождения и возвращает -1, если первая дата рождения старше второй, и 1, если первая дата рождения младше второй. Эта функция используется в функции сортировки qsort.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.667 из 5
Похожие ответы