课 程 报 告
课 程 名 称: 程序设计实践 专 业 班 级 : 信息类1109 学 生 姓 名 : 马占英 学 号 : 201116910924 任 课 教 师 : 陈为东 学 期 :20101-2012学年第二学期
1
课程报告任务书
题 目 图书信息管理系统 开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。使之能提供以下基本功能: (1)图书信息录入功能(图书信息用文件保存)--输入 (2)图书信息浏览功能--输出 主要 (3)查询功能(至少一种查询方式)、排序功能(至少一种排序方式): ①按书名查询 ②按作者名查询 ③ 按照价钱排序 ④按出版时间排序等等 内容 (4)图书信息的删除与修改 扩展功能:可以按照自己的程度进行扩展。比如(1)简单的权限处理 (2)报表打印功能(3)甚至根据自己情况,可以加上学生信息,并扩充为图书借阅系统。(4)模糊查询 (5)综合查询 (6)统计功能 比如统计处某一类别的图书信息 或 筛选出小于指定数量库存的图书信息等等,总之,可以根据自己需求进行分析功能。 一、提交材料应包括:(1)系统源代码 (2)课程报告 二、整个设计过程具体要求 (1)需求分析 要求学生对案例系统进行分析,设计出需要完成的功能,完善任务 要求 各个模块的调用关系; (2)设计过程 要求学生进一步明确各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等) (3)实现过程 要求学生养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试; (4)总结阶段 按照要求完成系统设计和实现报告,并进行总结、答辩。 报告撰写情况(30分) 系统完成情况(30分) 答辩情况(40分) 内容 规范程度 程序测试 基本功能扩展功能自述情况答辩情况 20分 5分 5分 20分 10分 10分 30分 总分 成绩 评定 成绩评定教师:
2
1 需求分析
3
系统主要实现书籍管理、读者管理和借阅管理等主要的图书管理功能。 (1)图书管理
图书类别管理:增、删除、改等管理。
图书信息管理:新书入库,图书购入后由图书管理人员将书籍编码并将其具体信息录入书籍信息表。书籍信息修改,书籍信息由于工作人员的疏忽而出现错误时,可修改其信息。管理员按不同方式查询、统计,读者按不同方式查询。 出版社信息管理:增、删除、改等管理。
图书注销:某一部分图书会随着时间的增长及知识的更新而变得不再有使用的价值,或者图书被损坏,这些图书就要在图书籍信息表中的除去。即从书籍信息表中删去此书籍记录。 (3)读者管理
读者类别信息管理:增、删除、改等管理。
读者信息管理:办理、挂失、暂停借、注销阅卡,录入、修改、删除读者信息。 (4)借阅管理
续借管理:提供读者在符合规定的情况下网上续借。
还书管理:根据借阅卡编号、图书ID等,在借阅信息表中找到相应的记录,将借书记录删除,更新该记录的相应数据(图书信息表)。根据违反规定情况计算和登记罚款记录。
借书管理:根据借阅卡编号和图书编号,进行借书登记。在借阅信息表中插入一条借书记录,该记录包括读者ID、图书ID、借出日期、借阅编号、操作员等信息,更新该记录的相应数据(图书信息表)。把超期图书以列表的形式显示出来,并以电子邮件或打印成书面通知读者。提供读者网上查询自己的借阅情况(包括超期提示).
4
2 概要设计
⑴ 数据结构
源程序包含两个结构体 mbook和 mlibrary。其中mbook结构体中包括图书
的序号num[],书名name[],作者author[],出版社publish[50],图书类别leibie[],图书价格price。mlibrar结构体中包括图书本数book[100]
⑵ 模块划分
主函数模块: void main()此模块通switch语句和函数调用功能实现各图
书管理功能。
图书信息保存模块:void save()此模块通过文件的打开和写入将信息保存至
library.txt文档。
图书信息录入模块:void putin()此模块结合void save()函数实现图书信息录入功能。
图书信息浏览模块:void lookup()此模块通过输出函数printf()将图书信息输出。
按图书名查询模块:void search_by_name()此模块通过for循环和字符串对
比函数strcmp(),实现按图书名查询的功能。设置变量S2用于存放用户输入的图书名,当S2和library.book[i].name相等时,即可输出要查询的图书信息
按作者名查询模块: void search_by_author()此模块通过for循环和字符串
对比函数strcmp(),实现按作者名查询功能。
查询功能选择模块:void search()此模块通过switch语句实现查询功能的选择。
5
图书信息删除模块:void dei()此模块通过字符串对比函数strcmp(),要删
除的图书,再通过字符串复制函数strcpy()将图书信息删除。
图书信息修改模块:void update()此模块通过字符串对比函数strcmp(),
找到要修改的图书,再通过字符串复制函数strcpy()修改图书信息
读者登录模块: void zuzhe() 此模块通过if条件语句实现读者登录功能。
读者功能菜单: void dumenu() 此模块通过switch语句实现图书管理功能
的选择,具体功能包括图书的浏览,查询,排序。
结构框架
6
开始 显示图书管理界功能选择 修改界面 查询界面 删除界面 退出界面 填写查选择要删除的记录 功能选择 询条件 返回主系统界面 图书编号是否存在? 查询在“借阅信息表”查询该书的借阅Y 结果 提示图书编号已存在 记录值 借阅记Y 录>0? N 提示“图书已借出,不能删除” 确定删除Y 吗? 提示“图书删除成功“ N
3 详细设计(小三黑体)
#include #include 7 #include {int num; /*图书号*/ char name[20]; /*书名*/ char zuozhe[20]; /*作者姓名*/ char chubanshe[20]; /*出版社*/ int price; /*价格*/ }BOOKS; int read_file(BOOKS books[]) { FILE *fp; int i=0; if((fp=fopen(\"project choose.txt\ { printf(\"\\n\\n*****库存文件不存在!请创建\"); return 0; } while(feof(fp)!=1) { fread(&books[i],sizeof(BOOKS),1,fp); if(books[i].num==0) break; else i++; } fclose(fp); return i; } 8 void save_file(BOOKS books[],int sum) { FILE *fp; int i; if((fp=fopen(\"project choose.txt\ { printf(\"读文件错误!\\n\"); return; } for(i=0;i /*输入模块*/ ⑴ 图书信息录入和保存 该程序创建一个文件,通过输入函数录入图书信息,并通过save()函数将图书信息保存至文件。 int input(BOOKS books[]) { int i=0; system(\"cls\"); printf(\"\\n\\n 录入图书信息 (最多%d种)\\n\ printf(\"----------------------------------------------------\\n\"); do { printf(\"\\n 第%d本图书\ printf(\"\\n 图书编号:\"); scanf(\"%d\ 9 if(books[i].num==0) break; printf(\"\\n 图书名称:\"); scanf(\"%s\ printf(\"\\n 作者:\"); scanf(\"%s\ printf(\"\\n 出版社:\"); scanf(\"%s\ printf(\"\\n 图书价格:\"); scanf(\"%d\ i++; }while(i ⑵ 图书信息浏览 /*输出模块*/ 该程序通过基本输出函数printf(),将图书信息输出。 void output(BOOKS books[]) {int i=0,j=0,page=1; system(\"cls\"); 10 printf(\"\\n\\n --图书信息表-- 第%d页\\n\\n\ printf(\"图书编号----图书名称-----作者----- 出版社-----图书价格\\n\"); printf(\"-------------------------------------------------------\\n\"); do { if(books[i].num!=0) { j++; if(j%PAGE!=0) { printf(\"%4d %10s %10s %10s %8d \\n\ books[i].zuozhe, books[i].chubanshe,books[i].price); printf(\"------------------------------------------------------\\n\"); } else { printf(\"按任意键继续!\"); getchar(); system(\"cls\"); printf(\"\\n\\n --图书信息表-- 第%d页\\n\\n\ printf(\"图书编号--图书名称--作者-- 出版社--图书价格\\n\"); printf(\"------------------------------------------\\n\"); printf(\"%4d \\n\ books[i].zuozhe, books[i].chubanshe,books[i].price); printf(\"---------------------------------------------\\n\"); } } i++; }while(books[i].num!=0); printf(\"按任意键返回主菜单!\"); getchar( ); 11 %10s %10s %10s %8d } /*给定编号,作者,出版社查找信息模块*/ void find_by_num(BOOKS books[],int sum) { int i,find_num; system(\"cls\"); printf(\"\\n 请输入要查找的图书编号:\"); fflush(stdin); scanf(\"%d\ for(i=0;i printf(\"这是您所查找到的图书:\\n\"); printf(\"图书编号----图书名称----作者---- 出版社---图书价格\\n\"); printf(\"------------------------------------------\\n\"); printf(\"%4d \\n\ books[i].zuozhe, books[i].chubanshe,books[i].price); printf(\"---------------------------------------------\\n\"); break; } else { printf(\"\\n 未找到要查找的图书信息,按任意键返回!\"); getchar(); %10s %10s %10s %8d 12 system(\"cls\"); } fflush(stdin); getchar(); } void find_by_zuozhe(BOOKS books[],int sum) { int i; char find_zuozhe[20]; system(\"cls\"); printf(\"\\n 请输入要查找的作者姓名:\"); scanf(\"%s\ for(i=0;i printf(\"图书编号--图书名称--作者-- 出版社--图书价格\\n\"); printf(\"------------------------------------------\\n\"); printf(\"%8d %10s %10s %10s %8d \\n\ books[i].zuozhe, books[i].chubanshe,books[i].price); printf(\"---------------------------------------------\\n\"); } else 13 {printf(\"\\n 未找到要查找的图书信息,按任意键返回!\"); getchar(); system(\"cls\"); } } void find_by_chubanshe(BOOKS books[],int sum) { int i; char find_chubanshe[20]; system(\"cls\"); printf(\"\\n 请输入要查找的出版社名称:\"); scanf(\"%s\ for(i=0;i printf(\"图书编号--图书名称--作者-- 出版社--图书价格\\n\"); printf(\"------------------------------------------\\n\"); printf(\"%8d %10s %10s %10s %8d \\n\ books[i].zuozhe, books[i].chubanshe,books[i].price); printf(\"---------------------------------------------\\n\"); } else {printf(\"\\n 未找到要查找的图书信息,按任意键返回!\"); 14 getchar(); system(\"cls\"); } } void find(BOOKS books[],int sum) { int choice; system(\"cls\"); printf(\"\\n 您要按照哪种方式查找? \\n\"); printf(\"\\n 1.按图书编号查找 \\n\"); printf(\"\\n 2.按图书作者查找 \\n\"); printf(\"\\n 3.按出版社查找 \\n\"); printf(\"\\n 0. 退出\\n\"); printf(\"\\n 请选择(0-3): \\n\"); scanf(\"%d\ switch(choice) { case 1: find_by_num(books,sum); break; case 2: find_by_zuozhe(books,sum); break; case 3: find_by_chubanshe(books,sum); break; case 0: break; } } /*删除信息模块*/ void del(BOOKS books[]) { int i,g,sum; int del_num; 15 { system(\"cls\"); printf(\"\\n 请输入要删除的图书编号:\"); scanf(\"%d\ fflush(stdin); getch(); for(i=0;i printf(\"这是您所要删除图书信息:\\n\"); printf(\"图书编号----图书名称----作者---- 出版社----图书价格\\n\"); printf(\"----------------------------------------------------\\n\"); printf(\"%8d \\n\ books[i].zuozhe, books[i].chubanshe,books[i].price); printf(\"-----------------------------------------------------\\n\"); fflush(stdin); getch(); printf(\"您确认要删除吗?\"); printf(\"按任意键继续!\"); getchar(); 16 %10s %10s %10s %8d fflush(stdin); getch(); printf(\"已成功删除图书信息!\"); } books[i].num=0; } } /*信息修改模块*/ void modify(BOOKS books[],int sum) {int i=0,choice,modify_num,flag; do {system(\"cls\"); printf(\"请输入要修改的图书编号:\"); scanf(\"%d\ for(i=0;i { printf(\"\\n\\n --图书信息-- \\n\\n\"); printf(\"图书编号----图书名称----作者---- 出版社----图书价格\\n\"); printf(\"------------------------------------------\\n\"); printf(\"%8d %10s %10s %10s %8d \\n\ books[i].zuozhe, books[i].chubanshe,books[i].price); printf(\"---------------------------------------------\\n\"); printf(\"\\n 您要修改哪一项?\\n\"); printf(\"\\n 1.图书名称\\n\"); printf(\"\\n 2.作者\\n\"); printf(\"\\n 3.出版社\\n\"); printf(\"\\n 4.图书价格\\n\"); 17 printf(\"\\n 请选择(1-4):\\n\"); scanf(\"%d\ switch(choice) { case 1: printf(\"\\n 请输入修改后的图书名称:\"); scanf(\"%s\ case 2: printf(\"\\n 请输入修改后的作者姓名:\"); scanf(\"%s\ case 3: printf(\"\\n 请输入修改后的出版社名称:\"); scanf(\"%s\ case 4: printf(\"\\n 请输入修改后的图书价格:\"); scanf(\"%d\ } fflush(stdin); getch(); printf(\"\\n\\n --图书信息-- \\n\\n\"); printf(\"图书编号----图书名称----作者---- 出版社----图书价格\\n\"); printf(\"--------------------------------------------\\n\"); printf(\"%8d %10s %10s %10s %8d \\n\ books[i].zuozhe, books[i].chubanshe,books[i].price); printf(\"---------------------------------------------\\n\"); break; } else {printf(\"\\n 该书不存在!\"); getchar(); } printf(\"\\n 修改成功!\\n\"); printf(\"您要继续修改吗?(Y/N)\"); 18 if (choice=='Y'||choice=='y') { flag=1; printf(\"\\n 继续!\\n\"); } else flag=0; }while( flag==1); fflush(stdin); getch(); printf(\"\\n 按任意键返回主菜单!\"); getchar(); } /*图书信息统计模块*/ void count(BOOKS books[],int sum) /*统计某个出版社的图书数*/ { int i; char count_chubanshe[20]; int n=0; system(\"cls\"); printf(\"请输入一个出版社名称:\\n\"); fflush(stdin); scanf(\"%s\ for(i=0;i 19 } fflush(stdin); printf(\"统计出属于该出版社一共有%d本书\\n\ getch(); } /*排序模块*/ void sort(BOOKS books[],int sum) /*按图书编号排序模块*/ {BOOKS t; int i,j,k; system(\"cls\"); printf(\"\\n --图书信息-- \\n\"); printf(\"\\n 排名 图书编号 图书名称 作者 社 图书价格\\n\"); for(i=0;i {t=books[j]; 20 出版 books[j]=books[k]; books[k]=t; } } for(i=0;i %8d %12s %12s %12s \\n\ books[i].zuozhe, books[i].chubanshe,books[i].price); } fflush(stdin); getch(); } void main() { BOOKS books[M]; int choice,sum; sum=read_file(books); if (sum==0) {printf(\"请录入基本图书信息!*******\\n\"); getch(); sum=input(books); } do { system(\"cls\"); printf(\"\\n\\n\\n *******图书馆理系统******* \\n\\n\"); printf(\" 1.修改图书信息 \\n\\n\"); printf(\" 2.删除图书信息\\n\\n\"); printf(\" 3.查找图书信息\\n\\n\"); %6d 21 printf(\" 4.统计图书信息\\n\\n\"); printf(\" 5.图书排行信息\\n\\n\"); printf(\" 0.退出系统\\n\\n\"); printf(\" 请选择\\n\\n\"); scanf(\"%d\ switch(choice) { case 1 : modify(books,sum); break; case 2 : del(books); break; case 3 : find(books,sum); break; case 4 : count(books,sum); break; case 5 : sort(books,sum); break; case 0 : break; } }while(choice!=0); save_file(books,sum); } 4 调试分析(小三黑体) 调试过程中有以下问题: 问题(1):在浏览图书信息时,屏幕显示图书信息的时间很短,只是一闪而过, 然后会自动返回功能菜单。 解决办法:在显示完图书信息后,增加一个getchar()函数来延缓返回时间, 然后通过按任意键返回功能菜单。 问题(2): 在定义排序函数时,定义了一个float类型的指针temp,导致函数中 冒泡排序无法实现 解决办法:将指针temp的类型由floate改为mbook。(mbook是之前定义的图 书结构类型) 问题(3): 当选择某一功能后,之后的输入输出信息会在同一界面内显示,导 致界面信息混乱。 解决办法:采用system(“cls”)进行清屏,然后逐层显示信息,使信息清晰 明了。 问题(4):编译的时候有一个错误导致无法连接。 解决办法:发现主函数缺少最后一个分号,加上后错误消失。 22 5测试结果 (小三黑体) 测试数据组 图书号 图书名 作者 出版社 价格 1 英语 李华 人民出版社 20 2 新文学 王凯 人民出版社 30 3 数学 王伟 人民出版社 40 图书信息录入界面 23 管理员功能菜单界面 查询界面 24 删除界面 图书信息修改界面 25 图书信息浏览界面 6 课程心得总结(小三黑体,另起一页) 在对管理信息系统的开发过程有了基本了解后,系统基本实现了内部图书借阅管理的系统化、规范化和自动化。添加借阅人以及注销借阅人。图书的借阅、归还。可以按作者、图书名等信息对图书进行查询。能够对使用该管理系统的用户进行管理。 系统分:图书管理、图书查询、图书租借、证件管理、帮助信息等五个模块。进一步深入学习了数据库。数据查询、插入、更新、删除都用函数实现,进而实现模块化处理,数据库连接都是使用代码。这对我们来说是一次尝试与创新的过程,也可以说是一个挑战的过程,毕竟以前没有作过,缺少经验。现在利用自己学到的知识设计并制作一个图书管理系统,这本身就是一个知识转化为生产力的过程,所以很兴奋,投入了很高的热情与努力。在具体的设计与实施中,我们看到并感受到了一个管理系统从无到有的过程,对具体的设计步骤、思路、方法、技巧都有了进一步的了解,并感受深刻。在设计中我基本能按照规范的方法和步骤进行,首先对现有的系统进行调查,并查阅有关资料,最后确定设计方案,然后设计并制作,实施过程中我深刻的认识到认真执行管理系统软件标准的重要性,我由于对管理系统软件相关的标准和规范不太了解,缺少行为操作准则,所以在设计中手法比较生硬,主与次也没能很好把握住。 经过课堂理论课程的学习,以及这次课程设计的实践,极大的丰富了自身的理论基础,并且也具备了一些处理简单问题的能力,在老师的指导下去完成一个具有挑战性的,其具体应用及社会服务相结合的项目,深知通过对它的开发,将对我的能力有更高层次的突破。通 26 过对该系统的设计、开发和调试,一方面让我了解了数据库系统的开发过程与方法,另一方面,让我初步掌握了PowerBuilder开发工具的使用方法,熟悉了窗口、菜单以及一些可视化控件的使用方法。通过使用还了解到窗口对象、数据窗口对象、各类控件的属性与方法。同时,在制作过程中遇到了不少问题和困难,但通过查阅相关资料,通过同学们之间的交流,得到了不小的帮助! 27 28 因篇幅问题不能全部显示,请点此查看更多更全内容