12小组大作业剖析.docx
《12小组大作业剖析.docx》由会员分享,可在线阅读,更多相关《12小组大作业剖析.docx(27页珍藏版)》请在冰点文库上搜索。
12小组大作业剖析
HefeiUniversity
面向过程程序设计大作业报告
BACHELORDISSERTATION
项目题目:
图书管理系统的设计与实现
年级系别专业班级:
15级电子系通信工程
(二)班
组员姓名:
张凯谢跃兵李亚南
导师姓名:
方小红
完成时间:
2016.6.16
目录
一.基本概念1
1.C/C++语言的特点1
2.指针的使用方法1
3.数组传递技术1
二.需求分析1
三.概要分析2
四.界面设计2
五.模型设计3
六.模块设计5
1.Main.cpp文件5
2.Menu.cpp文件6
3.Input.cpp文件7
4.Output.cpp文件8
5.Search.cpp文件9
6.Delete.cpp文件10
7.Keep.cpp文件11
8.Load.cpp文件12
9.Menu.h文件13
10.BookManager.h文件13
11.Book.h文件13
七.运行测试14
八.项目总结16
九.课程心得16
张凯的心得:
16
李亚南的心得:
17
谢跃兵的心得:
17
十.致谢17
十一.参考文献17
中文摘 要
对于本次实验,工程要求包含图书的数据输入功能,数据的显示(输出)功能,数据查询(按照作者姓名查询)功能,数据删除(根据输入图书序号)功能,图书数据保存功能和调用图书数据功能。
针对这些我们运用到选择语句,循环语句,结构体,数组,指针,宏定义等方式共同创建工程代码。
我们的大致思路是:
首先针对每个功能进行创建工程代码,以结构体,数组形式表示图书的编号、书名、作者姓名、价格、书籍出版社、书籍ISBN。
运用循环语句将每本书的数据依次输入、输出、保存、调用;根据指针,地址传递的方式(根据输入的编号)删除图书数据;根据指针,地址传递的方式(根据输入的作者姓名)查询并输出该图书的数据。
然后创建程序起始页面(Menu)模块。
最后创建主模块将所有的模块连接起来(使用函数调用,传递地址)。
通过以上三步将程序代码串联在一起,并结合相应的头文件声明来结束这个工程。
通过调试,使工程达到预期要求。
关键词:
结构体;数组;指针;宏定义;循环
一.基本概念
1.C/C++语言的特点
C语言兼有高级语言和低级语言的特点:
①高级语言特点:
语言简洁,运算符丰富,使用灵活方便,适合结构化编程。
②低级语言特点:
可操作内存单元和数据位操作,目标代码质量高,适合开发系统软件和嵌入式软件。
C++保留了C的所有特点(编译生成的目标代码质量、效率只比C稍差),并在其基础上增加了面向程序设计的语法,更容易完成复杂环境模型建立和问题解决。
2.指针的使用方法
指针的使用包含三个步骤:
⑴抛地址(抛钥匙或抛绣球)
如:
调用交换模块代码:
swap(&a,&b),实参&a、&b分别是a、b的地址,也就是抛地址。
当一个模块中的变量需要在另一个模块中即时改变,除了将这些变量地址抛出去之外,别无他法。
⑵类型匹配(门当户对)
交换模块定义头部:
如:
voidswap(0int*pA,int*pB),定义了两个形参,这两个形参的类型是整数型的指针变量,必须与抛过来的地址类型匹配。
当然,一切函数参数传递都要遵循类型匹配这个规则,匹配有两个含义:
第一,要求相同类型;第二,数据个数相同。
⑶使用间接方式操作(芝麻开门)
如:
在swap模块内部使用pA和pB的时候,前面都加上了指针运算符*,这是间接操作数据方式(芝麻开门)。
读者揣测一下发送者和接收者的心思,接收者接到了地址接着就是对*pA和*pB操作。
3.数组传递技术
⑴传地址
数组名实质是一个固定地址,数组名作为实参传递,实际是将这个数组的头地址传过去(抛过去的不是一个数,是一把打开宝库的钥匙)。
自定义函数的形参拿到了头地址(钥匙)后,实质上控制了原来的数组,就可以按图索骥地改变原来数组中的元素内容。
所以,自定义模块sort的形参形式floatpArray[N]等价于float*pArray,本质上是指针变量。
正是由于数组名作为函数参数传递的实质是地址传递,所以不需要显示ruturn语句。
⑵传长度
FloatpArry[N]等价于float*pArry,这说明FloatpArry[N]中的N可有可无。
事实上,sort模块的头部写成:
voidsort(floatpArray[0])或voidsort(floatPArry[1000])都可以,排序代码真正决定轮次变化的是模块前“defineN4”中定义的常量N。
这里有一个很不好的现象:
sort模块代码写死了,被N限制住了,N被定义为4,sort代码只能进行长度是4的数组排序,N被定义为5,sort代码只能进行长度是5的数组排序。
Sort模块只能满足固定长度为N的数组排序,sort模块不具通用性。
之所以造成这种现象的根本原因是没有将一个数组的完整信息传递过来,除了传递数组名之外,还应传递数组的长度。
二.需求分析
列出所有功能(以图形表达),并给以必要文字说明各功能的作用。
图1
其中“输入功能”:
要求将图书的编号、书名、作者姓名、书本价格、图书出版社、图书ISBN使用数组和指针地址传递、循环语句输入系统。
其中“输出功能”:
要求将图书的编号、书名、作者姓名、书本价格、图书出版社、图书ISBN使用数组和指针地址传递、循环语句输出系统。
其中“查找功能”:
要求根据输入的作者姓名使用指针以及循环语句从图书管理系统中,一个一个的查找直到找的与之对应的书籍,并将书籍的其他信息(如:
价格,书名)输出显示。
其中“删除功能”:
要求根据输入的书籍序号使用指针和循环语句从图书管理系统之中找到对应书籍并删除此书籍的所有信息。
其中“保存功能”:
要求使用指针、循环语句、函数调用、文件指针函数等将所有的图书数据保存在Book.txt文件中。
其中“调用功能”:
要求使用指针、循环语句、函数调用、文件函数等将所有的图书数据从文件Book.txt中调出来。
三.概要分析
本系统使用结构体数组来保存图书信息并给信息进行相应的处理,结构体结构如下:
structBook
{
floatfNumber;//编号
charfName[41];//书名
charfAuthor[21];//作者姓名
floatfPrice;//定价
charfSource[20];//出版社
charfISBN[20];//ISBN
};
四.界面设计
运行的多个界面的设计。
*主界面
欢迎进入图书管理系统
1输入功能2输出功能
3查询功能4删除功能
5保存功能6调入功能
7退出系统
请选择功能(1,2,3,4,5,6,7):
图2
*输入界面
请输入数据(编号/书名/作者/价格/出版社/ISBN):
图3
输出界面
**********************数据输出如下**********************
********************************************************
编号书名作者价格出版社ISBN
*******************************************************
图4
查询界面
请输入作者的姓名:
编号书名作者价格出版社ISBN
图5
删除界面
请输入要删除的序号:
图6
五.模型设计
图7
六.模块设计
1.Main.cpp文件
主模块main
①模块功能:
编写一个程序,任意选择一个功能号然后执行相应的功能。
②输入输出:
系统模块,暂不考虑模块级别的输入输出,输入输出在内部完成。
形式:
intmain()
归属:
Main
③解决思路:
选择自己要进行的程序,通过功能号选择功能执行。
④算法提纲:
第一步:
先选要进行的程序项目,选择功能号;
第二步:
到达功能号后按要求输入相应数据即可。
⑤模块代码:
#include
#include
#include
#include"Menu.h"
#defineN1000
#include"BookManager.h"
#include"Book.h"
intmain()
{
BookbookAll[N];
intnum=0;
while
(1)
{
switch(menu())
{
case1:
inputBook(bookAll,N,&num);
cout<break;
case2:
outputBook(bookAll,N,num);
cout<break;
case3:
searchBook(bookAll,N,num);
cout<break;
case4:
delBook(bookAll,N,&num);
outputBook(bookAll,N,num);
cout<break;
case5:
keepBook(bookAll,N,num);
cout<break;
case6:
loadBook(bookAll,N,&num);
outputBook(bookAll,N,num);
cout<break;
case7:
exit(0);
default:
cout<<"提示出错"<}
}
return0;
}
2.Menu.cpp文件
自定义模块menu
①模块功能:
在打开程序时显示文字“欢迎进入图书管理系统”
②输入输出:
有输入,有输出,在打开程序时显示文字“欢迎进入图书管理系统”
形式:
intmenu()
归属:
Menu
③解决思路:
④算法提纲:
⑤模块代码:
#include
intmenu()
{
intchoose;
cout<<"\t**************************************"<cout<<"\t*\t\t欢迎进入图书管理系统\t\t*"<cout<<"\t*1输入功能\t\t\t\t\t2输出功能*"<cout<<"\t*3查询功能\t\t\t\t\t4删除功能*"<cout<<"\t*5保存功能\t\t\t\t\t6调入功能*"<cout<<"\t*7退出系统\t\t\t\t\t*"<cout<<"\t*************************************"<cout<<"请选择功能号(1,2,3,4,5,6,7):
";
cin>>choose;
cout<returnchoose;
}
3.Input.cpp文件
自定义模块inputBook
①模块功能:
进行数据录入
②输入输出:
图8
形式:
voidinputBook(Book*pBookAll,intn,int*pNum)
归属:
BookManager
③解决思路:
若实际人数等于n,停止输入,否则继续输入图书数据。
④算法提纲:
第一步:
判断人数是否等于n,选择Y或者N。
第二步:
选择Y继续输入书籍的编号、书名、作者、价格、出版社、ISBN,选择N停止输入。
⑤模块代码:
#include
#include"Book.h"
voidinputBook(Book*pBookAll,intn,int*pNum)
{
if(*pNum==n)
{
cout<<"对不起,图书已满";
}
else
{
charchoice;
do
{
cout<<"请输入数据(编号/书名/作者/价格/出版社/ISBN):
"<cin>>pBookAll[*pNum].fNumber
>>pBookAll[*pNum].fName
>>pBookAll[*pNum].fAuthor
>>pBookAll[*pNum].fPrice
>>pBookAll[*pNum].fSource
>>pBookAll[*pNum].fISBN;
(*pNum)++;
}while(cout<<"要输入数据吗?
(y/n)",cin>>choice,choice=='y');
}
}
4.Output.cpp文件
自定义模块outputBook
①模块功能:
对图书的有关数据进行显示。
②输入输出:
图9
形式:
voidoutputBook(Book*pBookAll,intn,intpNum)
归属:
BookManager
③解决思路:
先显示序号,再显示书籍的有关数据。
通过循环语句,对输入的所有数据进行输出。
④算法提纲:
第一步:
定义变量j,若j小于真实人数,输入第一本书籍的数据。
第二步:
令j递增,根据循环语句,对输入数据进行显示。
⑤模块代码:
#include
#include"Book.h"
voidoutputBook(Book*pBookAll,intn,intpNum)
{
cout<<"\t**********************数据输出如下**********************"<cout<<"\t********************************************************"<cout<<"\t"<<"编号\t\t"<<"书名\t\t"<<"作者\t\t"<<"价格\t\t\t"<<"出版社\t\t\t"<<"ISBN"<for(intj=0;j<=pNum-1;j++)
{
cout<<"\t"<<<"\t"<<<"\t"<<<"\t\t\t"<<<"\t\t"<<<"\t\t"<}
cout<<"\t*******************************************************"<}
5.Search.cpp文件
自定义模块searchBook
①模块功能:
根据输入作者姓名查到对应书籍信息并显示出来。
②输入输出:
图10
形式:
voidsearchBook(Book*pBookAll,intn,intpNum)
归属:
BookManager
③解决思路:
选择功能序号,然后按要求输入作者姓名,利用循环语句查找该作者,找到之后显示该书籍的其他信息。
④算法提纲:
第一步:
定义一个数组,作者姓名数组长度为21。
第二步:
由循环语句及逻辑结构判断有无该作者的姓名,从而判断有无该作者的书籍。
第三步:
若无该作者的姓名,则输出无该作者,若有该作者的姓名,则显示该作者所编写的图书的相关信息。
⑤模块代码:
#include
#include"Book.h"
#include"string.h"
#include"BookManager.h"
#include"Menu.h"
voidsearchBook(Book*pBookAll,intn,intpNum)
{
charname[21];
boolb=false;
cout<<"请输入作者的姓名:
";
cin>>name;
for(inti=0;i{
if(strcmp(pBookAll[i].fAuthor,name)==0)
{
b=true;
break;
}
}
if(b)
{
cout<<"\t"<<"编号\t\t"<<"书名\t\t"<<"作者\t\t"<<"价格\t\t"<<"出版社\t\t\t"<<"ISBN"<cout<<"\t"<<<"\t"<<<"\t"<<<"\t\t"<<<"\t\t"<<<"\t\t"<}
else
cout<<"没有该作者主编的著作\n";
}
6.Delete.cpp文件
自定义模块delBook
①模块功能:
对输入的某个图书数据进行删除。
②输入输出:
图11
形式:
voiddelBook(Book*pBookAll,intn,int*pNum)
归属:
BookManager
③解决思路:
删除某个序号no,将no+1至*pNum-1的所有内容前移一格。
④算法提纲:
第一步:
输入要删除的某个序号。
第二步:
利用指针变量将删除的第i个数据后的所有数据都赋值给i-1个数据。
即pBookAll[i-1]=pBookAll[i];
第三步:
利用循环语句,将第i个数据后的所有数据都赋值给i-1个数据。
⑤模块代码:
#include
#include"Book.h"
voiddelBook(Book*pBookAll,intn,int*pNum)
{
intno;
cout<<"请输入要删除的序号:
";
cin>>no;
for(inti=no;i<*pNum-1;i++)
{
pBookAll[i-1]=pBookAll[i];
}
(*pNum)--;
}
7.Keep.cpp文件
自定义模块keepBook
①模块功能:
对输入的数据进行保存。
②输入输出:
图12
形式:
voidkeepBook(Book*pBookAll,intn,intpNum)
归属:
BookManager
③解决思路:
对输入的数据进行保存。
④算法提纲:
第一步:
定义一个Book.txt文件。
第二步:
分别读如第i本书籍编号、书名、作者姓名、价格、出版社、ISBN;
第三步:
利用循环语句,将第i个数据后的所有数据都读入Book.txt文件中。
⑤模块代码:
#include
#include"Book.h"
voidkeepBook(Book*pBookAll,intn,intpNum)
{
FILE*pF;
pF=fopen("Book.txt","w");
for(inti=0;i{
fprintf(pF,"%f\t%s\t%s\t%f\t%s\t%s\n",pBookAll[i].fNumber,pBookAll[i].fName,pBookAll[i].fAuthor,pBookAll[i].fPrice,pBookAll[i].fSource,pBookAll[i].fISBN);
}
fclose(pF);
}
8.Load.cpp文件
自定义模块loadBook
①模块功能:
将保存的数据重新调入系统中。
②输入输出:
图13
形式:
voidloadBook(Book*pBookAll,intn,int*pNum)
归属:
BookManager
③解决思路:
将Book.txt中的数据调入到系统中。
④算法提纲:
第一步:
打开Book.txt文件,进行读取数据。
第二步:
当第i个数据有三个变量时,i自增;
第三步:
利用循环语句,当第i个数据有三个变量时,将第i个数据后的所有数据都读出来;
第四步:
关闭Book.txt文件。
⑤模块代码:
#include"Book.h"
#include
#include"Menu.h"
#include"BookManager.h"
voidloadBook(Book*pBookAll,intn,int*pNum)
{
FILE*pF=fopen("Book.txt","r");
if(pF)
{
while(!
feof(pF))
{
fscanf(pF,"%f\t%s\t%s\t%f\t%s\t%s\n",&pBookAll[*pNum].fNumber,pBookAll[*pNum].fName,pBookAll[*pNum].fAuthor,&pBookAll[*pNum].fPrice,pBookAll[*pNum].fSource,pBookAll[*pNum].fISBN);
(*pNum)++;
}
}
else
pF=fopen("Book.txt","w");
fclose(pF);
}
9.Menu.h文件
#ifndefmenu_h
#definemenu_h
intmenu();
#endif
10.BookManager.h文件
#ifndefBookManager_h
#defineBookManager_h
#include"Book.h"
voidinputBook(Book*pBookAll,intn,int*pNum);
voiddelBook(Book*pBookAll,intn,int*pNum);
voidkeepBook(Book*pBookAll,intn,intpNum);
voidsearchBook(Book*pBookAll,intn,intpNum);
voidoutputBook(Book*pBookAll,intn,intpNum);
voidloadBook(Book*pBookAll,intn,int*pNum);
#endif;
11.Book.h文件
#ifndefBook_h
#include"string.h"
#defineBook_h
structBook
{
floatfNumber;//编号
charfName[41];//书名
charfAuthor[21];//作者姓名
floatfPrice;//定价
charfSource[2