欢迎来到得力文库 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
得力文库 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C语言如何模拟ATM机的资料.doc

    • 资源ID:808905       资源大小:540.63KB        全文页数:33页
    • 资源格式: DOC        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C语言如何模拟ATM机的资料.doc

    一、一、 实验目的实验目的通过设计一个 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 #include #include #include #define PR printftypedef struct 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();/存款/-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: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“); PR(“卡号 2(16 位)姓名 2账户余额 2密码 2n“); PR(“n“); exit(0); while (fscanf(fp, “%s %s %lf %s“, temp.no, temp.name, head = (Account*)malloc(sizeof(Account); *head = temp; head->next = t; fclose(fp);system(“cls“);/清除“系统初始化中,请稍侯.”提示 /*登录*/ void Login() do char no17; system(“cls“);PR(“nnnnttt 请输入 16 位卡号:“); fflush(stdin);gets(no); if (strlen(no) != 16) PR(“卡号应为 16 位n“); system(“pause“); system(“cls“); continue; if (LockAccountTopic(no)/当该卡号被锁定时 PR(“07“);/响铃 PR(“nn 您的登陆密码今日连续输错三次,已被临时锁定,次日将自动解锁, 或当日持本人有效证件到柜台办理密码重置。nn“); system(“pause“); continue; if (!(now_acc = FindbyNo(no)/将卡号对应信息在链表的地址赋给 now_acc /当卡号不存在时 PR(“nn 此卡号不存在,请重新输入!nn“); system(“pause“); continue; char a = '2'/计算剩余可输错密码次数 do char password7; system(“cls“);PR(“nnnnttt 请输入 16 位卡号:%sn“, now_acc->no); PR(“nnttt 请输入 6 位密码:“); fflush(stdin); scanf(“%s“, password); if (strlen(password) != 6) PR(“密码应为 6 位n“); system(“pause“); system(“cls“); continue; if (!strcmp(now_acc->password, password)return;/密码正确,回到主函数 if (a = '0')/输错密码三次,锁定账户 PR(“nn 您的登陆密码今日连续输错三次,已被临时锁定,次日将自动 解锁,或当日持本人有效证件到柜台办理密码重置。nn“);LockAccount(no); break; PR(“07“);/响铃 PR(“密码输入错误,您还可以尝试%c 次nn“, a-); system(“pause“); while (1); while (1); /*检测账户是否被锁定*/ char LockAccountTopic(const char *no)/被锁定则返回 0 FILE *fp;char CruuentTime11;/当前日期 char ArchiveTime11;/锁卡档案日期 char t17;if (!(fp = fopen(“LockAccount.txt“, “a+“)/课本上讲以“a”方式打开文件,若文件不存 在,会出错。VS2013 实测,并不会出错,而是新建。为免第一次使用本程序时,根目录下 没有 LockAccount.txt 而导致出错,故此处不采用“r”方式。 PR(“07“);/响铃 PR(“LockAccount.txt 无法打开nn“); exit(0); rewind(fp);/获取当前日期 time_t rawtime; struct tm * timeinfo;time(/获取时间,以秒计,从 1970 年 1 月一日起算,存于 rawtime timeinfo = localtime(/转为当地时间,tm 时间结构 strftime(CruuentTime, 11, “%Y-%m-%d“, timeinfo);/格式化时间 fgets(ArchiveTime, 11, fp);/获取锁卡档案时间 if (strcmp(ArchiveTime, CruuentTime)/若无锁卡档案,或锁卡档案日期与当前日期不同,则无账户被锁定 fclose(fp); return 0; while (fscanf(fp, “%s“, t) = 1) if (!strcmp(t, no)/锁卡档案中,包含此卡号,返回 1 fclose(fp);return 1; fclose(fp);return 0;/锁卡档案中,不含此卡号,返回 0 /*查找卡号对应账户信息在链表中的地址*/ Account* FindbyNo(const char *no) for (Account *i = head; i; i = i->next) if (!strcmp(i->no, no) return i; return NULL; /*锁定账户*/ void LockAccount(const char *no) FILE *fp;char CruuentTime11;/当前日期 char ArchiveTime11;/锁卡档案日期 if (!(fp = fopen(“LockAccount.txt“, “r“) PR(“07“);/响铃 PR(“error on open LockAccount.txt file!nn“); exit(0); /获取当前日期 time_t rawtime; struct tm * timeinfo;time(/获取时间,以秒计,从 1970 年 1 月 1 日起算,存于 rawtime timeinfo = localtime(/转为当地时间,tm 时间结构 strftime(CruuentTime, 11, “%Y-%m-%d“, timeinfo);/格式化时间 fgets(ArchiveTime, 11, fp); fclose(fp); if (strcmp(ArchiveTime, CruuentTime)/若档案日期与当前日期不同,则说明档案已过期或无档案,新建记录。 if (!(fp = fopen(“LockAccount.txt“, “w“) PR(“07“);/响铃PR(“error on open LockAccount.txt file!nn“); exit(0); fprintf(fp, “%sn“, CruuentTime); else/若记录日期与当前日期相同,则追加记录 if (!(fp = fopen(“LockAccount.txt“, “a“) PR(“07“);/响铃 PR(“error on open LockAccount.txt file!nn“); exit(0); /添加记录 fprintf(fp, “%sn“, no); fclose(fp); /*查询函数主菜单*/ void Demand() char choose; do system(“cls“); PrintBalance(); PR(“ttttt +-+-+n“);PR(“ttttt |查询明细32|1|n“); PR(“ttttt +-+-+nn“); PR(“tt+-+-+ +-+-+n“);PR(“tt|0|33 退出系统| | 返 回 32|2|n“); PR(“tt+-+-+ +-+-+nn“);PR(“请选择服务:“); fflush(stdin); choose = getchar(); switch (choose) case '1': Printetail(); break;/查询明细 case '2': return;/返回 case '0': FreeData(); exit(0);/退出系统 default:printf(“输入错误,请重新选择n“); /解决用户可能的输入错误system(“pause“); while (1); /*输出余额*/ void PrintBalance() system(“cls“); PR(“nnnnnnnnntt+-+-+n“);PR(“tt| 您的账户余额 32|%-15.2f|n“, now_acc->balance); PR(“tt+-+-+nnnnnnn“); /*输出明细*/ void Printetail() FILE *fp; Record temp;int flag = 1;/当有记录时,置 0 if (!(fp = fopen(“records.txt“, “r“) PR(“无存取记录,请进行存取后再使用本功能nn“); system(“pause“); return; system(“cls“); PR(“+-+-+n“);PR(“| 日期 | 存取金额 |n“); PR(“+-+-+n“); while (fscanf(fp, “%s%d-%d-%d%lf“, temp.no, PR(“|%d-%d-%d|%-14.2f|n“, temp.date.year, temp.date.month, temp.date.day, temp.number); PR(“+-+-+n“); PR(“| 日期 | 存取金额 |n“);/未免记录太多看不到表头,在最后加个表头 PR(“+-+-+n“); if (flag)system(“cls“);/无记录时,清除表头 PR(“该卡号未有任何存取记录nn“); system(“pause“); return; system(“pause“);/当有存取记录时,输出后等待 /*将存款记录写入文件中*/ void Log(double money, const char *no) FILE *fp;Date CruuentTime;/当前日期 if (!money)/存取为零时 return; if (!(fp = fopen(“records.txt“, “a“) PR(“07“);/响铃 PR(“error on open records.txt file!“); exit(0); /获取当前日期 time_t rawtime; struct tm * timeinfo;time(/获取时间,以秒计,从 1970 年 1 月 1 日起算,存于 rawtime timeinfo = localtime(/转为当地时间,tm 时间结构 CruuentTime.year = timeinfo->tm_year + 1900, CruuentTime.month = timeinfo- >tm_mon + 1, CruuentTime.day = timeinfo->tm_mday; fprintf(fp, “%sn%d-%d-%dn%fn“, no, CruuentTime.year, CruuentTime.month, CruuentTime.day, money); fclose(fp); /*取款主界面*/ void Withdrawal() char choose; if (now_acc->balance balance balance -= money; Save(); Log(-money, now_acc->no);PR(“取款成功nn“); system(“pause“); /*存款*/ void Depositing() long money; do PR(“请输入存款金额(50 的倍数) ,单次存款金额不得超过 20000 元:“); fflush(stdin); scanf(“%ld“, if (money 20000 | money % 50)/解决输入金额为负数、超过 20000、不是 50 的倍数的情况 PR(“07“);/响铃 PR(“输入有误,请重新输入n“); system(“pause“); continue; PR(“正在处理,请稍候.n“); now_acc->balance += money;Save();/保存账户数据 Log(money, now_acc->no);/保存存取数据 PR(“存款成功nn“); system(“pause“); break; while (1); /*保存账户信息*/ void Save() FILE *fp; int i = 1; char ch; if (!(fp = fopen(“accounts.txt“, “w“) PR(“07“);/响铃 PR(“读取帐户信息失败!accounts.txt 无法打开n“); exit(0); for (Account *i = head; i; i = i->next)/写入账户信息 fprintf(fp, “%s %s %f %sn“, i->no, i->name, i->balance, i->password); fclose(fp); /*修改密码*/ void Modifiy() char oldpass7, newpass17, newpass27; do PR(“请输入原密码:“); fflush(stdin); gets(oldpass); if (strlen(oldpass) != 6) PR(“密码应为 6 位n“); system(“pause“); continue; if (strcmp(oldpass, now_acc->password)/解决密码输入有误,出于安全性的考虑,原密码输入错误时不提供返回功能 PR(“密码有误,请重新输入nn“); system(“pause“); continue; else break; while (1); do PR(“请输入六位新密码:“);fflush(stdin); scanf(“%s“, newpass1); if (strlen(newpass1) != 6) PR(“密码应为 6 位n“); system(“pause“); continue; PR(“请再次输入新密码:“); fflush(stdin); scanf(“%s“, newpass2); if (strcmp(newpass1, newpass2)/两次输入密码不一致时 PR(“密码不一致(输入*取消修改)n“); fflush(stdin); if (getchar() = '*') break; else/输入一致时 strcpy(now_acc->password, newpass1);/修改密码 Save();/保存用户数据 PR(“密码修改成功!nn“); system(“pause“); break; while (1); /*转账*/ void Transfer() Account* aimsite;/转入卡号在链表中的地址 long money;/转账金额 if (now_acc->balance no)/解决转账双方卡号相同的情况 PR(“双方账户相同,请核对后重试(输入*取消转账)n“); if (getchar() = '*') return; continue; if (aimsite = FindbyNo(aim)break;/找到转入卡号对应信息时 else PR(“未找到该卡号,输入*取消转账n“); if (getchar() = '*') return; continue; while (1);PR(“汇款目标用户名为:%sn“, CoverUpName(aimsite->name); PR(“是否确认无误?(输入*确认,否则退出)“); fflush(stdin); if (getchar() != '*') return; do PR(“请输入转账金额(50 的倍数):“); fflush(stdin); scanf(“%lu“, if (now_acc->balance balance -= money; aimsite->balance += money;Save();/保存账户数据 Log(-money, now_acc->no);/当前账户存取记录 Log(money, aimsite->no);/转入卡存取记录 PR(“转账成功nn“); system(“pause“); break; while (1); /*掩盖部分用户名*/ char *CoverUpName(const char *name) char temp20; strcpy(temp, name);int words = 0;/用于存放姓名的字数 for (char* i = temp; *i; i += 2)words+;/计算姓名的字数 switch (words) case 2:temp0 = '*', temp1 = '*'/当姓名字数为 2 时,掩盖姓 strcpy(temp + 1, temp + 2);/消除一个*号 break; case 3:temp2 = '*', temp3 = '*'/当姓名字数为 3 时,掩盖名字中的第一个字 strcpy(temp + 3, temp + 4);/消除一个*号 break; default:temp0 = '*', temp1 = '*', temp2 = '*', temp3 = '*'/姓名字数大于 3 时,掩盖姓 和名字中的第一个字 strcpy(temp + 2, temp + 4);/消除两个*号 return temp; /*释放链表空间*/void FreeData() Account* t; while (head) t = head; head = head->next; free(t);

    注意事项

    本文(C语言如何模拟ATM机的资料.doc)为本站会员(一***)主动上传,得力文库 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知得力文库 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于得利文库 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

    © 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

    黑龙江省互联网违法和不良信息举报
    举报电话:0468-3380021 邮箱:hgswwxb@163.com  

    收起
    展开