资源预览内容
第1页 / 共33页
第2页 / 共33页
第3页 / 共33页
第4页 / 共33页
第5页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1 一、一、 实验目的实验目的 通过设计一个 ATM 机模拟操作的程序,全面运用课程的主要知识点,巩固对模块化程序设 计、文件操作的理解,提高软件编程能力。 二、二、 实验要求实验要求 要求每人独立完成设计,编写一个 ATM 机模拟操作程序。提交实验报告、源程序、程序运 行截图。 1. 程序具有以下功能: 1) 登录系统: 输入卡号(16 位)、密码(6 位),只有卡号、密码同时正确(帐户信息存放在文件中)才能进 入系统; 2) 操作功能: 查询:查询帐户的存款余额。按任意键返回主菜单; 修改密码:连续输入两次新密码(两次输入结果完全相同)后,新密码取代旧密码,并存 放到帐户信息文件中。之后可返回主菜单; 取款:输入 50 或 100 的倍数模拟为取款金额,请注意:取款金额不得超过帐户余额, 操作后帐户余额应相应减少。之后可返回主菜单; 存款:输入 50 或 100 的倍数模拟为存款金额,现假设存款金额不得超过 XXXX0 元,操 作后帐户余额应相应增加。之后可返回主菜单; 转帐:先输入一个帐户号(已保存在帐户信息文件中),然后显示一部分用户名(如:张* 山),储户确认无误后,再输入 50 或 100 的倍数模拟为转帐金额,请注意:转帐金额不 得超过帐户余额,操作后帐户余额应相应减少。之后可返回主菜单; 退出:退出系统。 2. 定义如下结构体类型: “日期”结构体 Date:成员有:year(年)、month(月)、day(日); “帐户”结构体 Account:成员有:no(帐户号)、name(姓名)、balance(余额) “存取款记录”结构体 Record,:成员有:no(帐户号)、date(日期)、number(数量,可正可 负,正表示存款,负表示取款) 2 3. 帐户信息存放在 accounts.txt 文件,储户存取款记录保存在 records.txt 中; 4. 采用模块化程序设计方法来实现,即 main()显示主菜单、调用相关函数实现相 应功能,起主控作用。 5. 附加功能: 储户一天内输错密码的次数不能超过 3 次,否则无法进入系统; 应避免输入存款金额、取款金额为负数等异常情况的出现。 三、三、 程序已经实现的功能点程序已经实现的功能点 实验要求均已实现。此外还有: 1. 卡号、密码位数输错时,提示并返回重新输入, 2. 简化取款时的输入 3. 转账时,转账账户为原账户时,提示并返回重新输入 4. 在多个模块中添加了退出功能,无需回到主菜单即可退出系统 5. 在查询模块中加入了存取记录明细查询 四、四、 程序运行截图及说明程序运行截图及说明 1. 登陆模块 1) 卡号不为 16 位时,输出提示并返回重新输入 3 2) 卡号不存在时,输出提示并返回重新输入 3) 密码位数输错时,输出提示并返回重新输入密码,不作为密码错误处理,也无需重新输 入卡号 4) 密码连续输错三次时,锁定卡号,今日无法登录 4 2. 登录后的系统主菜单 3. 查询模块 1) 查询模块主菜单 5 2) 查询明细 4. 取款模块 1) 当余额不足 50 时,无法进入取款模块 6 2) 取款模块主菜单 3) 便捷取款 7 4) 手动输入取款金额 输错时,返回重新输入 8 5) 取款后的菜单 6) 取款完成后选择显示余额 9 5. 存款模块 1) 解决输入错误问题 2) 存款成功 10 6. 密码修改模块 1) 原密码输错时,返回重新输入,不提供退出功能 11 2) 密码位数输错、两次输入新密码不一致时,返回重新输入 12 3) 输入无误时 7. 转账模块 1) 转入卡号位数输错时,提示并返回重新输入 13 2) 未查找到该卡号时,输出提示,提供退出功能,键入除*外任意键重新输入 3) 转入卡号与当前卡号相同时,输出提示 14 4) 输出转入卡账户的部分用户名 15 5) 解决转账金额输错的问题 6) 转账成功 16 五、五、 采用的主要技术采用的主要技术 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 #include #include #include #define PR printf typedef struct 17 short int year; short int month; short int day; Date;/日期 typedef struct Account char no17; char name20; double balance; char password7; struct Account* next; Account; typedef struct char no17; 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();/存款 18 /- 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(tt n); PR(tt 请选择服务 n); PR(tt+-+-+ +-+-+n); PR(tt|5|33 转 账| |查 询32|1|n); PR(tt+-+-+ +-+-+nn); PR(tt +-+-+n); PR(tt |取 款32|2|n); PR(tt +-+-+nn); PR(tt +-+-+n); PR(tt |存 款32|3|n); PR(tt +-+-+nn); PR(tt+-+-+ +-+-+n); PR(tt|0|33 退出系统| |修改密码32|4|n); PR(tt+-+-+ +-+-+nn); 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: 19 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)。格式 如下:n); PR(卡号 1(16 位) 姓名 1 账户余额 1 密码 1n); P
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号