C语言课设:简易银行管理系统
作者:互联网
C语言课设:简易银行管理系统
源码如下:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
//账户数量限制
#define MAX_N 100
//存款余额限制,避免内存泄漏
#define Money 1e10
typedef struct Bank {
char account[20]; //账号
char password[8]; //密码
double balance;//账户余额
int state;//状态 0:已登录 1:挂失 2:注销
}Bank; //结构体
Bank banks[MAX_N];
int accountNum=0;//记录用户数目
int nowAccount=0;//记录登录的用户下标
/*函数声明*/
void menu();//登陆界面
void keyDown();//菜单选择
void openaccount();//开户
void save();//存款
void withdraw();//取款
void showAccount();//查询
void cancelAccount(); //注销账户
void load();//登陆账号
void charToFile();//存入文件
void loadmenu(); //账户菜单
void loadkeyDown();//账户选择
/*工具函数 */
//2.刷新文件
void charToFile() {
FILE *fp;
int i=0;//遍历数组
if(fp=fopen("account.txt","w")){
while(i<accountNum){
fprintf(fp,"%s\t%s\t%lf\t%d\n",banks[i].account,banks[i].password,banks[i].balance,banks[i].state);
i++;
}
}
fclose(fp);
}
//主函数
int main() {
int i=0;//i作为数组下标,也等于总用户数量-1
FILE *fp;
//创建并打开文件
if((fp=fopen("account.txt","r"))==NULL) {
if((fp=fopen("account.txt","w"))==NULL) {
printf("失败!\n");
exit(1);
}
}
//同步已有的数组和文件数据
while(fscanf(fp,"%s%s%lf%d",banks[i].account,banks[i].password,&banks[i].balance,&banks[i].state)!=EOF) {
i++;//数组下标
}
fclose(fp);
accountNum=i;
menu();
return 0;
}
/*一级菜单相关*/
void menu() {
printf("\t欢迎来到我的银行\n");
printf("**********银行账户系统************\n");
printf("* 1.开户 *\n");
printf("* 2.登陆 *\n");
printf("* 0.退出 *\n");
printf("**********************************\n");
keyDown();
}
//一级菜单可操作项
void keyDown() {
int choice=0;
printf("请选择你的操作(0~2):");
scanf("%d",&choice);
switch(choice) {
case 1:
openaccount();
printf("openaccount");
system("pause");
system("cls");
break;
case 2:
load();
printf("load");
system("pause");
system("cls");
break;
case 0:
printf("正常退出\n");
exit(0);
break;
default:
printf("选项不存在,重新选择:\n");
system("pause");
system("cls");
break;
}
menu();//返回一级菜单,看用户是否还有其他操作
}
/*一级操作具体实现*/
//1.开户
void openaccount() {
FILE *fp;
int i=0,j=0;//i每个字符在数字的下标 ,j遍历账户为账号查重
char ch;//密码的每一个字符
char password1[8]= {0};//检查密码
printf("\t账户(二十位以内):");
scanf("%s",banks[accountNum].account);
//账户查重
while(j<accountNum){
if(!strcmp(banks[j].account,banks[accountNum].account)) {//r若账户已存在
printf("账号已存在,请为账户重新命名:") ;
scanf("%s",banks[accountNum].account);
j=0;
}
j++;
}
printf("\t初始密码:");
while((ch=getch())!='\r') {//回车结束输入
if(ch!='\b'){
banks[accountNum].password[i++]=ch;
putchar('*');
}else{
i--;
printf("\b \b");
}
}
i=0;//重置i的位置,等待下次输入
printf("\n\t再次输入密码:");
while((ch=getch())!='\r') {
if(ch!='\b'){
password1[i++]=ch;
putchar('*');
}else{
i--;
printf("\b \b");
}
}
printf("\n");
if(strcmp(banks[accountNum].password,password1)!=0) {//strcmp返回为0
printf("两次密码不相同,开户失败!\n");
return;
}
banks[accountNum].balance=0;
banks[accountNum].state=0;
if(fp=fopen("account.txt","a"))//在文件末尾追加新用户
fprintf(fp,"%s\t%s\t%lf\t%d\n",banks[accountNum].account,banks[accountNum].password,banks[accountNum].balance,banks[accountNum].state);
fclose(fp);
accountNum++;
printf("开户成功\n");
}
//2.登录
void load() {
int right=0,i=0,j;//j遍历账户数组
int r1,r2;//strcmp的返回值分别对应account、password的比较
char ch;
char account1[20]= {0};
char password1[10]= {0};
printf("\t请输入账号:");
scanf("%s",account1);
printf("\t请输入密码:");
while((ch=getch())!='\r') {//回车结束输入
if(ch!='\b'){
password1[i++]=ch;
putchar('*');
}else{
i--;
printf("\b \b");
}
}
for(j=0; j<accountNum; j++) {//检查账户和密码是否存在(bank数组数据和文件一致)
r1=strcmp(account1,banks[j].account);
r2=strcmp(password1,banks[j].password);
if(r1==0&&r2==0) { //账号密码输入正确
if(banks[j].state==0) {
printf("\n%s 登录成功!\n",banks[j].account);
nowAccount=j;//记录当前登录的用户下标,方边更改该用户信息
system("pause");
system("cls");
loadmenu(); //二级菜单:账户界面
} else if(banks[j].state==1) {
printf("您的账户处于挂失状态,请解挂\n");
} else if(banks[j].state==2) {
printf("账户已被注销\n");
}
break ;//退出循环
}
}
if(j>=accountNum) //遍历了整个数组都没找到用户
printf("\n登录失败!!!(账号或密码有误)\n");
}
/*二级菜单相关*/
void loadmenu(){
printf("************账户界面**************\n");
printf("* 1.存款 *\n");
printf("* 2.取款 *\n");
printf("* 3.查询 *\n");
printf("* 4.销户 *\n");
printf("* 0.返回 *\n");
printf("**********************************\n");
loadkeyDown();//调用二级菜单选项
}
//二级菜单操作项
void loadkeyDown(){
int choice=0;
printf("请选择你的操作(0~5):");
scanf("%d",&choice);
switch(choice) {
case 1:
save();//存钱
printf("save");
system("pause");
system("cls");
loadmenu();//返回二级菜单
break;
case 2:
withdraw();//取钱
printf("withdraw");
system("pause");
system("cls");
loadmenu();//返回二级菜单
break;
case 3:
showAccount();//查询
printf("showAccount");
system("pause");
system("cls");
loadmenu();//返回二级菜单
break;
case 4:
cancelAccount();//销户
printf("cancelAccount");
system("pause");
system("cls");
loadmenu();//返回二级菜单
break;
case 0: //返回上一层界面
system("cls");
menu();
break;
default:
printf("该选项不存在,重新输入\n");
system("pause");
system("cls");
loadmenu();//返回二级菜单
break;
}
}
//存款
void save() {
double money;//存入金额
printf("存入金额:\n");
scanf("%lf",&money);
while(money<0){
printf("存款金额不能为负,请重新输入:\n");
scanf("%lf",&money);
}
if(money>Money||(money+banks[nowAccount].balance)>Money) {
printf("存款数额巨大,请到门店办理!\n");
return;
} else {
banks[nowAccount].balance+=money;
charToFile(); //更新数据
printf("存款成功\n");
}
}
//取款
void withdraw() {
double money;//取款金额
printf("请输入取款金额\n");
scanf("%lf",&money);
if(money<0){
printf("取款金额不能为负,请重新输入:");
scanf("%lf",&money);
}
if(banks[nowAccount].balance<money)
printf("余额不足!");
else {
banks[nowAccount].balance-=money;
charToFile();
printf("取款成功\n");
}
}
//查询
void showAccount() {
printf("您的账户信息如下:\n");
printf("[账号:%s\t余额:%lf]\n",banks[nowAccount].account,banks[nowAccount].balance);
}
//销户
void cancelAccount() {
if(banks[nowAccount].state==2) {
printf("账户已经不存在\n");
return;
}else if(banks[nowAccount].state==1){
printf("账户已经挂失,请解挂后在销户\n");
}else{
if(banks[nowAccount].balance>0){
printf("请将您的账户余额取完在注销\n");
}
banks[nowAccount].state=2;
banks[nowAccount].balance=0;
charToFile();
printf("注销成功\n");
}
}
Tips:
1. 包括两级菜单
2. 运用文件存储
标签:account,accountNum,课设,管理系统,void,system,C语言,printf,banks 来源: https://blog.csdn.net/weixin_45442297/article/details/117024460