В функции RetDate должны выводится фамилия, имя и номер билета читателей у которых истек срок возврата книги - C (СИ)

Узнай цену своей работы

Формулировка задачи:

В функции RetDate должны выводится фамилия, имя и номер билета читателей у которых истек срок возврата книги(retdate). Не понимаю как это можно сделать.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<locale.h>
 
struct Reader
{
    char famil[30];
    char name[30];
    int libcn, cipher;
    char retdate[10];
};
 
void input(struct Reader *rea)//добавления нового читателя
{
    FILE *f;
    char c;
    int i=0,n;
    if ((f=fopen("f.txt","a+"))!=NULL)
    {
        while((c=getc(f))!=EOF)
        {
            fscanf(f,"%d",&n);
            fscanf(f,"%s",rea[i].famil);//фамилия
            fscanf(f,"%s",rea[i].name);//имя
            fscanf(f,"%d",&rea[i].libcn);//номер билета
            fscanf(f,"%d",&rea[i].cipher);//шифр книги
            fscanf(f,"%s",rea[i].retdate);//дата возврата
            i++;
        }
    }
    else printf("Error");
 
    printf("Введите фамилию: ");
        scanf("%s",rea[n].famil);
    printf("Введите имя: ");
        scanf("%s",rea[n].name);
    printf("Введите номер билета: ");
        scanf("%d",&rea[n].libcn);
    printf("Введите шиф книги: ");
        scanf("%d",&rea[n].cipher);
    printf("Введите дату возврата: ");
        scanf("%s",rea[n].retdate);
 
    fprintf(f,"\n%d %s %s %d %d %s",n+1,rea[n].famil, rea[n].name, rea[n].libcn, rea[n].cipher, rea[n].retdate);
    fclose(f);
}
 
void output(struct Reader *rea)//вывод на экран списка читателей
{
    FILE *f;
    char c;
    int i=0,j,n;
 
    if((f=fopen("f.txt","r"))!=NULL)
    {
        while ((c=getc(f))!=EOF)
        {
            fscanf(f,"%d",&n);
            fscanf(f,"%s",rea[i].famil);//фамилия
            fscanf(f,"%s",rea[i].name);//имя
            fscanf(f,"%d",&rea[i].libcn);//номер билета
            fscanf(f,"%d",&rea[i].cipher);//шифр книги
            fscanf(f,"%s",rea[i].retdate);//дата возврата
            i++;
        }
        printf("%d",n);
    }
    else printf("Error");
 
    printf("******************************\n");
    printf("Фамилия\tИмя\tНомер билета\tШифр книги\tДата возврата\n");
 
    for(j=0;j<n;j++)
    {
        printf("%s\t%s\t\t%d\t%d\t\t%s\n", rea[j].famil, rea[j].name, rea[j].libcn, rea[j].cipher, rea[j].retdate);
    }
    fclose(f);
}
 
void RetDate (struct Reader *rea)//вывод читателей (ФИО и номер билета), у которых срок возврата книги истек
{
}
 
int main (void)
{
    setlocale(LC_ALL, "rus");
    struct Reader st[1024];
    int i;
    while(1)
    {
        printf("\n******************************\n");
        printf("1.Добавить нового читателя\n");
        printf("2.Вывести список читателей\n");
        printf("3.Вывести читателей, у которых истек срок возврата книги\n");
        printf("4.Выйти\n");
        printf("Выберите действие: \n");
        scanf("%d",&i);
        switch(i)
        {
            case 1: input(st);break;
            case 2: output(st);break;
            case 3: RetDate(st);break;
            case 4: exit(1);break;
            default:printf("Error");
        }
    }
    return 0;
}

Решение задачи: «В функции RetDate должны выводится фамилия, имя и номер билета читателей у которых истек срок возврата книги»

textual
Листинг программы
void RetDate(struct Reader *rea, char *current_date)//вывод читателей (ФИО и номер билета), у которых срок возврата книги истек
{
    FILE *f;
    char c;
    int i=0, n;
 
    if((f=fopen("f.txt","r"))!=NULL)
    {
        while ((c=getc(f))!=EOF)
        {
            ungetc(c, f);
            fscanf(f,"%d",&n);
            fscanf(f,"%s",rea[i].famil);//фамилия
            fscanf(f,"%s",rea[i].name);//имя
            fscanf(f,"%d",&rea[i].libcn);//номер билета
            fscanf(f,"%d",&rea[i].cipher);//шифр книги
            fscanf(f,"%s",rea[i].retdate);//дата возврата
            i++;
        }
        printf("%d",n);
    }
    else printf("Error");
    fclose(f);
 
    char *date_pattern = "%d/%d/%d";
    
    int cday,   tday;
    int cmonth, tmonth;
    int cyear,  tyear;
    
    sscanf(retdate, date_pattern, &cday, &cmonth, &cyear);
    
    printf("******************************\n");
    printf("Фамилия\tИмя\tНомер билета\tШифр книги\tДата возврата\n");
 
    for(i = 0; i < n; ++i) {
        sscanf(rea[i].retdate, date_pattern, &tday, &tmonth, &tyear);
        
        if((cyear < tyear) || (cmonth < tmonth) || (cday < tday)) {
            printf("%s\t%s\t\t%d\t%d\t\t%s\n", rea[j].famil, rea[j].name, rea[j].libcn, rea[j].cipher, rea[j].retdate);
        }
    }
}

Объяснение кода листинга программы

  1. Объявлены функции RetDate и main, последняя вызывается первой.
  2. В функции RetDate открывается файл f.txt для чтения.
  3. Переменная c используется для чтения символов из файла, которые затем возвращаются с помощью ungetc для корректного чтения чисел.
  4. Читаются данные о каждом читателе: номер, фамилия, имя, номер билета и шифр книги.
  5. Чтение даты возврата книги с помощью fscanf в переменную retdate.
  6. Объявлены переменные cday, cmonth, cyear для хранения текущей даты.
  7. С помощью sscanf из retdate извлекаются день, месяц и год.
  8. Выводится шаблон вывода данных.
  9. В цикле for перебираются все читатели.
  10. С помощью sscanf из rea[i].retdate извлекаются день, месяц и год даты возврата.
  11. Если текущая дата меньше даты возврата любого из читателей, то выводятся данные этого читателя.
  12. Функция RetDate завершается, файл закрывается.
  13. В функции main создается структура Reader и инициализируется массив структур.
  14. Вызывается функция RetDate с передачей массива структур и текущей даты в качестве аргументов.
  15. В случае ошибки при открытии файла выводится сообщение об ошибке.
  16. В функции main программа завершается.

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


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

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

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