基本要求:
1)采用链式存储结构实现
2)图书信息:每种书的登记内容包括书号、书名、著作者、现存量和库存量等信息;
3)读者信息:每个读者的登记内容包括读者号、姓名、性别等信息
4)借阅信息:每条借阅信息包括读者号、书号、借阅时间、归还时间
5)系统主要功能如下:
a)读者的增删改,图书信息的增删改,其中图书的增加(采编入库):新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;
b)借阅:如果一种书的现存量大于0,则借出一本,在借阅信息中登记读者号、书号、借阅时间,改变图书现存量;
c)归还:填写对应借阅记录的归还时间,改变该书的现存量。
d)查询:可查询书籍信息、读者信息、借阅信息等
e)图书、读者、借阅信息均可保存在文件中,可从文件中调入
学校实验专周比较水,出的都是一些小题目, 从中挑了一个工程量最大的也只是这个小实验,然后我就尽量写的详细一点,把各个功能分开。
文件调用不是很熟悉,仓促学了一点皮毛就用上了,有兴趣以后自行扩展。
实验大致思路和顺序表差不多,多了一些链表基本操作,分别存储图书信息和读者信息,初始化并插入数据后开始用第三个结构体存储借阅信息,通过判断输入法内容和读者号、图书号是否一致来决定借阅成功或失败。
链式结构体中的数组是为了方便存储字符串。
#include <cstdio> #include <cstdlib> #include <string.h> #define ERROR 0 #define OK 1 #define MAXSIZE 50//字符串容纳最大长度 50 typedef int Status; typedef int ElemType; //图书信息 typedef struct Book{ char book_id[MAXSIZE];//图书序号 char book[MAXSIZE];//书名 char author[MAXSIZE];//作者 int num;//现存量 int kucun;//库存量 char read_id[MAXSIZE];//借阅者的id struct Book *next; }LBook,*LinkBook; //读者信息 typedef struct Reader{ char read_id[MAXSIZE];//读者号 char reader[MAXSIZE];//读者姓名 char ssex[MAXSIZE];//读者性别 // char borrow_book[10]; struct Reader *next; }LReader,*LinkReader; //查阅信息 typedef struct info{ char book_id[MAXSIZE];//图书序号 char book_name[MAXSIZE];//图书名称 char read_id[MAXSIZE];//读者序号 char reader[MAXSIZE];//读者名字 char time1[MAXSIZE];//借阅时间 char time2[MAXSIZE];//归还时间 struct info *next; }*information,Info; Status InitBook(LinkBook &L){ L=new Book; if(!L) return ERROR; L->next=NULL; L->kucun=0; L->num=0; return OK; } //初始化读者信息 Status InitReader(LinkReader &L){ L=new Reader; if(!L) return ERROR; L->next=NULL; return OK; } //初始化借阅信息 Status Information(information &C){ C=new Info; if(!C) return ERROR; C->next=NULL; return OK; } //遍历图书信息 void DisBook(LinkBook L){//不改动数值可以不引用& LBook *p; p=L->next;//指向第一个节点 printf("开始展开所有图书信息\n"); printf("------------------>\n"); while(p)//p!=NULL { printf("图书序号:%s\n图书名称:%s\n图书作者:%s\n现存量:%d\n库存量:%d\n",p->book_id,p->book,p->author,p->num,p->kucun); printf("------------------>\n"); p=p->next; } } //遍历读者信息 void DisReader(LinkReader L){//不改动数值可以不引用& LReader *p; p=L->next;//指向第一个节点 printf("开始展开所有读者信息\n"); printf("------------------>\n"); while(p)//p!=NULL { printf("读者号:%s\n姓名:%s\n性别:%s\n",p->read_id,p->reader,p->ssex); printf("------------------>\n"); p=p->next; } } //遍历借阅信息 void DisBorrow(information L) { Info *p; p=L->next; printf("展开所有订阅信息:\n"); printf("------------------>\n"); while(p)//p!=NULL { printf("图书:%s\n读者:%s\n借阅日期:%s\n归还日期:%s\n",p->book_name,p->reader,p->time1,p->time2); printf("------------------>\n"); p=p->next; } } //删除读者操作 Status DelReader(LinkReader &L,char *i) { LReader *p=L; while(p->next)// { if(strcmp(p->next->read_id,i)==0){ Reader *s=p->next; p->next=s->next;//p->next=p->next->next delete s; return OK; } p=p->next; } return ERROR; } //删除图书信息操作 Status DelBook(LinkBook &L,char *i) { LBook *p=L; while(p->next)// { if(strcmp(p->next->book_id,i)==0){ Book *s=p->next; p->next=s->next;//p->next=p->next->next delete s; return OK; } p=p->next; } return ERROR; } //添加读者信息(前插法)--量插 void AddReader(LinkReader &L,int n){ LReader *p; L=new Reader; L->next=NULL; int i; p=L->next; printf("请输入读者号,姓名和性别:\n"); for(i=n;i>0;--i) { p=new Reader; scanf("%s %s %s",p->read_id,p->reader,p->ssex); p->next=L->next; L->next=p; } } //初始添加图书信息(前插法)--单插 Status AddBook(LinkBook &L,ElemType e){ LBook *p; L=new Book; L->next=NULL; int i,j; p=L->next; for(i=0;i<e;i++){ p=new LBook; p->num=p->kucun=0; printf("请选择图书编号和数量:\n"); scanf("%s%d",p->book_id,&j); printf("请插入图书的名字和作者名:\n"); scanf("%s%s",p->book,p->author); p->num+=j; p->kucun+=j; p->next=L->next; L->next=p; } } //Insert 后续添加图书 Status InsertBook(LinkBook &L,char *n,ElemType e) { LBook *p,*s; p=L->next; while(p){ if(strcmp(p->book_id,n)==0){//如果存在过这本书 p->kucun+=e; p->num+=e; return OK; } p=p->next; } p=new LBook; p->num=p->kucun=0; printf("请插入图书的名字和作者名:\n"); scanf("%s%s",p->book,p->author); p->num=e; p->kucun=e; p->next=L->next; L->next=p; } //后续添加读者号 Status InsertReader(LinkReader &L,char *n) { LReader *p,*s; p=L->next; while(p){ if(strcmp(p->read_id,n)==0){//如果读者号已存在 printf("该账户已经被注册!\n"); return OK; } p=p->next; } p=new LReader; strcpy(p->read_id,n); printf("请插入读者的名字和性别:\n"); scanf("%s%s",p->reader,p->ssex); p->next=L->next; L->next=p; } //按图书序号查找图书信息 Status GetBook(LinkBook L,char *n) { LBook *p = L->next; while(p)//p!=NULL { if(strcmp(p->book_id,n)==0) { printf("查找的结果为:\n"); printf("图书序号:%d\n图书名称:%s\n图书作者:%s\n现存量:%d\n库存量:%d\n",p->book_id,p->book,p->author,p->num,p->kucun); printf("------------------>\n"); return OK; } p=p->next; } printf("没找到该图书,请核对输入是否正确\n"); } //搜索图书序号修改图书信息 Status AlterBook(LinkBook L,char *n) { LBook *p = L->next; while(p)//p!=NULL { if(strcmp(p->book_id,n)==0) { printf("图书查到,请修改:\n"); printf("图书序号为:%s\n请修改:",p->book_id); scanf("%s",p->book_id); printf("书名为:%s\n请修改:",p->book); scanf("%s",p->book); printf("作者:%s\n请修改:",p->author); scanf("%s",p->author); printf("现存量和库存量为%d和%d\n请修改:",p->num,p->num); scanf("%d,%d",&p->num,&p->kucun); printf("------------------>\n"); return OK; } p=p->next; } printf("没找着该图书,请重新检查!\n"); return ERROR; } //按读者号查找读者信息 Status GetReader(LinkReader L,char *n) { LReader *p = L->next; while(p)//p!=NULL { if(strcmp(p->read_id,n)==0) { printf("查找的结果为:\n"); printf("读者号:%s\n姓名:%s\n性别:%s\n",p->read_id,p->reader,p->ssex); printf("------------------>\n"); return OK; } p=p->next; } printf("没找到该读者,请核对输入是否正确\n"); } //通过读者号修改读者信息 Status AlterReader(LinkReader L,char *n) { LReader *p = L->next; while(p)//p!=NULL { if(strcmp(p->read_id,n)==0) { printf("读者信息查到,请修改:\n"); printf("读者号:\n"); scanf("%s",&p->read_id); printf("读者名:\n"); scanf("%s",p->reader); printf("读者性别:\n"); scanf("%s",p->ssex); printf("------------------>\n"); return OK; } p=p->next; } printf("没找到该读者,请核对输入是否正确\n"); } //借阅书 Status Borrow(LinkBook &L,LinkReader &S,information &C ){ LBook *p=L->next; LReader *q=S->next; Info *s=C->next; char n[10],m[10]; printf("请输入读者证号和图书号进行借阅:\n"); scanf("%s%s",m,n); while(p){ if(strcmp(p->book_id,n)==0){ s=new Info; strcpy(s->book_id,n); //字符串赋值,需要函数 strcpy(s->book_name,p->book); if(p->kucun>0){//判断是否还有库存 p->kucun--; //借走了,该书库存-1 } else { printf("这本书已经被借完了!\n"); delete s; return ERROR; } break; } p=p->next; } while(q){ if(strcmp(q->read_id,m)==0){ strcpy(s->read_id,m);//字符串赋值 strcpy(s->reader,q->reader); // strcpy(q->borrow_book,p->book); break; } q=q->next; } if(q==NULL){ printf("读者号或者图书号错误,请检查输入是否有误!\n"); return ERROR; } printf("请填写借阅和归还日期:\n"); scanf("%s%s",s->time1,s->time2); s->next=C->next; C->next=s; return OK; } //归还书 Status Return(LinkBook &L,LinkReader &S,information &C ){ LBook *p=L->next; LReader *q=S->next; Info *s=C->next; char n[10],m[10]; printf("请输入读者证号和图书号进行归还:\n"); scanf("%s%s",m,n); while(p){ if(strcmp(p->book_id,n)==0){ s=new Info; strcpy(s->book_id,"已归还"); //原来的信息填写为已归还,做个记录,也可以删掉 都行啊; strcpy(s->book_name,"已归还");//删掉代码:略了 p->kucun++; //归还了,库存+1 Info *S=C; Info *P=S->next; S->next=P->next; delete P; break; while(q){ if(strcmp(s->read_id,m)==0){ // strcpy(q->borrow_book,"暂无"); strcpy(p->book_id,0); return OK; } q=q->next; } } p=p->next; } return ERROR; } //保存到txt中 --路径默认选择到我的桌面,可更改 void saveBook(LinkBook L,LinkReader S,information &C) { FILE *fp=NULL; LBook *p=L->next; LReader *q=S->next; Info *s=C->next; fp=fopen("C:/Users/23211/Desktop/books.txt","w+"); while(p){ fprintf(fp,"%s %s %s %d %d\n",p->book_id,p->author,p->book,p->num,p->kucun); p=p->next; } fp=fopen("C:/Users/23211/Desktop/Readers.txt","w+"); while(q){ fprintf(fp,"%s %s %s\n",q->read_id,q->reader,q->ssex); q=q->next; } fp=fopen("C:/Users/23211/Desktop/Borrow.txt","w+"); while(s){ fprintf(fp,"%s %s %s %s %s %s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2); s=s->next; } printf("更新完成!\n"); } //从文件中读取 void ReadBook(LinkBook L,LinkReader S,information &C) { LBook *p=L->next; LReader *q=S->next; Info *s=C->next; p=new LBook; q=new LReader; s=new Info; FILE * fp=NULL; printf("--------------------------------------------------->\n"); printf("展开图书信息:\n"); fp=fopen("C:/Users/23211/Desktop/books.txt","r"); while(fscanf(fp,"%s%s%s%d%d",p->book_id,p->author,p->book,&p->num,&p->kucun)!=EOF){ printf("图书序号:%s,作者:%s,书名:%s,数量:%d,库存:%d\n",p->book_id,p->author,p->book,p->num,p->kucun); p-p->next; } printf("--------------------------------------------------->\n"); printf("展开读者信息:\n"); fp=fopen("C:/Users/23211/Desktop/Readers.txt","r"); while(fscanf(fp,"%s%s%s\n",q->read_id,q->reader,q->ssex)!=EOF){ printf("读者号:%s,姓名:%s,性别:%s\n",q->read_id,q->reader,q->ssex); // q=q->next; } printf("--------------------------------------------------->\n"); printf("展开借阅信息\n"); fp=fopen("C:/Users/23211/Desktop/Borrow.txt","r"); while(fscanf(fp,"%s%s%s%s%s%s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2)!=EOF){ printf("图书号:%s\n,图书名:%s\n,读者号:%s\n,读者姓名:%s\n,借阅日期:%s\n,归还日期:%s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2); s=s->next; } printf("--------------------------------------------------->\n"); printf("提取完成完成!\n"); } void function(){//功能菜单 printf("<------------------------------------------------>\n"); printf("<-----------0-欢迎来到鳝溪校区阅览室!-0---------->\n"); printf("<------------------------------------------------>\n"); printf("<---------------请选择以下功能------------------->\n"); printf("<---------------1.初始图书信息------------------->\n"); printf("<---------------2.初始读者信息------------------->\n"); printf("<---------------3.查看所有图书信息--------------->\n"); printf("<---------------4.查看所有读者信息--------------->\n"); printf("<---------------5.添加读者借阅信息--------------->\n"); printf("<---------------6.删除读者信息------------------->\n"); printf("<---------------7.删除图书信息------------------->\n"); printf("<---------------8.修改读者信息------------------->\n"); printf("<---------------9.修改图书信息------------------->\n"); printf("<---------------10.查询读者信息------------------>\n"); printf("<---------------11.查询图书信息------------------>\n"); printf("<---------------12.查询借阅信息------------------>\n"); printf("<---------------13.导出读者、图书和借阅信息------>\n"); printf("<---------------14.导入读者,图书和借阅信息------>\n"); printf("<---------------15.查看功能菜单------------------>\n"); printf("<---------------16.添加图书信息------------------>\n"); printf("<---------------17.添加读者信息------------------>\n"); printf("<---------------18.归还图书---------------------->\n"); printf("<-------------------0.退出----------------------->\n"); } void tool(LinkBook L,LinkReader S,information &C){//功能实现 int i,choose; char n[MAXSIZE]; ElemType e; while(1){ printf("请输入你要选择的功能:\n请选择:"); scanf("%d",&choose); switch(choose){ case 1: printf("请插入多少种不同的图书:\n"); scanf("%d",&e); AddBook(L,e); break; case 2: printf("请选择插入读者数量:\n"); scanf("%d",&e); AddReader(S,e); break; case 3: DisBook(L); break; case 4: DisReader(S); break; case 5://添加读者借阅信息 if(Borrow(L,S,C)) printf("添加成功!\n"); else printf("添加失败!\n"); break; case 6: printf("请输入要删除的读者号:\n"); scanf("%s",n); if(DelReader(S,n)){ printf("删除成功!\n"); } else{ printf("该读者号不存在,请检查是否有这个读者号!\n"); } break; case 7: printf("请输入要删除的图书序号:\n"); scanf("%s",n); if(DelBook(L,n)){ printf("删除成功!\n"); } else{ printf("该图书不存在,请检查是否有这个图书号!\n"); } break; case 8: printf("请输入要修改的读者号:\n"); scanf("%s",n); AlterReader(S,n); break; case 9: printf("请输入要修改的图书号:\n"); scanf("%s",n); AlterBook(L,n); break; case 10: printf("请输入要查询的读者号:\n"); scanf("%s",n); GetReader(S,n); break; case 11: printf("请输入要查询的图书序号:\n"); scanf("%s",n); GetBook(L,n); break; case 12://遍历借阅信息 DisBorrow(C); break; case 13://导出读者、图书和借阅信息 saveBook(L,S,C); break; case 14://导入读者、图书和借阅信息 ReadBook(L,S,C); break; case 15://功能菜单 function(); break; case 16: printf("插入图书信息:\n"); printf("请输入图书号和数量:\n"); scanf("%s%d",n,&e); InsertBook(L,n,e); break; case 17: printf("插入读者信息:\n"); printf("请输入读者号:\n"); scanf("%s",n); InsertReader(S,n); break; case 18://归还 Return(L,S,C); break; case 0://退出程序 printf("拜拜!\n"); exit(0); default: printf("不在选择范围内,更多功能请等待扩展。\n请重新选择!\n"); } } } int main() { LinkBook L; LinkReader S; information C; InitReader(S); InitBook(L); Information(C); function(); tool(L,S,C); }
写的比较基础,也更容易扩展。