当前位置:网站首页>C语言实现模拟银行存取款管理系统课程设计(纯C语言版)

C语言实现模拟银行存取款管理系统课程设计(纯C语言版)

2022-06-21 06:03:00 叶落秋白

写在前面

    有很多大一学生在期末都会有课程设计题,例如通讯录管理系统、学生管理系统、登陆系统等等。那么对于大一学生,多数就只接触了C语言这一门计算机专业的课程,所以不好用更方便的C++之类的语言来完成此类课程设计;我做过此类的课程设计也不少,总结来看,套路其实没啥区别,所以就认真找一个当作模板来帮助初学者


目录

设计要求

思路分析

存储结构选择

结构体设计展示

菜单功能

菜单功能展示

主函数布局 

实现功能模块 

初始化功能

添加客户信息功能

查询客户信息功能

客户账户密码检验

客户编号检验

存取款功能

修改客户信息功能

退出管理系统

源码

运行效果

总结


设计要求

    设计一个银行存取款管理系统,能够输入和查询客户存款取款记录。每个客户信息包括编号、客户姓名、支取密码、客户地址、客户电话、账户总金额;在存取款记录中有类别和存取数目,类别分为取款和存款两种。本系统能够输入客户存款或取款信息;根据客户姓名查询存款和取款记录。

思路分析

由设计要求来选择存储结构和定义菜单功能来一个一个的实现

存储结构选择

    银行存取款管理系统,我选取的存储结构是结构体数组,分为存取款结构体,客户信息结构体,还有一个结构体用来嵌套以上两个结构体;存取款结构体包含存款和取款即可,客户信息就按照设计要求来声明属性,用来嵌套的结构体声明两个结构体数组和一个整型变量,该变量来记录结构体数组的下标,有序的插入数据。

结构体设计展示

const int Max= 100;
const int N= 12;
struct trMoney   //存取款
{
	int getMoney=0;//取款
	int setMoney=0;//存款
};
struct ConutInfo //客户信息
{  
	int No;//编号
	char Name[N];//姓名
	int Password;//密码
	char Address[N];//地址
	char Phone[N];//电话
	int SumMoney;//总金额
};
struct Bank     //银行系统 
{
	struct ConutInfo counter[Max];
	struct trMoney TM [Max];
	int size = 0;
};

菜单功能

    鉴于这个系统的功能比较多,所以我采用switch-case语句配合菜单来美化运行效果;功能分为存取款系统初始化,添加客户信息,查询客户信息及存取款记录,存取款的实现以及客户信息的修改,最后加一个退出该系统这六个功能。

菜单功能展示

void showMenu()//菜单功能
{
	printf("\t*****************************\n");
	printf("\t***** 1、银行系统初始化 *****\n");
	printf("\t***** 2、添加客户信息   *****\n");
	printf("\t***** 3、查询客户信息   *****\n");
	printf("\t***** 4、客户存取款功能 *****\n");
	printf("\t***** 5、客户信息修改   *****\n");
	printf("\t***** 0、退出管理系统   *****\n");
	printf("\t*****************************\n");
}

主函数布局 

int main()
{
	Bank M;
	while (1) {
		showMenu();
		int select = 0;
		printf("请选择你的操作:");
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			Init_Bank(&M);
			break;
		case 2:
			Add_Bank(&M);
			break;
		case 3:
		{
			Show_Bank(&M);
		}
		break;
		case 4:
		{
			Trans_Bank(&M);
		}
		break;
		case 5:
		{
			Modify_Bank(&M);
			break;
		}
		break;
		case 0://退出
			printf("欢迎下次使用,祝您生活愉快\n"); return 0;  break;
		default:
			printf("请合理输入操作数0~5:\n");
			scanf("%d", &select);
			break;
		}
	}
}

主函数中创建 

实现功能模块 

分为六大模块加两个判断的小模块,退出功能借助return 来退出循环

