c语言,模拟借书还书

书籍和学生都放在两个文件,每个人可以借多本,当借书时可以记录下借书时间,下次登录时可以计算是否到期,要怎么实现啊,多本书怎么保存,都是字符,时间怎么保存和计算,求指导…

//就说个大概吧,也没有太细节,简单的做法下面的代码就可以,当然可以做得更好更复杂,那就相当于是图书馆管理系统了。下面主要是借书、还书、查询是否到期等
#include<stdio.h>
#include<time.h>
#include<string.h>
#define  N 5
#define M 5
typedef struct{
int year;
int month;
int day;
}Date;
typedef struct{
char name[100];
char author[50];
int available;  //是否可借(1可借,0不可外借)
Date date; // 入库/借出/还入日期
}Book;
typedef struct{
int number;
char name[20];
int count; //该生所持有的书数量
Book book[3]; //每个学生最多只能同时保有3本书
}Student;
void add_book(Book *); //录入新书
int borrow_book(Book *,Student *); //借书
int return_book(Book *,Student *); 
int query(Book *,char*); //查询
Date get_time(); //获取当前时间
int cal_day(Date); //计算是否超期
void main()
{
Book book[N];
Student stu[M];
char name[100];
int i;
//从文件中读入图书信息和学生信息
FILE *fp;
fp=fopen("d:\\book.txt","r");
for(i = 0;i<N&&!feof(fp);i++)
fscanf(fp,"%s%s%d%d%d%d",book[i].name,book[i].author,&book[i].available,&book[i].date.year,&book[i].date.month,&book[i].date.day);
fclose(fp);
fp=fopen("d:\\student.txt","r");
for(i= 0;i<M&&!feof(fp);i++)
{
fscanf(fp,"%d%s%d",&stu[i].number,stu[i].name,&stu[i].count);
for(int j =0;j<3;j++)
fscanf(fp,"%s%s%d%d%d%d",stu[i].book[j].name,stu[i].book[j].author,&stu[i].book[j].available,&stu[i].book[j].date.year,&stu[i].book[j].date.month,&stu[i].book[j].date.day);
}
fclose(fp);

int mode;
loop:
printf("1.录入图书\n2.借书\n3.还书\n4.查询\n*.退出\n");
scanf("%d",&mode);
switch(mode)
{
case 1:
add_book(book);
break;
case 2:
if(borrow_book(book,stu))printf("借书成功\n");
else printf("借书失败\n");
break;
case 3:
if(return_book(book,stu))printf("还书成功\n");
else printf("还书失败\n");
break;
case 4:
printf("输入书名:");
scanf("%s",name);
if(!query(book,name))printf("没有查询到该图书信息\n");
break;
default:
return;
}
goto loop;
}
//根据学号,查看是否还能借入,如能借入更新借书的学生信息和图书信息
int borrow_book(Book *b,Student *s)
{
printf("输入书名:");
char name[100];
scanf("%s",name);
printf("输入学号:");
int num;
scanf("%d",&num);
for(int i = 0;i<M;i++)
if(s[i].number == num && s[i].count<3)//持有数量3本以上无法借书
{
int c = s[i].count;
for(int j =0;j<N;j++)
if(strcmp(b[j].name,name)==0) //借书成功,更新信息
{
b[j].available = 0;
b[j].date = get_time();
s[i].book[c] = b[j];
s[i].count = c+1;
return 1;
}
}
return 0;
}
//根据学号和书名查找到借书信息,并更新还书信息和计算是否超期
int return_book(Book *b,Student *s)
{
printf("输入书名:");
char name[100];
scanf("%s",name);
printf("输入学号:");
int num;
scanf("%d",&num);
for(int j= 0;j<M;j++)
if(s[j].number == num&&s[j].count>0)
{
for(int k=0;k<s[j].count;k++)
if(strcmp(s[j].book[k].name,name)==0)
{
s[j].count--; //更新学生持有书籍数量
for(int i =0;i<N;i++)
if(strcmp(b[i].name,name)==0)
{
if(query(b,name)>0)
printf("借书超期%d天,请交纳罚金\n");
b[i].available = 1;
b[i].date = get_time();
return 1;
}
}
}
return 0;
}
void add_book(Book *book)
{
//录入新书并保存至文件
}
//根据书名查找图书信息,(还可以根据学生来查找,这里没实现)
int query(Book *b,char *name)
{
for(int i =0;i<N;i++)
if(strcmp(b[i].name,name)==0)
{
if(b[i].available ==1){printf("本书可以借出\n");return -1;}
else 
{
int days = cal_day(b[i].date);
printf("本书已被借出%d天\n",days);
if(days>10)
printf("本书已超期%d天\n",days-10);
return days-10;
}
}
return 0;
}
Date get_time()
{
Date date;
time_t curtime;
struct tm * timeinfo;
time ( &curtime );  //获取时间
timeinfo = localtime ( &curtime );  //转为当地时间
date.year = timeinfo->tm_year+1900;
date.month = timeinfo->tm_mon+1;
date.day = timeinfo->tm_mday;
return date;
}
//计算借出的总天数
int cal_day(Date d)
{
Date od = get_time();
if(od.year == d.year)
{
if(od.month == d.month) return d.day - od.day;
else return d.day - od.day +(od.month - d.month)*30;  //每月按30天计
}
else
{return ((d.month-1)*30+d.day) - ((od.month-1)*30 +od.day) + (d.year - od.year)*365;} //每年按365天计
}

以下是部分运行结果和书籍学生信息文本。


大概意思就是:多本书使用数组来保存,时间的计算用库函数。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-03-14
你好!程序什么时间用?你这个程序需要三个数据文件来配合完成功能