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






