c语言课程设计--图书管理系统.docx
内蒙古科技大学课程设计说明书内蒙古科技大学本科生课程设计说明书题 目:C语言课程设计 图书管理系统学生姓名:学 号:专 业:软件工程班 级:软件一班指导教师:日 期: 2016 年 1月 3 日22内蒙古科技大学课程设计任务书课程名称C语言课程设计设计题目图书管理系统 指导教师 时间2016.1.52016.1.9一、教学要求1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力二、设计资料及参数每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。学生选修课程管理系统设计假定有n门课程,每门课程有课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。试设计一选修课程系统,使之能提供以下功能:v 课程信息录入功能(课程信息用文件保存)输入;课程信息浏览功能输出v 查询功能:(至少一种查询方式)算法按学分查询 按课程名称查询v 学生选修课程(可选项)三、设计要求及成果1. 分析课程设计题目的功能需求(可选用数组或链表实现,可多人(最多3人)协作完成一个题目)2. 写出详细设计说明(至少包括功能实现分析和模块流程图)3. 编写程序代码,调试程序使其能正确运行(代码书写要规范,标示符要见名知意,要有必要的注释,每人至少500行代码,不包括注释和花括号)4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告(请严格按照模板进行排版)四、进度安排第一天 选择课程设计题目,分析课题的要求第二天 编程第三天 编程及调试第四天 写课程设计报告第五天 提交课程设计报告(打印稿及电子稿)五、评分标准1. 根据平时上机考勤、表现和进度,教师将每天点名和检查2. 根据课程设计完成情况,必须有可运行的软件。3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。目 录内蒙古科技大学课程设计任务书I第一章 需求分析31.1引言31.2任务概述31.3数据描述31.4功能需求31.5任务计划4第二章概要设计52.1总体设计52.2数据类型设计(或数据结构设计)52.3接口设计 /函数声明62.4运行界面设计6第三章详细设计73.1输入模块设计73.2输出模块设计73. 3查找模块设计73.4排序模块设计73.5保存及读取模块设计7第四章测试分析84.1测试程序执行情况84.2出现的问题和解决的方法9第五章课程设计总结12参考文献12致谢13附录:程序代码14第一章 需求分析1.1 引言随着图书馆里图书数量的增多,图书管理管理变得越来越困难,为了方便学校对图书借阅的管理,一个简易的图书管理管理系统可以解决一些简单的问题1.2 任务概述v 图书信息录入功能(图书信息用文件保存)输入v 图书信息浏览功能输出v 查询或排序功能:(至少两种种查询方式)算法按书名查询 按作者名查询v 图书信息的删除与修改v 图书的借出与归还1.3 数据描述需要输入的数据包括登录号、书名、作者名、分类号、出版单位、出版时间、价格等。系统会自动处理图书的借出与归还。1.4 功能需求图书管理系统需要实现以下功能;1. 图书信息录入功能(图书信息用文件保存)-输入2. 图书信息浏览功能输出3. 查询或排序功能:(至少两种查询方式)-算法按书名查询 按作者查询4. 图书信息的删除与修改5. 图书的借出与归还 1.5 程序功能简介本系统是C语言开发的一个图书管理系统。本系统具有图书信息录入、浏览、删除、修改、查找(包括按书名、作者查找)功能。其中图书信息包括登录号、书名、作者名、分类号、出版单位、出版时间、价格,并且对信息以文件形式储存。另外本系统具备实用性的同时代码逻辑谨慎清晰易懂,且界面美观第二章 概要设计2.1 总体设计选择功能色图书的借出与归还v 图图图书信息的删除与修改v 信息的删除与修改v 书信息的删除与修改查询或排序功能图书信息浏览功能图书信息录入功能图书信息的删除与修改系统运行按作者名查询按书名查询2.2 数据类型设计(或数据结构设计)1. 数据以顺序结构储存2.3 接口设计 /函数声明可参考用以下表格形式:表2.1:函数列表函数名函数格式 /即函数首部mainint main()int num; /*登录号*/char name100; /*书名*/ char author100;/*作者名*/char fn100;/*分类号*/char place100;/*出版单位*/char day100;/*出版时间*/float money;/*价格*/main()/*主函数*/void Input();/*输入*/void Display();/*输出*/void Find();/*查找*/ void Modify(); /*删除*/void Change();/*修改*/2.4 运行界面设计第三章 详细设计3.1 输入模块设计void BOOK:input() /定义成员函数input(),用于输入图书信息cout<<"ntt 输入书名:"cin>>name;cout<<"ntt 输入作者:"cin>>author;cout<<"ntt 输入分类号:"cin>>sort;cout<<"ntt 输入出版单位:"cin>>publish;cout<<"ntt 输入出版时间:"cin>>pub_year;cout<<"ntt 输入价格(小数):"cin>>price;cout<<"ntt *输入完成*n"第四章 测试分析4.1 测试程序执行情况能按照正确操作实现已加入的各个功能,一些部分添加了报错的功能,如选择1-n中的一个数字。界面;录入新增浏览查询修改删除第五章 课程设计总结经过一个多星期的编译原理课程设计,在我的努力下,顺利完成该课程设计。通过该课程设计,掌握了编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程及其相关的技术,对课本上的知识也有了更深的理解。老师常说,课本上的知识是机械的,表面的,要学会去运用,要举一反三。现在终于深刻的了解了这句话。经过这次的课程设计,发现书本上很深奥的知识变的更为简单,同样,对实验原理也了有更深的理解。知道和理解了该理论在计算机中是怎样执行的, 对该理论在实践中的应用有深刻的理解 。通过该课程设计,把死板的课本知识变得生动有趣,激发了学习的积极性。能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。除了课堂外,课程设计是最能学到东西的,最考验人的。在做课程设计的这段时间,时刻都感到自己学的知识有多么的贫瘠。经过这次课程设计,让我对C+这门语言有了更深的认识,操作能力有了提高要想是写出的代码能运行,需要耐心细心,毅力以及充沛的体力。只有经过多次编辑,多次编译,再多次运行,才能编写出更好的程序,有时候需要多次的更正才能达到所要的运行结果。参考文献1C语言程序设计,谭浩强,清华大学出版社2C语言程序设计课程设计,刘振安,机械工业出版致谢宇松#include<fstream.h>#include<string>class BOOK /定义一个BOOK类,包含7个公有数据成员和2个成员函数public:int login;char name20;char author20;char sort20;char publish20;char pub_year20;float price;void input(); /成员函数声明void output();void BOOK:input() /定义成员函数input(),用于输入图书信息cout<<"ntt 输入书名:"cin>>name;cout<<"ntt 输入作者:"cin>>author;cout<<"ntt 输入分类号:"cin>>sort;cout<<"ntt 输入出版单位:"cin>>publish;cout<<"ntt 输入出版时间:"cin>>pub_year;cout<<"ntt 输入价格(小数):"cin>>price;cout<<"ntt *输入完成*n"void BOOK:output() /定义成员函数output(),用于输出图书信息cout<<"ntt 登录号:"<<login<<"n"cout<<"ntt 书名:"<<name<<"n"cout<<"ntt 作者:"<<author<<"n"cout<<"ntt 分类号:"<<sort<<"n"cout<<"ntt 出版单位:"<<publish<<"n"cout<<"ntt 出版时间:"<<pub_year<<"n"cout<<"ntt 价格:"<<price<<"元nn"void screen(); /自定义函数screen()的声明,该函数用于显示系统主菜单int count() /count()用于计算文件中存储有几本书的信息ifstream infile("book_information.dat",ios:in|ios:binary|ios:nocreate);infile.seekg(0,ios:end); /文件指针移到文件尾return infile.tellg()/sizeof(BOOK);void luru() /luru():实现书目信息录入char p;cout<<"ntt 执行录入功能会删除系统中原有信息,是否继续?(YN)"cin>>p;if(p='y'|p='Y')BOOK bo;int i=0; ofstream outfile("book_information.dat",ios:out|ios:binary); /ios:out会删除文件原有数据 if (!outfile)cout<<"ntt 文件打开错误!" return; do cout<<"nn" i=i+1;bo.login=i;/第一本书的登录号(bo.login)为1,随循环顺次增加 cout<<"tt 第"<<bo.login<<"本书n" bo.input(); outfile.write(char*)&bo,sizeof(bo); cout<<"ntt 是否继续录入新书信息?(YN)" cin>>p; while(p='y'|p='Y'); outfile.close(); screen(); /函数结束,返回主菜单void xinzeng() /xinzeng():增加书目信息BOOK bo;ofstream outfile("book_information.dat",ios:out|ios:binary|ios:app);if (!outfile)cout<<"ntt 文件打开错误!"return;bo.login=count()+1; /录入新书时,计算对应的登录号cout<<"nntt 第"<<bo.login<<"本书n"bo.input();outfile.write(char*)&bo,sizeof(bo);outfile.close();screen(); /函数结束,返回主菜单void liulan() /liulan():浏览所有书目信息BOOK bo;ifstream infile("book_information.dat",ios:in|ios:binary|ios:nocreate); if(!infile) cout<<"ntt 打开输入文件出错!n" return;infile.seekg(0,ios:end);/文件指针移到文件尾 if(!infile.tellg() /判断文件内信息是否为空cout<<"ntt 系统内图书信息为空!"else infile.seekg(0,ios:beg); /文件指针回到文件头for(int j=1;j<=count();j+) infile.read(char*)&bo,sizeof(bo); bo.output();screen(); /函数结束,返回主菜单void chaxun(); /后面的by_name()和by_author()会调用chaxun(),所以须添加函数声明void by_name() /by_name():按书名查找并输出cout<<"ntt 输入书名:"char a20;cin>>a;BOOK bo;ifstream infile("book_information.dat",ios:in|ios:binary|ios:nocreate);if(!infile) cout<<"ntt 打开输入文件出错!n" return;int i=count(),k=0; /i存储文件中书的数量,k用于判断所查的文件名是否存在for(int j=1;j<=i;j+)infile.read(char*)&bo,sizeof(bo); if(strcmp(a,bo.name)!=0) /比较输入的文件名和文件中存储的文件名k+; /当两文件名不相同时,k自增1,否则不变if(k=i) /若k=i,说明文件中没有一个文件名与输入的相同,即所查的文件名不存在cout<<"ntt 没有找到该书目!n"elseinfile.seekg(0);cout<<"nn" for(int j=1;j<=i;j+)infile.read(char*)&bo,sizeof(bo); if(strcmp(a,bo.name)=0) /找到文件名,输出对应的信息 bo.output(); infile.close();cout<<"ntt 是否继续查询?(YN)"char p;cin>>p;if(p='y'|p='Y')by_name();else chaxun(); /结束查询,返回子菜单void by_author() /按作者查找并输出cout<<"ntt 输入作者:"char b20;cin>>b;BOOK bo;ifstream infile("book_information.dat",ios:in|ios:binary|ios:nocreate);if(!infile) cout<<"ntt 打开输入文件出错!n" return;int i=count(),k=0;for(int j=1;j<=i;j+)infile.read(char*)&bo,sizeof(bo); if(strcmp(b,bo.author)!=0)k+;if(k=i)cout<<"ntt 没有找到该作者!n"elseinfile.seekg(0);cout<<"nn" for(int j=1;j<=i;j+)infile.read(char*)&bo,sizeof(bo); if(strcmp(b,bo.author)=0)bo.output();infile.close();cout<<"ntt 是否继续查询?(YN)"char p;cin>>p;if(p='y'|p='Y')by_author();elsechaxun();void chaxun() /chaxun():建立查询子菜单cout<<"nn"cout<<"tttt1 按 书 名nn"cout<<"tttt2 按 作 者nn"cout<<"tttt0 返 回nn"cout<<"tt 请选择(0-2):"int option1;cin>>option1;switch(option1)case 1:by_name();break;case 2:by_author();break;case 0:screen();break;default:cout<<"ntt 输入错误,请重新输入:" chaxun();void xiugai() /xiugai():修改书目信息BOOK bo;fstream mfile("book_information.dat",ios:in|ios:out|ios:binary|ios:nocreate);if(!mfile) cout<<"ntt 打开输入文件出错!n" return; cout<<"nntt 输入书目登录号:"int c;cin>>c; /按登录号查询 if(c>=1&&c<=count()/判断登录号是否存在mfile.seekg(c-1)*sizeof(bo); /文件指针移到开始修改的位置 mfile.read(char*)&bo,sizeof(bo); char p; cout<<"ntt 是否修改书名?(YN)"cin>>p; if(p='y'|p='Y')cout<<"ntt 输入书名:"cin>>bo.name; cout<<"ntt 是否修改作者?(YN)"cin>>p; if(p='y'|p='Y')cout<<"ntt 输入作者:"cin>>bo.author;cout<<"ntt 是否修改分类号?(YN)"cin>>p; if(p='y'|p='Y') cout<<"ntt 输入分类号:"cin>>bo.sort;cout<<"ntt 是否修改出版单位?(YN)"cin>>p; if(p='y'|p='Y') cout<<"ntt 输入出版单位:"cin>>bo.publish;cout<<"ntt 是否修改出版时间?(YN)"cin>>p; if(p='y'|p='Y') cout<<"ntt 输入出版时间:"cin>>bo.pub_year;cout<<"ntt 是否修改价格?(YN)"cin>>p; if(p='y'|p='Y') cout<<"ntt 输入价格:"cin>>bo.price; mfile.seekg(c-1)*sizeof(bo); /文件指针移回开始修改的位置 mfile.write(char*)&bo,sizeof(bo); /重新写入该书目信息cout<<"ntt *修改成功*n" elsecout<<"ntt 登录号不存在!n" mfile.close();screen(); /函数结束,返回主菜单void shanchu() /删除书目信息BOOK bo;char a20;cout<<"nntt 输入要删除的书目:"cin>>a; ifstream infile("book_information.dat",ios:in|ios:binary|ios:nocreate); if(!infile)cout<<"ntt 打开输入文件出错!n" return; fstream mfile("book_information2.dat",ios:out|ios:in|ios:binary); /建立名为book_information2的中间文件,存储除被删除书目以外的书目信息if (!mfile)cout<<"ntt 文件打开错误!"return;int i=count(),k=0;for(int j=1;j<=i;j+)infile.read(char*)&bo,sizeof(bo); if(strcmp(a,bo.name)!=0) /比较输入的文件名和文件中存储的文件名k+; /当两文件名不相同时,k自增1,否则不变if(k=i) /若k=i,说明文件中没有一个文件名与输入的相同,即所查的文件名不存在cout<<"ntt 没有找到该书目!n"infile.close();mfile.close();elseinfile.seekg(0,ios:beg);for(int j=1;j<=i;j+)infile.read(char*)&bo,sizeof(bo); if(strcmp(a,bo.name)!=0) /如果文件名不相同,则把信息复制到book_information2.dat中mfile.write(char*)&bo,sizeof(bo); else break; /如果文件名相同,则不复制信息,直接跳出循环 for(j+;j<=i;j+)infile.read(char*)&bo,sizeof(bo); bo.login=bo.login-1; mfile.write(char*)&bo,sizeof(bo); infile.close(); ofstream outfile("book_information.dat",ios:out|ios:binary);/建立重名文件,清空原有信息 if (!outfile)cout<<"ntt 文件打开错误!" return; mfile.seekg(0,ios:beg); /文件指针移到文件头 for(j=1;j<i;j+)mfile.read(char*)&bo,sizeof(bo); /将book_information2.dat中的信息复制到book_information.dat outfile.write(char*)&bo,sizeof(bo); mfile.close(); outfile.close(); cout<<"ntt *删除成功*n"screen();void quanshan() /quanshan():删除文件中全部信息ifstream infile("book_information.dat",ios:in|ios:binary|ios:nocreate|ios:trunc);if(!infile)cout<<"ntt 打开输入文件出错!n" return;infile.close(); cout<<"ntt *全删成功*n"screen();void screen() /显示主界面 cout<<"nnttt 图 书 信 息 管 理 系 统nnn" cout<<"tttt 1 录 入nn" cout<<"tttt 2 新 增nn" cout<<"tttt 3 浏 览nn" cout<<"tttt 4 查 询nn" cout<<"tttt 5 修 改nn" cout<<"tttt 6 删 除nn" cout<<"tttt 7 全 删nn" cout<<"tttt 0 退 出nn"cout<<"tt 请选择(0-7):"int option;cin>>option;switch(option) case 1:luru();break; case 2:xinzeng();break; case 3:liulan();break; case 4:chaxun();break; case 5:xiugai();break; case 6:shanchu();break; case 7:quanshan();break;case 0:return;default:cout<<"ntt 输入错误,请重新输入:" screen();void main()screen();