void Init_Bank(Bank* M);//初始化客户
void Add_Bank(Bank* M);//添加客户
int isExit(Bank* M, char* name, int password);//账号密码判断是否有客户
int isExit2(Bank* M, int no);//编号判断是否有客户
void Trans_Bank(Bank* M);//存取款
void Show_Bank(Bank* M);//查询客户信息
void Modify_Bank(Bank* M);//修改客户信息

初始化功能

void Init_Bank(Bank* M)
{
	int count;
	printf("初始化创建管理系统的客户个数为:");
	scanf("%d", &count);
	printf("开始添加:\n");
	for (int i = 0; i < count; i++)
	{
		int r = rand() % 99 + 2018001;
		M->counter[M->size].No = r;
		printf("随机生成客户编号完成:\t\n");
		printf("录入客户姓名为:");
		scanf("%s", &M->counter[M->size].Name);
		printf("录入客户密码为:");
		scanf("%d", &M->counter[M->size].Password);
		printf("录入客户地址为:");
		scanf("%s", &M->counter[M->size].Address);
		printf("录入客户电话为:");
		scanf("%s", &M->counter[M->size].Phone);
		printf("录入客户账户总额为:");
		scanf("%d", &M->counter[M->size].SumMoney);
		M->size++;
	}
	system("pause"); system("cls");
}

  初始化此系统的过程是:输入初始要添加的客户数,利用for循环进行客户信息的录入,其中编号由随机数产生,其余属性由我们自己录入 ,最后别忘了给系统人数进行更新,也就是M->size++,pause 和 cls 是系统函数,分别用来暂停程序的运行和清空屏幕,这样可以让程序操作性更强

添加客户信息功能

void Add_Bank(Bank* M)
{
	int r = rand() % 99 + 2018001;
	M->counter[M->size].No = r;
	printf("随机生成客户编号完成:\t\n");
	printf("录入客户姓名为:");
	scanf("%s", &M->counter[M->size].Name);
	printf("录入客户密码为:");
	scanf("%d", &M->counter[M->size].Password);
	printf("录入客户地址为:");
	scanf("%s", &M->counter[M->size].Address);
	printf("录入客户电话为:");
	scanf("%s", &M->counter[M->size].Phone);
	printf("录入客户账户总额为:");
	scanf("%d", &M->counter[M->size].SumMoney);
	M->size++;
	system("pause"); system("cls");
}

    添加客户信息功能就可以稍微偷偷懒了,只要去掉初始化功能中的for循环就实现了 

查询客户信息功能

void Show_Bank(Bank* M)
{
	char name[N]; int password;
	printf("输入查询客户的姓名:\t");
	scanf("%s", &name);
	printf("输入对应的密码:\t");
	scanf("%d", &password);
	int v = isExit(M,name,password);
	if (v != -1)
	{
		printf("客户编码为:\t");
		printf("%d\n", M->counter[v].No);
		printf("客户名字为:\t");
		printf("%s\n", M->counter[v].Name);
		printf("客户电话为:\t");
		printf("%s\n", M->counter[v].Phone);
		printf("客户地址为:\t");
		printf("%s\n", M->counter[v].Address);
		if (M->TM[v].getMoney <= 0 && M->TM[v].setMoney<=0)
		{
			printf("暂无存取款记录");
		}
		else if (M->TM[v].getMoney > 0)
		{
			printf("客户取走了 %d元\t", M->TM[v].getMoney);
		}
		else if(M->TM[v].setMoney > 0)
		{
			printf("客户存取了 %d元\t", M->TM[v].setMoney);
		}
		printf("\n账户总金额为:\t");
		printf("%d\n", M->counter[v].SumMoney);
	}
	else printf("查无此人");
	system("pause"); system("cls");
}

    我通过客户信息数组中的下标来访问要查找的客户信息,所以这里调用isExit函数返回用户信息的下标,如果找不到就返回-1 ;然后输出该用户的信息及存取款记录,通过存取款数组中的存款与取款的值来判断类别是存款还是取款,然后提示存或者取的数目,再输出剩余的总金额。

客户账户密码检验

