其他分享
首页 > 其他分享> > C语言课设:简易银行管理系统

C语言课设:简易银行管理系统

作者:互联网

C语言课设:简易银行管理系统
源码如下:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
//账户数量限制 
#define MAX_N 100
//存款余额限制,避免内存泄漏 
#define Money 1e10

typedef struct Bank {
	char account[20]; //账号
	char password[8]; //密码
	double balance;//账户余额
	int state;//状态 0:已登录 1:挂失 2:注销
}Bank;  //结构体
Bank banks[MAX_N];
int accountNum=0;//记录用户数目
int nowAccount=0;//记录登录的用户下标 

/*函数声明*/
void menu();//登陆界面
void keyDown();//菜单选择
void openaccount();//开户
void save();//存款
void withdraw();//取款
void showAccount();//查询
void cancelAccount(); //注销账户
void load();//登陆账号
void charToFile();//存入文件

void loadmenu(); //账户菜单 
void loadkeyDown();//账户选择


/*工具函数 */
	//2.刷新文件
void charToFile() {
	FILE *fp;
	int i=0;//遍历数组
	if(fp=fopen("account.txt","w")){
		while(i<accountNum){
			fprintf(fp,"%s\t%s\t%lf\t%d\n",banks[i].account,banks[i].password,banks[i].balance,banks[i].state);
			i++;
		}
	}
	fclose(fp);
} 
//主函数 
int main() {
	int i=0;//i作为数组下标,也等于总用户数量-1 
	FILE *fp;
	//创建并打开文件 
	if((fp=fopen("account.txt","r"))==NULL) {
		if((fp=fopen("account.txt","w"))==NULL) {
			printf("失败!\n");
			exit(1);
		}
	}
	//同步已有的数组和文件数据 
	while(fscanf(fp,"%s%s%lf%d",banks[i].account,banks[i].password,&banks[i].balance,&banks[i].state)!=EOF) {
		i++;//数组下标 
	}
	fclose(fp);
	accountNum=i;
	menu();
	return 0;
}

/*一级菜单相关*/
void menu() {
	printf("\t欢迎来到我的银行\n");
	printf("**********银行账户系统************\n");
	printf("*           1.开户               *\n");
	printf("*           2.登陆               *\n");
	printf("*           0.退出               *\n");
	printf("**********************************\n");
	keyDown();
}

//一级菜单可操作项 
void keyDown() {
	int choice=0;
	printf("请选择你的操作(0~2):");
	scanf("%d",&choice);
	switch(choice) {
		case 1:
			openaccount();
			printf("openaccount");
			system("pause");
			system("cls");
			break;
		case 2:
			load();
			printf("load");
			system("pause");
			system("cls");
			break;
		case 0:
			printf("正常退出\n");
			exit(0);
			break;
		default:
			printf("选项不存在,重新选择:\n");
			system("pause");
			system("cls");
			break;
	}
	menu();//返回一级菜单,看用户是否还有其他操作 
}
/*一级操作具体实现*/
	//1.开户
void openaccount() {
	FILE *fp;
	int i=0,j=0;//i每个字符在数字的下标 ,j遍历账户为账号查重 
	char ch;//密码的每一个字符 
	char password1[8]= {0};//检查密码 
	printf("\t账户(二十位以内):");
	scanf("%s",banks[accountNum].account);
	//账户查重
	while(j<accountNum){
		if(!strcmp(banks[j].account,banks[accountNum].account)) {//r若账户已存在
	 		printf("账号已存在,请为账户重新命名:") ; 
	 		scanf("%s",banks[accountNum].account);
	 		j=0; 
	 	} 
	 	j++;
	}
	printf("\t初始密码:");
	while((ch=getch())!='\r') {//回车结束输入 
		if(ch!='\b'){
			banks[accountNum].password[i++]=ch; 
    		putchar('*'); 
		}else{
			i--;
			printf("\b \b");
		}	
	}	
	i=0;//重置i的位置,等待下次输入 
	printf("\n\t再次输入密码:");
	while((ch=getch())!='\r') {
		if(ch!='\b'){
			password1[i++]=ch; 
    		putchar('*'); 
		}else{
			i--;
			printf("\b \b");
		}
	}
	printf("\n");
	if(strcmp(banks[accountNum].password,password1)!=0) {//strcmp返回为0 
		printf("两次密码不相同,开户失败!\n");
		return;
	}
	banks[accountNum].balance=0;
	banks[accountNum].state=0;
	if(fp=fopen("account.txt","a"))//在文件末尾追加新用户 
		fprintf(fp,"%s\t%s\t%lf\t%d\n",banks[accountNum].account,banks[accountNum].password,banks[accountNum].balance,banks[accountNum].state);
	fclose(fp);
	accountNum++;
	printf("开户成功\n");
}
	//2.登录
