数据结构课程设计 客户消费积分系统
课程设计报告
设计题目: 客户消费积分系统 学院、系: 电子与信息工程学 院 专业班级: 学生姓名:
指导教师:
成 绩:
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 using namespace std; struct cnode { char name[20]; char ID[20]; double consume; double integer; struct cnode *next; };
void Initstack(cnode * &head) {
head= new cnode;
head->next=NULL;
}
void Getelem (cnode *head);
void Search(cnode *head,char ID[]);
void Amend(cnode *head,char ID[]);
void Delete(cnode *head,char ID[]);
void Showall(cnode *head);
void count(cnode *head);
double display_discount(double integer);
void main()
{
cnode *head;
int choice;
char y[20];
Initstack(head);
do{
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cin>>choice;
if(choice==1)
{
Getelem(head);
}
else if(choice==2)
{
cout
cin>>y;
while(strlen(y)!=18)
{
cout
cin>>y;
}
Search(head,y);
}
else if(choice==3)
{
cout
cin>>y;
while(strlen(y)!=18)
{
cout
cin>>y;
}
Amend(head,y);
}
else if(choice==4)
{
cout
cout
cin>>y;
Delete(head,y);
}
else if(choice==5)
{
cout
Showall(head);
}
else if(choice==6)
{
cout
count(head);
}
else if(choice==7)
exit(1);
}while(choice
}
void Getelem (cnode *head)
{
cnode *p;
double y;
p=new cnode; /*申请空的节点空间*/
cout
cin>>p->name;
cout
cin>>p->ID;
while(strlen(p->ID)!=18)
{
cout
cin>>p->ID;
}
cout
cin>>p->consume;
p->integer=p->consume/100;
y=display_discount(p->integer);
cout
cout
cout
p->next=head->next;
head->next=p;
}
void Search(cnode *head,char ID[])
{
cnode *p;
double y;
p=head;
if(p->next==NULL)
cout
else
{
while(p->next!=NULL)
{
p=p->next;
if(strcmp(ID,p->ID)==0)
{
cout
coutname;
cout
coutID;
cout
coutconsume;
cout
coutinteger;
y=display_discount(p->integer);
cout
cout
cout
}
}
}
}
void Amend(cnode *head,char ID[])
{
cnode *p;
double y,z;
int choose,x;
p=head;
if(p->next==NULL)
cout
else
{
while(p->next!=NULL)
{
p=p->next;
if(strcmp(ID,p->ID)==0)
{
cout
coutname;
cout
coutID;
cout
coutconsume;
cout
coutinteger;
y=display_discount(p->integer);
cout
cout
cout
}
}
cout>choose;
if(choose==1)
{
cout
cin>>p->name;
}
if(choose==2)
{
cout
cin>>p->ID;
while(strlen(p->ID)!=18)
{
cout>p->ID;
}
}
if(choose==3)
{
cout>x;
if(x==1)
{
cout
cin>>p->consume;
}
else
{
cout
cin>>z;
p->consume+=z;
}
}
cout
coutname;
cout
coutID;
cout
coutconsume;
p->integer=p->consume/100;
cout
coutinteger;
y=display_discount(p->integer);
cout
cout
cout
}
}
void Delete(cnode *head,char ID[])
{
cnode *p;
int x;
double y;
p=head;
if(p->next==NULL)
cout
else
{
while(p->next!=NULL)
{
head=p;
p=p->next;
if(strcmp(ID,p->ID)==0)
{ cout
coutname;
cout
coutID;
cout
coutconsume;
cout
coutinteger;
y=display_discount(p->integer);
cout
cout
cout
}
}
cout>x;
if(x==1)
{
head->next=p->next;
cout
}
else
{
cout
}
}
}
void Showall(cnode *head)
{
cnode *p;
double y;
p=head;
if(p->next==NULL)
cout
else
{
while(p->next!=NULL)
{
p=p->next;
cout
coutname;
coutID;
cout
coutconsume;
cout
coutinteger;
y=display_discount(p->integer); cout
cout
cout
}
}
}
void count(cnode *head) {
cnode *p;
int i=0;
p=head;
if(p->next==NULL)
cout
else
{
while(p->next!=NULL)
{
p=p->next;
i++;
}
}
cout
double display_discount(double points) {
double discount;
if(points == 0)
discount = 0;
if(points > 0&&points
if(points > 50&&points
if(points > 100&&points
if(points > 150&&points
if(points > 200&&points
else if(points > 300)
discount = 5;
return discount;
}