【C语言】模拟一个简单的银行系统(只涉及最简单的switch语句)

C语言模拟一个简单的银行系统

    • 前言
    • 需求
    • 分析
    • 直接上源代码
    • 几点解释
    • 附:去年的代码

前言

最近和大一的学弟学妹们在上暑期的课程,本着打基础的心态来跟C语言部分的学习。感觉时间真的过得很快,去年的这个时候我完成这部分课程都很吃力,现在已经好多了。

今天主要是老师布置了一个和去年差不多的小demo,花了大概十来分钟写完了(没什么技术含量),打算和去年写的一起整理一下,当做记录自己的成长。二来也是第一次使用Markdown写博客,当做练手。再有就是自己一直没能养成写博客的好习惯,决定以泪洗面改过自新,把这一年来的学习收获好好总结,便从这一篇开始吧。

需求

  • 提供操作1.取款 2.存款 3.修改密码 4.退出
  • 用户输入正确密码后登陆(先设置一个默认密码)
  • 密码输错三次则被锁卡(即退出程序)
  • 取款数目不能超过余额(默认余额为零)

分析

  • 用一个变量接收用户的选择,使用switch语句进行判别
  • 使用全局变量保存用户的密码和余额
  • 每一个操作对应一个方法,单独抽出来实现
  • 程序需要保持运行则需要进入死循环,在结束程序时才能跳出循环
  • 结束程序有两种情况,一是用户主动退出,二是不正当操作次数过多自动退出

直接上源代码

#include 
#include 

#define maxTime 3
int max = 3;
int PWD = 123456;
int totalMoney = 0;

void showLine(){
	printf("****************************\n");
}
//菜单
void showMenu(){
	printf("请选择操作:\n");
	printf("1.取款         2. 存款   \n");
	printf("3.更改密码     4. 退出   \n");
}
//欢迎界面
void welcome(){
	showLine();
	printf("\t欢迎光临\n");
	showLine();
}

//检查密码
bool checkPwd(int pwd){
	if(pwd == PWD){
		//密码正确
		return true;
	}else{
		//密码错误
		max --;
		if(max <= 0){
			printf("错误次数过多,已自动退出\n");
				exit(1);			
		}
		return false;
	}
}

/*
//检查登录
void checkRes(){
	printf("请输入密码:\n");
	int pwd;
	do{
		scanf("%d",&pwd);
		if(checkPwd(pwd) == false){
			//密码错误
			printf("密码错误,请重新输入(还有%d次机会)\n",max);
		}else{
			break;
		}
	}while(max > 0);
}
*/

//检查登录
void checkRes(){
	printf("请输入密码:\n");
	int pwd;
	int time = 0;
	do{
		scanf("%d",&pwd);
		if(pwd != PWD){
			//密码错误
			time ++;
			if(time >= maxTime){
				printf("错误次数过多,已自动退出\n");
				exit(1);			
			}
			printf("密码错误,请重新输入(还有%d次机会)\n",maxTime-time);
		}else{
			break;
		}
	}while(time < maxTime);
}

//修改密码
void changePwd(){
	printf("请输入原始密码:\n");
	int oldPwd;
	int newPwd;
	int time = 0;
	
	do{
		scanf("%d",&oldPwd);
		if(oldPwd != PWD){			
			time ++;
			if(time >= maxTime){
				printf("错误次数过多,已自动退出\n");
				exit(1);
			}
			printf("密码错误,请重新输入(还有%d次机会)\n",maxTime-time);
		}else{
			printf("请输入新密码\n");
			scanf("%d",&newPwd);
			PWD = newPwd;
			break;
		}
	}while(time < maxTime);

	//printf("%d\n",PWD);
	printf("修改密码成功!\n");
	showLine();
	showMenu();
}
//存款
void saveMoney(){
	printf("请输入存款金额:\n");
	int money;
	scanf("%d",&money);
	totalMoney += money;
	printf("存款成功!余额为:%d\n",totalMoney);
	showLine();
	showMenu();
}
//取款
void drawMoney(){
	printf("请输入取款金额:\n");
	int momey;
	scanf("%d",&momey);
	if(momey > totalMoney){
		printf("余额不足!余额为:%d\n",totalMoney);
	}else{
		totalMoney -= momey;
		printf("取款成功!余额为:%d\n",totalMoney);
	}
	showLine();
	showMenu();
}


