栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言实现模拟ATM机管理系统

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言实现模拟ATM机管理系统

一段路大学学生专用银行

本行所提供的的服务包括以下几种:开户、显示、保存、登录、退出

登录成功后主要包括以下功能:存款、取款、查询余额、修改密码、转账、返回

一、基本量 1、定义常量和账户基本信息

本行账户信息主要包括:账号、姓名、性别、院系、专业、班级、卡号、开户行、开户时间、余额、状态、初始密码

//所用头文件
#include 
#include 
#include 
#include 
#include 

//定义常量
#define MAX_ID 10			//账号
#define MAX_NAME 20			//姓名
#define MAX_SEX 5			//性别
#define MAX_DEP 30			//院系
#define MAX_MAJOR 30		//专业
#define MAX_CLASS 30		//班级
#define MAX_CARD 30			//卡号
#define MAX_PASSWORD 10		//密码
#define MAX_BANK 30			//开户行

#define MAX_MONEY 20000		//最高取款(转账)限度

//账户信息
typedef struct ATM_ACCOUNT{
	char xh[MAX_ID],xm[MAX_NAME],xb[MAX_SEX],yx[MAX_DEP],zy[MAX_MAJOR],
		bj[MAX_CLASS],kh[MAX_CARD],mm[MAX_PASSWORD],khh[MAX_BANK];
	char zt;//银行卡状态
	long khsj;//开户时间
	float ye;//余额
}ATM_account;

//定义几个全局变量
int max_account,//账户的上限值,存在一个文本文件中
	cnt_account,//现有账户数,存在一个二进制文件中
	sign;//登录账户的角标

ATM_account  atm_account;
ATM_account *p_account = &atm_account;//指向的内存块,存放具体的账户信息
2、所有函数声明 
void init();//初始化函数
int getNum();//获取本机所有账户函数

void menu1();//初始界面菜单函数
void welcome();//初始界面选择功能函数
void Open_account();//开户函数
void Show_account();//显示账户信息函数
void Login();//登录函数
void Save_account();//保存函数

void menu2();//主机菜单函数
void mainmenu();//主机菜单选择功能函数
void Money();//存取款金额选择函数
void Deposit();//存款函数
void Money_Slove1();//固定存款金额处理函数
void Other_Money1();//任意存款金额处理函数
void Draw();//取款函数
void Money_Slove2();//取款金额选择功能函数
void Sub_Money(int k);//固定金额取款处理函数
void Other_Money2();//任意金额取款处理函数
void Query();//查询余额函数
void ChangePwd();//修改密码函数
void Transfer();//转账函数
int validata_ID(char* p);//转账账户核对函数
int validata_Money(int money);//转账金额合法性检查函数
3、初始化
//初始化
void init(){
	FILE* fp;
	int i = 0;
	cnt_account=getNum();//获取本机现有账户数
	if((fp=fopen("data\init.txt","r"))==NULL){
		perror("init_init.txt");system("pause");return ;
	}
	fscanf(fp,"max_account=%d;",&max_account);
	printf("max_account = %dn",max_account);
	if(max_account<=0){
		puts("初始化数据有误,程序终止执行!");system("pause");return ;
	}
	//内存分配!
	p_account = (ATM_account *)malloc(max_account*sizeof(ATM_account));
	if(p_account==NULL){
		puts("内存分配失败,程序终止执行!");system("pause");return ;
	}
	fclose(fp);
	if((fp=fopen("data\atm_account.dat","rb"))==NULL){
		perror("init_atm_account.dat");system("pause");return;
	}
	fread( &cnt_account, sizeof(int),cnt_account, fp );
	fread( p_account, sizeof(ATM_account),cnt_account , fp );
	printf("共有%d个账户信息!n",cnt_account);
	puts("初始化完毕!");
	system("pause");
	fclose(fp);
	fp = NULL;
}
 4、获取本机现有账户数