int isExit(Bank *M,char *name,int password)//姓名和密码判断是否有此人
{
	for (int i = 0; i <Max; i++)
	{
		if (*M->counter[i].Name == *name && M->counter[i].Password==password) return i;
	}
	return -1;
}

    这里传入我们要查找的客户姓名和密码,遍历客户信息数组找到与其对应的下标并返回,找不到则返回-1; 这里尤其注意数组名代表的数组的地址,因此判断条件的开始要加上*符号,后面的数组名前也要加*,否则两个地址是无论如何都不会相等的

客户编号检验

int isExit2(Bank *M,int no)//编号判断是否有此人
{
	for (int i = 0; i <Max; i++)
	{
		if (M->counter[i].No == no) return i;
	}
	return -1;
}

    和账户密码检验类似,这里通过判断编号是否对应来返回对应客户信息数组下标 

存取款功能

void Trans_Bank(Bank* M)
{
    char name[N]; int password;
    printf("输入存取款客户的姓名:\t");
    scanf("%s", &name);
    printf("输入对应的密码:\t");
    scanf("%d", &password);
    int v = isExit(M, name, password);
    if (v != -1)
    {
        printf("验证成功:\n");
        while (1)
        {
            printf("选择你的操作:1--取款 --2--存款 --0--退出\n");
            int z = 0;
            scanf("%d", &z);
            switch (z)
            {
            case 1:
            {
                int getmoney = 0;
                printf("取钱的金额为:"); scanf("%d", &getmoney);
                if (M->counter[v].SumMoney < getmoney)
                {
                    printf("非法操作,请减少取款量\n");
                }
                else
                {
                    M->TM[v].getMoney = getmoney;
                    M->counter[v].SumMoney -= M->TM[v].getMoney;
                    printf("取款成功!");
                }
                break;
            }
            case 2:
            {
                int setmoney = 0;
                printf("存钱的金额为:"); scanf("%d", &setmoney);
                //M->counter[v].F.setMoney = setmoney;
                M->TM[v].setMoney = setmoney;
                M->counter[v].SumMoney += M->TM[v].setMoney;
                break;
            }
            case 0:printf("\n退出存取款功能,欢迎下次使用!\n"); system("pause"); system("cls"); return;
            }
        }
    }
    else printf("查无此人");
    system("pause"); system("cls");
}

    首先通过账号密码检验,提示验证成功后,再进行账户总额的存取,这里我想让存取款功能更健壮点,就采用了循环选择的样式,并给出操作的提示,1代表取款,2代表存款,0代表退出;还有一点就是取款的金额不能大于总金额,所以我进行了一个if判断,取款不合法就要重新选择操作 

修改客户信息功能

void Modify_Bank(Bank *M)
{
	int no = 0;
	printf("输入查询客户的编号:\t");
	scanf("%d", &no);
	int v = isExit2(M, no);
	if (v != -1)
	{
		printf("修改客户姓名为:");
		scanf("%s", &M->counter[v].Name);
		printf("修改客户密码为:");
		scanf("%d", &M->counter[v].Password);
		printf("修改客户地址为:");
		scanf("%s", &M->counter[v].Address);
		printf("修改客户电话为:");
		scanf("%s", &M->counter[v].Phone);
		printf("修改完毕!\n");
	}
	else printf("查无此人");
	system("pause"); system("cls");
}

    通过调用isExit2也就是编号判断函数,返回要查找的客户的下标,仅修改客户的姓名密码地址电话功能,修改账户金额有点不合实际了

退出管理系统

printf("欢迎下次使用,祝您生活愉快\n"); return 0;  break;

当在键盘上输入0时,就会输出printf中的提示信息,并通过return结束程序 

