您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > C语言模拟ATM机.pptx
学海无涯一、实验目的通过设计一个ATM机模拟操作的程序,全面运用课程的主要知识点,巩固对模块化程序设计、文件操作的理解,提高软件编程能力。二、实验要求要求每人独立完成设计,编写一个ATM机模拟操作程序。提交实验报告、源程序、程序运行截图。1.程序具有以下功能:1)登录系统:输入卡号(16位)、密码(6位),只有卡号、密码同时正确(帐户信息存放在文件中)才能进入系统;2)操作功能:查询:查询帐户的存款余额。按任意键返回主菜单;修改密码:连续输入两次新密码(两次输入结果完全相同)后,新密码取代旧密码,并存放到帐户信息文件中。之后可返回主菜单;取款:输入50或100的倍数模拟为取款金额,请注意:取款金额不得超过帐户余额,操作后帐户余额应相应减少。之后可返回主菜单;存款:输入50或100的倍数模拟为存款金额,现假设存款金额不得超过20000元,操作后帐户余额应相应增加。之后可返回主菜单;转帐:先输入一个帐户号(已保存在帐户信息文件中),然后显示一部分用户名(如:张*山),储户确认无误后,再输入50或100的倍数模拟为转帐金额,请注意:转帐金额不得超过帐户余额,操作后帐户余额应相应减少。之后可返回主菜单;退出:退出系统。2.定义如下结构体类型:“日期”结构体Date:成员有:year(年)、month(月)、day(日);“帐户”结构体Account:成员有:no(帐户号)、name(姓名)、balance(余额)“存取款记录”结构体Record,:成员有:no(帐户号)、date(日期)、number(数量,可正可负,正表示存款,负表示取款)学海无涯3.帐户信息存放在accounts.txt文件,储户存取款记录保存在records.txt中;4.采用模块化程序设计方法来实现,即main()显示主菜单、调用相关函数实现相应功能,起主控作用。5.附加功能:储户一天内输错密码的次数不能超过3次,否则无法进入系统;应避免输入存款金额、取款金额为负数等异常情况的出现。三、程序已经实现的功能点实验要求均已实现。此外还有:1.卡号、密码位数输错时,提示并返回重新输入,2.简化取款时的输入3.转账时,转账账户为原账户时,提示并返回重新输入4.在多个模块中添加了退出功能,无需回到主菜单即可退出系统5.在查询模块中加入了存取记录明细查询四、程序运行截图及说明1.登陆模块1)卡号不为16位时,输出提示并返回重新输入学海无涯2)卡号不存在时,输出提示并返回重新输入3)密码位数输错时,输出提示并返回重新输入密码,不作为密码错误处理,也无需重新输入卡号4)密码连续输错三次时,锁定卡号,今日无法登录学海无涯2.登录后的系统主菜单3.查询模块1)查询模块主菜单学海无涯2)查询明细4.取款模块1)当余额不足50时,无法进入取款模块学海无涯2)取款模块主菜单3)便捷取款学海无涯4)手动输入取款金额输错时,返回重新输入学海无涯5)取款后的菜单6)取款完成后选择显示余额学海无涯5.存款模块1)解决输入错误问题2)存款成功学海无涯6.密码修改模块1)原密码输错时,返回重新输入,不提供退出功能学海无涯2)密码位数输错、两次输入新密码不一致时,返回重新输入学海无涯3)输入无误时7.转账模块1)转入卡号位数输错时,提示并返回重新输入学海无涯2)未查找到该卡号时,输出提示,提供退出功能,键入除*外任意键重新输入3)转入卡号与当前卡号相同时,输出提示学海无涯4)输出转入卡账户的部分用户名学海无涯5)解决转账金额输错的问题6)转账成功学海无涯五、采用的主要技术1.宏定义:由于本程序的printf语句较多,为了便于编写,故用PR代替2.链表:账户信息采用链表结构,内存动态分配,使用内存无限制,可以扩展到所有可以使用的内存3.switch多分支选择结构4.文本文件的读写5.利用time.h头文件,简便地获取系统日期6.system()函数和fflush()函数的简单使用六、设计心得1.各函数的功能要相对独立,逐步求精。2.如果函数的参数为指针,且仅作为输入参数,则应在类型前加const,以防止该指针在函数体内被意外修改附:程序代码/****运行本程序前,请在本程序根目录下建立文件“accounts.txt”,格式如下:*卡号1(16位)姓名1账户余额1密码1*卡号2(16位)姓名2账户余额2密码2*……****/#includestdio.h#includestdlib.h#includestring.h#includetime.h#definePRprintftypedefstruct学海无涯{shortintyear;shortintmonth;shortintday;}Date;//日期typedefstructAccount{charno[17];charname[20];doublebalance;charpassword[7];structAccount*next;}Account;typedefstruct{charno[17];Datedate;doublenumber;}Record;//记录Account*head=NULL;//账户信息链表表头Account*now_acc=NULL;//当前账户/************函数申明************/voidInitializeAccount();//导入账户信息//--------------------------------------charLockAccountTopic(constchar*no);//检测账户是否被锁定voidLockAccount(constchar*no);//锁定账户//--------------------------------------voidLogin();//登录Account*FindbyNo(constchar*no);//查找卡号对应账户信息在链表中的地址//--------------------------------------voidDemand();//查询主菜单voidPrintBalance();//输出余额voidPrintetail();//输出明细//--------------------------------------voidModifiy();//修改密码//--------------------------------------voidWithdrawal();//取款主界面voidWithdrawalOt(longmoney);//取款//--------------------------------------voidDepositing();//存款学海无涯//--------------------------------------voidTransfer();//转账char*CoverUpName(constchar*name);//掩盖部分用户名//--------------------------------------voidLog(doublemoney,constchar*no);//将存款记录写入文件中voidSave();//保存账号信息voidFreeData();//释放链表空间//--------------------------------------intmain(){charchoose;InitializeAccount();//导入账户信息Login();//登录do{system(cls);PR(\t\t请选择服务\n);\n);+---------+-+\n);|查询\32|1|\n);+---------+-+\n\n);+---------+-+\n);|取款\32|2|\n);+---------+-+\n\n);+---------+-+\n);PR(\t\tPR(\t\t+-+---------+PR(\t\t|5|\33转账|PR(\t\t+-+---------+PR(\t\tPR(\t\tPR(\t\tPR(\t\tPR(\t\tPR(\t\tPR(\t\t+-+---------+|存款\32|3|\n);+---------+-+\n\n);+---------+-+\n);|修改密码\32|4|\n);+---------+-+\n\n);PR(\t\t|0|\33退出系统|PR(\t\t+-+---------+PR(请选择服务:);fflush(stdin);choose=getchar();switch(choose){case'1':Demand();break;//查询case'2':Withdrawal();break;//取款case'3':Depositing();break;//存款case'4':Modifiy();break;//修改密码case'5':Transfer();break;//转账case'0':FreeData();return0;//退出default:学海无涯printf(输入错误,请重新选择\n);//解决用户可能的输入错误system(pause);}}while(1);return0;}/**********导入账户信息**********/voidInitializeAccount(){FILE*fp;Accounttemp;PR(系统初始化中,请稍侯...\n);if(!(fp=fopen(accounts.txt,r))){PR(\07);//响铃PR(读取帐户信息失败,请在本程序根目录建立帐户信息文件(accounts.txt)。格式如下:\n);PR(卡号1(16位)姓名1账户余额1密码1\n);PR(卡号2(16位)姓名2账户余额2密码2\n);PR(……\n);exit(0);}while(fscanf(fp,%s%s%lf%s,temp.no,temp.name,&temp.balance,temp.password)==4){//读入账户信息Account*t=head;head=(Account*)malloc(sizeof(Account));*head=temp;head-next=t;}fclose(fp);system(cls);//清除“系统初始化中,请稍侯...”提示}/**********登录**********/voidLogin(){do{charno[17];system(cls);PR(\n\n\n\n\t\t\t请输入16位卡号:);fflush(stdin);学海无涯gets(no);if(strlen(no)!=16){PR(卡号应为16位\n);system(pause);system(cls);continue;}if(LockAccountTopic(no)){//当该卡号被锁定时PR(\07);//响铃PR(\n\n您的登陆密码今日连续输错三次,已被临时锁定,次日将自动解锁,或当日持本人有效证件到柜台办理密码重置。\n\n);system(pause);continue;}if(!(now_acc=FindbyNo(no)))//将卡号对应信息在链表的地址赋给now_acc{//当卡号不存在时PR(\n\n此卡号不存在,请重新输入!\n\n);system(pause);continue;}chara='2';//计算剩余可输错密码次数do{charpassword[7];system(cls);PR(\n\n\n\n\t\t\t请输入16位卡号:%s\n,now_acc-no);PR(\n\n\t\t\t请输入6位密码:);fflush(stdin);scanf(%s,password);if(strlen(password)!=6){PR(密码应为6位\n);system(pause);system(cls);continue;}if(!strcmp(now_acc-password
本文标题:C语言模拟ATM机.pptx
链接地址:https://www.777doc.com/doc-5632474 .html