int getNum(){
	FILE *fp;
	int i = 0;
	long pos = 0;
	if((fp=fopen("data\atm_account.dat","rb"))==NULL){
		perror("getNum_atm_account.dat");system("pause");return 0 ;
	}
	fseek(fp,0,SEEK_END);//定位文件函数
	pos = ftell(fp);//pos---->文件的尺寸!!!!
	if(pos==-1){
		puts("文件定位出错!");system("pause");
		return 0;
	}
	return pos/sizeof(ATM_account);//结果就是atm_account.dat存放了多少个账户的信息!!!
	fclose(fp);
	fp = NULL;
}
5、主函数
int main(){
	init();//初始化
	welcome();//欢迎界面
    return 0;
}
 二、初始界面 一)初始界面菜单
void menu1(){
	puts("**********************************************");
	puts("*1.开户   2.显示账户  3.登录   4.存盘  0.退出*");
	puts("**********************************************");
	printf("请选择:> ");
}
void welcome(){
	int input = 0;
	while(1){
		system("cls");
		menu1();
		scanf("%d",&input);
		switch(input){
		case 1:Open_account();break;
		case 2:Show_account();break;
		case 3:Login();break;
		case 4:Save_account();break;
		case 0://退出之前要自动保存一下信息
            Save_account();puts("欢迎下次使用!");system("pause");exit(0);
		default:puts("选择错误,请重试!");system("pause");break;
		}
	}
}
二)开户
//1、开户
void Open_account(){
	printf("账号:> ");scanf("%s",p_account[cnt_account].xh);
	printf("姓名:> ");scanf("%s",p_account[cnt_account].xm);
	printf("性别:> ");scanf("%s",p_account[cnt_account].xb);
	printf("院系:> ");scanf("%s",p_account[cnt_account].yx);
	printf("专业:> ");scanf("%s",p_account[cnt_account].zy);
	printf("班级:> ");scanf("%s",p_account[cnt_account].bj);
	printf("卡号:> ");scanf("%s",p_account[cnt_account].kh);
	printf("开户行:> ");scanf("%s",p_account[cnt_account].khh);
	p_account[cnt_account].khsj=time(0);
	p_account[cnt_account].ye=0.0f;
	p_account[cnt_account].zt='0';//账户状态良好为'0'
	strcpy(p_account[cnt_account].mm,"000000");
	cnt_account++;//开户数增加1
	puts("开户完毕!");system("pause");
}
三)显示
//2、显示账户信息
void Show_account(){
	int i=0;
	if(cnt_account==0)
		puts("还未有人开户,NO.1快去开户吧!");
	else{
		while(i 
四)登录 

此处若是三次登录都失败,可将账户锁定,锁定就将状态改为 '1'

//3、登录
void Login(){
	int times = 0,i = 0;
	int flag = 0;
	char xh[MAX_ID],mm[MAX_PASSWORD];
	do{
		system("cls");
		puts("欢迎使用农业银行ATM机");
		printf("账号:> ");scanf("%s",xh);
		printf("密码:> ");scanf("%s",mm);
		//到p_account所指的内存中查找该账号和密码;
		//如果比对上,则进入主操作界面(mainmenu());
		//否则,重新输入账号、密码,循环,直到用完3次机会!
		for(i=0;i 
五)保存 
//4、保存
void Save_account(){
	FILE* fp;
	int i = 0;
	if((fp=fopen("data\atm_account.dat","wb"))==NULL){
		perror("Save_account_atm_account.dat");system("pause");return;
	}
	fwrite(&cnt_account,sizeof(cnt_account),cnt_account,fp);//先写账户总数
	i=fwrite(p_account,sizeof(ATM_account),cnt_account,fp);//再写具体的账户信息
	if(i==0)
		puts("存盘失败!");
	else{
		printf("保存完毕,共存入%d个账户信息!n",i);
	}
	system("pause");
	fclose(fp);
	fp = NULL;
}
三、主机界面 一)主机菜单
void menu2(){
	puts("*****************************************");
	puts("*** 1、存款      2、取款  3、查询余额 ***");
	puts("*** 4、修改密码  5、转账  0、返回     ***");
	puts("*****************************************");
	printf("请选择:> ");
}
void mainmenu(){
	int input = 0;
	while(1){
		system("cls");
		menu2();
		scanf("%d",&input);
		switch(input){
		case 1:Deposit();break;
		case 2:Draw();break;//待完成项目
		case 3:Query();break;
		case 4:ChangePwd();break;
		case 5:Transfer();break;
		case 0:welcome();break;
		default:puts("选择有误,请重试!");system("pause");break;
		}
	}
}
二)存款

存款金额:只能存入百元大钞(即:大于100且为100的整数倍)

1、存取款金额选择菜单
void Money(){
	puts("****************************************************");
	puts("*** 1、100元    **   2、200元   **   3、500元    ***");
	puts("*** 4、1000元   **   5、2000元  **   6、其他金额 ***");
	puts("******************** 0、返回 ***********************");
	puts("****************************************************");
	printf("请选择:> ");
}
2、存款
void Deposit(){
	Money_Slove1();//存款
	printf("%s的余额为:%.2fn",p_account[sign].xh,p_account[sign].ye);
	puts("存款完毕!");system("pause");
}
3、处理存款金额
void Money_Slove1(){
	int input = 0;
	while(1){
		system("cls");
		Money();
		scanf("%d",&input);
		switch(input){
		case 1:p_account[sign].ye += 100;
			puts("已存入100元");system("pause");break;
		case 2:p_account[sign].ye += 200;
			puts("已存入200元");system("pause");break;
		case 3:p_account[sign].ye += 500;
			puts("已存入500元");system("pause");break;
		case 4:p_account[sign].ye += 1000;
			puts("已存入1000元");system("pause");break;
		case 5:p_account[sign].ye += 2000;
			puts("已存入2000元");system("pause");break;
		case 6:Other_Money1();break;
		case 0:return;
		default:puts("选择有误,请重试!");system("pause");break;
		}
	}
}
void Other_Money1(){
	int money = 0;
	puts("本行仅支持存入百元大钞!");
	printf("请输入存款金额:> ");scanf("%d",&money);
	//判断存入金额是否为百元大钞
	if(money>=100 && money%100==0){//是
		p_account[sign].ye += money;
		printf("已存入%d元n",money);
	}
	else{//否
		puts("存入金额不符要求,无法存入!");
	}
	system("pause");
}
三)取款

取款金额条件:非负、余额充足、小于单笔上限、整取

1、取款
void Draw(){
	printf("%s的余额为:%.2fn",p_account[sign].xh,p_account[sign].ye);
	Money_Slove2();//取款
    printf("%s的余额为:%.2fn",p_account[sign].xh,p_account[sign].ye);
	puts("取款完毕!");system("pause");
}
2、处理取款金额
void Money_Slove2(){
	int input = 0;
	int k = 0;
	while(1){
		system("cls");
		Money();
		scanf("%d",&input);
		switch(input){
		case 1:k=100;Sub_Money(k);break;
		case 2:k=200;Sub_Money(k);break;
		case 3:k=500;Sub_Money(k);break;
		case 4:k=1000;Sub_Money(k);break;
		case 5:k=2000;Sub_Money(k);break;
		case 6:Other_Money2();break;
		case 0:return;
		default:puts("选择有误,请重试!");system("pause");break;
		}
	}
}
void Sub_Money(int k){
	if(k > p_account[sign].ye)
		puts("余额不足,取款失败!");
	else{
		p_account[sign].ye  -= k;
		printf("已取走%d元n",k);
	}
    system("pause");
}
void Other_Money2(){
	int money = 0;
	puts("本行仅支持按50的倍数取款!");
	printf("请输入取款金额:> ");scanf("%d",&money);
	//判断取款金额:非负、小于余额、50的倍数、上限
	if(money>=0 && money<=p_account[sign].ye && money%50==0 && money<=MAX_MONEY){//是
		p_account[sign].ye -= money;
		printf("已取走%d元n",money);
	}
	else{//否
		puts("取款金额不符要求,无法取款!");
	}
	system("pause");
}
四)查询余额
void Query(){
	printf("%s的余额为:%.2fn",p_account[sign].xh,p_account[sign].ye);
    system("pause");
}
五)修改密码

