客户消费积分管理系统-数据结构设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广州XX学院
课程设计报告
课程数据结构与算法
题目李CC 专业计算机科学与技术
指导教师 XX 班级计科XX 学号 22姓名李XX
2020年1月3日
《数据结构与算法》课程设计任务书
银行排队系统的设计与实现
一、设计要求
1.问题描述
针对客户的消费情况,进行客户管理,根据客户的消费积分对客户实行不同程度的打折优惠。
2.需求分析
(1)采用一定存储结构进行客户信息存储;
(2)对客户的信息可以进行修改、删除、添加;
(3)能够根据消费情况进行客户积分的累加;
(4)根据积分情况,对客户实行不同程度的打折优惠;
(5)演示程序以用户和计算机的对话方式进行。
二、概要设计
1.主界面设计
为了实现“客户消费积分管理系统”的各项功能,首先设计一个含有多个菜单项的主控菜单子程序,以链接系统的各项子功能,方便用户使用本系统。
本系统主控菜单运行界面如下图1所示。
2.存储结构设计
本系统采用链表存储客户消费积分管理系统中的客户信息。
3.系统功能设计
本系统分为以下7个功能模块。
(1)添加客户:添加客户需要输入客户的姓名、身份证号码、电话号码、消费金额,在输入消费金额后系统会自动计算出该用户获得的积分,并且输出对应折扣到该客户信息中。
(2)查找客户:查找需要输入客户相应的身份证号码。
(3)修改客户:可以单独选择修改客户的姓名、身份证号码、电话号码、消费金额,也可以一次性全都修改。
(4)删除客户:查找到需要删除的客户即可一键删除。
(5)显示客户:显示外部文件保存的所有客户的信息。
(6)统计客户:统计客户总数。
(0)保存退出:保存所有修改删除操作到文件中。
三、模块设计
1.模块设计
本程序包含3个模块:主程序模块、菜单选择模块和链表操作模块。
调用关系如图所示。
2.系统子程序及功能设计
本系统共设置13个函数,包括主函数。
各函数名及功能说明如下。
(1) int menu_select()//菜单函数
(2) void Getelem (cnode *head) //添加客户函数以头节点为参数
(3) void Search(cnode *head,char ID[])//查找函数
(4) void Amend(cnode *head,char ID[])//修改客户函数
(5) void Delete(cnode *head,char ID[])//删除客户函数
(6) void Showall(cnode *head) //显示所有客户函数
(7) void count(cnode *head) //显示所有客户总数
(8) double display_discount(double points) /*计算客户折扣函数,接受一个double 型的数作为参数,输出对应的折扣*/
(10) cnode *creslink()//以创建新链表的方式读取文件数据
(11) void WritetoText(cnode *head) //将所有记录写入文件
(12) void main()//主函数
3.函数主要调用关系图
四、详细设计
1.数据类型定义
(1)数组的结构体定义
typedef struct cnode{
char name[20]; //名字
char ID[20]; //身份证6位
char tnumber[20];//电话
double consume; //消费金额
double integer; //积分
double discount; //折扣
struct cnode *next;}cnode;
(2)初始化链表
void Initstack(cnode *head)/*初始化链表*/{
head= (cnode*)malloc(sizeof(cnode)); //开辟节点空间
head->next=NULL;
}//头指针指向下一空节点
(3) 全局变量的定义
double display_discount(double integer);//定义折扣函数
int customer_number = 0;//初始客户数量
系统主要子程序详细设计
(1)添加客户函数
void Getelem (cnode *head) //添加客户函数以头节点为参数{ cnode *p;
double y;
p=(cnode*)malloc(sizeof(cnode));/*申请空的节点空间*/
printf("\n请输入姓名:");
scanf("%s",&p->name);
printf("请输入身份证号:");
scanf("%s",&p->ID);
printf("请输入电话号码:");
scanf("%s",&p->tnumber);
printf("请输入消费金额:");
scanf("%lf",&p->consume);
p->integer=p->consume/10;
printf("对应积分:%lf\n",p->integer);
y=display_discount(p->integer); //调用函数计算折扣
printf("折扣:%.1lf折",y);
printf("\n");
p->discount=y;
printf("添加客户成功!\n\n");
customer_number++;
p->next=head->next;
head->next=p;
}
(2)查找客户函数
void Search(cnode *head,char ID[])//查找{
cnode *p;
double y;
p=head;
if(p->next==NULL)
printf("没有客户!\n");
else
{
while(p->next!=NULL)
{
p=p->next;
if(strcmp(ID,p->ID)==0)
{ //判断身份证号是否相同
printf("姓名:%s\n",p->name);
printf("身份证号:%s\n",p->ID);
printf("电话号码:%s\n",p->tnumber);
printf("消费:%.2lf\n",p->consume);
printf("积分:%lf\n",p->integer);
y=display_discount(p->integer);
printf("折扣:%.1lf折\n",y);
p->discount=y;}}}}
(3)修改客户函数
void Amend(cnode *head,char ID[])//修改客户函数{ cnode *p;
double y;
int choose1;
p=head;
if(p->next==NULL)
printf("没有客户!\n");
else
{
while(p->next!=NULL)
{
p=p->next;
if(strcmp(ID,p->ID)==0)
{ //判断身份证号是否相同
printf("\n姓名:%s\n",p->name);
printf("身份证号:%s\n",p->ID);
printf("电话号码:%s\n",p->tnumber);
printf("消费:%.2lf\n",p->consume);
printf("积分:%lf\n",p->integer);
y=display_discount(p->integer);
printf("折扣:%.1lf折\n\n",y);
p->discount=y;
}
}
printf("1.姓名 2.身份证号 3.电话号码 4.消费金额 5.修改全部\n"); printf("请选择你要修改的选项:");
scanf("%d",&choose1);
if(choose1==1)
{
printf("\n请输入修改后姓名:");
scanf("%s",&p->name);
printf("修改成功!\n");
}
if(choose1==2)
{
printf("\n请输入修改后的身份证号:");
scanf("%s",&p->ID);
printf("修改成功!\n");
}
if(choose1==3)
{
printf("\n请输入修改后电话:");
scanf("%s",&p->tnumber);
printf("修改成功!\n");
}
if(choose1==4)
{
printf("\n请输入修改后的消费:");
scanf("%lf",&p->consume);
p->integer=p->consume/10;
printf("积分:%lf\n",p->integer);
y=display_discount(p->integer);
printf("折扣:%.1lf折\n\n",y);
printf("修改成功!\n");
}
if(choose1==5)
{
printf("\n请输入姓名:");
scanf("%s",&p->name);
printf("请输入身份证号:");
scanf("%s",&p->ID);
printf("请输入电话号码:");
scanf("%s",&p->tnumber);
printf("请输入消费金额:");
scanf("%lf",&p->consume);
p->integer=p->consume/10;
printf("对应积分:%lf\n",p->integer);
y=display_discount(p->integer); //调用函数计算折扣
printf("折扣:%.1lf折",y);
printf("\n");
p->discount=y; }}}
(4)删除客户函数
void Delete(cnode *head,char ID[])//删除客户函数{ cnode *p,*q;
char ch[2];
int j=0,i=0;
double y;
p=head;
if(p->next==NULL)
printf("没有客户!\n");
else{
while(p->next!=NULL){
q=p;
p=p->next;
j++;
if(strcmp(ID,p->ID)==0) { printf("\n姓名:%s\n",p->name);
printf("身份证号:%s\n",p->ID);
printf("电话号码:%s\n",p->tnumber);
printf("消费:%.2lf\n",p->consume);
printf("积分:%lf\n",p->integer);
y=display_discount(p->integer);
printf("折扣:%.1lf折\n\n",y);
q->next=p->next;}}
printf("已找到该客户,是否删除?(y/n)");
scanf("%s",ch);
if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要进行删除*/{
for(i=j;i<=customer_number;i++){
q=q->next;}
customer_number--;
printf("删除成功!");}
else
{printf("删除失败!");}}}
(5)显示客户函数
void Showall(cnode *head) //显示所有客户函数{ cnode *p;
double y;
p=head;
if(p->next==NULL)
printf("没有客户!\n");
else{
while(p->next!=NULL){
p=p->next;
printf("姓名:%s\n",p->name);
printf("身份证号:%s\n",p->ID);
printf("电话号码:%s\n",p->tnumber);
printf("消费:%.2lf\n",p->consume);
printf("积分:%lf\n",p->integer);
y=display_discount(p->integer);
printf("折扣:%.1lf折\n\n",y);}}}
(6)计算客户相应折扣
double display_discount(double points) {
double discount;
if(points == 0)
discount = 0;
if(points > 0&&points <= 20)
discount = 9.5;
if(points > 20&&points <= 30)
discount = 9;
if(points > 30&&points <= 50)
discount = 8.5;
if(points > 50&&points <= 80)
discount = 8;
if(points > 80&&points <= 90)
discount = 7.5;
else if(points > 90)
discount = 7;
return discount;}
五、测试分析
系统运行主界面如图1所示。
各子功能测试运行结果如下:
1.添加客户
在主菜单下,用户输入l并回车,运行结果如图所示。
图中输入数据全为1,仅供测试。
2.查找客户
在主菜单下,用户输入2并回车,进入查找客户界面。
根据提示输入客户身份证号即可查询。
当输入一个客户的身份证号码123后运行结果如图所示。
3.修改客户
在主菜单下,用户输入3并回车,可以进入修改客户界面,运行结果如图所示,例如输入客户李四的身份证123,显示李四的各项信息,并且输入相应序号可以单独修改该用户信息或者一步修改所有信息。
4.删除客户
在主菜单下,用户输入4并回车,进入删除客户界面,运行结果如图所示。
按界面显示输入身份证号码,输入正确后会显示出该用户信息,再次输入y/n选择删除操作。
5.显示客户
在主菜单下,用户输入5并回车,进入显示客户界面,运行结果如图所示。
6.统计客户
在主菜单下,用户输入6并回车,即可统计文件中保存的客户总数。
运行结果如图。
7.保存信息并退出系统
在主菜单下,用户输入0并回车,会提示“已保存,退出系统”,即可保存前面修改、删除的操作并写入文件中,运行结果如下图所示。
六、用户手册
(1) 本程序执行文件为“客户消费积分管理系统.exe”。
(2) 进入本系统之后,随即显示系统主菜单界面。
用户可在该界面下输入各子菜单前对应的数字,并按回车键执行相应子菜单命令。
(3) 输入1按回车进行添加客户操作;输入2按回车进行查找客户操作;输入3进行修改客户各项信息操作;输入4进行删除客户操作;输入5进行显示客户操作;输入6进行统计客户操作;输入0保存前面的操作,接着写入外部TXT文件,并且退出系统。
(4) 该系统需要操作人员记住客户的身份证号码,在系统中身份证号码是用来实现查找、删除、修改的关键数据。
(5) 在运行本系统前需要在电脑D盘建立一个Customer的文件夹,并且在该文件夹子目录下建立一个以customer命名的.TXT文件,用来储存数据。
七、源程序清单
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct cnode{
char name[20]; //名字
char ID[20]; //身份证6位
char tnumber[20];//电话
double consume; //消费金额
double integer; //积分
double discount; //折扣
struct cnode *next;}cnode;
void Initstack(cnode *head)/*初始化链表*/{
head= (cnode*)malloc(sizeof(cnode)); //开辟节点空间
head->next=NULL;}//头指针指向下一空节点
double display_discount(double integer);//定义折扣函数
int customer_number = 0;//初始客户数量
int menu_select()//菜单函数{
int check_number;
do{
system("cls"); /*运行前清屏*/
printf("\n");
printf(" 客户消费积分管理系统 \n\n");
printf(" ****************************");
printf("\n * *\n");
printf("\n * 1 添加客户 *\n");
printf("\n * 2 查找客户 *\n");
printf("\n * 3 修改客户 *\n");
printf("\n * 4 删除客户 *\n");
printf("\n * 5 显示客户 *\n");
printf("\n * 6 统计客户 *\n");
printf("\n * 0 保存退出 *\n");
printf("\n * *\n");
printf(" ***************************");
printf("\n 请输入您的选择(0-6):");
scanf("%d",&check_number); /*读入选择*/
}while(check_number<0||check_number>9);
return(check_number); /*返回选择*/}
void Getelem (cnode *head) //添加客户函数以头节点为参数{ cnode *p;
double y;
p=(cnode*)malloc(sizeof(cnode));/*申请空的节点空间*/ printf("\n请输入姓名:");
scanf("%s",&p->name);
printf("请输入身份证号:");
scanf("%s",&p->ID);
printf("请输入电话号码:");
scanf("%s",&p->tnumber);
printf("请输入消费金额:");
scanf("%lf",&p->consume);
p->integer=p->consume/10;
printf("对应积分:%lf\n",p->integer);
y=display_discount(p->integer); //调用函数计算折扣printf("折扣:%.1lf折",y);
printf("\n");
p->discount=y;
printf("添加客户成功!\n\n");
customer_number++;
p->next=head->next;
head->next=p;}
void Search(cnode *head,char ID[])//查找{
cnode *p;
double y;
p=head;
if(p->next==NULL)
printf("没有客户!\n");
else
{
while(p->next!=NULL)
{
p=p->next;
if(strcmp(ID,p->ID)==0)
{ //判断身份证号是否相同
printf("姓名:%s\n",p->name);
printf("身份证号:%s\n",p->ID);
printf("电话号码:%s\n",p->tnumber);
printf("消费:%.2lf\n",p->consume);
printf("积分:%lf\n",p->integer);
y=display_discount(p->integer);
printf("折扣:%.1lf折\n",y);
p->discount=y;
}
}
}
}
void Amend(cnode *head,char ID[])//修改客户函数
{
cnode *p;
double y;
int choose1;
p=head;
if(p->next==NULL)
printf("没有客户!\n");
else
{
while(p->next!=NULL)
{
p=p->next;
if(strcmp(ID,p->ID)==0)
{ //判断身份证号是否相同
printf("\n姓名:%s\n",p->name);
printf("身份证号:%s\n",p->ID);
printf("电话号码:%s\n",p->tnumber);
printf("消费:%.2lf\n",p->consume);
printf("积分:%lf\n",p->integer);
y=display_discount(p->integer);
printf("折扣:%.1lf折\n\n",y);
p->discount=y;
}
}
printf("1.姓名 2.身份证号 3.电话号码 4.消费金额 5.修改全部\n");
printf("请选择你要修改的选项:");
scanf("%d",&choose1);
if(choose1==1)
{
printf("\n请输入修改后姓名:");
scanf("%s",&p->name);
printf("修改成功!\n");
}
if(choose1==2)
{
printf("\n请输入修改后的身份证号:");
scanf("%s",&p->ID);
printf("修改成功!\n");
}
if(choose1==3)
{
printf("\n请输入修改后电话:");
scanf("%s",&p->tnumber);
printf("修改成功!\n");
}
if(choose1==4)
{
printf("\n请输入修改后的消费:");
scanf("%lf",&p->consume);
p->integer=p->consume/10;
printf("积分:%lf\n",p->integer);
y=display_discount(p->integer);
printf("折扣:%.1lf折\n\n",y);
printf("修改成功!\n");
}
if(choose1==5)
{
printf("\n请输入姓名:");
scanf("%s",&p->name);
printf("请输入身份证号:");
scanf("%s",&p->ID);
printf("请输入电话号码:");
scanf("%s",&p->tnumber);
printf("请输入消费金额:");
scanf("%lf",&p->consume);
p->integer=p->consume/10;
printf("对应积分:%lf\n",p->integer);
y=display_discount(p->integer); //调用函数计算折扣
printf("折扣:%.1lf折",y);
printf("\n");
p->discount=y;
}
}
}
void Delete(cnode *head,char ID[])//删除客户函数
{
cnode *p,*q;
char ch[2];
int j=0,i=0;
double y;
p=head;
if(p->next==NULL)
printf("没有客户!\n");
else
{
while(p->next!=NULL)
q=p;
p=p->next;
j++;
if(strcmp(ID,p->ID)==0)
{
printf("\n姓名:%s\n",p->name);
printf("身份证号:%s\n",p->ID);
printf("电话号码:%s\n",p->tnumber);
printf("消费:%.2lf\n",p->consume);
printf("积分:%lf\n",p->integer);
y=display_discount(p->integer);
printf("折扣:%.1lf折\n\n",y);
q->next=p->next;
}
}
printf("已找到该客户,是否删除?(y/n)");
scanf("%s",ch);
if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要进行删除*/
{
for(i=j;i<=customer_number;i++)
{
q=q->next;
}
customer_number--;
printf("删除成功!");
}
else
{
printf("删除失败!");
}
}
}
void Showall(cnode *head) //显示所有客户函数
{
cnode *p;
double y;
p=head;
if(p->next==NULL)
printf("没有客户!\n");
else
{
while(p->next!=NULL)
p=p->next;
printf("姓名:%s\n",p->name);
printf("身份证号:%s\n",p->ID);
printf("电话号码:%s\n",p->tnumber);
printf("消费:%.2lf\n",p->consume);
printf("积分:%lf\n",p->integer);
y=display_discount(p->integer);
printf("折扣:%.1lf折\n\n",y);
}
}
}
void count(cnode *head) //显示所有客户总数
{
int i=0;
cnode *p;
p=head;
if(p->next==NULL)
printf("没有客户!\n");
else
{
while(p->next!=NULL)
{
p=p->next;
i++;
}
}
printf("现有客户数量为%d位!\n\n",i);
}
double display_discount(double points) //计算客户折扣函数,接受一个double型的数作为参数,输出对应的折扣
{
double discount;
if(points == 0)
discount = 0;
if(points > 0&&points <= 20)
discount = 9.5;
if(points > 20&&points <= 30)
discount = 9;
if(points > 30&&points <= 50)
discount = 8.5;
if(points > 50&&points <= 80)
discount = 8;
if(points > 80&&points <= 90)
discount = 7.5;
else if(points > 90)
discount = 7;
return discount;
}
cnode *creslink()//读取文件数据
{
FILE * fp;
cnode *head,*p,*q;
char name[20],tnumber[20],ID[20];
double consume,integer,discount;
head=(cnode*)malloc(sizeof(cnode));
p=head;
if((fp=fopen("D:\\Customer\\customer.txt","r"))==NULL) /*打开文件*/
{
printf("不能打开文件\n");
system("pause");
exit(0);
}
fscanf(fp,"%d\n",&customer_number);
while(fscanf(fp,"%s%s%s%lf%lf%lf",name,ID,tnumber,&consume,&integer,&discou nt)!=EOF)
{
q=(cnode*)malloc(sizeof(cnode));
strcpy(q->name,name);
strcpy(q->ID,ID);
strcpy(q->tnumber,tnumber);
q->consume=consume;
q->integer=integer;
q->discount=discount;
p->next=q;
p=q;
}
p->next=NULL;
fclose(fp);
return head;
}
void WritetoText(cnode *head) //将所有记录写入文件
{
FILE *fp; /*定义文件指针*/
cnode *p;
p=head->next;
if((fp=fopen("D:\\Customer\\customer.txt","w"))==NULL) /*打开文件*/
{
printf("不能打开文件\n");
system("pause");
exit(0);
}
fprintf(fp,"%d\n",customer_number); /*循环写入数据*/
while(p)
{
fprintf(fp,"%-8s %-8s %-
8s %f %f %f\n",p->name,p->ID,p->tnumber,p->consume,p->integer,p->disco unt);
p=p->next;
}
printf("\n");
fprintf(fp,"\n");
fclose(fp); /*关闭文件*/
}
void main()//主函数
{
cnode *head;
char y[20];
head=creslink();
//AddfromText(head);
for(;;)
{
switch(menu_select()) /*选择判断*/
{
case 1://添加
Getelem(head);
system("pause");
break;
case 2://查找
printf("\n请输入您查找客户的身份证号:");
scanf("%s",y);
Search(head,y);
system("pause");
break;
case 3://修改
printf("\n请输入您想修改客户的身份证号:");
scanf("%s",y);
Amend(head,y);
system("pause");
break;
case 4://删除
printf("\n");
printf("请输入你想要删除的客户的身份证号:");
scanf("%s",y);
Delete(head,y);
system("pause");
break;
case 5://显示所有客户信息
printf("\n");
Showall(head);
system("pause");
break;
case 6://显示客户总数
printf("\n");
count(head);
system("pause");
break;
case 0:
WritetoText(head);
printf("已保存,退出系统\n"); //结束程序
system("pause");
exit(0);
}
}
}。