资源描述
内蒙古科技大学课程设计说明书
内蒙古科技大学
本科生课程设计说明书
题 目:C语言课程设计
—— 图书管理系统
学生姓名:
学 号:
专 业:软件工程
班 级:软件一班
指导教师:
日 期: 2016 年 1月 3 日
22
内蒙古科技大学课程设计任务书
课程名称
C语言课程设计
设计题目
图书管理系统
指导教师
时间
2016.1.5——2016.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
第一章 需求分析 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 接口设计 //函数声明 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 引言
随着图书馆里图书数量的增多,图书管理管理变得越来越困难,为了方便学校对图书借阅的管理,一个简易的图书管理管理系统可以解决一些简单的问题
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:函数列表
函数名
函数格式 //即函数首部
main
int main()
int num;
/*登录号*/
char name[100];
/*书名*/
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 运行界面设计
第三章 详细设计
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 输入价格(小数):";cin>>price;
cout<<"\n\t\t ******输入完成******\n";
}
第四章 测试分析
4.1 测试程序执行情况
能按照正确操作实现已加入的各个功能,一些部分添加了报错的功能,如选择1-n中的一个数字。
界面
;录入
新增
浏览
查询
修改
删除
第五章 课程设计总结
经过一个多星期的编译原理课程设计,在我的努力下,顺利完成该课程设计。
通过该课程设计,掌握了编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程及其相关的技术,对课本上的知识也有了更深的理解。老师常说,课本上的知识是机械的,表面的,要学会去运用,要举一反三。现在终于深刻的了解了这句话。经过这次的课程设计,发现书本上很深奥的知识变的更为简单,同样,对实验原理也了有更深的理解。知道和理解了该理论在计算机中是怎样执行的, 对该理论在实践中的应用有深刻的理解 。通过该课程设计,把死板的课本知识变得生动有趣,激发了学习的积极性。能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。
课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。除了课堂外,课程设计是最能学到东西的,最考验人的。在做课程设计的这段时间,时刻都感到自己学的知识有多么的贫瘠。经过这次课程设计,让我对C++这门语言有了更深的认识,操作能力有了提高要想是写出的代码能运行,需要耐心细心,毅力以及充沛的体力。只有经过多次编辑,多次编译,再多次运行,才能编写出更好的程序,有时候需要多次的更正才能达到所要的运行结果。
参考文献
1.《C语言程序设计》,谭浩强,清华大学出版社
2.《C语言程序设计课程设计》,刘振安,机械工业出版
致谢
宇松
#include<fstream.h>
#include<string>
class BOOK //定义一个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 输入书名:";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 输入价格(小数):";cin>>price;
cout<<"\n\t\t ******输入完成******\n";
}
void BOOK::output() //定义成员函数output(),用于输出图书信息
{
cout<<"\n\t\t 登录号:"<<login<<"\n";
cout<<"\n\t\t 书名:"<<name<<"\n";
cout<<"\n\t\t 作者:"<<author<<"\n";
cout<<"\n\t\t 分类号:"<<sort<<"\n";
cout<<"\n\t\t 出版单位:"<<publish<<"\n";
cout<<"\n\t\t 出版时间:"<<pub_year<<"\n";
cout<<"\n\t\t 价格:"<<price<<"元\n\n";
}
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<<"\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
{
cout<<"\n\n";
i=i+1;bo.login=i;//第一本书的登录号(bo.login)为1,随循环顺次增加
cout<<"\t\t 第"<<bo.login<<"本书\n";
bo.input();
outfile.write((char*)&bo,sizeof(bo));
cout<<"\n\t\t 是否继续录入新书信息?(Y\\N)";
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<<"\n\t\t 文件打开错误!";
return;
}
bo.login=count()+1; //录入新书时,计算对应的登录号
cout<<"\n\n\t\t 第"<<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<<"\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*)&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.dat",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++; //当两文件名不相同时,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) //找到文件名,输出对应的信息
{
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("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 没有找到该作者!\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_author();
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;
case 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 打开输入文件出错!\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'||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 输入分类号:";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\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<<"\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 打开输入文件出错!\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));
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++)
{
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<<"\n\t\t 文件打开错误!";
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<<"\n\t\t ******删除成功******\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";
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 删 除\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();
}
展开阅读全文