这个代码是用数组实现的,整个代码看上去很清晰,思路很清楚,便于对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[N];/*
= {
{"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[n].account);
printf("\t\t请输入用户名......\n");
printf("\t\t");
scanf("%s", bank[n].user);
printf("\t\t输入您的密码......\n");
printf("\t\t");
scanf("%ld", &bank[n].pw);
for(i=0; i<N && i != n; i++) {
if(strcmp(bank[n].account, bank[i].account) == 0) {
printf("\t\t账户已存在,请重新注册......\n");
n -= 1;
Sleep(2000);
system("cls");
return;
}
}
printf("\t\t注册成功\n");
bank[n].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;
}