ATM取款机模拟系统程序
设计报告完成版
Revised by Liu Jing on January 12, 2021
目录
三、编程题部分(银行ATM模拟存取系统)
1、设计内容…………………………………………第2页 2、设计……………………………………………… 第2页 (1)数据分析………………………………………… 第2页 (2)程序流程分析…………………………………… 第3页 3、编码及调试……………………………………… 第13页 4、程序运行截图…………………………………… 第32页 四、总结与体会……………………………………… 第37页 五、参考文献………………………………………… 第39页 三、编程题部分
1、设计内容
完成一个管理类的综合型设计:银行ATM模拟存取系统。要求学生进行数据结构的设计、对函数进行模块化结构化设计、并灵活运用数组、结构体、指针、文件等多种数据类型设计开发系统。通过写程序,学生应掌握用计算机程序设计语言解决实际问题的方法、步骤。该系统应该具有以下功能: 1)账户管理功能
a) 开户:完成账户注册的功能。即输入账户的相关信息。要求账户号长度12位,密码长度不得低于6位,必须使用暗码,账户信息保存到数组中,账户信息最后保存到相关文件中;
b) 账户登录:输入账户、密码,验证是否能够登录该系统; c)密码修改:输入两次相同的密码方可修改。 2)账务管理功能
a) 存款:每笔存款金额大于0元小于等于1000元,以50元为基本单位。需记录交易日期和时间。
b) 取款:每笔取款金额大于等于100元小于等于2000元,以50元为基本单位。需记录交易日期和时间。
c) 转账:每笔转账金额大于等于100元小于等于5000元。需记录交易日期和时间。 3)查询功能 a) 存款记录查询 b) 取款记录查询 c) 转账记录查询 d) 余额查询
4)文件功能及其它功能:数据都应保存在相关文件中。 2、设计
(1) 数据分析(描述定义的各主要变量的作用及意义);
char zhanghao[16];/*用户账号*/ char xingming[9];/*用户姓名*/ char mima[7];/*账户密码*/
char shengfenzheng[19];/*用户身份证号*/ float yue;/*账户余额*/
char kaihushijian[50];/*开户时间*/
char zhanghao[16];/*交易的账号*/
char jiaoyishijian[50];/*交易时间*/ char leixing[5];/*交易类型*/ float jiaoyijine;/*交易金额*/
float jiaoyiyue;/*交易后的余额*/
char duifangzhanghao[12];/*交易时的对方账号*/
int
zhanghuxuhao=0,jiaoyixuhao=0,dangqianxiabiao=0,duifangzhanghuxiabiao=0;/*账户序号,交易序号,当前登录的账户下标,转账时对方的账户下标*/ 注册函数:
int baiwei,shiwei,gewei,len;/*定义账号的后三位*/
char mima2[7];/*注册时第二次输入的密码*/ 登录函数:
char zhanghao[16],mima[7];/*登录时输入的账号和密码*/ 装载和保存文件函数: FILE *fp;/*定义文件指针*/
char wenjianming[13];/*定义输入的文件名*/
存、取款,转账函数:
float jine;/*输入的存、取款,转账金额*/
char t[30];/*把取得的存、取款,转账时间赋给该数组*/ 转账函数:
char duifangzhanghao[16],c;/*输入的对方账号赋给该数组。在判断是否继续时,把输入的字符Y或N赋给c,以便读入选择*/ 修改密码函数:
char mima[7],xinmima1[7],xinmima2[7];/*旧密码,第一次输入的新密码,第二次输入的新密码*/
(2)程序流程分析(描述主程序的基本构成、函数设计、函数的调用关系、各部分的流程图等。) 主程序的基本构成:: struct Zhanghu {};/*账户的结构体*/ typedef struct
{}Jiaoyi;/*交易记录的结构体*/ int menu(); /*主菜单函数*/
void zhuce(); /*主菜单功能函数—注册函数*/ void denglu(); /*主菜单功能函数登录函数*/ void zhuangzai(); /*主菜单功能函数装载数据函数*/ void baocun(); /*主菜单功能函数保存数据函数*/ int denglu_menu(); /*登录菜单函数*/
void cunkuan(); /*登录菜单功能函数—存款函数*/ void qukuan(); /*登录菜单功能函数—取款函数*/ void zhuanzhang(); /*登录菜单功能函数—转账函数*/ void chaxun(); /*登录菜单功能函数—查询函数*/ void xiugaimima(); /*登录菜单功能函数—修改密码函数*/ int chaxun_menu(); /*查询菜单函数*/
void chaxun_yue(); /*查询菜单功能函数—查询余额函数*/
void chaxun_mingxi(); /*查询菜单功能函数—查询明细函数*/ void chaxun_cunkuan(); /*查询菜单功能函数—查询存款函数*/ void chaxun_qukuan(); /*查询菜单功能函数—查询取款函数*/ void chaxun_zhuanzhang();/*查询菜单功能函数—查询转账函数*/ 函数设计:
本程序在函数设计上采用结构化程序设计方法,自顶向下,逐步根据功能设计函数,逐步细化设计,由浅入深,模块化设计,保证了程序的可读性和质量。先设计主菜单(一级菜单)的功能函数,再设计二级菜单的功能函数,自顶而下,逐步细化。如图示意:
(顶层设计) 注
主菜单功能 登录存款取款转账查询装载怎样保存怎样(第二层
设计) 二级菜单
册怎样注(第三层设计) 函数调用关系:
mai strczhucstrlstrcstrccunkudengqukuazhuangzhdenglu_menchaxun_yue strcpchaxun_menu strcm
chaxuxiugaimima fopen fscanf fgets chaxun_mingxi chaxun_cunkuan chaxun_qukuan chaxun_zhuanzhang zhuangfopen fclose fprint baocufclose menu 注册函数的流程图:
开始 定义数据变量,调用时间函数,设置账号的随输入姓名 输入两次密两次密码相 N Y
输入身份证 Y 号位数既不为 N
输入存款金输出账户和第一结束 登录函数的流程图: 开始 定义个变量,i=0
输入账 N i 输入的账号和i++ 输入密 N 密码错密码输 Y 进入登陆界面 N 执行switch功能 Y N 输入选项数数字为0 return根据选项执行语 Y 退出 修改密码函数的流程图: 输入账输入旧密 N 密码正return; Y 输入两次新 N N 次数为3 两次密码 Y Y return; 密码修改成功 结束 存款函数的流程图: 开始结束 system(\ 返回 输入存款金额jine Y jineP!=0||jine<=0jineP!=0||jine< return调用时间函数 ; N调用strcpy函数复制账号、类型、时间。计算余 存款成功 输出存款的交易记录 取款函数的流程图: 结束开始 返回 system(\ 输入取款金额jine Y 取款金额大于账户余额 N YjineP!= 输出提示, retur调用时间函数 return; 调用strcpy函数复制账号、类型、时间。计算输出存款的交易记录 转账函数的流程图: 开始 输入对方账 Y 是否与当前return; N N return; i Y i=zhanghuxu输入的账号与 N 输出对方账号的i++; N 是否继return; Y Y 输入转账金额jine大于账户return; N jine<=Y N 显示警告信息 Nreturn; 是否继 Y 执行转账语装载函数的流程图: 开始 输出转账交易记 输入要读入结束 Y找不到该 N 返回 N Ni Y从文件中读入账户的 i++ 从文件中读入交易记录 i++ 关闭文保存函数的流程图: 结束 开始 输入要保存 Y 新建该文 N 返回 N i i i++ 把交易记录的数据信息i++ 关闭文结束 3、编码及调试 #include char zhanghao[16];/*用户账号*/ }; char xingming[9];/*用户姓名*/ char mima[7];/*账户密码*/ char shengfenzheng[19];/*用户身份证号*/ float yue;/*账户余额*/ char kaihushijian[50];/*开户时间*/ typedef struct /*交易记录的结构体*/ { char zhanghao[16];/*交易的账号*/ char jiaoyishijian[50];/*交易时间*/ char leixing[5];/*交易类型*/ float jiaoyijine;/*交易金额*/ float jiaoyiyue;/*交易后的余额*/ char duifangzhanghao[12];/*交易时的对方账号*/ } Jiaoyi; struct Zhanghu zhanghu[100];/*定义账户的结构体数组,可以注册100个账户*/ int zhanghuxuhao=0,jiaoyixuhao=0,dangqianxiabiao=0,duifangzhanghuxiabiao=0;/*账户序号,交易序号,当前登录的账户下标,转账时对方的账户下标*/ Jiaoyi jiaoyi[1000];/*定义交易记录的结构体数组,可以保存1000条交易记录*/ int menu(); /*声明 主菜单 函数*/ void zhuce(); /*声明 注册 函数*/ void denglu(); /*声明 登录 函数*/ void zhuangzai(); /*声明 装载数据 函数*/ void baocun(); /*声明 保存数据 函数*/ int denglu_menu(); /*声明 登录菜单 函数*/ void cunkuan(); /*声明 存款 函数*/ void qukuan(); /*声明 取款 函数*/ void zhuanzhang(); /*声明 转账 函数*/ void chaxun(); /*声明 查询 函数*/ void xiugaimima(); /*声明 修改密码 函数*/ int chaxun_menu(); /*声明 查询菜单 函数*/ void chaxun_yue(); /*声明 查询余额 函数*/ void chaxun_mingxi(); /*声明 查询明细 函数*/ void chaxun_cunkuan(); /*声明 查询存款 函数*/ void chaxun_qukuan(); /*声明 查询取款 函数*/ void chaxun_zhuanzhang();/*声明 查询转账 函数*/ void main()/*主函数*/ { system(\设置运行界面的背景颜色为蓝色*/ printf(\欢迎使用ATM终端 机!\\n\\n\\n\\t\\t\\t\ system(\暂停功能*/ { switch(menu()) /*主菜单选择判断*/ { case 1:zhuce();/*调用注册函数*/ printf(\ system(\清屏*/ for(;;)/*空循环语句*/ break; case 2:denglu();/*调用登录函数*/ printf(\ break; case 3:zhuangzai();/*调用装载数据的函数*/ printf(\ break; case 4:baocun();/*调用保存数据的函数*/ printf(\ break; case 0: printf(\欢迎使用ATM终端机管理系统。谢谢!\\n\结束程序*/ printf(\ system(\ exit(0); } } } int menu() /*定义主菜单函数*/ { char c; do { system(\每次选择运行前清屏*/ printf(\ -----------\\n\ printf(\终端机管理系统主菜单********\\n\主菜单选择*/ printf(\ ---\\n\ printf(\注册|\\n\ printf(\登录|\\n\ printf(\装载数据|\\n\ printf(\保存数据 |\\n\ printf(\退出 |\\n\ printf(\\\n\ printf(\ printf(\ ---\\n\ printf(\请作出选择(0-4):\ c=getchar(); /*读入选择*/ }while(c<'0'||c>'4'); return(c-'0'); /*c变为空后返回重新选择*/ } /***************定义主菜单里的各功能函数函数**********************/ void zhuce() /*定义注册函数*/ { int baiwei,shiwei,gewei,len;/*定义账号的后三位*/ char mima2[7];/*注册时第二次输入的密码*/ char t[30];/*开户时间*/ int i,j=0; time_t rawtime; struct tm *timeinfo; time(&rawtime);/*调用时间函数,取得开户时间*/ timeinfo=localtime(&rawtime); strcpy(t,asctime(timeinfo)); for(i=0;i if(t[i]=='\\n') { } t[i]='\\0'; break; baiwei=zhanghuxuhao/100; shiwei=zhanghuxuhao/10; gewei=zhanghuxuhao; zhanghu[zhanghuxuhao].zhanghao[12]=baiwei+'0'; zhanghu[zhanghuxuhao].zhanghao[13]=shiwei+'0'; zhanghu[zhanghuxuhao].zhanghao[14]=gewei+'0'; zhanghu[zhanghuxuhao].zhanghao[15]='\\0'; system(\运行前清屏*/ printf(\注册功能————ZHUCE GONGNENG\\n\\n\\n\ printf(\请输入姓名:\ fflush(stdin);/*消耗输入字符后的回车操作*/ scanf(\ do { printf(\请输入6位数密码:\ fflush(stdin); scanf(\ len=strlen(zhanghu[zhanghuxuhao].mima); if(len!=6)/*判断密码是否为6位*/ { printf(\您的密码不是6位数!\ system(\ return; } //此处用字符串长度函数来判断密码的位数 printf(\请再次输入密码:\ fflush(stdin); scanf(\ if(strcmp(zhanghu[zhanghuxuhao].mima,mima2)!=0)/*判 断两次密码输入是否相同*/ { j++; printf(\您的密码输入错误!您还有%d次机会输 入密码!\\n\ } } while (strcmp(zhanghu[zhanghuxuhao].mima,mima2)!=0); if(j==3)/*密码输入错误不得超过三次*/ { } system(\ return; do { printf(\请输入身份证号:\ fflush(stdin); scanf(\ len=strlen(zhanghu[zhanghuxuhao].shengfenzheng); if(len!=18&&len!=15)/*判断身份证号位数是否为15位或 18 位*/ printf(\身份证号错误!请输入15位或18位身份证 号!\\n\ }while(len!=18&&len!=15); printf(\请输入存入金额:\ fflush(stdin); scanf(\ if((int)zhanghu[zhanghuxuhao].yueP!=0)/*存款金额必须为50的整数倍*/ { } 间*/ strcpy(jiaoyi[jiaoyixuhao].zhanghao,zhanghu[zhanghuxuhao].zhanghao);/**/ */ jiaoyi[jiaoyixuhao].jiaoyijine=zhanghu[zhanghuxuhao].yue;/strcpy(jiaoyi[jiaoyixuhao].leixing,\存\复制交易类型*/ strcpy(jiaoyi[jiaoyixuhao].jiaoyishijian,t);/*复制交易时间strcpy(zhanghu[zhanghuxuhao].kaihushijian,t);/*复制开户时 printf(\本终端机只接受50元或100元面值的存款!\ system(\ return; *第一次交易的账户余额值赋给交易经额的值*/ jiaoyi[jiaoyixuhao].jiaoyiyue=zhanghu[dangqianxiabiao].yue;/*第一次交易的账户余额值赋给交易余额的值*/ printf(\开户成功!\\t\ system(\暂停功能*/ //输出账户第一次交易的数据清单 printf(\账号\\t\\t交易类型\\t交易金额\\t余额\\t\\t交易时 间\\n\ printf(\ printf(\ printf(\ printf(\ printf(\ zhanghuxuhao++;/*账户序号加一*/ jiaoyixuhao++;/*交易序号加一*/ printf(\ system(\暂停*/ } void denglu() /******定义登录函数*******/ { char zhanghao[16],mima[7];/*登录时输入的账号和密码*/ int i=0,j=0; system(\清屏*/ printf(\登录功能————DENGLU GONGNENG\\n\\n\\n\进入登录得功能界面*/ 号*/ printf(\输入账号:\ scanf(\输入账号*/ for( i=0;i if(strcmp(zhanghao,zhanghu[i].zhanghao)==0) { dangqianxiabiao=i;/*若找到,则跳出循环*/ break; } if(i==zhanghuxuhao)/*注册的账号中没输入的账号*/ do { { } printf(\当前账号不存在!\ system(\ return; printf(\输入密码:\ scanf(\ if(strcmp(mima,zhanghu[i].mima)!=0) { j++; printf(\您的密码输入错误!您还有%d次机会输 入密码!\\n\\n\ } if(j==3)/*密码输入错误不得超过三次*/ { system(\ } return; }while(strcmp(mima,zhanghu[i].mima)!=0); { switch(denglu_menu()) /***登陆界面选择判断***/ { case 1:cunkuan();/*调用存款函数*/ printf(\ for(;;)/*空循环语句*/ break; case 2:qukuan();/*调用取款函数*/ printf(\ break; case 3:zhuanzhang();/*调用转账函数*/ printf(\ break; case 4:chaxun();/*调用查询函数*/ printf(\ break; case 5:xiugaimima();/*调用修改密码函数*/ printf(\ break; case 0: return;/*返回上一级菜单界面*/ } } int denglu_menu()/**********************定义登录菜单函数**************************/ { char c; } do { system(\每次选择运行前清屏*/ printf(\欢迎进入 登录界面!*********\\n\\n\登录界面菜单选择*/ printf(\存款|\\n\ printf(\取款|\\n\ printf(\转账|\\n\ printf(\查询 |\\n\ printf(\修改密码 |\\n\ printf(\返回 |\\n\ printf(\ printf(\请作出选择(0-5):\ c=getchar(); /*读入选择*/ }while(c<'0'||c>'5'); return(c-'0'); /*c变为空后返回重新选择*/ } void zhuangzai() /*定义装载函数*/ { FILE *fp;/*定义文件指针*/ */ { printf(\无法打开该文件!\ int i; char wenjianming[13];/*定义输入的文件名*/ printf(\请输入打开的文件名(文件名.txt):\ fflush(stdin); scanf(\输入要读入数据的文件名*/ if ((fp=fopen(wenjianming,\找不到输入的文件名 \\n\ */ } system(\ return; fscanf(fp,\ fscanf(fp,\账号\\t\\t姓名\\t密码\\t身份证号\\t余额\\t开户时间 for(i=0;i { } fscanf(fp,\ fscanf(fp,\账号\\t\\t交易时间\\t\\t\\t交易类型 交易金额 交易 fscanf(fp,\ zhanghu[i].xingming,zhanghu[i].mima, zhanghu[i].shengfenzheng,&zhanghu[i].yue); fgets(zhanghu[i].kaihushijian,30,fp); fscanf(fp,\ 余额\\t对方账号\\n\ for(i=0;i fscanf(fp,\ fgets(jiaoyi[i].jiaoyishijian,30,fp); } fscanf(fp,\ &jiaoyi[i].jiaoyijine,&jiaoyi[i].jiaoyiyue); fgets(jiaoyi[i].duifangzhanghao,16,fp); fscanf(fp,\ fclose(fp);/*关闭文件*/ printf(\读入成功!\\n\\n\ printf(\ system(\ } void baocun() /***定义保存函数***/ { FILE *fp;/*文件指针*/ int i; char wenjianming[13]; printf(\请输入文件名(输入格式为:文件名.txt):\ fflush(stdin); scanf(\输入要保存的文件名*/ if((fp=fopen(wenjianming,\ { printf(\无法打开文件!\\n\\t\\t\\t\ system(\ } return; fprintf(fp,\ fprintf(fp,\账号\\t\\t姓名 \\t密码\\t身份证号\\t\\t\\t余额 \\t\\t\\t开户时间\\n\ */ fprintf(fp,\for(i=0;i 30s\\n\ zhanghu[i].shengfenzheng,zhanghu[i].yue,zhanghu[i].kaihush zhanghu[i].xingming,zhanghu[i].mima, ijian); fprintf(fp,\ fprintf(fp,\账号\\t\\t交易时间\\t\\t\\t交易类型\\t交易金额\\t交 易余额\\t\\t对方账号\\n\ for(i=0;i 文件*/ fprintf(fp,\ 16s\\n\ jiaoyi[i].jiaoyishijian, jiaoyi[i].leixing, jiaoyi[i].jiaoyijine,jiaoyi[i].jiaoyiyue,jiaoyi[i].duifangzhanghao); } void cunkuan() /*************************定义存款函数***********************/ { float jine;/*输入的存款金额*/ char t[30];/*把取得的存款时间赋给该数组*/ int i; time_t rawtime; struct tm *timeinfo; system(\清屏*/ fclose(fp);/*关闭文件*/ printf(\保存成功!\\n\ printf(\ system(\ printf(\存款功能————CUNKUAN GONGNENG\\n\\n\\n\进入存款功能界面*/ printf(\本终端机只接收50元或100元币值人民币! \\n\\n\\t\\t\\t请输入存款金额:\提示信息*/ scanf(\输入存款金额*/ if((int)jineP!=0||jine<=0)/*存款金额必须为50的整数倍且 为正数*/ { printf(\请输入面值为50或100的存款金额!请勿输 入负数或0!\\n\\t\\t\\t\ system(\ } else/*调用时间函数,把取得的存款时间赋给t数组*/ { return; time(&rawtime); timeinfo=localtime(&rawtime); strcpy(t,asctime(timeinfo)); for(i=0;i t[i]='\\0'; break; } strcpy(jiaoyi[jiaoyixuhao].zhanghao,zhanghu[dangqianxiabiao].zhanghao);/*把当前登录账号复制给交易记录里的账号*/ */ jiaoyi[jiaoyixuhao].jiaoyijine=jine;/*把存款金额赋给交易金额*/ zhanghu[dangqianxiabiao].yue+=jiaoyi[jiaoyixuhao].jiaoyijine;/*计算存款后的账户余额*/ jiaoyi[jiaoyixuhao].jiaoyiyue=zhanghu[dangqianxiabiao].yuestrcpy(jiaoyi[jiaoyixuhao].leixing,\存\复制交易类型*/ strcpy(jiaoyi[jiaoyixuhao].jiaoyishijian,t);/*复制交易时间 ;/*交易后的余额等于账户余额*/ printf(\存款成功!\\t\\t\ system(\ printf(\账号\\t\\t交易类型\\t交易金额\\t交易余额\\t\\t交易时间\\n\输出账户存款交易的数据清单 printf(\ printf(\ printf(\ printf(\ printf(\ jiaoyixuhao++;/*交易序号加一*/ printf(\ system(\ } void qukuan() /***********************定义取款函数**************************/ { float jine;/*定义取款金额*/ char t[30];/*把取得的取款时间赋给该数组*/ int i; time_t rawtime; struct tm *timeinfo; system(\清屏*/ printf(\取款功能————QUKUAN GONGNENG\\n\\n\\n\进入取款功能界面*/ printf(\本终端机只可取50或100元币值人民币! \\n\\n\\t\\t\\t请输入取款金额:\ scanf(\ /*输入取款金额*/ if(jine> zhanghu[dangqianxiabiao].yue)/*账户余额是否 足够取款*/ { printf(\您的余额不足!\ } system(\ return; if((int)jineP!=0||jine<=0)/*取款金额必须为50的整数倍且 为正数*/ { printf(\请输入面值为50或100的存款金额!请勿输 入负数或0!\\n\\t\\t\\t\ system(\ } else/*调用时间函数,把取得的交易时间赋给t数组*/ { return; time(&rawtime); timeinfo=localtime(&rawtime); strcpy(t,asctime(timeinfo)); for(i=0;i t[i]='\\0'; break; } strcpy(jiaoyi[jiaoyixuhao].zhanghao,zhanghu[dangqianxiabiao].zhanghao);/*把当前登录账号复制给交易记录里的账号*/ */ jiaoyi[jiaoyixuhao].jiaoyijine=jine;/*取款金额值赋给交易金额*/ zhanghu[dangqianxiabiao].yue-=jiaoyi[jiaoyixuhao].jiaoyijine;/*计算取款后的账户余额*/ jiaoyi[jiaoyixuhao].jiaoyiyue=zhanghu[dangqianxiabiao].yuestrcpy(jiaoyi[jiaoyixuhao].leixing,\取\复制交易类型*/ strcpy(jiaoyi[jiaoyixuhao].jiaoyishijian,t);/*复制交易时间 ;/*取款后余额等于账户余额*/ printf(\取款成功!\\t\\t\ system(\ printf(\账号\\t\\t交易类型\\t交易金额\\t交易余额\\t\\t交易 时间\\n\输出账户和交易的数据清单 printf(\ printf(\ printf(\ printf(\ printf(\ jiaoyixuhao++;/*交易序号加一*/ } void zhuanzhang() /******************************定义转账函数********************************/ { char t[30];/*时间数组*/ int i; time_t rawtime; struct tm *timeinfo; float jine;/*转账金额*/ printf(\ system(\ char duifangzhanghao[16],c;/*输入的对方账号赋给该数组。在判断是否继续时,把输入的字符Y或N赋给c,以便读入选择*/ system(\清屏*/ printf(\转账功能————ZHUANZHANG GONGNENG\\n\\n\\n\进入转账功能界面*/ if(strcmp(zhanghu[dangqianxiabiao].zhanghao,duifangzhanghao)==0)/*判断输入的账号是否与当前用户的账号相同*/ printf(\请输入对方账号:\ scanf(\输入对方账号*/ { printf(\对不起!用户不能给自己转账!\\t\ system(\ return; } for( i=0;i if(strcmp(duifangzhanghao,zhanghu[i].zhanghao)==0)/*在 已注册账号里依次寻找对方账号*/ { duifangzhanghuxiabiao=i;/*若找到,跳出该循环语句*/ break; } if(i==zhanghuxuhao)/*若在已注册账号里没找到输入的对方账 号,返回*/ { } else/*调用时间函数,把取得的转账交易时间赋给t数组*/ { printf(\当前账号不存在!\\t\ system(\ return; time(&rawtime); timeinfo=localtime(&rawtime); strcpy(t,asctime(timeinfo)); for(i=0;i t[i]='\\0'; break; } printf(\对方姓名: *%s\只显示出对方用户的名,不显示出姓*/ printf(\是否继续(Y/N): \ fflush(stdin); scanf(\读入选择*/ if(c!='y'&&c!='Y') { printf(\退出转账功能!欢迎使用其它功能!\\t\ system(\ } else return; do { printf(\请输入转账金额:\ scanf(\ if(jine<=0)/*转账金额不得为非正数*/ { printf(\请不要输入负数或0!\ system(\ } if(jine>zhanghu[dangqianxiabiao].yue)/*转账金额在账户 余额范围内*/ { printf(\对不起!您的余额不足,请在余额范围内进行转账。\\n\\t\\t\ system(\ return; } }while(jine<=0); printf(\请用户谨慎考虑,以防受骗!\提示谨慎信息*/ printf(\是否确定转账(Y/N): \ fflush(stdin); scanf(\读入选择*/ if(c!='y'&&c!='Y') { printf(\退出转账功能!欢迎使用其它功能!\ system(\ strcpy(jiaoyi[jiaoyixuhao].zhanghao,zhanghu[dangqianxiabiao].zhanghao);/*把当前用户账号复制给此次交易记录的账号*/ */ strcpy(jiaoyi[jiaoyixuhao].duifangzhanghao,zhanghu[duifangstrcpy(jiaoyi[jiaoyixuhao].leixing,\转出\复制交易类型 } return; zhanghuxiabiao].zhanghao);/*复制交易的对方账号*/ */ jiaoyi[jiaoyixuhao].jiaoyijine=jine;/*复制交易金额*/ zhanghu[dangqianxiabiao].yue-=jiaoyi[jiaoyixuhao].jiaoyijine;/*计算转账后的账户余额*/ jiaoyi[jiaoyixuhao].jiaoyiyue=zhanghu[dangqianxiabiao].yue; strcpy(jiaoyi[jiaoyixuhao].jiaoyishijian,t);/*复制交易时间 jiaoyixuhao++; strcpy(jiaoyi[jiaoyixuhao].zhanghao,zhanghu[duifangzhanghu xiabiao].zhanghao);/*复制接受转帐金额的用户账号*/ strcpy(jiaoyi[jiaoyixuhao].leixing,\转入\ strcpy(jiaoyi[jiaoyixuhao].duifangzhanghao,zhanghu[dangqia nxiabiao].zhanghao);/*复制转账的用户账号*/ 间*/ jiaoyi[jiaoyixuhao].jiaoyijine=jine; zhanghu[duifangzhanghuxiabiao].yue+=jiaoyi[jiaoyixuhao].jiaoyijine;/*计算金额转入后的账户余额*/ jiaoyi[jiaoyixuhao].jiaoyiyue=zhanghu[duifangzhanghuxiabiastrcpy(jiaoyi[jiaoyixuhao].jiaoyishijian,t);/*复制转账的时 o].yue;/*账户余额值赋给交易后的余额值*/ jiaoyixuhao++; printf(\恭喜您!转账成功!\\t\\t\ system(\ printf(\账号\\t\\t交易类型\\t转出金额\\t余额\\t交易时间 \\n\输出账户和交易的数据清单 printf(\ printf(\ printf(\ printf(\ printf(\ printf(\对方账 号:%s\\n\输出对方用户的账号*/ } void xiugaimima() /****************************定义 修改密码 函数****************************/ { char mima[7],xinmima1[7],xinmima2[7]; int j=0; printf(\请输入原来的密码:\ scanf(\输入旧密码*/ printf(\ system(\ if(strcmp(mima,zhanghu[dangqianxiabiao].mima)!=0)/*判断旧密码正确与否*/ { printf(\您的密码输入错误!\ system(\ return; } do { printf(\请输入新密码:\ */ scanf(\ if(strcmp(xinmima1,xinmima2)!=0)/*判断输入的两次新密 scanf(\ printf(\请再一次输入新密码:\输入两次新密码 码是否相等*/ { j++; printf(\您的密码输入错误!您还有%d次机会 输入密码!\\n\ } if(j==3)/*新密码输入错误不得超过三次*/ { system(\ return; } }while(strcmp(xinmima1,xinmima2)!=0); strcpy(zhanghu[dangqianxiabiao].mima,xinmima1);/*拷贝新密 码到账户信息里*/ printf(\您的密码修改成功!\ system(\ } return; void chaxun() /***定义查询函数***/ { { switch(chaxun_menu()) /*查询界面选择判断*/ { case 1:chaxun_yue();/*调用查询余额函数*/ printf(\ for(;;)/*空循环语句*/ break; case 2:chaxun_mingxi(); /*调用查询明细函数*/ printf(\ break; case 3:chaxun_cunkuan(); /*调用查询存款函数*/ printf(\ break; case 4:chaxun_qukuan(); /*调用查询取款函数*/ printf(\ break; case 5:chaxun_zhuanzhang(); /*调用查询转账函数*/ printf(\ break; case 0: return; } } int chaxun_menu()/*定义查询菜单函数*/ { char c; } do { system(\每次选择运行前清屏*/ printf(\欢迎进入 查询界面!*********\\n\\n\查询界面菜单选择*/ printf(\查询余额|\\n\ printf(\查询明细|\\n\ printf(\查询存款|\\n\ printf(\查询取款|\\n\ printf(\查询转账|\\n\ printf(\返回|\\n\ printf(\ printf(\请作出选择(0-5):\ c=getchar(); /*读入选择*/ }while(c<'0'||c>'5'); return(c-'0'); /*c变为空后返回重新选择*/ } void chaxun_yue() /*定义查询余额函数*/ { printf(\这是查询余额功能\\n\\n\\t\\t\\t\ printf(\您的账户余额 为:%.2f\\n\\n\\t\\t\\t\输出账户余额*/ } void chaxun_mingxi() /*定义查询明细函数*/ { int i; system(\清屏*/ system(\ printf(\查询明细————CHAXUN MINGXI\\n\\n\\t\\t\\t\进入查询明细界面*/ printf(\您的账 号:%s\ printf(\交易类型 交易金额 交易余额\\t\\t交易时间\\t对 方账号\\n\输出账户和交易的数据清单 for(i=0;i if( strcmp(jiaoyi[i].zhanghao,zhanghu[dangqianxiabiao].zhanghao)==0) { printf(\ printf(\ printf(\ printf(\ } printf(\ printf(\ system(\ } void chaxun_cunkuan() /*定义查询存款函数*/ { int i; system(\ printf(\查询存款————CHAXUN CUNKUAN\\n\\n\\t\\t\\t\ printf(\您的账 号:%s\ printf(\交易类型\\t交易金额\\t交易余额\\t\\t交易时间 \\n\输出账户和交易的数据清单 for(i=0;i if( strcmp(jiaoyi[i].zhanghao,zhanghu[dangqianxiabiao].zhanghao)==0&&strcmp(jiaoyi[i].leixing,\存\ { printf(\ printf(\ } void chaxun_qukuan() /*定义查询取款函数*/ { int i; system(\ printf(\ printf(\ } printf(\ system(\ printf(\查询取款————CHAXUN QUKUAN\\n\\n\\t\\t\\t\ printf(\您的账 号:%s\ printf(\交易类型\\t交易金额\\t交易余额\\t\\t交易时间 \\n\输出账户和交易的数据清单 for(i=0;i if( strcmp(jiaoyi[i].zhanghao,zhanghu[dangqianxiabiao].zhanghao)==0&&strcmp(jiaoyi[i].leixing,\取\ { printf(\ printf(\ } void chaxun_zhuanzhang() /*定义查询转账函数*/ { int i; printf(\ printf(\ } printf(\ system(\ char leixing[5]; system(\ printf(\查询转账————CHAXUN ZHUANZHANG\\n\\n\\t\\t\\t\ printf(\您的账 号:%s\ printf(\交易类型 交易金额 交易余额\\t交易时间\\t对方 账号\\n\输出账户和交易的数据清单 for(i=0;i { strcpy(leixing,jiaoyi[i].leixing); leixing[2]='\\0';/*强制去除第二个字符的元素*/ if( strcmp(jiaoyi[i].zhanghao,zhanghu[dangqianxiabiao].zhanghao)==0&&strcmp(leixing,\转\判断为当前用户的转账记录*/ { printf(\ printf(\ printf(\ printf(\ } printf(\ } } printf(\ system(\ 4、程序运行截图 四、 总结与体会 思想“备战” 心情忐忑 暑假之前就在想,收假回来就要进行C语言程序设计课程设计,上个学期C语言学得那么……考试还可以,让我去做两周的程序设计还不崩溃。而且听说还要独立完成一个比较大的程序设计,一想到这心里就弄得心慌慌的。于是,考完试后,痛下决心,带C语言的课本回家,整个暑假啃这本书,还拿不下它吗! 整个暑假…… 事实是,书本“浏览”一遍后,就被我于心不忍的留在了房间的角落里。返校之前,找到C语言课本,擦掉上面的灰尘,发出感叹:“这书白带回来了,那两周该怎么过啊……” 无奈,回到学校,上课前一晚,简单的回顾了一下课本。第二天,怀着忐忑不安的心情,踏上了通往机房的“崎岖路途”。 课程设计第一天 上课第一天,心情总算舒缓下来。讲解了一个贪吃蛇游戏的程序,体验了20分钟的游戏过程,还好,能听得懂,没想象的那么难。可是,“好戏”总是在后头,暗暗跟自己说“加油吧!时间足够的!”,上课 比较认真的听了,课下的安排也挺松的,又随便看了下课本。好吧,青春总是要有挑战的,虽然这算不上什么挑战。一个星期只上三天课,时间足够自己安排。那就发挥“悬梁刺股”的奋斗精神,事实上,虽然还没到达这种地步,这两周过的确实挺辛苦的。早上一起床就打开电脑(当然不是玩电脑,很专注的编程),除了吃饭和上课几乎不离开宿舍。好几次,电脑还没崩溃,我就想崩溃了…… 课程设计第一周完——开始有一点点成就感 不得不说,老师们很尽职尽责,讲解的很详细。好几次,找了很多次都不知道错在哪里,一头雾水,经老师这么一点拨,豁然开朗。大一上学期学完C语言还懵懵懂懂的,现在才过了一周,连我都感到很惊讶,自己对C程序的编程思路变得比以前清晰了不少,编程能力也提高了不少。这一改变让我很欣喜,在编程上更有自信了。说实话,经过这一周,课程设计已经把我对C语言编程的胃口完全吊起来了,对编程的“恐惧”和乏味早就丢到 天边的哪一个角落里去啦。 课程设计第二周(上):充满自信的开始——收获 虽然说编程能力确实提高了不少,但也不是编程总是一帆风顺的。在宿舍里调试程序时,有时候总是编译出错,检查后又找不出错误,总是急的心烦意乱。实在编不下去了,走出宿舍,在校园里随便走走。回来后,心平气和,再看程序,多看几遍,就发现了错误。因此,编程的时候,心情愉悦也是很重要的,至少能少犯错,提高编程效率。另外,每当自己编程打结的时候,就和做同一个程序设计的同学互相讨论,总是能发现一些意外之处,能很好的完善程序。互相交流,都能受益。让我 认识到,编程真的是需要互相借鉴,互相学习,互相交流的一件事。在编程想法和编程思路上,自己想不到的别人想得到,或者别人想不到的自己有想到了。因此,跟同学多交流,多学习,也是提高自己编程能力的方法之一。 课程设计第二周(下)——成果 课程设计已经快要接近尾声了,程序功能也在完善中。无数次运行程序,测试ATM模拟系统程序的功能。看着调试后的程序无误的运行结果,心里很高兴。 无数次代码的翻滚让眼睛疲累,无数次的手指在键盘上快速的敲打,无数次的调试,终于能见成效。很感谢老师的帮助,没老师的指导帮助,确实是很困难的。 课程设计——尾声 两周的时间,在专注忙碌的调试程序中就要过去。两周的学习,两周的改变,两周的提高,在这两周所收获的,比一个学期都要多。两周,把C语言课本的十章都融会贯通。一个学期学完还比较迷茫的知识,现在已豁然开朗。当然,没一个学期的系统学习也是不行的,毕竟,两周的提高都是建立在对基础知识的了解和掌握上。奋斗了十多个日日夜夜,今天终于要交出自己的劳动成果了。感慨啊,虽然不希望常常这样辛苦,却不得不说,这十多个日日夜夜,真的很过瘾。 呐喊:青春,让我流汗,让我不要忘记奋斗的乐趣 短短的两周,不仅是编程能力的改变,还有认识上的提高。高考以后,好久没有体会这种在学习中奋斗的感觉了。高考已过,这两周也即 将结束,然而对于奋斗的历程确还只是开始,我希望不要让安逸的生活渐渐磨灭我奋斗的斗志,我渴望能在年纪尚未老去前多流汗,我渴望奋斗的乐趣不会随着岁月的流逝而流失,我渴望奋斗到身体衰老以致不能行走,只为一个念想…… 在调试程序中收获的编程小心得和小技巧: (1) 在VC++6.0中编译时,若用到for循环语句,不要在for语句 内定义i,不然肯定会编译出错; (2) 编完程序,要仔细检查圆括号和大括号有没有配对齐; (3) 一些有用的库函数:system(\每次运行前清屏*/ system(\暂停功能,可以让运行界面暂停,昂任 意键在继续 system(\设置运行界面的背景颜色,数字为字体颜色的代号,大写字母为背景颜色的代号*/ 另外,在调用system(\类函数时,要写预处理指令 #include fflush(stdin);/*放在scanf函数前,消耗输入字符后的回 车字符,起保险作用*/ exit(0);/*直接终止程序*/ 五、 参考文献 谭浩强着. C程序设计(第四版). 北京:清华大学出版社,2010 谭浩强着. C程序设计(第四版)学习辅导. 北京:清华大学出版社,2010 谭浩强着. C程序设计教程. 北京:清华大学出版社,2007 谭浩强着. C++程序设计. 北京:清华大学出版社,2011
ATM取款机模拟系统程序设计报告完成版