void load() {
	int right=0,i=0,j;//j遍历账户数组 
	int r1,r2;//strcmp的返回值分别对应account、password的比较 
	char ch;
	char account1[20]= {0};
	char password1[10]= {0};
	printf("\t请输入账号:");
	scanf("%s",account1);
	printf("\t请输入密码:");
	while((ch=getch())!='\r') {//回车结束输入 
		if(ch!='\b'){
			password1[i++]=ch; 
    		putchar('*'); 
		}else{
			i--;
			printf("\b \b");
		}	
	}	
	for(j=0; j<accountNum; j++) {//检查账户和密码是否存在(bank数组数据和文件一致)
		r1=strcmp(account1,banks[j].account);
		r2=strcmp(password1,banks[j].password);
		
		if(r1==0&&r2==0) { //账号密码输入正确 
			if(banks[j].state==0) {
				printf("\n%s 登录成功!\n",banks[j].account); 
				nowAccount=j;//记录当前登录的用户下标,方边更改该用户信息 
				system("pause");
				system("cls");
				loadmenu(); //二级菜单:账户界面 
			} else if(banks[j].state==1) {
				printf("您的账户处于挂失状态,请解挂\n");
			} else if(banks[j].state==2) {
				printf("账户已被注销\n");
			}
			break ;//退出循环 
		}	
	}
	if(j>=accountNum) //遍历了整个数组都没找到用户 
		printf("\n登录失败!!!(账号或密码有误)\n");	
}

/*二级菜单相关*/
void loadmenu(){
	printf("************账户界面**************\n");
	printf("*           1.存款               *\n");
	printf("*           2.取款               *\n");
	printf("*           3.查询               *\n");
	printf("*           4.销户               *\n");
	printf("*           0.返回               *\n");
	printf("**********************************\n");
	loadkeyDown();//调用二级菜单选项 
}
	//二级菜单操作项 
void loadkeyDown(){
	int choice=0;
	printf("请选择你的操作(0~5):");
	scanf("%d",&choice);
	switch(choice) {
		case 1:
			save();//存钱 
			printf("save");
			system("pause");
			system("cls");
			loadmenu();//返回二级菜单
			break;
		case 2:
			withdraw();//取钱 
			printf("withdraw");
			system("pause");
			system("cls");
			loadmenu();//返回二级菜单
			break;
		case 3:
			showAccount();//查询
			printf("showAccount"); 
			system("pause");
			system("cls");
			loadmenu();//返回二级菜单
			break;
		case 4:
			cancelAccount();//销户 
			printf("cancelAccount"); 
			system("pause");
			system("cls");
			loadmenu();//返回二级菜单
			break;
		case 0:         //返回上一层界面 
			system("cls");
			menu();
			break;
		default:
			printf("该选项不存在,重新输入\n");
			system("pause");
			system("cls");
			loadmenu();//返回二级菜单
			break;
	} 
}
	//存款
void save() {
	double money;//存入金额
	printf("存入金额:\n");
	scanf("%lf",&money); 
	while(money<0){
		printf("存款金额不能为负,请重新输入:\n");
		scanf("%lf",&money);
	}
	if(money>Money||(money+banks[nowAccount].balance)>Money) {
		printf("存款数额巨大,请到门店办理!\n");
		return;
	} else {
		banks[nowAccount].balance+=money;	
		charToFile(); //更新数据
		printf("存款成功\n");
	}
}

//取款
void withdraw() {
	double money;//取款金额
	printf("请输入取款金额\n");
	scanf("%lf",&money);
	if(money<0){
		printf("取款金额不能为负,请重新输入:");
		scanf("%lf",&money);
	}
	if(banks[nowAccount].balance<money)
		printf("余额不足!");
	else {
			banks[nowAccount].balance-=money;
			charToFile();
			printf("取款成功\n");		
		}
}

//查询
void showAccount() {
	printf("您的账户信息如下:\n");
	printf("[账号:%s\t余额:%lf]\n",banks[nowAccount].account,banks[nowAccount].balance);
}	

//销户
void cancelAccount() {
	if(banks[nowAccount].state==2) {
		printf("账户已经不存在\n");
		return;
	}else if(banks[nowAccount].state==1){
		printf("账户已经挂失,请解挂后在销户\n");
	}else{
		if(banks[nowAccount].balance>0){
			printf("请将您的账户余额取完在注销\n");
		} 	
		banks[nowAccount].state=2;
		banks[nowAccount].balance=0;
		charToFile();
		printf("注销成功\n");
	}
}

Tips:
1. 包括两级菜单
2. 运用文件存储

标签:account,accountNum,课设,管理系统,void,system,C语言,printf,banks
来源: https://blog.csdn.net/weixin_45442297/article/details/117024460