В функции 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программа завершается.