c语言课程设计报告会员卡计费系统源代码.docx
- 文档编号:8300661
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:37
- 大小:20.34KB
c语言课程设计报告会员卡计费系统源代码.docx
《c语言课程设计报告会员卡计费系统源代码.docx》由会员分享,可在线阅读,更多相关《c语言课程设计报告会员卡计费系统源代码.docx(37页珍藏版)》请在冰豆网上搜索。
c语言课程设计报告会员卡计费系统源代码
#include
//编译预处理指令,引入头文件
#include
#include
#include
#defineMAX10
#defineMENU_MAIN_COUNT7
//自定义符号常量
//主菜单的选项个数
typedefstructmember
//定义结构体类型
member,采用链式存储结构
{
charname[MAX];//姓名
charid[MAX];//卡号
charsex[2];//性别
intage;//年龄
floatmoney;//余额
chartel[12];//电话
structmember*next;//定义一个指针指向下一个会员信息
floatcost;//消费金额
}mem;//定义结构体变量mem
/*声明函数*/
voidmenu();
voidsave(mem*p);
/*声明函数,声明菜单函数
//声明保存函数
*/
mem*head=NULL;
//头指针为
NULL
mem*get_last(mem
*p)
//取得链表最后一个元素的节点指针并返回该
指针
{
if(p->next==NULL)
{
returnp;
}
else
{
get_last(p->next);
}
}
voidcreat_member(mem
*pNew)
//输入信息操
作,会员登记函数
{
//创建一个新
的会员
chars;
printf("
printf("
卡号:
");
请输入姓名
:
");
scanf("%s",pNew->id);scanf("%s",pNew->name);
//运用指针输入卡号
//运用指针输入姓名
a:
printf("请输入性别
s=getchar();
if(s=='f'||s=='m')
{
(f--女
m--男):
");
getchar();
//输入男女
//判断是男是女
if(s=='f'||s=='F')strcpy(pNew->sex,"女");
if(s=='M'||s=='m')strcpy(pNew->sex,"男");
}
else
//如果输入错
误
{
printf("输入错误,请重新输入
gotoa;
...\n");
//跳转至
a,重
新输入
}
printf("
printf("
请输入年龄:
");请输入缴费金额
:
");
scanf("%d",&(pNew->age));scanf("%f",&(pNew->money));
//运用指针输入年龄
//运用指针输入余
额
printf("
请输入电话
:
");
scanf("%s",pNew->tel);
//运用指针输入电
话
pNew->cost=0;
//运用指针
初始化消费额为
0
printf("\n创建完毕!
\n");
}
voidnewMember()
//会员登记
函数
{
//添加会员信息
charcon='N';
mem*pLast=NULL;
mem*pNew=(mem
*)malloc(sizeof(mem));
//按
mem
动
态分配内存
pNew->next=NULL;
creat_member(pNew);
//调用会员登
记函数
if(head==NULL)
{
head=pNew;
}
else
{
pLast=get_last(head);
pLast->next=pNew;
}
printf("
继续输入会员信息?
(Y
继续,
N
返回菜单
)");
//判断是否继续登
记
getchar();
con=getchar();
if(con=='n'||con=='N')
{
save(pNew);
menu();
}
else{
save(pNew);
newMember();
}
}
//显示信息
操作
voidtable_head()
{//定义表头
printf("+----------+------+------+------+--------+--------+-----------+\n");
printf("|卡号|姓名|性别|年龄|余额|累计消费
|
电话
|\n");
printf("+----------+------+------+------+--------+--------+-----------+\n");
}
voidtable_buttom()
{
//定义底线
printf("+----------+------+------+------+--------+--------+-----------+\n");
}
voidtable_row(mem*p)
{
//定义中间
部分
printf("|%10s|%6s|%6s|%6d|%8.2f|%8.2f|%11s|\n",p->id,p->name,p->sex,p->age,p->money,p->cost,p->tel);
}
voiddisplay(mem*p)
{
//显示所有信息
p=head;
table_head();
//调用表头
while(p!
=NULL)
{
table_row(p);
p=p->next;
//调用中间部分
}
table_buttom();
//调用底线
}
voiddisplay_one(mem*p)
{
//只显示一条信息
table_head();
table_row(p);
table_buttom();
}
voidtable_sum()
{//定义总计
printf("+----------+------+------+------+--------+--------+-----------+\n");
printf("|||||总计|
printf("+----------+------+------+------+--------+--------+-----------+\n");
总计
|
|\n");
}
voidtable_r(floatmoney,floatcost)
{
printf("|
|
|
//定义总计
|
2
|%8.2f|%8.2f|
|\n",money,cost);
}
voiddisplay_statistics(mem*p,floatmoney,floatcost)
{
//显示统计信
息函数
p=head;
table_head();
while(p!
=NULL)
{
//调用表头
table_row(p);
p=p->next;
//定义中间部分
}
p=head;
table_sum();
//定义总计
table_r(money,cost);
//定义总计
2
}
table_buttom();
//定义表尾
//文件相关操
作
voidsave(mem*p)
{
//保存函数
FILE*fp;
//定义一个指
向文件的指针变量
fp=fopen("member.dat",
"a");
//将fopen函数
的返回值赋给指针变量
fp
while(p!
=NULL)
{
fprintf(fp,"%s%s%s%d%f%s%d\n",p->id,p->name,p->sex,p->age,p->money,
p->tel,p->cost);
p=p->next;
}
fclose(fp);
getchar();
//关闭指针
}
voidmodify_file(mem*p)
{
//保存修改
会员信息函数
FILE*fp;
p=head;
if((fp=fopen("member.dat","w"))==NULL)
{
//检查打开
文件的操作是否有错
printf("文件不存在
");
getchar();
menu();
//调用菜单函
数
}
while(p!
=NULL)
{
fprintf(fp,"%s%s%s%d%f%s%f\n",p->id,p->name,p->sex,p->age,p->money,
p->tel,p->cost);
p=p->next;
}
fclose(fp);
getchar();
}
voidload(mem*p)
{//从文件加载信息
FILE*fp;
mem*pLast=NULL;
head=NULL;
if((fp=fopen("member.dat","r"))==NULL)
{//检查打开文件的
操作是否有错
printf("没有会员信息,请录入!
");
getch();
menu();//调用菜单函数
}
while(!
feof(fp))
{//文件指针是否到
达末尾
mem*pNew=(mem*)malloc(sizeof(mem));//按mem动态分配内
存
pNew->next=NULL;
fscanf(fp,"%s%s%s%d%f%s%f\n",
pNew->id,pNew->name,pNew->sex,&(pNew->age),&(pNew->money),pNew->tel,&(pNew->cost));
if(head==NULL)
{
head=pNew;
}
else
{
pLast=get_last(head);
pLast->next=pNew;
}
}
p=head;
fclose(fp);
}
//通过卡号搜索信息函
数
mem*search_id(mem*p)
{
//通过卡号搜索信息
charid[MAX];
inti=0;
p=head;
scanf("%s",id);
while(p&&(strcmp(id,"n")!
=0))
{
//判断
id
是否不为
n
if(strcmp(p->id,id)==0)
{
//找到
i=1;
break;
}
else
p=p->next;
}
if(strcmp(id,"n")==0)
//输入
n时返回菜单
menu();
if(p==NULL)
{
//重新搜索卡号
printf("您查找的卡号不存在,请重新输入:
\n");
p=search_id(p);
//调用寻找函数
}
else
returnp;
//返回
p
}
/*修改会员信息操作
*/
voidmodify_m()
{
//修改会员的信息
chars,fun='y';
charpro[]=
"|\n"
"|1姓名\n"
"|2性别\n"
"|3年龄\n"
"|4电话\n"
"|5返回\n"
"|\n";
mem*p;
load(p);
display(p);
//调用显示函数
printf("请输入需要修改信息的会员卡号(
p=search_id(p);
n返回菜单):
");
//调用按号寻找函数
while(fun=='y'||fun=='Y')
{
//当继续寻找时
system("cls");
display_one(p);
printf("请选择修改的项目:
\n");
printf(pro);
getchar();
scanf("%c",&fun);
switch(fun)
{
case'1':
printf("请输入姓名
:
");
//清屏
//调用显示一条函数
//输出pro
//用switch语句选择修改内容
scanf("%s",p->name);break;
case'2':
a:
printf("请输入性别
s=getchar();
if(s=='f'||s=='m')
(f--女
m--男):
");
getchar();
{
if(s=='f'||s=='F')strcpy(p->sex,"女");
if(s=='M'||s=='m')strcpy(p->sex,"男");
}
else
{
printf(">输入错误,请重新输入...\n");
gotoa;
}
break;
case'3':
printf("请输入年龄
:
");
scanf("%d",&(p->age));break;
case'4':
printf("请输入电话
:
");
scanf("%s",p->tel);break;
default:
break;
}
printf("是否继续修改
Y/N?
");
//判断是否继续寻找
getchar();
fun=getchar();
}
modify_file(p);
system("cls");
display_one(p);
//调用保存修改会员信息函数
//清屏
//调用显示一条函数
printf("\n
修改成功
按任意键继续
!
");
getchar();
menu();
//调用菜单函数
}
//会员续费函数
voidadd()
{
//会员续费
floatmoney;
mem*p;
load(p);
display(p);
//调用浏览函数
printf("\n");
printf("请输入需要续费的会员卡号(
n返回菜单):
");
p=search_id(p);
//调用按号寻找函数
system("cls");
//清屏
display_one(p);
//调用显示一条函数
printf("请输入续费金额:
");
scanf("%f",&money);
p->money+=money;
//续费
modify_file(p);
//调用保存修改会员信息
函数
system("cls");
//清屏
display_one(p);
//调用显示一条函数
printf("续费成功,任意键继续!
");
getchar();
menu();
//调用菜单函数
}
//会员结算函数
voidconsume()
{//会员结算
mem*p;
floatcost;
load(p);
display(p);
/*
调用浏览函数
*/
printf("\n");
printf("
请输入需要结算的会员卡号(
n返回菜单):
");
p=search_id(p);
//调用按号寻找函数
system("cls");
display_one(p);
//清屏
//调用显示一条函数
printf("
请输入花费金额:
");
scanf("%f",&cost);
if(p->cost>=1000)
{
//判断是否升级为
vip
printf("恭喜您已经升级为VIP,本次消费
printf("本次实际消费%.2f元!
",cost*0.9);
cost*=0.9;
if((p->money-cost)<0)
{
9折优惠。
\n");
//升级为vip,消费打9折
//判断余额是否充
足
printf("对不起,余额不足,请及时充值!
");
getchar();
menu();
}
p->cost+=cost;
p->money-=cost;//消费getchar();
}
else
{
if((p->money-cost)<0)
{
//同上
printf("对不起,余额不足,请及时充值!
");
getchar();
menu();
}
p->cost+=cost;
p->money-=cost;
}
modify_file(p);
//调用保存修改会员信息函
数
system("cls");
display_one(p);
//
//
清屏
调用显示一条函数
printf("结算成功,任意键继续
!
");
getch();
menu();
//调用菜单函数
}
/*会员退出函数
*/
voiddelete_m()
{
//删除会员信息
mem*p,*q=head,*thelast;
floatmoney;
load(p);
display(p);
/*
调用浏览函数
*/
printf("\n");
printf("请输入需要删除的会员卡号(
n返回菜单):
");
p=search_id(p);
//调用按号寻找函数
thelast=head;
if(p==head)
{
//判断指针
head=p->next;
money=p->money;
free(p);
}
else
{
while(thelast)
{
if(thelast->next==p)
break;
else
thelast=thelast->next;
}
thelast->next=p->next;
money=p->money;
free(p);
}
}
modify_file(q);
printf("退回余额%.2f元!
\n",money);
printf("删除成功,按任意键继续!
");
getch();
menu();
//调用保存函数
//显示退回的余额
//调用菜单函数
/*统计函数*/
mem*sort_m()
{
//按缴费总额排序
mem*q,*tail,*p=(mem*)malloc(sizeof(mem));
p->next=head;
head=p;
tail=NULL;
//定义
tail
while(tail!
=head->next)
{
p=head;
q=p->next;
while(q->next!
=tail)
{
//判断
q是否为
空
if(p->next->money>q->next->money)
{
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
//比较大小,排序
}
p=p->next;
q=p->next;
}
tail=q;
}
head=head->next;
free(p);
returnhead;
//返回值
}
mem*sort_c()
{
//按消费金额排
序
mem*q,*tail,*p=(mem*)malloc(sizeof(mem));
p->next=head;
head=p;
tail=NULL;
//定义
tail
while(tail!
=head->next)
{
p=head;
q=p->next;
while(q->next!
=tail)
{
if(p->next->cost>q->next->cost)
{
//比较大小,排
序
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
}
p=p->next;
q=p->next;
}
tail=q;
}
head=head->next;
free(p);
returnhead;
//返回值
}
floatsumm(mem*p)
{
//计算缴费总额
floatsumm=0;
p=head;
while(p)
{
//循环,实现求总额
summ+=p->money;
p=p->next;
}
returnsumm;
//返回总额
}
floatsumc(mem*p)
{
//计算消费总额
floatsumc=0;
p=head;
while(p)
{
//循环,实现求总额
sumc+=p->cost;
p=p->next;
}
returnsumc;
//返回总额
}
voidstatistics()
{
//统计会员信息函数
intf=0;
mem*p;
load(p);
system("cls");
printf("\t\t=======================================\n"
"\t\t|\n"
"\t\t|1按缴费总额排序\n"
"\t\t|2按消费总额排序\n"
"\t\t|3返回菜单\n"
"\t\t|\n"
"\t\t=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 报告 会员卡 计费 系统 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)