1、c语言课程设计报告会员卡计费系统源代码#include / 编译预处理指令,引入头文件#include #include #include #define MAX 10#define MENU_MAIN_COUNT 7/ 自定义符号常量/ 主菜单的选项个数typedef struct member/ 定义结构体类型member ,采用链式存储结构char nameMAX; / 姓名char idMAX; / 卡号char sex2; / 性别int age; / 年龄float money; / 余额char tel12; / 电话struct member *next; / 定义一个指针指向
2、下一个会员信息float cost; / 消费金额mem; / 定义结构体变量 mem/* 声明函数 */void menu();void save(mem *p);/* 声明函数,声明菜单函数/ 声明保存函数*/mem *head=NULL;/ 头指针为NULLmem* get_last(mem*p)/ 取得链表最后一个元素的节点指针并返回该指针if(p-next = NULL)return p;elseget_last(p-next);void creat_member(mem*pNew)/ 输入信息操作,会员登记函数/ 创建一个新的会员char s;printf(printf(卡号 :)
3、;请输入姓名: );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( 输入错误,请重新输入goto a;.n);/ 跳转至a,重新输入printf(printf(请输入年龄 :
4、); 请输入缴费金额: );scanf(%d,&(pNew-age); scanf(%f,&(pNew-money);/ 运用指针输入年龄/ 运用指针输入余额printf(请输入电话: );scanf(%s,pNew-tel);/ 运用指针输入电话pNew-cost=0;/ 运用指针初始化消费额为0printf(n 创建完毕 !n);void newMember()/ 会员登记函数/ 添加会员信息char con=N;mem *pLast= NULL;mem *pNew=(mem*)malloc(sizeof(mem);/ 按mem动态分配内存pNew-next=NULL;creat_memb
5、er(pNew);/ 调用会员登记函数if(head = NULL)head = pNew;elsepLast = get_last(head);pLast-next = pNew;printf(继续输入会员信息?(Y继续,N返回菜单);/ 判断是否继续登记getchar();con = getchar();if (con = n | con = N)save(pNew);menu();elsesave(pNew);newMember();/ 显示信息操作void table_head()/ 定义表头printf(+-+-+-+-+-+-+-+n);printf(| 卡号 | 姓名 | 性别
6、| 年龄 | 余额 |累计消费|电话|n);printf(+-+-+-+-+-+-+-+n);void table_buttom()/ 定义底线printf(+-+-+-+-+-+-+-+n);void table_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);void display(mem *p)/ 显示所有信息p = head;table_head();/ 调用表头while(p != NULL)table_row(
7、p);p = p-next;/ 调用中间部分table_buttom();/ 调用底线void display_one(mem *p)/ 只显示一条信息table_head();table_row(p);table_buttom();void table_sum() / 定义总计printf(+-+-+-+-+-+-+-+n);printf(| | | | | 总计 |printf(+-+-+-+-+-+-+-+n);总计|n);void table_r(float money,float cost)printf(|/ 定义总计|2|%8.2f|%8.2f|n,money,cost);void
8、 display_statistics(mem *p,float money,float cost)/ 显示统计信息函数p = head;table_head();while(p != NULL)/ 调用表头table_row(p);p = p-next;/ 定义中间部分p=head;table_sum();/ 定义总计table_r(money,cost);/ 定义总计2table_buttom();/ 定义表尾/ 文件相关操作void save(mem *p)/ 保存函数FILE *fp;/ 定义一个指向文件的指针变量fp=fopen(member.dat,a);/ 将 fopen 函数的
9、返回值赋给指针变量fpwhile(p != NULL)fprintf(fp, %s %s %s %d %f %s %dn,p-id, p-name, p-sex, p-age, p-money,p-tel,p-cost);p = p-next;fclose(fp);getchar();/ 关闭指针void modify_file(mem *p)/保存修改会员信息函数FILE *fp;p= head;if(fp=fopen(member.dat, w)=NULL)/ 检查打开文件的操作是否有错printf( 文件不存在);getchar();menu();/ 调用菜单函数while(p != N
10、ULL)fprintf(fp, %s %s %s %d %f %s %fn,p-id, p-name, p-sex, p-age, p-money,p-tel,p-cost);p = p-next;fclose(fp);getchar();void load(mem *p) / 从文件加载信息FILE *fp;mem *pLast = NULL;head=NULL;if(fp=fopen(member.dat,r)=NULL) / 检查打开文件的操作是否有错printf( 没有会员信息,请录入! );getch();menu(); / 调用菜单函数while(!feof(fp) / 文件指针是
11、否到达末尾mem *pNew = (mem *)malloc(sizeof(mem); / 按 mem 动态分配内存pNew-next = NULL;fscanf(fp, %s %s %s %d %f %s %fn,pNew-id, pNew-name, pNew-sex, &(pNew-age), &(pNew-money), pNew-tel,&(pNew-cost);if(head = NULL)head = pNew;elsepLast = get_last(head);pLast-next = pNew;p = head;fclose(fp);/ 通过卡号搜索信息函数mem* sea
12、rch_id(mem *p)/ 通过卡号搜索信息char idMAX;int i=0;p = head;scanf(%s,id);while(p&(strcmp(id,n)!=0)/ 判断id是否不为nif(strcmp(p-id,id)=0)/ 找到i=1;break;elsep=p-next;if(strcmp(id,n)=0)/ 输入n 时返回菜单menu();if(p=NULL)/ 重新搜索卡号printf( 您查找的卡号不存在,请重新输入:n);p=search_id(p);/ 调用寻找函数elsereturn p;/ 返回p/* 修改会员信息操作*/void modify_m()/
13、 修改会员的信息char s,fun=y;char pro =|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: p
14、rintf( 请输入姓名: );/ 清屏/ 调用显示一条函数/ 输出 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, 男 );elseprintf( 输入错误,请重新输入 .n);goto a;break;case 3: printf( 请输入年龄: );scanf(%d,&
15、(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();/ 调用菜单函数/ 会员续费函数void add()/ 会员续费float money;mem *p;load(p);
16、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();/ 调用菜单函数/
17、 会员结算函数void consume() / 会员结算mem *p;float cost;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)/ 判断是否升级为vipprintf( 恭喜您已经升级为 VIP,本次消费printf( 本次实际消费 %.2f 元!,cost*0.9);
18、cost*=0.9;if(p-money-cost)cost+=cost;p-money-=cost; / 消费 getchar();elseif(p-money-cost)cost+=cost;p-money-=cost;modify_file(p);/ 调用保存修改会员信息函数system(cls);display_one(p);/清屏调用显示一条函数printf( 结算成功,任意键继续!);getch();menu();/ 调用菜单函数/* 会员退出函数*/void delete_m()/ 删除会员信息mem *p,*q=head,*thelast;float money;load(p)
19、;display(p);/*调用浏览函数*/printf(n);printf( 请输入需要删除的会员卡号(n 返回菜单): );p=search_id(p);/ 调用按号寻找函数thelast=head;if(p=head)/ 判断指针head=p-next;money=p-money;free(p) ;elsewhile(thelast)if(thelast-next=p)break;elsethelast=thelast-next;thelast-next=p-next;money=p-money;free(p);modify_file(q);printf( 退回余额 %.2f 元! n,
20、money);printf( 删除成功,按任意键继续! );getch();menu();/ 调用保存函数/ 显示退回的余额/ 调用菜单函数/* 统计函数 */mem *sort_m()/ 按缴费总额排序mem *q,*tail,*p=(mem*)malloc(sizeof(mem);p-next=head;head=p;tail=NULL;/ 定义tailwhile(tail!=head-next)p=head;q=p-next;while(q-next!=tail)/ 判断q 是否为空if(p-next-moneyq-next-money)p-next=q-next;q-next=q-ne
21、xt-next;p-next-next=q;/ 比较大小,排序p=p-next;q=p-next;tail=q;head=head-next;free(p);return head;/ 返回值mem* sort_c()/ 按消费金额排序mem *q,*tail,*p=(mem*)malloc(sizeof(mem);p-next=head;head=p;tail=NULL;/ 定义tailwhile(tail!=head-next)p=head;q=p-next;while(q-next!=tail)if(p-next-costq-next-cost)/ 比较大小,排序p-next=q-nex
22、t;q-next=q-next-next;p-next-next=q;p=p-next;q=p-next;tail=q;head=head-next;free(p);return head;/ 返回值float summ(mem *p)/ 计算缴费总额float summ=0;p=head;while(p)/ 循环,实现求总额summ+=p-money;p=p-next;return summ;/ 返回总额float sumc(mem *p)/ 计算消费总额float sumc=0;p=head;while(p)/ 循环,实现求总额sumc+=p-cost;p=p-next;return sumc;/ 返回总额void statistics()/ 统计会员信息函数int f=0;mem *p;load(p);system(cls);printf(tt=ntt|ntt|1 按缴费总额排序 ntt|2 按消费总额排序 ntt|3 返回菜单 ntt|ntt=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1