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

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);//修改客户信息

运行效果

初始化测试:

添加客户信息: 

查询操作: 

 存取款操作:

 修改功能:

🎉总结

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