В функции 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); } } }
Объяснение кода листинга программы
- Объявлены функции
RetDate
иmain
, последняя вызывается первой. - В функции
RetDate
открывается файлf.txt
для чтения. - Переменная
c
используется для чтения символов из файла, которые затем возвращаются с помощьюungetc
для корректного чтения чисел. - Читаются данные о каждом читателе: номер, фамилия, имя, номер билета и шифр книги.
- Чтение даты возврата книги с помощью
fscanf
в переменнуюretdate
. - Объявлены переменные
cday
,cmonth
,cyear
для хранения текущей даты. - С помощью
sscanf
изretdate
извлекаются день, месяц и год. - Выводится шаблон вывода данных.
- В цикле
for
перебираются все читатели. - С помощью
sscanf
изrea[i].retdate
извлекаются день, месяц и год даты возврата. - Если текущая дата меньше даты возврата любого из читателей, то выводятся данные этого читателя.
- Функция
RetDate
завершается, файл закрывается. - В функции
main
создается структураReader
и инициализируется массив структур. - Вызывается функция
RetDate
с передачей массива структур и текущей даты в качестве аргументов. - В случае ошибки при открытии файла выводится сообщение об ошибке.
- В функции
main
программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д