C语言实现模拟银行存取款管理系统课程设计(纯C语言版)
🎉写在前面
有很多大一学生在期末都会有课程设计题,例如通讯录管理系统、学生管理系统、登陆系统等等。那么对于大一学生,多数就只接触了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 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 TM[v].setMoneyTM[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 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 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 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#includeconst 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 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 counter[i].Name == *name && M->counter[i].Password==password) return i;}return -1;}int isExit2(Bank *M,int no)//编号判断是否有此人{for (int i = 0; i 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 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 TM[v].setMoneyTM[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);//修改客户信息
运行效果
初始化测试:
添加客户信息:
查询操作:
存取款操作:
修改功能:
🎉总结
本文排版和课程设计报告基本无误,就是说完成可以稍作修改来完成答辩;实现思路,存储结构,注意事项都有,如要求非法数据测试,那就运行几遍试试,希望能给你们启发和帮助,创作不易,要个赞不过分吧