当前位置:文档之家› C语言模拟ATM机

C语言模拟ATM机

一、实验目的通过设计一个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* ……****/#include <stdio、h>#include <stdlib、h>#include <string、h>#include <time、h>#define PR printftypedef struct{short int year;short int month;short int day;}Date;//日期typedef struct Account{char no[17];char name[20];double balance;char password[7];struct Account* next;}Account;typedef struct{char no[17];Date date;double number;}Record;//记录Account *head = NULL;//账户信息链表表头Account *now_acc = NULL;//当前账户/************函数申明************/void InitializeAccount();//导入账户信息//--------------------------------------char LockAccountTopic(const char *no);//检测账户就是否被锁定void LockAccount(const char *no);//锁定账户//--------------------------------------void Login();//登录Account* FindbyNo(const char *no);//查找卡号对应账户信息在链表中的地址//--------------------------------------void Demand();//查询主菜单void PrintBalance();//输出余额void Printetail();//输出明细//--------------------------------------void Modifiy();//修改密码//--------------------------------------void Withdrawal();//取款主界面void WithdrawalOt(long money);//取款//--------------------------------------void Depositing();//存款//--------------------------------------void Transfer();//转账char *CoverUpName(const char *name);//掩盖部分用户名//--------------------------------------void Log(double money, const char *no);//将存款记录写入文件中void Save();//保存账号信息void FreeData();//释放链表空间//--------------------------------------int main(){char choose;InitializeAccount();//导入账户信息Login();//登录do{system("cls");PR("\t\t \n");PR("\t\t 请选择服务\n");PR("\t\t+-+---------+ +---------+-+\n");PR("\t\t|5|\33转账| |查询\32|1|\n");PR("\t\t+-+---------+ +---------+-+\n\n");PR("\t\t +---------+-+\n");PR("\t\t |取款\32|2|\n");PR("\t\t +---------+-+\n\n");PR("\t\t +---------+-+\n");PR("\t\t |存款\32|3|\n");PR("\t\t +---------+-+\n\n");PR("\t\t+-+---------+ +---------+-+\n");PR("\t\t|0|\33退出系统| |修改密码\32|4|\n");PR("\t\t+-+---------+ +---------+-+\n\n");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(); return 0;//退出default:printf("输入错误,请重新选择\n"); //解决用户可能的输入错误system("pause");}} while (1);return 0;}/**********导入账户信息**********/void InitializeAccount(){FILE *fp;Account temp;PR("系统初始化中,请稍侯、、、\n");if (!(fp = fopen("accounts、txt", "r"))){PR("\07");//响铃PR("读取帐户信息失败,请在本程序根目录建立帐户信息文件(accounts、txt)。

相关主题