当前位置:网站首页>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);//修改客户信息运行效果
初始化测试:

添加客户信息:

查询操作:

存取款操作:
修改功能:

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

After the code is generated by the code generator, the copy is completed, and the module is not displayed on the web page

深度理解RNN的梯度消失和LSTM为什么能解决梯度消失

Improve the determination of the required items of business details. When the error information is echoed according to the returned status code, the echoed information is inconsistent with the expecta

Asp. Net web API 2 Lesson 18 - working with entity relations in OData

Improved Object Categorization and Detection Using Comparative Object Similarity
![[mysql] MySQL file structure, page and line records](/img/e3/8b6c39f299679522d84cad64af7a42.png)
[mysql] MySQL file structure, page and line records

FPGA - 7系列 FPGA SelectIO -03- 逻辑资源之ILOGIC

【利用MSF工具内网复现MS08-067】

微生物生态数据分析——冗余分析

nametuple的源码为什么要使用.replace(‘,‘, ‘ ‘).split()而不是.split(‘,‘)
随机推荐
Improve the determination of the required items of business details. When the error information is echoed according to the returned status code, the echoed information is inconsistent with the expecta
[MySQL] SQL statement execution process of MySQL
直击2022互联网大裁员:繁花落地,一地鸡毛
leetcode 675. 为高尔夫比赛砍树——(每日一难day29)
Leetcode刷题 ——— (4)字符串中的第一个唯一字符
Q & A: issues related to "micro build low code" billing
【JVM】方法区
正则表达式基础
827. 最大人工岛 并查集
【【毕业季·进击的技术er】------老学长心得分享
Judge whether a tree is a complete binary tree
Some details of BN
[reproduce ms08-067 via MSF tool intranet]
FPGA - 7系列 FPGA SelectIO -04- 逻辑资源之IDELAY和IDELAYCTRL
You have an error in your SQL syntax; check the manual that corresponds to your MYSQL server
太厉害了MySQL总结的太全面了
IP - RF data converter -04- API User Guide - ADC status indication function
【数据挖掘】期末复习 第三章
[data mining] final review Chapter 1
Quartz. Net getting started