<1>c语言实现ATM存取款系统(数组)
2012-10-03 19:00
525 查看
这个代码是用数组实现的,整个代码看上去很清晰,思路很清楚,便于对ATM有一个整体的了解,但代码有一个致命的问题,就是会发生爆栈,也就是说程序中函数不断地调用函数,事实上没有一个函数执行完,这样的话,多进行几项业务,栈就会充满,最后爆栈,程序自动退出。
#include<stdio.h> #include<String.h> #include<math.h> #include<stdlib.h> #include<windows.h> #define N 100 struct info { char account[30]; char user[100]; long dsit; long pw; }bank ;/* = { {"2011021232", "ouyan", 10000, 892968} };*/ void login(); void regist(); int menu(); int refer(); int deposit(); int withdraw(); int transfer(); int resetPW(); int judgePW(long ps); /*flagI标记当前登录账户,flagN标记当前转账的账户*/ int flagI, flagN; int n = 0; main() { int choice = -1; while(1) { printf(" 欢迎使用银行存取款系统 \n"); printf("\n ================================ \n"); printf(" 1.登录 \n"); printf(" 2.注册 \n"); printf(" 3.退出 \n"); printf("\n ================================ \n"); printf("\t* 请输入您的选择:"); scanf("%d", &choice); switch(choice) { case 1: system("cls"); login(); break; case 2: system("cls"); regist(); break; case 3: exit(0); break; default: printf("输入有误,请重输...\n"); break; } } } ////////////////////////////////////登录/////////////////////////////////////////// void login() { int i; int flag = 0; char my_act[100]; long password; int X = -1; printf("\t\t=================****登录****=================\n\n"); printf("\t\t* 输入账户: "); scanf("%s", my_act); printf("\n"); printf("\t\t* 输入密码: "); scanf("%ld", &password); for(i=0; i<N; i++) { if(strcmp(my_act, bank[i].account) == 0 && password == bank[i].pw) { flagI = i; flag = 1; printf("\t\t登录成功,正在跳转页面...\n"); Sleep(2000); system("cls"); while(1) { X = menu();//成功进入 if(X == 1) { system("cls"); menu(); } else return; } } else { printf("\t\t账号或密码错误,请重新输入...\n"); Sleep(2000); system("cls"); return; } } } ///////////////////////////////////注册//////////////////////////////////////////// void regist() { int i; printf("\t\t=================****注册****=================\n\n"); printf("\t\t请输入您的账户....\n"); printf("\t\t"); scanf("%s", bank .account); printf("\t\t请输入用户名......\n"); printf("\t\t"); scanf("%s", bank .user); printf("\t\t输入您的密码......\n"); printf("\t\t"); scanf("%ld", &bank .pw); for(i=0; i<N && i != n; i++) { if(strcmp(bank .account, bank[i].account) == 0) { printf("\t\t账户已存在,请重新注册......\n"); n -= 1; Sleep(2000); system("cls"); return; } } printf("\t\t注册成功\n"); bank .dsit = 0; n ++; Sleep(2000); system("cls"); return; } ////////////////////////////////主页面//////////////////////////////////////////////// int menu() { printf("\t\t=================****主页面****=================\n\n"); printf("\t\t====================****************=================\n\n"); printf("\t\t* 1. 查询 \n"); printf("\t\t* 2. 存钱 \n"); printf("\t\t* 3. 取钱 \n"); printf("\t\t* 4. 转账 \n"); printf("\t\t* 5. 修改密码 \n"); printf("\t\t* 6. 安全退出 \n"); printf("\t\t=====================================================\n\n"); int choice = -1; int Y = -1; printf("\t\t *"); printf("我的选择:"); scanf("%d", &choice); while(1) { switch(choice) { case 1: system("cls"); Y = refer(); break; case 2: system("cls"); Y = deposit(); break; case 3: system("cls"); Y = withdraw(); break; case 4: system("cls"); Y = transfer(); break; case 5: system("cls"); Y = resetPW(); break; case 6: system("cls"); return 0; default: printf("输入有误,请重输...\n"); return 1; } switch(Y) { case 0: printf("出现错误!\n"); return 0; break; case 1: /*正常情况menu返回1重新进入menu*/ return 1; break; case 2: Y = deposit(); break; case 3: Y = withdraw(); break; case 4: Y = transfer(); break; case 5: Y = resetPW(); break; } } } /////////////////////////////////////查询/////////////////////////////////////////// int refer() { printf("\t\t=================****查询****=================\n\n"); printf("\t\t* 您的账户余额为:\n"); printf("\t\t* %ld\n", bank[flagI].dsit); Sleep(3000); system("cls"); return 1; } /////////////////////////////////////取款/////////////////////////////////////////// int deposit() { long rMoney; printf("\t\t=================****存款****=================\n\n"); printf("\t\t* 输入您要存入的钱数(整百):\n\n"); printf("\t\t* "); scanf("%ld", &rMoney); if(rMoney%100 != 0) { printf("\t\t* 出现错误,请重试...\n\n"); return 2; } bank[flagI].dsit += rMoney; printf("\t\t* 存钱成功...\n\n"); Sleep(2000); system("cls"); return 1; } ///////////////////////////////////取款/////////////////////////////////////////// int withdraw() { long omoney; printf("\t\t=================****取款****=================\n\n"); printf("\t\t* 输入您要取出的钱数...\n\n"); printf("\t\t* "); scanf("%ld", &omoney); if(omoney%100 != 0) { printf("\t\t* 出现错误...\n\n"); Sleep(2000); system("cls"); return 3; } if(omoney > bank[flagI].dsit) { printf("\t\t* 余额不足...\n\n"); system("cls"); return 1; } bank[flagI].dsit -= omoney; printf("\t\t* 取钱成功...\n\n"); Sleep(2000); system("cls"); return 1; } //////////////////////////////////转账///////////////////////////////////////////// int transfer() { char ob[20]; int key, i; long k; printf("\t\t=================****转账****=================\n\n"); printf("\t\t* 请输入您要转账的账户...\n"); printf("\t\t* "); scanf("%s", ob); for(i=0; i<N; i++) { if(i == flagI) continue; if(strcmp(ob, bank[i].account) == 0) { flagN = i; printf("\t\t* 输入要转出的钱数(整百):\n"); printf("\t\t* "); scanf("%ld", &k); if(k%100 != 0) { printf("\t\t *"); printf("\t\t出现错误,请重试...\n"); Sleep(2000); system("cls"); return 1; } if(k > bank[flagI].dsit) { printf("\t\t* 余额不足.....\n"); return 4; } bank[flagI].dsit -= k; bank[flagN].dsit += k; Sleep(2000); printf("\t\t* 转账成功..."); Sleep(2000); system("cls"); return 1; } } printf("\t\t* 对不起,您输入的账户不存在...\n"); printf("*****************请稍等*********************"); Sleep(2000); system("cls"); return 1; } //////////////////////////////////修改密码//////////////////////////////////////////// int resetPW() { long password1, password2; long newpassword; printf("\t\t=================****修改密码****=================\n\n"); printf("\t\t* 请输入原始密码...\n\n"); printf("\t\t* "); scanf("%ld", &password1); printf("\t\t* 请再次输入...\n\n"); printf("\t\t* "); scanf("%ld", &password2); if(bank[flagI].pw == password1 && bank[flagI].pw == password2) { printf("\t\t* 输入新密码...\n\n"); printf("\t\t* "); scanf("%ld", &newpassword); if(judgePW(newpassword) == 1) { bank[flagI].pw = newpassword; printf("\t\t* 密码重置成功...\n\n"); Sleep(2000); system("cls"); return 1; } else { printf("\t\t* 输入的密码不符合规则,请重试...\n"); Sleep(2000); system("cls"); return 5; } } else { printf("\t\t* 密码错误...\n"); Sleep(2000); system("cls"); return 1; } return 1; } //////////////////////////////////////密码判断//////////////////////////////////////// int judgePW(long ps) { int n, k; for(k=0; k<6; k++) { n = ps%10; ps = ps/10; if(n < 0 || n > 9) { return 2; } } return 1; }
相关文章推荐
- <3>c语言实现ATM存取款系统(数组实现)
- <5>c语言实现ATM存取款系统(文件、排序)
- <4>c语言实现ATM存取款系统(链表)
- <C语言>使用一个二维数组实现学生姓名管理系统,要求不能使用链表
- <DataStructure_1>用栈实现四则运算(c语言)
- <google面试题>实现两个N*N矩阵的乘法,矩阵由一维数组表示
- C语言数组实现学生信息管理系统设计
- <C语言>如何一步一步根据简单的代码联想到更多的功能?(实现输入一个整数,输出比它小包括它本身的所有素数。)
- <<C语言接口与实现>> 第五章 内存管理
- <ios>调用系统的短信和发送邮件功能,实现短信分享邮件分享
- <QT实现音乐播放器1> QMediaPlayer音乐文件导入
- < < PXE实现Linux系统无人值守批量安装 > >
- 用C语言关于学生管理系统的几种实现方法(一位数组,二维数组,指针,结构体)
- ATM系统实现[11]——取款窗口[00原创]
- C语言实现 ATM机存取款系统
- <<Linux内核设计与实现>>读书笔际(五)-系统调用
- <模拟飞机票订票和退票系统>的c++实现
- <二叉树 前中后 层序 非递归遍历 c语言实现>
- <剑指offer 面试题6-1>单项链表的实现 Java实现
- <详解>C语言实现程序跳转到绝对地址0x100000处执行