int main(void){


	checkRes();
	welcome();
	showMenu();

	int choose;
	int time = 0;
	do{
		scanf("%d",&choose);
		switch(choose){

			case 1:
				//取款
				drawMoney();
				break;
			case 2:
				//存款
				saveMoney();
				break;
			case 3:
				//更改密码
				changePwd();
				break;
			case 4:
				//退出
				exit(0);
			default:
				
				time ++;
				if(time >= maxTime){
					printf("错误次数过多,已自动退出\n");
					exit(1);
				}
				printf("输入不合法,请重新输入(还有%d次机会)\n",maxTime-time);
		}

	}while(time < maxTime);


	return 0;
}

几点解释

  • 关于判断不正当操作次数这部分,我一开始考虑是定义一个常量maxTime规定最大次数,然后在每次不正当操作出现时(如:输错密码、选择不合法操作)用另一个变量记录,再与它比较,若相等则自动退出程序。后来想直接通过操作全局变量max来实现(可以省掉一些内存),但是这样会有多个地方都能修改max值,可能会让程序变得有些复杂,于是我又改回来了……只留下了一个方法作纪念
  • 鉴于检查登录和修改密码两个部分都有验证密码的环节,本来单独抽了一个checkPwd方法(也就想到了使用全局变量max),但是后来觉得也差不太多,就没用了
  • 存在两个bug:
    1.密码是用int保存的,判定密码的时候比较的是数值而不是字符串,因此“0”和“000000”会被认作同一个密码,可以成功登陆(如果不偷懒还是该用char类型)
    2.由于没有对缓存中的字符进行处理,因此在选择操作和输入密码时只能输入数字,一旦输入数字以外的字符将进入死循环(……)改好后会说明
  • 改进方向:设定用户结构体,为每个用户保存帐号密码、姓名年龄等信息(可以自行设计数据结构);若想实现长久保存,还涉及文件的有关操作;然后可以增加开户、转账等更丰富的功能

附:去年的代码

#include 
#include 

int main(void) {
    
    //欢迎界面
    printf("******欢迎光临******\n");
    printf("请输入密码:");
    
    //输入密码
    int pwd = 123456;
    int inputpwd = 0;
    int inputtime = 3;
    
    while(1) {
        scanf("%d",&inputpwd);
        
        if (inputpwd == pwd) {
            printf("密码正确\n");
            break;
        } else {
            inputtime--;
            if (inputtime == 0) {
                printf("账户已被锁定 请到柜台处理\n");
                exit(EXIT_FAILURE);
            }
            printf("密码输入错误,请重新输入(还有%d次机会)\n",inputtime);
            
        }
    }
    
    //进行操作
    int choose = 0;
    int totalmoney = 0;
    int change = 0;
    int newpwd = 0;
    
    
    do {
        int inputtime = 3;
        printf("**************请选择操作**************\n");
        printf("1.取款    2.存款   3.更改密码   4.退出");
        printf("************************************\n");
        scanf("%d",&choose);
        
        switch (choose) {
            case 1:
                printf("请输入取款金额:\n");
                scanf("%d",&change);
                if (totalmoney - change < 0) {
                    printf("余额不足,请重试\n");
                    printf("余额为:%d\n",totalmoney);
                } else {
                    totalmoney -= change;
                    printf("取款成功,余额为:%d\n",totalmoney);
                }
                printf("按回车键返回\n");
                getchar();
                getchar();
                break;
            case 2:
                printf("请输入取款金额:\n");
                scanf("%d",&change);
                totalmoney += change;
                printf("存款成功,余额为:%d\n",totalmoney);
                printf("按回车键返回\n");
                getchar();
                getchar();
                break;
            case 3:
                printf("请输入原有密码:\n");
                scanf("%d",&inputpwd);
                while (inputpwd != pwd) {
                    inputtime--;
                    if (inputtime == 0) {
                        printf("错误次数过多,请重新开始\n");
                        exit(EXIT_FAILURE);
                    }
                    printf("密码错误,请重新输入(还有%d次机会)\n",inputtime);
                    scanf("%d",&inputpwd);
                }
                printf("请输入新密码:\n");
                scanf("%d",&newpwd);
                pwd = newpwd;
                printf("密码修改成功,新密码为%d\n",pwd);
                printf("按回车键返回\n");
                getchar();
                getchar();
                break;
            case 4:
                printf("退出程序\n");
                printf("************************************\n");
                exit(EXIT_SUCCESS);
            default:
                printf("请输入正确数字!\n");
                break;
        }
    }while (choose != 4);
    return 0 ;
}

这么一看也没有很大进步嘛……继续努力吧

你可能感兴趣的:(c语言demo)