输入原密码:核对,若输错原密码三次可锁定账户(此项本程序未实现)

输入新密码:三次新密码要一致才能修改原密码,修改完之后要重新登录,

void ChangePwd(){
	char ori_mm[MAX_PASSWORD];
	char new_mm1[MAX_PASSWORD], new_mm2[MAX_PASSWORD], new_mm3[MAX_PASSWORD];
	printf("请输入原密码:> "); scanf("%s", ori_mm);
	if (strcmp(ori_mm, p_account[sign].mm) == 0){
		puts("密码正确!"); system("pause");//下一步
		system("cls");
		printf("请输入新密码:> "); scanf("%s", new_mm1);
		puts("输入成功,请再次输入!"); system("pause");
		do{
			system("cls");
			printf("请再次输入新密码:> "); scanf("%s", new_mm2);
			if (strcmp(new_mm1, new_mm2) == 0){//判断两次密码是否一致
				puts("输入成功,请再次输入!"); system("pause");
				break;
			}
			else{
				puts("两次密码不一致,请重新输入!"); system("pause");
			}
		} while (1);
		do{
			system("cls");
			printf("请再次输入新密码:> "); scanf("%s", new_mm3);
			//判断三次密码是否一致
			if (strcmp(new_mm3, new_mm2) == 0){
				strcpy(p_account[sign].mm, new_mm3);//修改密码
				puts("输入成功,密码已修改,请重新登录!"); system("pause"); Login();
				break;
			}
			else{
				puts("密码输入不一致,请重新输入!"); system("pause");
			}
		} while (1);
	}
	else{
		puts("原密码输入有误,无法修改密码!"); system("pause");
	}
}
六)转账 1、转账

