<1>c语言实现ATM存取款系统(数组)

这个代码是用数组实现的,整个代码看上去很清晰,思路很清楚,便于对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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值