商品销售统计系统.docx
《商品销售统计系统.docx》由会员分享,可在线阅读,更多相关《商品销售统计系统.docx(16页珍藏版)》请在冰豆网上搜索。
![商品销售统计系统.docx](https://file1.bdocx.com/fileroot1/2022-11/23/873fa8cb-2f0c-4265-a96e-0ee2eb10d0f8/873fa8cb-2f0c-4265-a96e-0ee2eb10d0f81.gif)
商品销售统计系统
课程设计报告
课程
程序设计语言Ⅱ课程设计
课程设计名称
商品销售统计程序
学生
项正武
学号
11041111
专业班级
110411
指导教师
2014年2月
一、课程设计题目:
商品销售统计
主要内容和要求:
编写商品销售统计程序,商品的信息有:
商品的名称,计量单位〔重量或件〕,单价。
所有商品的信息事先已存入电脑,屏幕上显示所有商品的名称,选择商品名,输入商品计量单位(如重量,件数等),根据单价算出总价。
客户一次购物可能购买多种商品,程序应计算出客户应付的钱款数。
程序分为两个部分:
第一部分用于输入商品的信息并允许修改和删除;第二部分实现销售统计。
程序运行时由用户选择进入哪一部分功能,并能在运行时在两部分之间切换。
第二部分运行时,首先显示所有商品名称及代码〔商品数目较多时,应考虑分屏显示〕,用户输入商品代码及商品重量或件数,用户一次操作可输入假设干商品的购买信息,然后输入一个特殊的代码〔如-1〕表示本次购物结束。
此时。
程序计算出应付钱款数并显示。
测试数据
程序应输入不少于10种商品的信息,并进行模拟运行。
实现提示
本程序的商品信息管理可采用与课程设计题目二类似的数据结构,既定义一个商品类,每种商品作为商品类的实例〔对象〕存储在链表节点中。
选做内容
程序在营业结束时统计每种商品的销售量,销售金额及总营业额。
因此第二部分应有营业结束的选择,当用户选择此项时屏幕上显示当天营业的每种商品的销售量,销售金额及总营业额。
注意,商品类的数据成员应增加有商品的销售量和销售金额。
总营业额是所有商品的营业额之和,可用静态数据成员实现。
或可由原商品类派生出一个特殊的类,增加上面的数据成员及相应的成员函数。
二、问题分析:
由设计题目的要求,我们需要对设计一个能够统计所销售商品的代码、名称、价格、数量等信息,并且能够通过输入选择键调出仓库中所有商品的所有信息;实现通过代码来查询某个商品,并且输出该商品的所有信息;能够在用户购买商品时,根据情况给予用户反馈信息,其中包括购买商品名称、代码、单价、所买数量,并对该商品进行一次小结,告知用户消费情况;购买结束后,统计用户所消费的总金额,记录其所付金额以及找零金额。
实现这些功能,需要声明构造函数Sale〔〕,包含数据成员商品代码、名字、价格、数量。
另外,创建链表,用于储存商品录入信息,购买情况,以及所有商品的信息。
利用switch语句来实现根据需要选择不同的功能。
创建链表,对头结点进行初始化,对数据域分配内存大小,通过指针域访问结点,来实现元素的储存调用等。
定义子函数,来实现商品的录入、查询、显示、购买等功能。
录入功能需要包含商品的一些信息,如:
代码、名称、价格等;查询功能则是为了方便用户获得所需购买物品的一些信息;显示功能可以使用户对仓库的储存情况一目了然;购买功能主要是进行商品的结算。
编写过程中,代码和名字需应用字符串,数量以整型输出,考虑到上平的数量可能会很多,故定义为unsignedintquality,价格以浮点型输出。
三、算法设计:
1、需要定义一个构造函数Sale.包含数据成员:
代码、名称、价格、数量。
2、定义主函数,编写菜单程序,通过判断输入的格式是否正确,选择是否在屏幕上显示菜单,利用switch语句来选择不同的功能。
4、创建链表,它包括数据域和指针域,数据域用于群体中元素的内容,通过指针来访问结点。
并对头结点进行初始化。
对结点动态分配内存,存储录入商品的全部信息,并可以在需需要的时候将相应的信息调出来。
5、定义子函数,通过调用来实现所选功能。
6、运用switch语句选择键入0、1、2、3或4,选择所需进入功能。
选择1,调用1号子函数,进行商品录入,录入商品的代码、名字、价格和数量;选择2,调用2号子函数,进入商品查询系统,输入所要查询商品的代码,如果存在此商品,便会输出该商品的一切信息。
选择3,可以检录到所有库存商品的信息,方便用户选择;选择4,根据录入信息键入所要购买商品的代码和数量,并在购买一件商品结束后,输出用户的购买信息;选择0,表示运行结束,退出系统。
6、应用一个功能完成后,都会有提示供用户选择,方便用户,也能使程序运行通畅。
四、用户手册:
程序运行时,首先根据系统提示来选择需要进入的功能
1、由于该程序编辑过程中并没有储存上平信息,因此需要录入商品信息,输入1即可。
系统会提示输入代码、名称、价格和数量。
录入一个后提示是否继续输入,选择Y/N。
2、商品查询功能选择三,根据所输入的商品代码,判断是否存在所查商品,仓库中有,输出该商品的全部信息,供消费者参考;如果没有则提示:
“无此商品”。
3、输入3,则会显示当时情况下所有商品的库存信息。
4、输入4,2表示购买商品,输入2后会提示是否继续购买,如果我们要继续,只需输入任意键〔空格、Enter键除外〕。
必须注意的是,如果输入数字,则只能是一位数,两位或多位,则会导致程序无法正常运行。
购买时会提示输入所买商品的代码以及数量。
每一次购买结束屏幕上都会显示所买商品的信息:
代码==名称==价格==数量==小计(元)。
如果所买商品代码未曾录入,会提示没有该商品。
5、键入0,退出系统。
五、调试过程:
错误之处;
1、代码和名字分别定义为整型和字符型。
2、未对链表头结点进行初始化。
3、数据域中没有分配内存。
4、在do-while语句结束时没有返回头结点。
5、显示程序不能实现,卖出商品后没有方法在原有的数据上减去卖出的部分,显示的仍旧是录入商品的全部数量。
导致的后果:
第一个错误导致在访问结点无法进行;与后面的不匹配。
第二个错误,在运行程序时,无论时录入商品信息还是购买商品均不能进行第二步操作;第三个错误引发的后果与错误2一样;错误4则导致函数creat没有返回值。
最后的一个错误不符合任务书上的要求
改正方法:
1、定义代码和名字改用string;
2、对头结点进行初始化并动态分配一个内存大小:
Head=(Link)newNode;//每次动态分配一个Node内存大小。
Head->num="";
Head->name="";
Head->jiage=0.0;
Head->shuliang=0;
Head->next=NULL;
3、返回头结点:
returnHead;。
收获:
在编写次程序时,由于对来链表不是相当了解,以至于定义变量num、name时没有注意其类型,无法与后面Head->num="";Head->name="";if(p->num==num)相匹配,程序出现错误。
而后通过问同学才有了一定的了解。
同时还了解到应用量表的时候需哎哟注意对头结点进行初始化以及分配空间,用以储存更多的元素内容,否则的话在运行的过程中,录入一钟商品的信息完成后,程序会自动结束。
最后一个错误是由于自己大一造成的。
其次,第一次调试发现,程序无法进行商品查询功能,这表示,该程序尚不完整,经过思考以及同学的帮助,对其进行了完善:
首先定义一个子函数:
LinkSearch(LinkHead,string&num)
{
Linkp;
p=Head;
while(p!
=NULL)
{
if(p->num==num)
returnp;
else
p=p->next;
}
cout<<"无此商品!
"<returnp;。
}
通过输入商品代码,来查询仓库中是否有该商品。
另外在运行程序是发现,当选择查看所有商品信息时输出结果太乱信息无法与提示对齐,我们可以在头文件中加入#include,后面的输出程序可以改成:
cout<m_code
<m_name
<m_price
<m_quantity<但是由于本人对齐不太了解,故选择输出空格,尽量使其对齐。
改良设想:
本程序最大的缺点就是没有在程序中预先储存商品信息,因此在运行程序过程中需要首先录入一部分商品。
为了方便方便,我们可以针对此问题来进行修改,在容器中储存一些比较常用的商品〔不少于二十种〕。
运行程序过程中,如果我们选择了2,购买商品,首先会显示:
结束买入请按‘N’,其他任意键表示继续买入!
这里的任意键不为空格和输入键,并且输入数字的情况下只能为一位,否则无法输入代码,程序无法继续进行。
六、测试结果:
运行程序后,屏幕显示内容为:
-----------------欢送光临,选择进入系统--------------------
*1.录入信息2.查询商品3.显示数据4、购买商品0.退出系统*
首先录入商品,键入1:
商品入库信息
代码:
001
名称:
a
价格:
8
数量:
100
信息录入成功!
继续?
〔Y/N〕
如果继续录入则键入Y,重复上面的操作。
如果键入N,再次进行功能选择:
键入2,进行商品查询:
键入3,显示所有的商品信息,屏幕显示:
根据提示继续进行选择,键入4,进行商品购买,每次购买结束后均有提示,如图:
选择Y则继续进行上述操作,反之则为:
选择0,屏幕显示“已退出系统!
”
通过对该程序的简单测试,可以知道它的总工作流程可概括为下列图所示:
菜
单
选
项
录入成功
输出所查商品信息
所买商品信息以及需要付的金额。
1录入商品
代码:
名称:
价格:
数量:
2、商品查询
代码:
3、显示数据
所有商品信息
4、购买商品
代码:
数量:
0、退出系统
七、、课后总结:
通过此次课程设计,我学到了好多东西。
由于之前对C++的知识积累不够,使得本次课程设计遇到了不少的困难。
通过咨询老师同学和查看参考资料,困难逐个儿解决了,随着困难的解决,我学到了不少的知识,使我明确了以后的努力方向。
本次课程设计让我有时机能把之前学的C++知识系统的串联起来。
尤其使对链表方面的知识,有了更深入的了解。
在此过程中,通过不断的调试——修改——调试循环,对程序进行一步步的完善,最后进行测试,对一些功能进行应用,检查是否能够实现任务书上的要求到的所有功能,能否完美的实现这些功能,这不仅仅使对我们知识方面的考验,也是在考验我们的细心程度以及检查问题并改正问题的能力,更是对我们耐心的考验。
通过这次课程设计,培养了我分析实际应用系统和设计设计实际应用系统的能力,提高了应用面向对象程序设计工具进行实际系统的设计的能力。
八、参考文献
[1]郑莉,董渊,张瑞丰.C++语言程序设计.北京:
清华大学出版社,2004年1月第三版。
九、附录:
//商品销售统计程序
#include
#include
usingnamespacestd;
structSale
{
stringnum;
stringname;
floatjiage;
unsignedintshuliang;
structSale*next;
};
typedefstructSaleNode;
typedefNode*Link;
//创建链表。
LinkCreate(LinkHead)
{
Head=(Link)newNode;
Head->num="";
Head->name="";
Head->jiage=0.0;
Head->shuliang=0;
Head->next=NULL;
//-----
Linkp;//定义一个用来运算的指针ptr。
p=Head;
LinkDNode;
charGoOn;
do
{
cout<<"商品入库信息!
"<stringnum,name;
floatjiage;
unsignedintshuliang;
cout<<"代码:
"<cin>>num;
cout<<"名称:
"<cin>>name;
cout<<"价格:
"<cin>>jiage;
while(cin.fail())
{
cout<<"出现错误,请重新输入:
"<cin>>jiage;
}
cout<<"数量:
"<cin>>shuliang;
while(cin.fail())
{
cout<<"出现错误,请重新输入:
"<cin>>shuliang;
}
DNode=(Link)newNode;
DNode->num=num;
DNode->name=name;
DNode->jiage=jiage;
DNode->shuliang=shuliang;
DNode->next=NULL;
p->next=DNode;
p=DNode;
cout<<"信息录入成功!
继续?
(Y/N)";
cin>>GoOn;
}while(GoOn=='Y'||GoOn=='y');
returnHead;
}
//释放链表。
voidRelease(LinkHead)
{
Linkp;
while(Head!
=NULL)
{
p=Head;
Head=Head->next;
deletep;
}
}
//查询。
LinkSearch(LinkHead,string&num)
{
Linkp;
p=Head;
while(p!
=NULL)
{
if(p->num==num)
returnp;
else
p=p->next;
}
cout<<"无此商品!
"<returnp;
}
voidDisplay(LinkHead)
{
Linkp;
p=Head->next;
cout<<"所有商品信息"<cout<<"代码==名称==价格==数量"<while(p!
=NULL)
{
cout<num<<
""<name<<
""<jiage<<
""<shuliang<p=p->next;
}
}
voidDisplay_One(LinkHead,string&num,unsignedshuliang)
{
Linkp;
p=Search(Head,num);
cout<<"代码==名称==价格==数量==小计(元)"<cout<num<<
""<name<<
""<jiage<<
""<<jiage<}
//单个商品小结。
floatCheckOut(LinkHead,string&num,unsignedshuliang)
{
Linkp;
floatsum(0);
p=Search(Head,num);
sum=(p->jiage*shuliang);
returnsum;
}
voidxg(LinkHead,string&num,unsignedshuliang)
{
Linkp;
p=Search(Head,num);
p->shuliang=p->shuliang-shuliang;
}
//总结帐。
voidTotal(LinkHead)
{
Linkp;
p=Head;
floatsum(0);
floatfukuan;
charGoOn;
while
(1)
{
cout<<"结束买入请按\'N\',其它任意键表示继续买入!
"<cin>>GoOn;
if(GoOn=='N'||GoOn=='n')
break;
else
{
stringnum;
unsignedintshuliang;
cout<<"代码:
"<cin>>num;
cout<<"数量:
"<cin>>shuliang;
sum+=CheckOut(p,num,shuliang);
cout<<"你购买的商品为:
"<Display_One(p,num,shuliang);
xg(Head,num,shuliang);
}
}
cout<<"该付"<"<cout<<"实付(元):
";
cin>>fukuan;
cout<<"找零"<"<}
intmain()
{
//---------菜单项选择项----------------
LinkHead=NULL;
Linkp;
stringnum;
intloop=1;
while(loop)
{
cout<<"-----------------欢送光临,选择进入系统--------------------"<cout<<"*1.录入信息2.查询商品3.显示数据4.买入商品0.退出系统*"<intmenu;
cin>>menu;
if(cin.fail())
{
cout<<"出现错误,请重新输入!
"<cin>>menu;
}
switch(menu)
{
case0:
cout<<"已退出系统!
"<loop=0;
break;
case1:
Head=Create(Head);
break;
case2:
cout<<"输入商品代码:
"<cin>>num;
p=Search(Head,num);
cout<<"代码==名称==价格==数量"<cout<num<<
""<name<<
""<jiage<<""<shuliang<break;
case3:
Display(Head);
break;
case4:
Total(Head);
break;
}
}
Release(Head);
return0;
}