数据结构课程设计客户消费积分系统.docx
《数据结构课程设计客户消费积分系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计客户消费积分系统.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构课程设计客户消费积分系统
课程设计报告
设计题目:
客户消费积分系统
学院、系:
电子与信息工程学院
专业班级:
学生姓名:
指导教师:
成绩:
2013年1月8日
1、需求分析…………………………………………………………2
1.1问题描述………………………………………………………3
1.2基本要求………………………………………………………3
2、概要设计…………………………………………………………3
2.1数据结构……………………………………………………….4
2.2程序模块……………………………………………………….4
2.3各模块之间的调用关系以及算法设计……………………….4
3、详细设计………………………………………………………...5
4、测试与分析……………………………………………………..6
5、总结……………………………………………………………..10
6、附录……………………………………………………………..11
1、需求分析:
1.1问题描述
1、采用动态分配顺序表存储客户信息,并用文件保存和读写数据
2、能对客户信息进行添加、查询、修改、删除等基本操作
3、根据客户消费额,合理计算出客户消费所得积分
4、根据客户积分值,实行不同情况的优惠(即计算折扣)
1.2基本要求
进行添加客户时要注意不能超过所定义数组的最大容量,查找时输入的身份证号要求为18位,本程序能对客户信息进行添加、查询、修改、删除等基本操作,根据客户消费额,合理计算出客户消费所得积分,根据客户积分值,实行不同情况的优惠。
2、概要设计:
1.数据结构
线性表的抽象数据类型定义
InitList
前置条件:
线性表不存在
输入:
无
功能:
线性表的初始化
输出:
无
后置条件:
一个空的线性表
DestroyList
前置条件:
线性表已存在
输入:
无
功能:
销毁线性表
输出:
无
后置条件:
释放线性表所占的内存空间
Length
前置条件:
线性表已存在
输入:
无
功能:
求线性表的长度
输出:
线性表中元素个数
后置条件:
、线性表不变
Get
前置条件:
线性表已存在
输入:
元素的序号i
功能:
在线性表中去序号为i的元素
输出:
如果序号合法,返回序号为i的元素值,否则抛出异常
后置条件:
、线性表不变
Insert
前置条件:
线性表已存在
输入:
插入位置i,插入元素x
功能:
在线性表的第i个位置,插入元素X
输出:
若插入不成功,抛出异常
后置条件:
若插入成功,表中增加了一个元素
Delete
前置条件:
线性表已存在
输入:
删除位置i
功能:
删除线性表的第i个元素
输出:
若删除成功,返回被删除元素,否则抛出异常
后置条件:
若删除成功,表中减少了一个元素
Print
前置条件:
线性表已存在
输入:
无
功能:
按位置的先后次序依次输出线性表中的元素
输出:
线性表中的各个元素
后置条件:
线性表不变
2.程序模块
主函数main()
动态获取表空间,初始化链表,打开文件将客户数据加载入表中,进行表操作,操作结束将表数据保存到文件,文件关闭。
2.1添加客户信息
遍历当前单链表,若待添加的用户编号已存在,则返回用户已存在的提示信息;若待添加的用户不存在,则将该客户信息添加到顺序表最后,并将单链表表长度加1。
2.2删除客户信息
遍历当前顺序表,若要删除的用户标号不存在,则返回提示信息;否则提示用户是否确定删除,确定即删除。
删除操作即将待删除记录的后面记录依次向前移动1步。
2.3更改客户信息
遍历当前单链表,若待更改的用户编号不存在,则返回用户不存在的提示信息;若待添加的用户存在,则提示输入新的信息。
2.4查找客户信息
输入待查找用户的身份证号,若存在则返回用户的信息
2.5显示客户信息
遍历整个单链表,显示当前所有客户
2.6统计客户
遍历单链表,统计当前链表中所有客户的总数
3.各模块之间的调用关系以及算法设计
3、详细设计
添加客户信息伪代码:
1.初始化工作指针P,申请空的结点空间;
2.输入姓名,输入身份证号;
3.若省份证号不等于18,输出输入有误,否则输入消费金额,并调用函数进行折扣计算;
查找客户信息:
1.初始化工作指针P,工作指针P指向头结点,并定义折扣;
2.判断P是否为空,若为空,输出无用户,否则P后移直到身份证号相同;
3.若相同调用函数计算折扣;
更改客户信息:
1.初始化工作指针p,定义折扣和续加金额;
2.判断指针P是否为空,若为空输出没有客户,否则p后移;
3.判断身份证号是否相同,若相同输出姓名、身份证号、消费、折扣、积分;
4.输入要修改的项目;
4.1选择1,输入修改后的姓名4.2选择2,输入修改后的身份证号4.3选择3,覆盖以前消费、续加上现在费用;
5.调用积分函数,计算折扣;
删除客户信息:
1.初始化工作指针p,定义折扣;
2判断指针P是否为空,若为空输出没有客户,否则p后移;
3判断身份证号是否相同,若相同输出姓名、身份证号、消费、折扣、积分;
4选择是否删除,选1返回删除成功,选2,返回删除失败;
显示客户信息:
1初始化工作指针p,定义折扣;
2判断指针P是否为空,若为空输出没有客户,否则p后移;
3输出每位姓名、身份证号、消费、折扣、积分
统计客户信息:
1初始化工作指针p,累加器i初始化;
2判断指针P是否为空,若为空输出没有客户,否则p后移;
3累加器i加1;
4输出现有客户数量i位;
计算折扣函数:
1.定义折扣discount
2.若积分为0,则折扣为0;若积分大于0小于50,则折扣为9;若积分大于等于50,于100,则折扣为8,;若积分大于等于100,小于等于150,则折扣为7;若积分大于等于150,小于等于200,则折扣为7;若积分大于等于150,小于等于200,则折扣为6.5
若积分大于等于200,小于等于300,则折扣为6,;若积分大于300,折扣为6.
4、测试与分析
添加客户信息:
查找客户信息:
修改客户信息:
删除客户信息:
显示客户:
统计客户:
退出:
5、总结:
在本次课程设计当中,我对许多以往掌握不够熟练或者是使用较少而易忽略的知识点有了一定的掌握,而且通过本次试验提高了我的实际操作能力,在编写代码的过程当中,我通过查阅有关的资料和分析实例,从中学到了很多能够不断优化自己代码,可以提高代码利用率的知识,并且更加合理的构建了各个知识点之间的联系,充分的利用了循环和选择性语句,在存储过程中,对文件的部分知识也有了一个深层次的了解和掌握,对于如何修改文件信息以及保存有了一定的概念和运用。
当然,在代码的编写过程中,也遇到了许多问题,我通过自身的努力去改正它们,在这个过程中我也学到了很多东西,在代码的调试过程中,我碰到了许多以前所没有碰到过的错误,但通过同学的帮助解决了这些困难,并且自身得到了一定的提高。
通过本学期的学习我对数据结构有了更深的了解,数据结构重在思想,通过学习数据结构的思想和C++结合来编写程序,虽然现在编程仍有许多困难,但以后的学习中,我会更加努力,希望能够不断的提高自己!
6、附录:
源程序
#include
usingnamespacestd;
structcnode
{
charname[20];
charID[20];
doubleconsume;
doubleinteger;
structcnode*next;
};
voidInitstack(cnode*&head)
{
head=newcnode;
head->next=NULL;
}
voidGetelem(cnode*head);
voidSearch(cnode*head,charID[]);
voidAmend(cnode*head,charID[]);
voidDelete(cnode*head,charID[]);
voidShowall(cnode*head);
voidcount(cnode*head);
doubledisplay_discount(doubleinteger);
voidmain()
{
cnode*head;
intchoice;
chary[20];
Initstack(head);
do{
cout<<"\n";
cout<<"客户消费积分管理系统\n\n";
cout<<"****************************";
cout<<"\n**\n";
cout<<"\n*主菜单*\n";
cout<<"\n*1添加客户*\n";
cout<<"\n*2查找客户*\n";
cout<<"\n*3修改客户*\n";
cout<<"\n*4删除客户*\n";
cout<<"\n*5显示客户*\n";
cout<<"\n*6统计客户*\n";
cout<<"\n*7退出*\n";
cout<<"\n**\n";
cout<<"***************************";
cout<<"\n请输入您的选择(1,2,3,4,5,6):
";
cin>>choice;
if(choice==1)
{
Getelem(head);
}
elseif(choice==2)
{
cout<<"\n请输入您查找客户的身份证号:
";
cin>>y;
while(strlen(y)!
=18)
{
cout<<"身份证号码位数有误请重新输入(18位):
";
cin>>y;
}
Search(head,y);
}
elseif(choice==3)
{
cout<<"\n请输入您想修改客户的身份证号:
";
cin>>y;
while(strlen(y)!
=18)
{
cout<<"身份证号码位数有误请重新输入(18位):
";
cin>>y;
}
Amend(head,y);
}
elseif(choice==4)
{
cout<<"\n";
cout<<"请输入你想要删除的客户的身份证号:
";
cin>>y;
Delete(head,y);
}
elseif(choice==5)
{
cout<<"\n";
Showall(head);
}
elseif(choice==6)
{
cout<<"\n";
count(head);
}
elseif(choice==7)
exit
(1);
}while(choice<=7);
}
voidGetelem(cnode*head)
{
cnode*p;
doubley;
p=newcnode;/*申请空的节点空间*/
cout<<"请输入姓名:
";
cin>>p->name;
cout<<"请输入身份证号(18位):
";
cin>>p->ID;
while(strlen(p->ID)!
=18)
{
cout<<"身份证号码位数有误请重新输入(18位):
";
cin>>p->ID;
}
cout<<"请输入消费金额:
";
cin>>p->consume;
p->integer=p->consume/100;
y=display_discount(p->integer);
cout<<"折扣:
";
cout<cout<<"折\n";
p->next=head->next;
head->next=p;
}
voidSearch(cnode*head,charID[])
{
cnode*p;
doubley;
p=head;
if(p->next==NULL)
cout<<"没有客户!
\n";
else
{
while(p->next!
=NULL)
{
p=p->next;
if(strcmp(ID,p->ID)==0)
{
cout<<"姓名:
";
cout<name;
cout<<"身份证号:
";
cout<ID;
cout<<"消费:
";
cout<consume;
cout<<"积分:
";
cout<integer;
y=display_discount(p->integer);
cout<<"折扣:
";
cout<cout<<"折\n";
}
}
}
}
voidAmend(cnode*head,charID[])
{
cnode*p;
doubley,z;
intchoose,x;
p=head;
if(p->next==NULL)
cout<<"没有客户!
\n";
else
{
while(p->next!
=NULL)
{
p=p->next;
if(strcmp(ID,p->ID)==0)
{
cout<<"姓名:
";
cout<name;
cout<<"身份证号:
";
cout<ID;
cout<<"消费";
cout<consume;
cout<<"积分:
";
cout<integer;
y=display_discount(p->integer);
cout<<"折扣:
";
cout<cout<<"折\n";
}
}
cout<<"请选择你要修改的1、姓名。
2、身份证号。
3、消费金额。
";
cin>>choose;
if(choose==1)
{
cout<<"请输入修改后姓名;";
cin>>p->name;
}
if(choose==2)
{
cout<<"请输入修改后的身份证号:
";
cin>>p->ID;
while(strlen(p->ID)!
=18)
{
cout<<"身份证号码位数有误请重新输入(18位):
";
cin>>p->ID;
}
}
if(choose==3)
{
cout<<"1.覆盖以前消费、2.续加上现在费用!
!
请选择:
";
cin>>x;
if(x==1)
{
cout<<"请输入修改后的消费:
";
cin>>p->consume;
}
else
{
cout<<"请输入续加金额:
";
cin>>z;
p->consume+=z;
}
}
cout<<"姓名:
";
cout<name;
cout<<"身份证号:
";
cout<ID;
cout<<"消费:
";
cout<consume;
p->integer=p->consume/100;
cout<<"积分:
";
cout<integer;
y=display_discount(p->integer);
cout<<"折扣:
";
cout<cout<<"折\n";
}
}
voidDelete(cnode*head,charID[])
{
cnode*p;
intx;
doubley;
p=head;
if(p->next==NULL)
cout<<"没有客户!
\n";
else
{
while(p->next!
=NULL)
{
head=p;
p=p->next;
if(strcmp(ID,p->ID)==0)
{
cout<<"姓名:
";
cout<name;
cout<<"身份证号:
";
cout<ID;
cout<<"消费:
";
cout<consume;
cout<<"积分:
";
cout<integer;
y=display_discount(p->integer);
cout<<"折扣:
";
cout<cout<<"折\n";
}
}
cout<<"你确认删除?
1、确定。
2、取消。
请选择:
";
cin>>x;
if(x==1)
{
head->next=p->next;
cout<<"删除成功!
";
}
else
{
cout<<"删除失败!
";
}
}
}
voidShowall(cnode*head)
{
cnode*p;
doubley;
p=head;
if(p->next==NULL)
cout<<"没有客户!
\n";
else
{
while(p->next!
=NULL)
{
p=p->next;
cout<<"姓名:
";
cout<name;
cout<<"身份证号:
";
cout<ID;
cout<<"消费:
";
cout<consume;
cout<<"积分:
";
cout<integer;
y=display_discount(p->integer);
cout<<"折扣:
";
cout<cout<<"折\n";
}
}
}
voidcount(cnode*head)
{
cnode*p;
inti=0;
p=head;
if(p->next==NULL)
cout<<"没有客户!
\n";
else
{
while(p->next!
=NULL)
{
p=p->next;
i++;
}
}
cout<<"现有客户数量为"<
";
}
doubledisplay_discount(doublepoints)
{
doublediscount;
if(points==0)
discount=0;
if(points>0&&points<=50)
discount=9;
if(points>50&&points<=100)
discount=8;
if(points>100&&points<=150)
discount=7;
if(points>150&&points<=200)
discount=6.5;
if(points>200&&points<=300)
discount=6;
elseif(points>300)
discount=5;
returndiscount;
}