数据结构课程设计客户积分系统.docx
《数据结构课程设计客户积分系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计客户积分系统.docx(11页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计客户积分系统.docx](https://file1.bdocx.com/fileroot1/2023-1/3/8a7e4017-73c3-44b8-8b8a-18f5076b95b7/8a7e4017-73c3-44b8-8b8a-18f5076b95b71.gif)
数据结构课程设计客户积分系统
目录(参考)
附录(源代码)
1系统分析
1.1课程设计内容
客户消费积分管理系统系统,功能包括:
1、采用动态分配顺序表存储客户信息,并用文件保存和读写数据
2、能对客户信息进行添加、查询、修改、删除等基本操作
3、根据客户消费额,合理计算出客户消费所得积分
4、根据客户积分值,实行不同情况的优惠(即计算折扣)
客户消费积分管理系统系统的性能需求:
速度:
系统整体运行要流畅,响应时间不能太长,不能出现系统卡死情况,能满足使用者普通操作。
安全性:
系统涉及使用者的利益,为了防止造成使用者财产损失,应加强系统安全性检测,特别是后台文件的保密。
精度:
系统中涉及到折扣和积分的计算一定要注意精度要求,特别是折扣,应采用高精度数据类型,积分使用整型。
容量:
随着客户数的增多,系统容量不断增加,显然为满足容量需求,应采用动态分配存储空间辅以后台文件存储数据。
1.2系统功能需求分析
功能需求:
商家(软件使用者)可以进行添加、查询、修改、删除客户信息,查看客户信息存储文件,其中包括客户编号、客户姓名、客户消费积分值、客户享受的优惠(折扣)。
客户管理:
客户信息包括客户编号、客户姓名、客户消费积分值、客户享受的优惠(折扣)。
积分管理:
主要包括积分计算、积分更新、积分清零操作。
积分计算:
根据客户的一次性消费额,计算增加的积分值,记录客户本次消费使用的积分值;积分更新:
每次消费后,商家根据客户消费增加的积分值以及使用的积分值计算剩余积分;积分清零:
在年底,商家可以通过该操作将所有用户积分清零。
折扣管理:
根据客户本次消费额和客户已有积分值,计算客户本次消费所享受的优惠,即折扣。
具体规则:
积分值大于2000,享受6折优惠;积分值大于500小于2000,享受7折优惠;积分值大于200小于500,享受8折优惠;积分值大于50小于200,享受9折优惠。
1.3数据结构设计
Customer(客户)定义:
typedefstruct{
charno[10];//客户编号
charname[5];
floatpoints;//积分
floatdiscount;//折扣
}Customer;
顺序表定义:
#definelistinitsize10
#definelistincrement10
typedefstruct
{
Customer*elem;
intlength;//当前长度
intlistsize;//当前分配的存储容量
}SqList;
voidInitSq(SqList&L){//动态分配顺序表存储空间
L.elem=(Customer*)malloc(listinitsize*sizeof(Customer));if(!
L.elem){
printf("Notabletoallocatememory.\n");
exit
(1);
}
L.length=0;
L.listsize=listinitsize;
}
2系统设计
2.1总体设计
2.2各功能模块的设计
2.2.1主函数main()
动态获取表空间,初始化顺序表,打开文件将客户数据加载入表中,进行表操作,操作结束将表数据保存到文件,文件关闭。
2.2.2客户信息添加
遍历当前顺序表,若待添加的用户编号已存在,则返回用户已存在的提示信息;若待添加的用户不存在,则将该客户信息添加到顺序表最后,并将顺序表长度加1。
2.2.3客户信息删除
遍历当前顺序表,若要删除的用户标号不存在,则返回提示信息;否则提示用户是否确定删除,确定即删除。
删除操作即将待删除记录的后面记录依次向前移动1步。
2.2.4客户信息更新
遍历当前顺序表,若待更新的用户编号不存在,则返回用户不存在的提示信息;若待添加的用户存在,则提示输入新的信息。
2.2.5查找客户信息
2.2.6显示客户信息
遍历顺序表,返回客户信息
2.2.7消费积分清零
遍历顺序表,将积分与折扣赋值为0;
2.2.8积分计算
intpoints_cal(floatconsume)//积分计算规则{
if(consume<=0)cons=0;elseif(consume<=500)cons=consume/10;
elseif(consume<=2000)cons=(consume-500)/8+50;
elseif(consume<=5000)cons=(consume-2000)/6+237;
elsecons=(consume-5000)/5+737;returncons;
}
2.2.9折扣计算
doubleDiscount(intdiscount)//折扣的计算规则{
if(m<=0)discount=10;elseif(m<=50)discount=10;
elseif(m<=200)discount=9;elseif(m<=500)discount=8;
elseif(m<=2000)discount=7;elsediscount=6;
returndiscount;
}
3系统调试
1.运行客户消费积分管理系统,主菜单如下:
2.调用添加客户模块,添加客户信息
3.测试删除模块
4.测试更新模块
其他模块测试类似。
4总结
本次课程设计,是我发现了很多不足,比如:
1.软件设计阶段考虑不充分,导致编码时随机性大,方向性不明确;
2.存储结构的选择分析不够充分,没有考虑其它可行的存储实现(只用了动态数组);
3.设计的系统安全性方面未能达到极高级别(后台文件可以随意更改);
此外,在系统调试阶段,我发还现了很多细节方面的不足,使我认识到设计一个系统并非想象中那么简单,而是需要考虑各个方面结果的。
通过本次课程设计,我加深了对顺序存储结构的理解,更加熟悉了顺序表的基本操作,还有文件读写方面的知识得到了回顾。
通过客户积分系统软件的设计,我基本熟悉了一般的软件开发流程,认识到前期设计的重要性与盲目编代码错误观点。
总的来说,本次课程设计获益匪浅,既是对书本所学知识的回顾,更是对课本所学知识的运用。
5参考文献
[1]严蔚敏,吴伟民.数据结构.[M]清华大学出版社,2005.
[2]何钦铭,颜晖.C语言程序设计.[M]高等教育出版社,2008.
附录
源代码:
#include#include#include
typedefstruct{
charno[10];//客户编号charname[5];
floatpoints;//积分floatdiscount;//折扣
}Customer;
#definelistinitsize10#definelistincrement10
typedefstruct{
Customer*elem;
intlength;//当前长度intlistsize;//当前分配的存储容量
}SqList;
voidInitSq(SqList&L){
L.elem=(Customer*)malloc(listinitsize*sizeof(Customer));//动态分配顺序表存储空间
if(!
L.elem){
printf("Notabletoallocatememory.\n");exit
(1);}
L.length=0;L.listsize=listinitsize;
}
intmain(void){
voidAdd(SqList&L);voidShow(SqList&L);voidDelete(SqList&L);
voidupdate(SqList&L);voidQuery(SqList&L);voidReset(SqList&L);
SqListL;InitSq(L);
charch;Customer*newbase;FILE*fp;
if((fp=fopen("1.txt","r"))==NULL){
printf("Fileopenerror!
\n");exit(0);}
Customercustomer;intc=0,f;ch=fgetc(fp);rewind(fp);
if(ch==EOF)printf("文件为空!
\n");
else{
fscanf(fp,"%s%s%f%f",customer.no,customer.name,&customer.discount,&customer.points);
while(!
feof(fp)){
L.elem[c]=customer;c++;L.length++;
fscanf(fp,"%s%s%f%f",customer.no,customer.name,&customer.discount,&customer.points);
if(L.length>=L.listsize){
newbase=(Customer*)realloc(L.elem,(L.listsize+listincrement)*sizeof(Customer));
if(!
newbase){
printf("Notabletoallocatememory.\n");exit
(1);}
L.elem=newbase;L.listsize+=listincrement;}
}}
printf("输入你要选择的操作:
\n\t1-添加顾客信息\n\t2-删除顾客信息\n\t3-更新顾客信息\n\t4-查找顾客信息\n\t5-显示所有顾客信息\n\t6-清零所有客户的消费积分\n\t0-退出\n");
printf("*****************************\n请选择操作:
");scanf("%d",&f);
while(f!
=0){
switch(f){
case1:
Add(L);break;case2:
Delete(L);break;case3:
update(L);break;
case4:
Query(L);break;case5:
Show(L);break;case6:
Reset(L);break;
default:
printf("请输入正确的操作!
\n");break;}
printf("*****************************\n请选择操作:
");scanf("%d",&f);}
if(fclose(fp)){
printf("Cannotclosethefileerror!
\n");exit(0);}
if((fp=fopen("1.txt","w+"))==NULL){
printf("Fileopenerror!
\n");exit(0);}
for(inti=0;ifprintf(fp,"%s%s%.1f%.0f\n",L.elem[i].no,L.elem[i].name,L.elem[i].discount,L.elem[i].points);
if(fclose(fp)){
printf("Cannotclosethefileerror!
\n");exit(0);}
return0;
}
voidAdd(SqList&L){
intz=L.length;Customercustomer;
printf("请输入客户信息:
\n");
printf("编号:
");scanf("%s",customer.no);
for(inti=0;iif(strcmp(L.elem[i].no,customer.no)==0){
printf("编号已存在,请重新输入:
");scanf("%s",customer.no);i=0;}
printf("姓名:
");scanf("%s",customer.name);
customer.discount=10;customer.points=0;L.elem[z]=customer;L.length++;
}
voidShow(SqList&L){
for(inti=0;iprintf("%s%s%.1f%.0f\n",L.elem[i].no,L.elem[i].name,L.elem[i].discount,L.elem[i].points);
}
voidQuery(SqList&L){charno3[10];
inti;
printf("输入要查询的顾客编号:
");scanf("%s",no3);
for(i=0;iif(strcmp(L.elem[i].no,no3)==0){
printf("%s%s%.1f%.0f\n",L.elem[i].no,L.elem[i].name,L.elem[i].discount,L.elem[i].points);
break;}
if(i>=L.length)printf("没有该顾客信息!
\n");
}
voidDelete(SqList&L){
charno1[10],xx;intcc=1;
printf("输入你要删除的顾客的编号:
");scanf("%s",no1);
printf("您确定要删除%s号客户的信息吗?
\n确定-Y,取消-N:
",no1);
scanf("%s",&xx);
if(xx=='Y'||xx=='y'){
for(inti=0;iif(strcmp(L.elem[i].no,no1)==0){
for(intj=i;jL.length--;printf("顾客信息删除完毕!
\n");cc=0;}
if(cc==0)break;}
if(i>=L.length)printf("您所要删除的顾客信息不存在或已删除!
\n");}
elseif(xx=='N'||xx=='n')printf("您的删除操作已取消!
\n");
}
intpoints_cal(floatconsume){//积分计算规则
intss=0;
if(consume<=0)ss=0;elseif(consume<=500)ss=consume/10;
elseif(consume<=2000)ss=(consume-500)/8+50;
elseif(consume<=5000)ss=(consume-2000)/6+237;
elsess=(consume-5000)/5+737;
returnss;}
doubleDiscount(intm){//折扣的计算规则
doubleee;
if(m<=50)ee=10;elseif(m<=200)ee=9;elseif(m<=500)ee=8;
elseif(m<=2000)ee=7;elseee=6;
returnee;}
voidupdate(SqList&L){
charno2[10];floatsum;inti,x,y;
printf("输入您所要更新顾客的编号:
");scanf("%s",no2);
for(i=0;iif(strcmp(L.elem[i].no,no2)==0)break;
if(i>=L.length)printf("顾客信息不存在。
");
else{
printf("选择你要的操作:
1-增加积分,2-减少积分:
\n");
scanf("%d",&x);
if(x==1){printf("输入本次一次性消费的金额:
");scanf("%f",&sum);
L.elem[i].points+=points_cal(sum);
L.elem[i].discount=Discount(L.elem[i].points);}
else{
printf("输入本次使用的积分值:
");scanf("%d",&y);
L.elem[i].points-=y;
L.elem[i].discount=Discount(L.elem[i].points);}
printf("顾客更新后的信息:
");
printf("%s%s%.1f%.0f\n",L.elem[i].no,L.elem[i].name,L.elem[i].discount,L.elem[i].points);}
}
voidReset(SqList&L){//清零所有客户的积分
for(inti=0;iL.elem[i].points=0;L.elem[i].discount=10;}
}