图书管理系统数据结构课程设计报告.docx
《图书管理系统数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《图书管理系统数据结构课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
图书管理系统数据结构课程设计报告
图书管理系统数据结构课程设计报告
1.设计要求
小型图书购销管理系统
1、需要处理的基础数据
✧图书资料基本信息:
图书编号、书名、作者、出版社、出版日期、定价等。
✧图书库存信息:
图书编号、书名、作者、库存数量等。
✧图书采购信息:
采购单号、图书编号、采购日期、采购数量、单价、采购金额等。
✧图书销售信息:
销售单号、图书编号、销售日期、销售数量、单价、销售金额等。
2、系统的基本功能
✧图书基本信息的录入和查询
✧图书采购
(1)输入要采购的图书编号,自动从图书基本资料中把相关信息提取出来。
(2)根据采购数量和单价,自动计算采购金额。
(3)根据采购数量,增加图书库存量。
✧图书销售
(1)输入要采购的图书编号(或书名)、销售数量,从图书库存信息中查找是否合法,合法时进行销售,否则报错。
(2)根据采购数量和单价,自动计算销售金额。
(3)销售时,从库存中减去相应的数量。
✧利润计算:
根据全部的采购金额和销售金额,计算书店的利润情况。
2.思路:
1.基本模块:
根据要求,应该有三个封装的类,包括:
书籍信息,采购信息和销售信息。
其中以书籍信息为核心,在书籍信息中建立关于其它两类的友元函数,达到信息交流的目的。
2.功能实现:
要求实现的功能有:
对于书籍信息:
录入,查询,采购和销售导致存量的改变
对于采购信息:
实施采购,查询采购
对于销售信息:
实施销售(需要判断是否合法),查询销售
总利润的计算
所以草图如下
考虑到购买和销售时要输入书籍号,并且更改基本库存信息。
不如将销售和采购函数作为友元函数,或许能减少函数个数。
3.建立程序和调试改错
因为是在模块的建设中边建设边调试,所以容易发现错误原因。
开始先建设基本类:
Book,公有成员为:
public:
voidset_book();录入功能函数
voiddisplay_book();反馈功能函数
voidbuy_book(Buy&);//此项在Buy类建立后再输入,为采购函数
voidsale_book(Sale&);//此项在Sale类建立后再输入,为销售函数
intbianhao;书籍编号(设为公有是为了方便进行对比时调用,不然或许要一个公有函数来实现“查询是否有此书”的功能,if(i==b[i1].bianhao)可能比写函数更加简短。
)
私有成员为private:
stringname;//书名
stringwritername;作者名
stringpublisher;出版社
inttime;出版时间
intprice;价格
intbnum;存量
在主函数中大框架是一个选择结构,选择想要执行的功能,由于选项多,所以选择swich.
而进行完一个功能后,考虑到依然有其他功能待执行,所以又用goto回到初始界面。
由于goto,所以case分支后面没有break,在调试过程中也没有发现问题
用类数组定义了书籍类数组后,用for循环进行录入,每次录入后,如果全部录入完毕,有一个选择,可以跳出for循环,同时记下录入函数执行的循环次数,方便反馈时控制反馈函数的执行次数。
可是在实际调试中发现,由于忽略了for循环中循环条件的等号,使得次数丢失。
于是补上。
在建立Buy模块后,发现程序报错,结尾处有非法字符,原来是在打中文的时候顺带打了个“;”,结果非法。
在建立完Sale模块后,发现选择执行销售功能时,程序直接结束,再试销售查询,结果也是结束,再试利润计算,也是如此。
但其他功能正常
开始以为是case的问题,于是加入一个default:
cout<<”请输入正确编码”来测试是否是进入case选择时未能成功匹配到选项,结果不是,输入4,选择销售功能时,依然是直接结束,看来是成功执行到了case4:
以后的语句。
在关掉VC后,删除所有生成的文件,再重新打开刚才的CPP后,发现无法构建,结果显示一个Sale的display()函数出现了问题。
再仔细看,原来由于Sale模块我是直接copy再修改的Buy模块,结果粗心忘了说明Sale:
:
display(){****}这个函数
于是将上面的函数进行说明后,程序完成,最终调试界面:
登录界面
录入
查询(全体展示在任意一次录入完成后选择“N”后自动进行)
采购
销售
采购查询
采购多项后查询(后来的多次采购未截屏)
同样的,销售多次后(这多次销售未截屏)
最后计算利润
调试结束
4心得
程序心得:
首先是对这个程序来说,结构简单,也只有大概300行,但是实际写却写了4个小时,首先是因为很多小细节上的语法错误难以控制,又难以寻找,而且到后来很难去检查一个很长的程序哪个细节错了。
不过,利用一些小技巧,比如隔离法:
用/**/来隐藏一个独立的模块,看是否依然报错,如果没有报错了,那显然错误出现在被隐藏的地方。
还有,针对性纠错,比如看看“;”是否是用中文输入法时输入的。
而且,养成了括号,引号必定成对打的习惯也让我减少了很多失误。
程序的思路不难,但是思路还有很多,比如可以用类中函数来判断输入的书籍编码是否和Book类组中的书籍码相同,比如友元函数可以是在销售和采购类中定义的,或者不使用友元函数,但是我认为自己做的程序是我能独立想到的最简洁了,对于一个不长又计算量不大的程序来说,也不必太过苛求。
不过写完报告后,听听其他同学的思路,或许也是一种学习方式。
C++心得:
对于这个新接触的概念,在进行了适量的实践后,发现确实比C好用多了,比如,刚编完的课程设计1,如果要用C来做,就很难检查结构性错误了,因为编了三个小时之后,就发现头脑茫然,看着长长的连成一片的语句很难寻找关键。
但是有类之后,就只要寻找错误出在哪个类上,再在对应的类或者主函数里排查,大大降低了调试难度。
而且,由于进行了封装,也很难出现张冠李戴的错误,每一个数据的作用都一目了然。
最关键的是,这样的编程更加模块化,我可以先编出关于某一个功能的模块,再编写另一个,最后关联起来,思路清晰,难以犯下结构性错误。
而且,由于丰富了语法,编写也更加随心所欲,不会纠结着用很多句子实现一个简单的功能。
附录课程设计,课题1(图书管理系统)源代码
#include
#include
usingnamespacestd;
intdis=0;intgain=0;inttotal=0;inti1=0;inti2=0;//全局变量总支出总收入净收益采购次数销售次数
classSale;
classBuy;
classBook//定义图书类
{public:
voidset_book();
voiddisplay_book();
voidbuy_book(Buy&);
voidsale_book(Sale&);
intbianhao;
private:
stringname;
stringwritername;
stringpublisher;
stringtime;
intprice;
intbnum;
};
classBuy//购买类
{
public:
friendvoidBook:
:
buy_book(Buy&);voiddisplay();
private:
intshuliang;intdprice;intbuy_bianhao;inttotal;intb_bianhao;stringtime;
};
classSale//销售类
{public:
friendvoidBook:
:
sale_book(Sale&);voiddisplay();
private:
intshuliang;intdprice;intsale_bianhao;inttotal;intb_bianhao;stringtime;
};
voidSale:
:
display()//采购查询函数
{
cout<<"销售编号:
"<"<"<