c++课程设计报告家电库存系统的设计.docx
《c++课程设计报告家电库存系统的设计.docx》由会员分享,可在线阅读,更多相关《c++课程设计报告家电库存系统的设计.docx(23页珍藏版)》请在冰豆网上搜索。
c++课程设计报告家电库存系统的设计
综合性设计报告
院(系):
_电子信息工程学院_班级:
学生姓名:
学号:
设计地点(单位)___计算机科学与工程实验室___________
设计题目:
_家电库存系统的设计________________
完成日期:
2009年9月11日
指导教师评语:
_______________________________________
__________________________________________________________________________________________________________________________________________________________________________________________________________________
成绩(五级记分制):
________________
指导教师(签字):
________________
课程设计任务书
设计题目:
家电库存系统的设计
学生姓名
课程名称
数据结构课程设计
专业班级
计科普2008-01,02
地点
计算机专业实验室
起止时间
2009.8.31-2009.9.11
设计内容及要求
以链表结构的有序表表示某商场家电部的库存模型。
当有提货或进货时需要对该链表及时进行维护。
每个工作日结束之后,将该链表中的数据以文件形式保存,每日开始营业之前,需将以文件形式保存的数据恢复成链表结构的有序表。
链表结点的数据域包括:
类别、型号、品牌、单价和数量,以单价的升序体现链表的有序性。
程序功能包括:
初始化、创建表、插入、删除、更新数据,查询及链表数据与文件之间的转换等。
设计
参数
测试数据要求:
家电类别(如:
电视机,空调,冰箱等)不少于5种,记录数量不少于50。
进度
要求
2009.8.31星期一完成任务的讲解、并接受课程设计任务,选定课程设计的题目
2009.9.1星期二了解任务的算法、并画出算法的程序流程图
2009.9.2星期三对任务的关键技术进行验证、并确定解决办法
2009.9.3星期四编制程序
2009.9.4星期五编制程序
2009.9.7星期一调试程序,并试运行
2009.9.8星期二整理课程设计过程中的各参数、进行总结并提出改进意见
2009.9.9星期三对改进办法进行实现,并编写课程设计报告
2009.9.10星期四编写课程设计报告并准备答辨
2009.9.11星期五参加答辨,提交设计报告
参考资料
1.严蔚敏吴伟民著,数据结构,清华大学出版社,2007.3
2.李春葆著,数据结构教程,清华大学出版社,2005.1
3.RichardF.GilbergBehrouzA.Forouzan,数据结构的C++伪码实现(英文版),人民邮电出版社,2002.1
其它
说明
1.本表应在每次实施前一周由负责教师填写二份,院系审批后交院系办备案,一份由负责教师留用。
2.若填写内容较多可另纸附后。
3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。
摘要
本程序的作用是建立一个简单的家电库存管理系统。
当库存信息发生变化时要求能对链表的信息进行更新并存入文件。
每个工作日开始时,需要把磁盘中的商品信息读出并加入链表中,每个工作日结束之后,在将该链表中的数据以文件形式保存,链表结点的数据域包括:
类别、型号、品牌、单价和数量,以单价的升序体现链表的有序性。
程序功能包括:
初始化、创建表、插入、删除、更新数据,查询及链表数据与文件之间的转换等。
程序需要对链表进行初始化、插入、删除、更新数据,查询等操作,还要求对文件的操作。
关键字:
链表数据域插入删除
第一部分设计题目、内容及要求
1.1设计题目
以链表结构的有序表表示某商场家电部的库存模型。
当有提货或进货时需要对该链表及时进行维护。
每个工作日结束之后,将该链表中的数据以文件形式保存,每日开始营业之前,需将以文件形式保存的数据恢复成链表结构的有序表。
链表结点的数据域包括:
类别、型号、品牌、单价和数量,以单价的升序体现链表的有序性。
程序功能包括:
初始化、创建表、插入、删除、更新数据,查询及链表数据与文件之间的转换等。
1.2设计要求
要求实现以下功能
(1)初始化并创建链表:
能够初始化并创建商品信息表并按照单价的升序排列;
(2)插入及删除:
能够添加新商品信息并且当商品由于某种原因(损坏,售出及其他原因)而不得不删除之时能够顺利地实现删除操作;
(3)更新数据:
当商品的价格或者数量变动的时候能够作出相应的改变;
(4)查询:
能够按照某种要求需求商品的信息,并决定是否购买该商品,然后作出相应的数据更新;
(5)链表与文件之间的转换:
能够成功地将链表中的信息写入文件,并能根据需要读出文件中的信息。
第二部分概要设计
2.1链表节点信息说明
表1各数据类型名称及其表示意义
名称
数据类型
表示的意义
Species
字符
家电的类型(包括电视机,空调等类型)
Xinghao
字符串
家电的型号
Pinpai
字符串
家电的品牌
Danjia
浮点型
家电价格,为浮点型
Shuliang
整型
家电的数量
Data
节点信息,包括以上数据信息
next
指针
指向由Date和next组成节点
表中,Species表示家电的类型,用一个大写字母代替。
例如“D”表示电视机,“K”表示空调,“B”表示冰箱,“J”表示电脑,“X”表示洗衣机。
Xinghao和Pinpai都是以字符串的形式表示的,Danjia表示一个商品的价格,而Shuliang这表示某种商品的库存量。
Date则是数据域,包括以上五项。
而next则表示指向下一个节点的指针。
这就是一个商品种类的全部信息,用一个节点的空间来储存该类型商品的信息。
而在以后的删除和插入以及查询操作中在某些情况下只需对商品的库存量做一些修改久可以达到目的,非常方便。
2.2总体程序框图
否
结束
输入i值决定下一步操作
更新数据
退出并保存商品信息
查询并决定是否购买
从商品清单中读取信息
删除商品信息
添加商品
初始化商品信息
选择进入的模块
选择是否进入系统
是
i=1i=2
图2-1总体程序框图
第三部分详细设计
3.1初始化数据模块详细设计
3.1.1初始化数据模块伪码算法
intInticial(ListNode&p)
{while(i!
=2)
{scanf(&pp->Date);pp->next=p->next;p->next=pp;scanf(&i);
}Paixu(p);Display(p);ListTxt(p);
returnOK;}
其中,排序函数伪码算法如下:
intPaixu(ListNode&head)
{p=q=head->next;while(p!
=NULL)
{q=p->next;min=p->Date;
while(q!
=NULL)
{if(q->Date.Danjia<=min.Danjia)
{min=q->Date;q->Date=p->Date;p->Date=min;}q=q->next;
}p=p->next;}Display(head);
returnOK;
其次,由链表读入信息到文件函数伪码算法如下:
intListTxt(ListNode&head)
{
FILE*fp;p=head->next;
if(p==NULL)exit(0);
if((fp=fopen("e:
\\a.txt","w"))==NULL)exit(0);
while(p!
=NULL)
{fprintf(fp,p->Date);p=p->next;}
if(fclose(fp))exit(0);
return1;
}
3.1.2初始化模块程序流程图
scanf("%d",&i)
p->next=pp
pp->next=p->next
输入相应商品信息
结束
输出相应提示
p->next==NULL
Display(p)
Paixu(p)
i==2
NY
Y
N
ListTxt(p)
图3-1数据初始化模块程序流程图
3.2添加商品模块详细设计
3.2.1添加信息模块伪码算法
intInsert(ListNode&head,Node&a)
{
p=head->next;
if(p==NULL)exit(0);
while(p=p->next)p=p->next;
q->Date=a.Date;
q->next=p->next;p->next=q;
ListTxt(head);
returnOK;
}
在上面的算法中,首先要查看一下商品信息表示否为空,是则退出,否则继续操作。
在进入该模块之前,有关插入的商品的信息已经初始化完成,直接通过引用就可以使用。
本模块首先将要插入商品的有关信息映射到一个节点的数据域,然后将该节点插入到商品信息表中,再排序即可。
结束
ListTxt(head)
Paixu(head)
p->next=q;
q->next=p->next
将a中的数据映射到节点q的数据域
3.2.2添加商品模块程序流程图
p==NULL
NY
图3-2添加商品信息模块程序流程图
3.3删除货物模块详细设计
3.3.1删除模块伪码算法
intDelete(ListNode&head,Node&a)
{if(p==NULL)exit(0);scanf(&choice);
switch(choice){
case1:
scanf(a.Species);
while(p!
=NULL)
{if(strcmp(p-Date.Species,a.Species)==0)
{printf(p->Date);i++;}p=p->next;}
if(i==1)break;
else{p=head;scanf(&number);while(count{if(strcmp(p->next->Date.Species,a.Species)==0){count++;
p=p->next;}
while(strcmp(p->next->Date.Species,a.Species)!
=0)p=p->next;
if(p->next->Date.Shuliang>a.Shuliang)p->next-Date.Shuliang-=a.Shuliang;
else{s=p->next;p->next=p->next->next;free(s);}Display(head);}
break;
case2:
scanf(a.XingHao);while(p!
=NULL){
if(strcmp(p->Date.XingHao,a.XingHao)==0){
printf(p->Date);i++;}p=p->next;}
if(i==1)break;
else{p=head;scanf(&number);
while(count{if(strcmp(p->next->Date.XingHao,a.XingHao)==0)count++;
p=p->next;}
while(strcmp(p->Date.XingHao,a.XingHao)!
=0)p=p->next;}
if(p->next->Date.Shuliang>a.Shuliang)
p->next->Date.Shuliang-=a.Shuliang;else
{s=p->next;p->next=p->next->next;
}Display(head);}break;}ListTxt(head);
returnOK;}
3.3.2删除模块程序流程图
由于本模块流程图中有类似的操作,所以只给出其中一种情况下的流程图,其他两种情况下的流程图省略不写。
另外,此图还省略了其他不重要的操作。
结束
Display(head)
p->next=p->next->next
s=p->next
NY
p==NULL
Choice==1
N
Y
Choice==2
scanf("%d",&number)
N
以后商品数量是否大于删除数量
Y
Y
N
p->next->Date.Shuliang-=a.Shuliang
图3-3删除模块流程图
3.4查询模块详细设计
3.4.1查询模块伪码算法
intSearch(ListNode&head,Node&a)
{if(p==NULL){getch();system("cls");}scanf(&choice);
switch(choice)
{case1:
scanf(a.Species);
while(p!
=NULL){if(strcmp(p->Date.Species,a.Species)==0){printf(p->Date);i++;}
p=p->next;}if(i==1)printf("*对不起,没有找到相关商品的信息!
\n");
elsescanf(&choice1);
switch(choice1)
{case1:
p=head;scanf(&a.Shuliang);
while(count{if(strcmp(p->next->Date.Species,a.Species)==0)
count++;p=p->next;}
while(strcmp(p->next->Date.Species,a.Species)!
=0)
p=p->next;
if(p->next->Date.Shuliang>a.Shuliang)
p->next->Date.Shuliang-=a.Shuliang;
else{
s=p->next;p->next=p->next->next;free(s);}break;
case2:
break;}
}break;
case2:
case1:
p=head;scanf(&a.Shuliang);
while(count{if(strcmp(p->next->Date.XingHao,a.XingHao==0))
count++;
p=p->next;}
while(strcmp(p->next->Date.XingHao,a.XingHao)!
=0)
p=p->next;
if(p->next->Date.Shuliang>a.Shuliang)
p->next->Date.Shuliang-=a.Shuliang;
else{
s=p->next;p->next=p->next->next;free(s);}break;
case2:
break;}
}break;
case3:
case1:
p=head;scanf(&a.Shuliang);
while(count{if(strcmp(p->next->Date.Brand,a.Brand)==0)
count++;
p=p->next;}
while(strcmp(p->next->Date.Brand,a.Brand)!
=0)
p=p->next;
if(p->next->Date.Shuliang>a.Shuliang)
p->next->Date.Shuliang-=a.Shuliang;
else{
s=p->next;p->next=p->next->next;free(s);}break;
case2:
break;}
}breakdefault:
getch();exit(0);}
return1;
}
3.4.2查询模块流程图
由于本模块流程图比较复杂,因此省略了一些不是很重要的部分。
Choice==1
i==1
Choice==2
输入number
i==2
p->next->Date.Shuliang>a.Shuliang
输入number
p->next->Date.Shuliang>a.Shuliang
s=p->next
p->next->Date.Shuliang-=a.Shuliang
p->next=p->next->next
p->next->Date.Shuliang-=a.Shuliang
s=p->next
p->next=p->next->nexttp->next->next
结束
图3-4查询模块流程图
3.5从文件中读取商品信息
3.5.1伪码算法
intTxtList(ListNode&head)
{q->next=NULL;FILE*fp;
if((fp=fopen("e:
\\a.txt","r"))==NULL)exit(0);
while(!
feof(fp))
{p=(ListNode)malloc(sizeof(Node));
fscanf(fp,p->Date);p->next=q->next;q->next=p;}
q->next=q->next->next;
if(Getlenth(q)==0)
{scanf(&choice);if(choice==1){Inticial(q);ListTxt(q);}
}s=q->next;
while(s!
=NULL){printf(s->Date);s=s->next;}
fclose(fp);return1;}
3.5.2读取信息模块程序流程图
Getlenth(q)==0
输入choice的值
q->next=q->next->next
向节点中读入信息
fp=open("e:
\\a.txt","r"))==NULL
结束
s=s->next
输出相应信息
choice==1
信息是否读取完毕
图3-5读取信息模块程序流程图
3.6数据更新模块详细设计
3.6.1数据更新模块伪码算法
intGengxin(ListNode&head)
{chara[40];charb[20];doubled;
while(p!
=NULL){printf(p->Date);
p=p->next;n++;}
while(choice1!
=2)
{
scanf(&k);p=head;
for(intcount=0;countp=p->next;
printf(p->Date);scanf(&choice);
switch(choice)
{
case1:
scanf(fp);strcpy(p->Date.Species,fp);break;
case2:
scanf(a);strcpy(p->Date.XingHao,a);break;
case3:
scanf(b);strcpy(p->Date.Brand,b);break;
case4:
scanf(&d);p->Date.Danjia=d;break;
case5:
scanf(&number);p->Date.Shuliang=umber;break;
default:
}printf(p->Date);scanf(&choice1);
}
ListTxt(head);return1;
}
3.6.2更新数据模块程序流程图
结束
输入choice的值
Choice==3
Choice==4
Choice==2
Choice==1
choice1==2
输出相应商品信息
输入choice值
scanf("%s",a);strcpy(p->Date.XingHao,a)
scanf("%s",fp);strcpy(p->Date.Species,fp)
scanf("%s",b);strcpy(p->Date.Brand,b)
scanf("%d",&number);p->Date.Shuliang=number
scanf("%lf",&d);p->Date.Danjia=d
输出更新之后商品的信息
图3-6更新数据模块流程图
3.6退出并保存商品清单
3.6.1退出并保存商品伪码算法
intListTxt(ListNode&head)
{FILE*fp;p=head->next;if(p==NULL)exit(0);
if((fp=fopen("e:
\\a.txt","w"))==NULL)exit(0);
while(p!
=NULL)
{fprintf(fp,p->Date);p=p->next;}if(fclose(fp))exit(0);return1;}
3.6.2退出并保存商品程序流程图
P==NULL
(fp=fopen("e:
\\a.txt","w"))==NULL
结束
p=p->next
将相应信息读入文件
p==NULL
图3-7退出并保存商品程序流程图
第四部分调试分析
4.1问题回顾和分析
编写完程序之后,调试过程中出现不少问题。
主要包括以下几个。
首先,刚开始发现了一些由于粗心而出现的小问题,包括数据的输入