1、实验1报告 图书管理软件系统的开发 ———————————————————————————————— 作者: ———————————————————————————————— 日期: 31 个人收集整理 勿做商业用途 实验一 管
2、理软件系统的开发 一、实验题目: 设计一个简单实用图书管理系统。 二、实验要求 1.该实验的课内学时是4个课时。 2.程序完成后应该完成如下基本功能: 1)用自定义结构体typedef struct设计该软件的数据结构; 2)用链表将所有的图书按照图书编号顺序链接起来。 3)程序能够输入图书名称、图书编号、ISBN号、单价、作者、出版社。 4)程序能够显示已经输入的指定图书编号的图书的信息。 5)程序能够统计某一类图书(ISBN号相同)的数量. 6)能够判断输入的ISBN号以及图书编号的有效性。 3. 1)程序能够按要求显示指定作者或者指定出版社的图书的数量。 2)
3、允许添加、修改、删除图书信息。 3)设计一个通用模块,能够根据图书的任何一项信息进行排序,并且根据图书编号进程排序(升序或者降序)。 4)能够输入的数据长期存储在文件中,再次运行程序时从文件中读取数据,无须重复输入。 5)在程序的提示语言清晰明确,界面美观并且适用. 三、层次及模块分析 借书 还书 上架新书信息录入 部分图书信息修改 下架图书信息删除除 操作选择菜单 图书信息查询 所有图书信息以文件形式输出保存与从外界文件加载 图书管理系统 1、图书编号输入 2、图书ISBN输入 3、图书编号生成 4、图书名称输入 5、图书作者输入 6、图书出版社输入
4、 7、图书价格输入 8、图书总册数及借出册数输入 9、图书信息地址查询 10、图书信息输出 11、图书排序 12、图书借阅信息输入 13、读者编号输入 14、读者信息地址查询 1、9、12、13、14 1、9、12、13、14 3、2、4、5、6、7、8、 1、9、15 1、9、2、4、5、6、7、8、12 1、9、11、10 15、图书信息删除 三、主要模块设计 Book,*BookList; //图书(列表)数据类型 typedef struct node4 { char ReaderName[10];//读者姓名 int
5、ReaderNo,Rented;//读者编号、借书数量 ReadInfoList readinfo;//借书信息 struct node4*Next;//下一读者 } Reader,*ReaderList; //读者(列表)数据类型 //全局变量 BookList L; ReaderList R; //函数声明 void mainmenu(); void Exit(); void RentBook(); void ReaderNoInput(); Book *BookNoSearch(int BookNo); Reader *ReaderNoSea
6、rch(int ReaderNo); void DateInput(Date*d); void BackBook(); void InfoWriteMenu(); void BookNoInput(Book* writebook); void ISBNInput(Book* writebook); void PriceInput(Book* writebook); void BookNameInput(Book* writebook); void AuthorInput(Book* writebook); void PublisherInput(Book* writebook
7、 void RentInfoWrite(Book* writebook); void BookInfoResearch(); void BookNoResearch(); void BookInfoPrn(Book*B); void ISBNResearch(); Book *ISBNSearch(int isbn); void BookNameResearch(); void BookResort(BookList L); void ResortbyBookNo(BookList L); void ResortbyISBN(BookList L); void Res
8、ortbyBookName(BookList L); void ResortbyAuthor(BookList L); void ResortbyPublisher(BookList L); void ResortbyPrice(BookList L); void AuthorResearch(); void PublisherResearch(); void PriceResearch(); void AddBook(); void DeleteBook(); void BookInfoLoad(); void ReaderInfoLoad(); //主菜单设计 vo
9、id mainmenu() { int OpratNo; printf(”********欢迎使用图书管理系统——揽月制作********\n\t请输入所选操作的序号加回车结束!\n\t1——〉借书!\n\t2—-〉还书!\n\t3—->图书信息修改!\n\t4-—〉图书信息查询!\n\t5—-〉新书上架信息录入!\n\t6-—>下架图书信息删除!\n\t7——>退出图书管理系统!\n"); scanf(”%d”,&OpratNo); switch(OpratNo) { case 1: RentBook();
10、 break; case 2: BackBook(); break; case 3: InfoWriteMenu(); break; case 4: BookInfoResearch(); break; case 5: AddBook(); break; case 6: DeleteBook(); break; case 7:
11、 Exit(); } } //退出系统 void Exit() { printf(”退出系统成功!下次再见!\n"); return; } //借书模块 void RentBook() { Book*book; Reader*reader; book=(Book*)malloc(sizeof(Book)); reader=(Reader*)malloc(sizeof(Reader)); Book*rentbook; Reader*bookreader; RentIn
12、fo*R1,*R2; ReadInfo*r1,*r2; int OprNo; printf(”您将进行借书操作请按提示操作!\n”); printf(”请输入所借图书的编号!\n"); BookNoInput(book);//图书编号输入 rentbook=BookNoSearch(book—〉BookNo);//按编号查询图书信息存储地址 if(rentbook) { rentbook->Rented++;//借出册数加1 R2=(RentInfo*)malloc(sizeof
13、RentInfo)); R1=rentbook-〉rentinfo->Next; while(R1-〉Next) { R1=R1-〉Next; } R1->Next=R2; R2—〉Next=NULL; printf("请输入借书读者编号!”); ReaderNoInput(reader);//读者编号输入 bookreader=(Reader*)ReaderNoSearch(reader—〉ReaderN
14、o);//按读者编号搜索读者信息存储地址 if(bookreader) { bookreader-〉Rented++;//借书册数加1 r2=(ReadInfo*)malloc(sizeof(ReadInfo)); r1=bookreader->readinfo->Next; while(r1->Next) { r1=r1->Next; } r1
15、>Next=r2; r2—>Next=NULL; R2—>BookReader=bookreader; r2-〉RentedBook=rentbook; printf(”请输入借书年、月、日!"); DateInput(&R2—〉RentDate);//日期输入 printf(”请再次输入借书年、月、日!”); DateInput(&r2->RentDate);//日期输入 free(b
16、ook); free(reader); printf("借书操作完成!"); } else printf(”借书操作失败!\n”); } else printf(”借书操作失败!\n"); printf("继续借书请按1加回车,返回主菜单请按2加回车,退出管理系统请按3加回车!"); scanf(”%d”,&OprNo); switch(OprNo) { case 1: RentBook(); brea
17、k; case 2: mainmenu(); break; case 3: Exit(); } } //读者编号输入模块 void ReaderNoInput(Reader*writereader) { scanf(”%d”,writereader—>ReaderNo); } //按编号查询图书信息存储地址模块 Book*BookNoSearch(int BookNo) { Book *B; while(B—>BookNo!=BookNo&&B->Next)
18、 { B=B—〉Next; } if(B->BookNo=BookNo)return B; else { printf("该编号图书不存在!\n”); return NULL; } } //按编号查询读者信息存储地址模块 Reader*ReaderNoSearch(int ReaderNo) { Reader*r=R; if(r—>Next!=NULL) { r=r-〉Next; while(r—>Reade
19、rNo!=ReaderNo&&r->Next)r=r->Next; if(r-〉ReaderNo=ReaderNo)return r; else { printf("该编号读者不存在!\n”); return NULL; } } } //日期输入模块 void DateInput(Date* d) { printf("请输入年、月、日以空格间隔回车结束!\n"); scanf("%d %d %d”,d—〉year, d—〉month,
20、d—〉day); } //还书模块设计 void BackBook() { //int bookno,rederno; Book*backbook; Book*booksign; Reader*bookreader; Reader*readersign; RentInfo*R1,*R2; ReadInfo*r1,*r2; int OprNo; booksign=(Book*)malloc(sizeof(Book)); readersign=(Reader*)malloc(sizeof(R
21、eader)); printf("您将进行还书操作请按提示操作!\n"); printf("请输入所还图书的编号!\n"); BookNoInput(booksign);//图书编号输入 backbook=BookNoSearch(booksign->BookNo);//按编号查询图书信息存储地址 printf(”请输入借书读者编号!”); ReaderNoInput(readersign);//读者编号输入 bookreader=(Reader*)ReaderNoSearch(readersign-〉ReaderNo);/
22、/按读者编号搜索读者信息存储地址 if(backbook&&bookreader) { R2=backbook—>rentinfo; R1=R2—>Next; r2=bookreader-〉readinfo; r1=r2—〉Next; while(R1-〉BookReader!=bookreader&&R1-〉Next) { R2=R1; R1=R1—〉Next; } while(
23、r1-〉RentedBook!=backbook&&r1—〉Next) { r2=r1; r1=r1—〉Next; } if(r1-〉RentedBook==backbook&&R1—>BookReader==bookreader) { backbook—>Rented-—; bookreader—>Rented--; R2->Next=R1—〉Next; free(R
24、1); r2->Next=r1—〉Next; free(r1); printf(”还书操作完成!\n"); } else printf("输入错误还书操作失败!\n”); } printf(”继续还书请按1加回车,返回主菜单请按2加回车,退出管理系统请按3加回车!”); scanf(”%d”,&OprNo); switch(OprNo) { case 1: BackBook(); bre
25、ak; case 2: mainmenu(); break; case 3: Exit(); } } //图书信息修改菜单 void InfoWriteMenu() { int OprNo; int writebookno; Book*writebook; printf("请输入要修改信息的图书的编号加回车结束!\n”); scanf("%d",&writebookno); writebook=(Book*)BookNoSearch(write
26、bookno); printf(”请输入所要修改内容的序号加回车结束!\n1—-〉修改图书编号!\n2—->修改ISBN号!\n3-->修改书名!\n4——>修改图书作者!\n5—->修改图书出版社!\n6-—>修改图书单价!\n7-->修改图书外借信息!8-->返回主菜单!\n9-->退出图书管理系统!\n”); scanf("%d",&OprNo); switch(OprNo) { case 1: printf(”请输入图书编号以回车结束!\n"); BookNoInput(writebook);
27、 printf(”图书信息修改完成!\n”); break; case 2: printf("请输入图书ISBN号以回车结束!\n”); ISBNInput(writebook); printf(”图书信息修改完成!\n"); break; case 3: printf(”请输入图书名称以#号结束!\n"); BookNameInput(writebook); printf("图书信息修改完成!\n”);
28、 break; case 4: printf(”请输入图书作者以#号结束!\n"); AuthorInput(writebook); printf("图书信息修改完成!\n”); break; case 5: printf(”请输入图书出版社以#号结束!\n”); PublisherInput(writebook); printf(”图书信息修改完成!\n"); break; case 6: printf
29、"请输入图书价格回车结束!\n"); PriceInput(writebook); printf(”图书信息修改完成!\n"); break; case 7: printf(”请输入图书外借信息!\n"); RentInfoWrite(writebook); printf("图书信息修改完成!\n"); break; case 8: mainmenu(); break; case 9:
30、 Exit(); break; default: printf("输入错误返回图书信息修改菜单!\n”); InfoWriteMenu(); } } //图书编号输入模块 void BookNoInput(Book* writebook) { scanf(”%d",writebook—>BookNo); } //ISBN号输入模块 void ISBNInput(Book* writebook) { scanf(”%d",writebook-〉ISBN); } //图书价格输入模块
31、 void PriceInput(Book* writebook) { scanf(”%d",writebook->Price); } //图书名称输入模块 void BookNameInput(Book* writebook) { char c; int i; scanf("%c”,&c); for(i=0; c!='#’; i++) { writebook—〉BookName[i]=c; scanf(”%c”,&c); } writebook->BookName[i
32、]=’\0'; } //图书作者输入模块 void AuthorInput(Book* writebook) { char c; int i; scanf(”%c",&c); for(i=0; c!=’#'; i++) { writebook-〉Author[i]=c; scanf(”%c”,&c); } writebook->Author[i]=’\0’; } //图书出版社输入模块 void PublisherInput(Book* writebook) {
33、char c; int i; scanf("%c”,&c); for(i=0; c!=’#’; i++) { writebook—>Publisher[i]=c; scanf("%c",&c); } writebook-〉Publisher[i]='\0’; } //图书外借信息修改模块 void RentInfoWrite(Book*writebook) { int count,readerno; RentInfo*R; //Reader*re; p
34、rintf(”请输入该书外借的册数!\n”); scanf("%d",writebook-〉Rented); for(count=0; count〈writebook—〉Rented; count++) { printf(”请输入第%d册图书借出日期!\n",count+1); R=(RentInfo*)malloc(sizeof(RentInfo)); writebook->rentinfo—〉Next=R; DateInput(&R—〉RentDate); printf(
35、"请输入第%d册图书借阅者的读者编号!\n”,count+1); scanf("%d",&readerno); R—〉BookReader=(Reader*)ReaderNoSearch(readerno); } } //图书信息查询 void BookInfoResearch() { int OprNo;//操作序号 printf(”您将进行图书信息查询操作请按提示进行操作!\n请输入所选操作的序号加回车结束!\n"); printf(”1-->查询所输入图书编号的所有图书!\n”); printf
36、"2——〉查询所输入ISBN号的所有图书!\n"); printf("3—-〉查询所输入书名的所有图书!\n"); printf("4-->查询所输入作者的所有图书!\n”); printf(”5-—〉查询所输入出版社的所有图书!\n”); printf(”6—-〉查询所输入价格的所有图书!\n”); printf(”7-—〉返回主菜单!\n"); printf("8—-〉退出图书管理系统!\n”); scanf(”%d”,&OprNo); switch(OprNo) { case 1:
37、 BookNoResearch(); break; case 2: ISBNResearch(); break; case 3: BookNameResearch(); break; case 4: AuthorResearch(); break; case 5: PublisherResearch(); break; case 6: PriceResea
38、rch(); break; case 7: mainmenu(); break; case 8: Exit(); break; default: printf("输入错误请重新输入!\n"); BookInfoResearch(); } } //查询所输入图书编号的所有图书 void BookNoResearch() { Book*B,*C; C=(Book*)malloc(sizeof(Book)
39、 BookNoInput(C); B=BookNoSearch(C—〉BookNo); BookInfoPrn(B); } //图书信息输出模块 void BookInfoPrn(Book*B) { int avilable,count; RentInfo *info; if(B) { avilable=B—>Total-B—〉Rented; printf(”图书编号:%017d图书ISBN号:%017d图书名称:%10s图书作者:%10s图书出版社:%10s图书价格:%04d
40、图书馆藏册数:%03d图书已借出册数:%03d图书可借册数:%03d\n",B-〉BookNo,B—〉ISBN,B—〉BookName,B—>Author,B-〉Publisher,B—>Price,B—〉Total,B-〉Rented,avilable); info=B->rentinfo-〉Next; for(count=1; count〈=B—〉Rented; count++) { printf(”第%03d位借阅者的借书日期:%4d年%2d月%2d日 借书读者编号:%010d借书读者姓名%4s\n”,inf
41、o—〉RentDate.year,info-〉RentDate.month,info->RentDate。day,info-〉BookReader—>ReaderNo,info—>BookReader->ReaderName); info=info->Next; } } } //查询所输入ISBN号的所有图书! void ISBNResearch() { Book*B,*C; C=(Book*)malloc(sizeof(Book)); ISBNInput(C); //printf(”请输入查
42、询结果的显示的排序方式!\n1——〉按编号升序排序显示!\n2-->按ISBN升序显示!\n3——>按书名ascii码升序显示!\n4——〉按作者的ascii码升序排序!\n5-—〉按出版社的ascii码升序显示!\n6——〉按价格升序显示!\n") B=ISBNSearch(C-〉ISBN); BookInfoPrn(B); } //按ISBN号查询图书信息存储地址模块 Book*ISBNSearch(int isbn) { Book*B=L; while(B—〉ISBN!=isbn&&B-〉Next) { B=B-
43、>Next; } if(B->ISBN=isbn)return B; else { printf(”该ISBN号图书不存在!\n"); return NULL; } } //查询所输入书名的所有图书! void BookNameResearch() { Book*B1,*B2; int flag,count=0; B1=(Book*)malloc(sizeof(Book)); printf(”请输入要查询的书名!\n"); BookNameInput(
44、B1); BookResort(L); B2=L—>Next; flag=0; while(B2—〉Next) { if(strcmp(B2-〉BookName,B1—>BookName)==0) { BookInfoPrn(B2); flag=1; count++; } B2=B2—>Next; } if(!flag)printf(”所输入书名的图书不存在!\n");
45、 else printf("共搜索到%d本所输入书名的图书所有信息如上所示!\n”,count); free(B1); } //图书信息存储链表排序 void BookResort(BookList L) { int OprNo; printf(”请选择图书的排序方式(输入操作序号加回车结束)!\n1——>按编号升序排序显示!\n2-->按ISBN升序显示!\n3-—〉按书名ascii码升序显示!\n4——>按作者的ascii码升序排序!\n5——>按出版社的ascii码升序显示!\n6——>按价格升序显示!\n”); scanf("%d”,&
46、OprNo); switch(OprNo) { case 1: ResortbyBookNo(L); break; case 2: ResortbyISBN(L); break; case 3: ResortbyBookName(L); break; case 4: ResortbyAuthor(L); break; case 5: ResortbyPublishe
47、r(L); break; case 6: ResortbyPrice(L); break; default: printf("输入错误重新选择!\n"); } } //按编号升序排序! void ResortbyBookNo(BookList L) { Book*B1,*B2,*B3;//B1标记插入位置的前一节点 B2标记进行插入的节点 B3标记下一进行排序的节点 if(L-〉Total〉1) { B2=L->Next—>Next;
48、 B3=B2-〉Next; L—>Next-〉Next=NULL; do { B1=L-〉Next; while(B2->BookNo>=B1-〉Next->BookNo&&B1—>Next-〉Next)B1=B1—>Next; if(B2—>BookNo〉=B1—〉Next-〉BookNo) { B2—〉Next=B1-〉Next; B1—>Next=B2
49、 } else { B2—>Next=B1—〉Next-〉Next; B1—>Next->Next=B2; } B2=B3; B3=B3—〉Next; } while(B2=NULL); } else printf("馆藏图书不足两册无需排序!\n"); } //按ISBN升序排序! void Resortby
50、ISBN(BookList L) { Book*B1,*B2,*B3;//B1标记插入位置的前一节点 B2标记进行插入的节点 B3标记下一进行排序的节点 if(L—>Total>1) { B2=L->Next->Next; B3=B2->Next; L-〉Next-〉Next=NULL; do { B1=L—〉Next; while(B2-〉ISBN〉=B1-〉Next—>ISBN&&B1-〉Next-〉Next)B1=B