输入对方账号:1、是否存在,2、账户状态,3、不能转给自己 
输入转账金额:1、非负数,2、50的倍数,3、上限
转账:1、修改自己的余额,2、修改对方的余额
记录交易信息:1、自己转出的,2、对方的转入(此功能未实现)

void Transfer(){
	char reci_xh[MAX_ID];
	int trans_sign;//转账的账号角标
again3:
	system("cls");
	printf("请输入需要转账的账号:> ");scanf("%s",reci_xh);
	//判断账号合法性
	trans_sign = validata_ID(reci_xh);
	if(trans_sign>=0){//合法
		int tra_amount = 0;
		printf("请输入转账金额:> ");scanf("%d",&tra_amount);
		if(validata_Money(tra_amount)>0){//合法
			p_account[sign].ye -=tra_amount;p_account[trans_sign].ye += tra_amount;
			printf("转账成功,共计转账%d元!",tra_amount);system("pause");
		}
	}
	else{//非法
		int a = 0;
		puts("账号有误,重试请按——1 !");
		a = getch();
		if(a==1){
			goto again3;
		}
		else{
			puts("已取消转账!");system("pause");
			return;
		}
	}
}
2、核对账户是否存在

遍历所有账户,若存在且账户状态良好(即为0)返回该账户下标,否则返回-1

int validata_ID(char* p){
	//查找账户是否存在,存在返回其角标k,否则返回-1
	int i = 0;
	if(strcmp(p_account[sign].xh,p)!=0){//不是转给自己
		for(i=0;i 
3、核对金额是否合法 

转账金额:非负、50的倍数、小于单笔最高转账金额、余额充足

int validata_Money(int money){
	//转账金额合法返回值为1,否则-1
	if(money>=0 && money%50==0 && money<=MAX_MONEY)
		if(money<=p_account[sign].ye) return 1;
		return -1;
}

本程序仅经过VS2013调试一次,暂未完成完整调试!!!!!!!! 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/975085.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号