C语言饭卡管理系统课程设计报告.pdf
课程设计报告课程名称:C 语言程序设计课设项目名称:饭卡管理系统学院:专业:姓名:学号:指导教师:成绩:第 1 页 共 36 页目目 录录第第 1 1 部分部分 课程设计题目与要求课程设计题目与要求.2 21问题描述.22功能要求.23任务分工.错误!未定义书签。错误!未定义书签。第第 2 2 部分部分饭卡管理系统的设计与功能实现饭卡管理系统的设计与功能实现. 3 31总体设计.32数据结构.33.算法设计.44程序代码设计.125测试与调试.22第第 3 3 部分部分 课程设计总结课程设计总结. 错误!未定义书签。错误!未定义书签。个人总结.错误!未定义书签。错误!未定义书签。个人总结.错误!未定义书签。错误!未定义书签。结束语.错误!未定义书签。错误!未定义书签。附录附录 程序清单程序清单.2323附录附录 用户使用说明书用户使用说明书.3434参考文献参考文献.3535第 2 页 共 36 页第第 1 1 部分部分 课程设计题目与要求课程设计题目与要求1问题描述问题描述学校等大单位集体食堂买饭时间非常集中,这时如果食堂使用饭票卖饭,大家就得排长队等候,而且还要经过先去买饭票等麻烦的经历。因此食堂提出使用计算机进行管理,食堂用饭卡卖饭,不仅提高卖饭速度,还易于管理,减少不必要的麻烦,同时减轻管理人员的工作负担。2功能要求功能要求重复显示如图所示的主菜单,在主菜单中选择任意一项,均实现相应功能。在主菜单中选择 1,建立名为 card.dat 的文件,并在其中添加若干人的饭卡号、姓名、金额、挂失信息,要求饭卡号是唯一的。在主菜单中选择 2,要求用户输入饭卡号、饭费,然后系统自动从该人的饭卡中减去饭钱,并分别显示买饭前后的金额,如果原来饭卡中的金额不足 5 元,则不能买饭,而且显示“金额不足够,请续钱!”,如果挂失信息为真,则显示“本卡已冻结!”。在主菜单中选择 4,添加新饭卡,这时要求新饭卡号和已有的饭卡号不能重号。在主菜单中选择 5,注销旧饭卡。在主菜单中选择 6, 要求用户输入饭卡号和挂失信息, 然后更新该饭卡的挂失信息。在主菜单中选择 7,在主菜单中选择 0,显示“感谢使用本软件!已正常退出,按任意键结束。”按任意键退出本系统。请输入选项编号 (07) :1建立饭卡文件2买饭3续钱4添加新饭卡5注销旧饭卡6设置与解除挂失7创新功能0退出系统第 3 页 共 36 页第第 2 2 部分部分饭卡管理系统的设计与功能饭卡管理系统的设计与功能实现实现1总体设计总体设计图 1 初始的主模块图 2 细分后的主模块图2数据结构数据结构例如:struct card char name10,num10; float yu,sum; int guashi; num10表示学号放在一维数组中,name10表示姓名放在一维数组中,yu 表示余额,sum表示消费金额的累积,guashi 表示挂失的情况。第 4 页 共 36 页3.算法设计算法设计图 3 主函数流程图第 5 页 共 36 页图 4 建立饭卡模块流程图第 6 页 共 36 页图 5 买饭模块流程图第 7 页 共 36 页图 6 续钱模块流程图第 8 页 共 36 页图 7 添加新饭卡模块流程图第 9 页 共 36 页图 8 注销旧饭卡模块流程图第 10 页 共 36 页图 9设置与解除挂失模块流程图第 11 页 共 36 页图 10创新功能模块流程图第 12 页 共 36 页4程序代码设计程序代码设计采用模块化的思想,按照“自顶向下,逐步细化”的原则设计算法。(1) 菜单的设计1, 本例需要输出主菜单选择界面,简单菜单的制作可利用 printf 函数实现。用 printf 函数将菜单项逐一打印到屏幕上,界面中的边框可以通过多个printf 函数输出的“|”和“-”拼接起来。2, 菜单应根据用户的选择做出不同的反应, 因此需要使用分支结构实现选择选项的功能。根据题意,主菜单含有 8 个菜单选项,属于多分支条件判断,使用带 break 和 switch 语句最为合适。3, 因为本例具有重复选择主菜单选项的功能, 因此需要使用循环结构。 在本例中菜单至少要显示一次,随后才判断是否继续选择主菜单,所以使用do-while 循坏比较好, 因为 do-while 循坏是先执行循环体, 然后再判断表达式。4,作为菜单,应该给用户一个正常的出口,即满足一定条件时退出程序。为了给用户提供方便,我们采用人机对话形式,当用户选择某一菜单项后,系统立即完成相应的功能,然后询问用户是否需要继续选择,只要用户继续选择(输入 y或 Y),主菜单就会在屏幕上反复出现,只有当用户不再选择(输入 N 或 n),才可退出主菜单。除此之外,为了使用方便,在主菜单中还特设 0 选项,选择它也能正常退出程序。为了实现上述功能,有关语句都应放在 do-while 循环体中。选择选项的程序段可设计成如下形式:choose=getchar();switch(choose)case 1:mycreat();break;case 2:mybuy();break;case 3:myaddyu();break;case 4:myaddcard();break;case 5:myzhuxiao();break;case 6:mysetguashi();break;case 7:mynew();break;case 0:printf(n 非常感谢使用本软件!n 已正常退出,按任意键结束.);exit(0);break;default :printf(n 该选项非法!);break;( 2 )设计各模块的算法,这是逐步细化的过程。1,建立饭卡模块,函数名 mycreat。在该模块中输入学生的卡号,姓名,充值钱数,并将它们存放在文件中;每输入一组数据,记录数增 1。建立饭卡的程序设计如下:void mycreat()int i=1;struct card temp=0;第 13 页 共 36 页FILE *fp=NULL;char yes_no=0;temp.guashi=0;temp.sum=0;system(cls);fp=fopen(D:饭卡管理系统filescard.dat,a);if(fp=NULL)printf(nn饭 卡 文 件 丢 失 ! 按 任 意 键 继续.);getchar();exit(0);elsefclose(fp);doprintf(n 请输入第%d 个记录:nn,i);printf( 卡号:);scanf(%s,&temp.num);if(myexist(temp.num)!=1)fp=fopen(D:饭卡管理系统filescard.dat,a);printf( 姓名:);scanf(%s,&temp.name);printf( 充值钱数:);scanf(%f,&temp.yu);fprintf(fp,%10s%10s%20.2f%4d%20.2fn,temp.num,temp.name,temp.yu,temp.guashi,temp.sum);fclose(fp);i+;else printf( 卡号重复!n);printf(n 请问您要继续吗?);doyes_no=getchar();while(yes_no!=Y&yes_no!=y&yes_no!=N&yes_no!=n);while(yes_no=Y|yes_no=y);在文件夹中寻找已输入的卡号用函数 myexist 系统自动用循环将文件中读入的学号一一做比较。用 fp=fopen(D:饭卡管理系统filescard.dat,a);追加打开文件, 输入学生的姓名,充值钱数,并将它们存放在文件中;每输入一组数据,记录数增 1。用 do-while 语句实现人机对话的功能,机器问用户是否继续,如果继续就接着第 14 页 共 36 页建立新饭卡,否则返回主菜单。2,买饭设计模块,函数名 mybuy.void mybuy()system(cls);fp=fopen(D:饭卡管理系统filescard.dat,r);while(feof(fp)=0) fscanf(fp,%s%s%f%d%f,tempi.num,tempi.name,&tempi.yu,&tempi.guashi,&tempi.sum);i+;fclose(fp);printf(n 请输入卡号:);scanf(%s,num_temp);if(myexist(num_temp)=-1) printf(n 卡号不存在!);else if(myguashi(num_temp)=1) printf(n 本卡已冻结!);else if(myyu(num_temp)=0) printf(n 余额不够,请续费!);else for(j=0;ji;j+)if(strcmp(num_temp,tempj.num)=0) break;printf(n 请输入消费金额:);scanf(%f,&money);printf(n 卡号姓名余额n);printf(n消费前:%-10s%-10s%-10.2fn,tempj.num,tempj.name,tempj.yu);printf(n消费后:%-10s%-10s%-10.2fn,tempj.num,tempj.name,tempj.yu-money);tempj.yu=tempj.yu-money;tempj.sum=tempj.sum+money;fp=fopen(D:饭卡管理系统filescard.dat,w);for(j=0;ji-1;j+)fprintf(fp,%10s%10s%20.2f%4d%20.2fn,tempj.num,tempj.name,tempj.yu,tempj.guashi,tempj.sum);fclose(fp);printf(nn 此次消费成功!按任意键返回主菜单.);getch();return;printf(nn 此次消费失败!按任意键返回主菜单.);getch();判断卡号存在模块:函数名 myexist。系统自动用循环将文件中读入的学号一一做比较。判断卡号挂失情况模块: 函数名 myguashi。 系统自动用 if-else 语句判断挂失情况。判断卡号余额情况模块: 函数名 myyu。 系统自动用 if-else 语句分别判断卡号余第 15 页 共 36 页额是否充足。3,续钱设计模块,函数名 myaddyu。void myaddyu()system(cls);fp=fopen(D:饭卡管理系统filescard.dat,r);while(feof(fp)=0) fscanf(fp,%s%s%f%d%fn,tempi.num,tempi.name,&tempi.yu,&tempi.guashi,&tempi.sum);i+;fclose(fp);printf(nn 请输入卡号:);scanf(%s,&num_temp);if(myexist(num_temp)=1&myguashi(num_temp)=0) for(j=0;ji;j+) if(strcmp(num_temp,tempj.num)=0) printf(n 请输入续费金额:);scanf(%f,&money);printf(n卡号姓名余额n);printf(续费前:%-10s%-10s%-10.2fnn,tempj.num,tempj.name,tempj.yu);printf(续费后:%-10s%-10s%-10.2fn,tempj.num,tempj.name,tempj.yu+money);tempj.yu=tempj.yu+money;fp=fopen(D:饭卡管理系统filescard.dat,w);for(k=0;ki;k+)fprintf(fp,%10s%10s%20.2f%4d%20.2fn,tempk.num,tempk.name,tempk.yu,tempk.guashi,tempk.sum);fclose(fp);printf(nn 续费成功!按任意键返回主菜单.);elseprintf(nn 卡号不存在或已挂失!按任意键返回主菜单.);getchar();判断卡号存在情况:函数名 myexist。系统自动用循环将文件中读入的学号一一做比较。判断挂失情况:函数名 myguashi。系统自动用 if-else 语句判断挂失情况。用 for 循环结构找寻对应的学号,并输入续费金额,使续费成功。备注:以下函数为续钱设计模块的子函数:fp=fopen(D:饭卡管理系统filescard.dat,r);第 16 页 共 36 页while(feof(fp)=0) fscanf(fp,%s%s%f%d%fn,tempk.num,tempk.name,&tempk.yu,&tempk.guashi,&tempk.sum);k+;fclose(fp);for(i=0;ik;i+) if(strcmp(num,tempi.num)=0) flag=1;break;return flag;4,添加新饭卡模块,函数名 myaddcard。在该模块中输入学生的卡号,姓名,充值钱数,并将它们存放在文件中;每输入一组数据,记录数增 1。添加饭卡模块设计程序如下:void myaddcard int i=0;struct card temp=0;FILE *fp=NULL;char yes_no=0;temp.guashi=0;temp.sum=0;system(cls);fp=fopen(D:饭卡管理系统filescard.dat,r);if(fp=NULL) printf(n 饭卡文件丢失!);getch();exit(0);fclose(fp);do printf(n 请输入第%d 个记录:nn,i+1);printf( 卡号:);scanf(%s,&temp.num);if(myexist(temp.num)!=1) printf( 姓名:);scanf(%s,&temp.name);printf( 充值钱数:);scanf(%f,&temp.yu);fp=fopen(D:饭卡管理系统filescard.dat,a);fprintf(fp,%10s%10s%20.2f%4d%20.2fn,temp.num,temp.name,temp.yu,temp.guashi,temp.sum);fclose(fp);i+;else printf(n 卡号重复!n);第 17 页 共 36 页printf(nn 要继续吗?);doyes_no=getch();while(yes_no!=Y&yes_no!=y&yes_no!=N&yes_no!=n);while(yes_no=Y|yes_no=y);在文件夹中寻找已输入的卡号用函数 myexist 系统自动用循环将文件中读入的学号一一做比较。没有找到,符合条件并输入学生的姓名,充值钱数,并将它们存放在文件中;每输入一组数据,记录数增 1。5,注销旧饭卡模块,函数名 myzhuxiao。system(cls);fp=fopen(D:饭卡管理系统filescard.dat,r);if(fp=NULL) printf(n 饭卡文件丢失!);exit(0);while(feof(fp)=0) fscanf(fp,%s%s%f%d%fn,tempi.num,tempi.name,&tempi.yu,&tempi.guashi,&tempi.sum);i+;fclose(fp);printf(nn 请输入卡号:);scanf(%s,num_temp);if(myexist(num_temp)=1) for(j=0;ji;j+)if(strcmp(num_temp,tempj.num)=0)break;for(k=j;ki;k+)tempk=tempk+1;fp=fopen(D:饭卡管理系统filescard.dat,w);for(k=0;ki-1;k+)fprintf(fp,%10s%10s%20.2f%4d%20.2fn,tempk.num,tempk.name,tempk.yu,tempk.guashi,tempk.sum);fclose(fp);printf(n 注销成功!按任意键返回主菜单.);elseprintf(n %s 不存在!按任意键返回主菜单.,num_temp);getch();查找学生饭卡卡号用比较函数 strcmp(num_temp,tempj.num)=0。用 for 循环语句利用数组的替换使学生饭卡被注销。6,设置与解除挂失模块,函数名 mysetguashi。system(cls);printf(n);printf( |*|n);printf( |请输入选项编号(02)|n);第 18 页 共 36 页printf( |*|n);printf( |1-设置挂失|n);printf( |n);printf( |2-解除挂失|n);printf( |n);printf( |0-返回|n);printf( |*|n);printf(n 请输入操作编号);fp=fopen(D:饭卡管理系统filescard.dat,r);if(fp=NULL) printf(n 饭卡文件丢失!);exit(0);while(feof(fp)=0) fscanf(fp,%s%s%f%d%fn,tempi.num,tempi.name,&tempi.yu,&tempi.guashi,&tempi.sum);i+;fclose(fp);choose=getchar();if(choose=1) printf(nn 请输入卡号:);scanf(%s,&num_temp);if(myexist(num_temp)=1) for(j=0;ji;j+)if(strcmp(num_temp,tempj.num)=0) break;tempj.guashi=1;fp=fopen(D:饭卡管理系统filescard.dat,w);for(k=0;ki;k+)fprintf(fp,%10s%10s%20.2f%4d%20.2fn,tempk.num,tempk.name,tempk.yu,tempk.guashi,tempk.sum);fclose(fp);printf(n 设置成功!按任意键返回主菜单.);getch();return;else printf(n 此卡不存在!按任意键返回主菜单.);getch();return;else if(choose=2) printf(nn 请输入卡号:);scanf(%s,&num_temp);printf(n);if(myexist(num_temp)=1) for(j=0;ji;j+)if(strcmp(num_temp,tempj.num)=0) break;tempj.guashi=0;fp=fopen(D:饭卡管理系统filescard.dat,w);for(k=0;ki;k+)fprintf(fp,%10s%10s%20.2f%4d%20.2f%n,tempk.num,tempk.name,tempk.yu,tempk.guashi,tempk.sum);fclose(fp);else printf( 此卡不存在!按任意键返回主菜单.);getch();第 19 页 共 36 页用 if-else 语句分别选择设置和解除挂失功能。备注:以下函数为设置与解除挂失的子函数:int myguashi(char num10) FILE *fp=NULL;struct card tempN=0;int i=0,j;fp=fopen(D:饭卡管理系统filescard.dat,r);while(feof(fp)=0) fscanf(fp,%s%s%f%d%fn,tempi.num,tempi.name,&tempi.yu,&tempi.guashi,&tempi.sum);i+;fclose(fp);for(j=0;ji;j+) if(strcmp(num,tempj.num)=0)break;if(tempj.guashi=1)return 1;elsereturn 0;7,创新功能模块,函数名 mynew。dofp=fopen(D:饭卡管理系统filescard.dat,r);if(fp=NULL) printf(n打开文件失败!n);return;while(feof(fp)=0)fscanf(fp,%s%s%f%d%fn,tempk.num,tempk.name,&tempk.yu,&tempk.guashi,&tempk.sum);k+;fclose(fp);system(cls);printf(请输入卡号:);scanf(%s,num_temp);for(i=0;i=50)第 20 页 共 36 页tempi.yu=tempi.sum/50+tempi.yu;tempi.sum=(int)tempi.sum%50;printf(余额为%f,tempi.yu);else printf(您的消费金额不足 50);fp=fopen(D:饭卡管理系统filescard.dat,w);for(j=0;jk;j+)fprintf(fp,%10s%10s%20.2f%4d%20.2f%n,tempj.num,tempj.name,tempj.yu,tempj.guashi,tempj.sum);fclose(fp);printf(n 请问您要继续吗?);doyes_no=getchar();while(yes_no!=Y&yes_no!=y&yes_no!=N&yes_no!=n);while(yes_no=Y|yes_no=y);用 if-else 语句判断消费金额是否大于 50 元。如果大于五十元用到 tempi.yu,tempi.sum 计算出返回金钱。8,界面设计模块,函数名 myprint。void myprint() system(cls);printf(nn);printf( |*|n);printf( |请输入选项编号(07)|n);printf( |*|n);printf( |1-建立饭卡文件|n);printf( |2-买饭|n);printf( |3-续钱|n);printf( |4-添加新饭卡|n);printf( |5-注销旧饭卡|n);printf( |6-设置与解除挂失|n);printf( |7-创新功能|n);printf( |0-退出系统|n);printf( |*|n);利用 myprint 函数实现主菜单的显示功能。备注以下为查找学生饭卡卡号的子函数:int myexist(char num10)第 21 页 共 36 页FILE *fp=NULL;struct card tempN=0;int i=0,flag=-1,k=0;fp=fopen(D:饭卡管理系统filescard.dat,r);while(feof(fp)=0)fscanf(fp,%s%s%f%d%fn,tempk.num,tempk.name,&tempk.yu,&tempk.guashi,&tempk.sum);k+;fclose(fp);for(i=0;ik;i+)if(strcmp(num,tempi.num)=0) flag=1;break; return flag;第 22 页 共 36 页5测试与调试测试与调试测试数据类型测试数据预期结果实例结果合法数据1建立 1-10 个学生饭卡, 1-5 输入金额 50元以下,6-10 输入金额 50 以上。查看档案,存在与刚才对应的十条记录。查看档案,存在与刚才对应的十条记录。2对卡号 1-10 卡号中任选一个进行买饭,输入消费金额 20 元。显示饭卡余额的信息,并且相应的扣除金额 20 元。显示饭卡余额的信息,并且相应的扣除金额 20 元。3从 1-10 个卡号中任选一个进行续钱,续钱金额为 100 元。该学号对应的余额增加 100 元。该学号对应的余额增加 100 元。4添加新饭卡,卡号为11,续费金额为 200元。查看档案,多了一个卡号为 11 的记录,且信息与对应的输入信息相等。查看档案,多了一个卡号为 11 的记录,且信息与对应的输入信息相等。5改变卡号为 5 的档案,使其消费累计金额为 200 元,之后进行返值操作该用户消费后的余额增加 2 元。该用户消费后的余额增加 2 元。6输入用户须知对应的选项号。屏幕上出现用户须知的内容。屏幕上出现用户须知的内容。7选择卡号为 6 进行挂失操作,选择设置挂失查看档案,卡号为 6的用户饭卡已挂失。查看档案,卡号为 6的用户饭卡已挂失。8把学号为 11 的用户进行注销操作。查看档案, 卡号为 11的用户的相关记录消失。查看档案, 卡号为 11的用户的相关记录消失。9选择卡号为 6 进行挂失操作,选择解除挂失查看档案,卡号为 6的用户饭卡已解除挂失。查看档案,卡号为 6的用户饭卡已解除挂失。10用户输入 0屏幕显示退出的相关提示信息,之后再按任何键时, 能够退出。屏幕显示退出的相关提示信息,之后再按任何键时, 能够退出。非法数据1对卡号为 1 的用户进行添加饭卡。显示学号重复相关的错误信息。显示学号重复相关的错误信息。2对学号为 2 的用户进行买饭操作。显示消费金额不足相关的错误信息。显示消费金额不足相关的错误信息。第 23 页 共 36 页3对卡号为 3 的用户进行两次注销。在第二次注销时,显示卡号不存在。在第二次注销时,显示卡号不存在。4对卡号为 1 的用户进行饭卡建立操作。显示卡号重复相关的错误信息。显示卡号重复相关的错误信息。5对卡号为 4 的用户进行续钱操作显示学号不存在相关信息。显示学号不存在相关信息。6把卡号为 5 的用户进行返值的操作显示消费金额不足的错误信息。显示消费金额不足的错误信息。7用户在主界面输入任何 0-7 以外的信息屏幕上显示选项非法错误。屏幕上显示选项非法错误。附录附录 程序清单程序清单#include#include#include#include#define N 100struct card char name10,num10;float yu,sum;int guashi;void myprint();第 24 页 共 36 页void mycreat();void mybuy();int myexist(char num10);int myguashi(char num10);int myyu(char num10);void myaddyu();void myaddcard();void myzhuxiao();void mysetguashi();void mynew();main()char choose=0;char yes_no=0;domyprint();printf(n请选择操作编号:);choose=getch();switch(choose)case 1:mycreat();break;case 2:mybuy();break;case 3:myaddyu();break;case 4:myaddcard();break;case 5:myzhuxiao();break;case 6:mysetguashi();break;case 7:mynew();break;case 0:printf(n 非常感谢使用本软件!n 已正常退出,按任意键结束.);exit(0);break;default :printf(n 该选项非法!);break;printf(n 请问您要继续吗?);doyes_no=getchar();while(yes_no!=Y&yes_no!=y&yes_no!=N&yes_no!=n);while(yes_no=Y|yes_no=y);void myprint()system(cls);第 25 页 共 36 页printf(nn);printf( |*|n);printf( |请输入选项编号(07)|n);printf( |*|n);printf( |1-建立饭卡文件|n);printf( |2-买饭|n);printf( |3-续钱|n);printf( |4-添加新饭卡|n);printf( |5-注销旧饭卡|n);printf( |6-设置与解除挂失|n);printf( |7-创新功能|n);printf( |0-退出系统|n);printf( |*|n);void mycreat()int i=1;struct card temp=0;FILE *fp=NULL;char yes_no=0;temp.guashi=0;temp.sum=0;system(cls);fp=fopen(D:card.dat,w);if(fp=NULL)printf(nn饭卡文件丢失!按任意键继续.);getchar();exit(0);elsefclose(fp);doprintf(n 请输入第%d 个记录:nn,i);printf( 卡号:);scanf(%s,&temp.num);if(myexist(temp.num)!=1)fp=fopen(D:card.dat,w);printf( 姓名:);scanf(%s,&temp.name);printf( 充值钱数:);scanf(%f,&temp.yu);fprintf(fp,%10s%10s%20.2f%4d%20.2fn,temp.num,temp.name,temp.yu,temp.guashi,temp.sum);第 26 页 共 36 页fclose(fp);i+;else printf( 卡号重复!n);printf(n 请问您要继续吗?);doyes_no=getchar();while(yes_no!=Y&yes_no!=y&yes_no!=N&yes_no!=n);while(yes_no=Y|yes_no=y);void mybuy()FILE *fp=NULL;struct card tempN=0;int i=0,j;char num_temp10=0;float money;system(cls);fp=fopen(D:饭卡管理系统filescard.dat,r);while(feof(fp)=0)fscanf(fp,%s%s%f%d%f,tempi.num,tempi.name,&tempi.yu,&tempi.guashi,&tempi.sum);i+;fclose(fp);printf(n 请输入卡号:);scanf(%s,num_temp);if(myexist(num_temp)=-1) printf(n 卡号不存在!);else if(myguashi(num_temp)=1) printf(n 本卡已冻结!);else if(myyu(num_temp)=0) printf(n 余额不够,请续费!);elsefor(j=0;ji;j+)if(strcmp(num_temp,tempj.num)=0) break;printf(n 请输入消费金额:);scanf(%f,&money);printf(n 卡号姓名余额n);printf(n消费前:%-10s%-10s%-10.2fn,tempj.num,tempj.name,tempj.y第 27 页 共 36 页u);printf(n消费后:%-10s%-10s%-10.2fn,tempj.num,tempj.name,tempj.yu-money);tempj.yu=tempj.yu-money;tempj.sum=tempj.sum+money;fp=fopen(D:饭卡管理系统filescard.dat,w);for(j=0;ji-1;j+)fprintf(fp,%10s%10s%20.2f%4d%20.2fn,tempj.num,tempj.name,tempj.yu,tempj.guashi,tempj.sum);fclose(fp);printf(nn此次消费成功!按任意键返回主菜单.);getchar();return;printf(nn 此次消费失败!按任意键返回主菜单.);getchar(); return;int myexist(char num10)FILE *fp=NULL;struct card tempN=0;int i=0,flag=-1,k=0;fp=fopen(D:饭卡管理系统filescard.dat,r);while(feof(fp)=0)fscanf(fp,%s%s%f%d%fn,tempk.num,tempk.name,&tempk.yu,&tempk.guashi,&tempk.sum);k+;fclose(fp);for(i=0;ik;i+)if(strcmp(num,tempi.num)=0) flag=1;break; return flag;int myguashi(char num10)FILE *fp=NULL;struct card tempN=0;int i=0,j;fp=fopen(D:饭卡管理系统filescard.dat,r);第 28 页 共 36 页while(feof(fp)=0)fscanf(fp,%s%s%f%d%fn,tempi.num,tempi.name,&tempi.yu,&tempi.guashi,&tempi.sum);i+;fclose(fp);for(j=0;ji;j+)if(strcmp(num,tempj.num)=0)break;if(tempj.guashi=1)return 1;elsereturn 0;int myyu(char num10)FILE *fp=NULL;struct card tempN=0;int i=0,j;fp=fopen(D:饭卡管理系统filescard.dat,r);while(feof(fp)=0)fscanf(fp,%s%s%f%d%fn,tempi.num,tempi.name,&tempi.yu,&tempi.guashi,&tempi.sum);i+;fclose(fp);for(j=0;ji;j+)if(strcmp(num,tempj.num)=0) break;if(tempj.yu5.00)return 0;else return 1;void myaddyu()FILE *fp=NULL;struct card tempN=0;int i=0,j,k;char num_temp10=0;float money;system(cls);fp=fopen(D:饭卡管理系统filescard.dat,r);while(feof(fp)=0)第 29 页 共 36 页fscanf(fp,%s%s%f%d%fn,tempi.num,tempi.name,&tempi.yu,&tempi.guashi,&tempi.sum);i+;fclose(fp);printf(nn 请输入卡号:);scanf(%s,&num_temp);if(myexist(num_temp)=1&myguashi(num_temp)=0)for(j=0;ji;j+)if(strcmp(num_temp,tempj.num)=0) break;printf(n 请输入续费金额:);scanf(%f,&money);printf(n卡号姓名余额n);printf(续费前:%-10s%-10s%-10.2fnn,tempj.num,tempj.name,tempj.yu);printf(续费后:%-10s%-10s%-10.2fn,tempj.num,tempj.name,tempj.yu+money);tempj.yu=tempj.yu+money;fp=fopen(D:饭卡管理系统filescard.dat,w);for(k=0;ki;k+)fprintf(fp,%10s%10s