源码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
const int Max= 100;
const int N= 12;
struct trMoney
{
	int getMoney=0;//取款
	int setMoney=0;//存款
};
struct ConutInfo
{
	int No;//编号
	char Name[N];//姓名
	int Password;//密码
	char Address[N];//地址
	char Phone[N];//电话
	int SumMoney;//总金额
};
struct Bank
{
	struct ConutInfo counter[Max];
	struct trMoney TM [Max];
	int size = 0;
};
void showMenu();//菜单功能
void Init_Bank(Bank* M)
{
	int count;
	printf("初始化创建管理系统的客户个数为:");
	scanf("%d", &count);
	printf("开始添加:\n");
	for (int i = 0; i < count; i++)
	{
		int r = rand() % 99 + 2018001;
		M->counter[M->size].No = r;
		printf("随机生成客户编号完成:\t\n");
		printf("录入客户姓名为:");
		scanf("%s", &M->counter[M->size].Name);
		printf("录入客户密码为:");
		scanf("%d", &M->counter[M->size].Password);
		printf("录入客户地址为:");
		scanf("%s", &M->counter[M->size].Address);
		printf("录入客户电话为:");
		scanf("%s", &M->counter[M->size].Phone);
		printf("录入客户账户总额为:");
		scanf("%d", &M->counter[M->size].SumMoney);
		M->size++;
	}
	system("pause"); system("cls");
}
void Add_Bank(Bank* M)
{
	int r = rand() % 99 + 2018001;
	M->counter[M->size].No = r;
	printf("随机生成客户编号完成:\t\n");
	printf("录入客户姓名为:");
	scanf("%s", &M->counter[M->size].Name);
	printf("录入客户密码为:");
	scanf("%d", &M->counter[M->size].Password);
	printf("录入客户地址为:");
	scanf("%s", &M->counter[M->size].Address);
	printf("录入客户电话为:");
	scanf("%s", &M->counter[M->size].Phone);
	printf("录入客户账户总额为:");
	scanf("%d", &M->counter[M->size].SumMoney);
	M->size++;
	system("pause"); system("cls");
}
int isExit(Bank *M,char *name,int password)//姓名和密码判断是否有此人
{
	for (int i = 0; i <Max; i++)
	{
		if (*M->counter[i].Name == *name && M->counter[i].Password==password) return i;
	}
	return -1;
}
int isExit2(Bank *M,int no)//编号判断是否有此人
{
	for (int i = 0; i <Max; i++)
	{
		if (M->counter[i].No == no) return i;
	}
	return -1;
}
void Trans_Bank(Bank* M)
{
	char name[N]; int password;
	printf("输入存取款客户的姓名:\t");
	scanf("%s", &name);
	printf("输入对应的密码:\t");
	scanf("%d", &password);
	int v = isExit(M, name, password);
	if (v != -1)
	{
		printf("验证成功:\n");
		while (1)
		{
			printf("选择你的操作:1--取款 --2--存款 --0--退出\n");
			int z = 0;
			scanf("%d", &z);
			switch (z)
			{
			case 1:
			{
				int getmoney = 0;
				printf("取钱的金额为:"); scanf("%d", &getmoney);
				if (M->counter[v].SumMoney < getmoney)
				{
					printf("非法操作,请减少取款量\n");
				}
				else
				{
					M->TM[v].getMoney = getmoney;
					M->counter[v].SumMoney -= M->TM[v].getMoney;
					printf("取款成功!");
				}
				break;
			}
			case 2:
			{
				int setmoney = 0;
				printf("存钱的金额为:"); scanf("%d", &setmoney);
				//M->counter[v].F.setMoney = setmoney;
				M->TM[v].setMoney = setmoney;
				M->counter[v].SumMoney += M->TM[v].setMoney;
				break;
			}
			case 0:printf("\n退出存取款功能,欢迎下次使用!\n"); system("pause"); system("cls"); return;
			}
		}
	}
	else printf("查无此人");
	system("pause"); system("cls");
}
void Show_Bank(Bank* M)
{
	char name[N]; int password;
	printf("输入查询客户的姓名:\t");
	scanf("%s", &name);
	printf("输入对应的密码:\t");
	scanf("%d", &password);
	int v = isExit(M,name,password);
	if (v != -1)
	{
		printf("客户编码为:\t");
		printf("%d\n", M->counter[v].No);
		printf("客户名字为:\t");
		printf("%s\n", M->counter[v].Name);
		printf("客户电话为:\t");
		printf("%s\n", M->counter[v].Phone);
		printf("客户地址为:\t");
		printf("%s\n", M->counter[v].Address);
		if (M->TM[v].getMoney <= 0 && M->TM[v].setMoney<=0)
		{
			printf("暂无存取款记录");
		}
		else if (M->TM[v].getMoney > 0)
		{
			printf("客户取走了 %d元\t", M->TM[v].getMoney);
		}
		else if(M->TM[v].setMoney > 0)
		{
			printf("客户存取了 %d元\t", M->TM[v].setMoney);
		}
		printf("\n账户总金额为:\t");
		printf("%d\n", M->counter[v].SumMoney);
	}
	else printf("查无此人");
	system("pause"); system("cls");
}
void Modify_Bank(Bank *M)
{
	int no = 0;
	printf("输入查询客户的编号:\t");
	scanf("%d", &no);
	int v = isExit2(M, no);
	if (v != -1)
	{
		printf("修改客户姓名为:");
		scanf("%s", &M->counter[v].Name);
		printf("修改客户密码为:");
		scanf("%d", &M->counter[v].Password);
		printf("修改客户地址为:");
		scanf("%s", &M->counter[v].Address);
		printf("修改客户电话为:");
		scanf("%s", &M->counter[v].Phone);
		printf("修改完毕!\n");
	}
	else printf("查无此人");
	system("pause"); system("cls");
}
int main()
{
	Bank M;
	while (1) {
		showMenu();
		int select = 0;
		printf("请选择你的操作:");
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			Init_Bank(&M);
			break;
		case 2:
			Add_Bank(&M);
			break;
		case 3:
		{
			Show_Bank(&M);
		}
		break;
		case 4:
		{
			Trans_Bank(&M);
		}
		break;
		case 5:
		{
			Modify_Bank(&M);
			break;
		}
		break;
		case 0://退出
			printf("欢迎下次使用,祝您生活愉快\n"); return 0;  break;
		default:
			printf("请合理输入操作数0~5:\n");
			scanf("%d", &select);
			break;
		}
	}
}
void showMenu()//菜单功能
{
	printf("\t*****************************\n");
	printf("\t***** 1、银行系统初始化 *****\n");
	printf("\t***** 2、添加客户信息   *****\n");
	printf("\t***** 3、查询客户信息   *****\n");
	printf("\t***** 4、客户存取款功能 *****\n");
	printf("\t***** 5、客户信息修改   *****\n");
	printf("\t***** 0、退出管理系统   *****\n");
	printf("\t*****************************\n");
}
void showMenu();//菜单功能
void Init_Bank(Bank* M);//初始化客户
void Add_Bank(Bank* M);//添加客户
int isExit(Bank* M, char* name, int password);//账号密码判断是否有客户
int isExit2(Bank* M, int no);//编号判断是否有客户
void Trans_Bank(Bank* M);//存取款
void Show_Bank(Bank* M);//查询客户信息
void Modify_Bank(Bank* M);//修改客户信息

运行效果

初始化测试:

6fb697e5e56b48d4a572638ca8d9c15f.png

添加客户信息: 

e016bc8265de4e3f957afed433a723c8.png

查询操作: 

2c9bb6e55922417ea03a93ed14ce973f.png

96aa9bd27ed6436096e678146382d79d.png 存取款操作:

7fc80ea0492b406a9b9b7e221a55c217.png 修改功能:

a1a8609cc3e34be485a8ea079c451cdf.png

总结

    本文排版和课程设计报告基本无误,就是说完成可以稍作修改来完成答辩;实现思路,存储结构,注意事项都有,如要求非法数据测试,那就运行几遍试试,希望能给你们启发和帮助,创作不易,要个赞不过分吧

原网站

版权声明
本文为[叶落秋白]所创,转载请带上原文链接,感谢
https://ylqb196.blog.csdn.net/article/details/125111706