C语言-银行系统的简单实现(存钱,取钱,保存用户信息,销户,开户,转账,查询等功能,使用消息队列达到2个不同进程之间的相互通信)

主要分为两人大模块:

客户端
1、进入时的功能开户、销户、登录、解锁
开户:输入姓名、身份证号、设置密码,如果开户成功,则服务器上保存一个账号信号(一个账号存一个文件,文件名建议是账号)。
销户:输入帐号、密码,服务器询问是否确认销户,如果确认则服务器删除帐号文件,并记录帐号。
登录:输入账号、密码,三次错误账号锁定。
解锁:输入账号、身份证号解锁。
2、登录成功:存钱、取钱、转账、查询、修改密码
存钱:输入存钱金额
取钱:输入取钱金额
转账:目标帐号和要转的金额
查询:不需要输入数据
修改密码:原密码和新密码
服务器
如果识别功能:根据消息的类型识别客户端请求的功能。
开启服务各项功能的子进程
各进程按照消息类型接收消息

Makefile

FLAG=-Werror
STD=-std=gnu99
CC=gcc

all:
	$(CC) $(STD) $(FLAG) client.c tools.c -o client
	$(CC) $(STD) $(FLAG) server.c tools.c -o server
	$(CC) $(STD) $(FLAG) login.c tools.c -o login
	$(CC) $(STD) $(FLAG) open.c tools.c -o open
	$(CC) $(STD) $(FLAG) save.c tools.c -o save
	$(CC) $(STD) $(FLAG) take.c tools.c -o take
	$(CC) $(STD) $(FLAG) transf.c tools.c -o transf
	$(CC) $(STD) $(FLAG) select.c tools.c -o select
	$(CC) $(STD) $(FLAG) change.c tools.c -o change 
	$(CC) $(STD) $(FLAG) destory.c tools.c -o destory
	$(CC) $(STD) $(FLAG) unlock.c tools.c -o unlock	

clean:
	rm client server login open save take transf select change destory unlock

change.c 修改密码
destory.c 销毁用户
open.c 开户
select.c 查询
save.c 存款
take.c 取款
transf.c 转账
client.c 用户端
login.c 登陆
server.c 系统端
tools.c 一些工具函数
unlock.c 解锁
data(文件夹) 存储用户信息
Makefile 编译执行脚本
struct.h 结构体存储头文件 tools.h 工具函数头文件

此处所用getch.h的头文件为自建头文件(linux下没有conio.h头文件) 如果有需要可以私我

client.c 用户端

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include "struct.h"
#include "tools.h"


static long online = 0;		//记录当前的用户
static int lock = 0;		//密码错误的次数

int msgid_ctos;				//消息队列的标识符
int msgid_stoc;				//消息队列的标识符

int init(void);				//创建消息队列
void open_acc(void);		//开户操作
void destory(void);			//销户操作
void login(void);			//登录操作
void unlock(void);			//解锁操作
void user_menu(void);		//用户菜单
void menu(void);			//菜单(开户,销户)
void save(void);			//存钱
void take(void);			//取钱
void transf(void);			//转账
void select_money(void);	//查询余额
void change_pw(void);		//改变密码

int main()
{
   
	init();
	menu();
}

int init(void)				//创建消息队列
{
   
	//ftok是获取IPC键值
	msgid_ctos = msgget(ftok(".",100),IPC_CREAT);
	if(0 > msgid_ctos)
	{
   
		perror("msgget");
		return -1;
	}
	msgid_stoc = msgget(ftok(".",200),IPC_CREAT);
	if(0 > msgid_stoc)
	{
   
		perror("msgget");
		return -1;
	}
	return 0;
}

void login(void)			//登录操作
{
   
	if(lock >= 3)
	{
   
		printf("您的账户已被锁定,请解锁\n");
		getch();
		return;
	}
	Account acc = {
   };
	Msg msg = {
   110};
	printf("请输入帐号:");
	scanf("%ld",&acc.user);
	getchar();
	printf("请输入密码:");
	get_pw(acc.pw,true,L_PW);
	msg.acc = acc;
	//发送消息
	msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);

	Msg msg2 = {
   };
	// 接收消息
	msgrcv(msgid_stoc,&msg2,sizeof(Msg),220,MSG_NOERROR);
	
	if(acc.user == msg2.acc.user)
	{
   
		online = acc.user;
		printf("\n用户:%ld,登陆成功\n",online);
		getch();
		user_menu();
	}
	else
	{
   	
		lock++;	
		printf("\n帐号或密码错误\n");
		getch();
	}
}

void open_acc(void)			//开户操作
{
   

	Account acc = {
   };
	Msg msg = {
   111};
	printf("请输入姓名:");
	get_str(acc.name,L_NAME);
	printf("请输入身份证:");
	get_str(acc.id,L_ID);
	printf("请输入密码:");
	get_str(acc.pw,L_PW);
	msg.acc = acc;
	//发送消息
	msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);

	Msg msg2 = {
   };
	// 接收消息
	msgrcv(msgid_stoc,&msg2,sizeof(Msg),221,MSG_NOERROR);
	printf("msg2:%s,acc:%s\n",msg2.acc.name,acc.name);
	if(strcmp(acc.name,msg2.acc.name) == 0)
	{
   
		printf("帐号:%ld,开户成功\n",msg2.acc.user);
	}
	else
	{
   		
		printf("开户失败\n");
	}
	getch();
}

void save(void)				//存款
{
   
	Account acc = {
   };
	Msg msg = {
   112};

	printf("请输入存款金额:");
	scanf("%lf",&acc.money);
	getchar();
	acc.user = online;	
	msg.acc = acc;
	//发送消息
	msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);

	Msg msg2 = {
   };
	// 接收消息
	msgrcv(msgid_stoc,&msg2,sizeof(Msg),222,MSG_NOERROR);
	if(msg2.acc.user == online)
	{
   
		printf("存钱成功\n");
	}
	else
	{
   
		printf("存钱失败\n");
	}
	getch();
}

void take(void)				//取款
{
   
	Account acc = {
   };
	Msg msg = {
   113};
	printf("请输入取款金额:");
	scanf("%lf",&acc.money);
	getchar();
	acc.user = online;	
	msg.acc = acc;
	msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);

	Msg msg2 = {
   };
	// 接收消息
	msgrcv(msgid_stoc,&msg2,sizeof(Msg),223,MSG_NOERROR);
	if(msg2.acc.user == online)
	{
   
		printf("取钱成功\n");
	}
	else if(msg2.acc.user == online + 2)
	{
   
		printf("余额不足,请充值\n");
	}
	else
	{
   
		printf("取钱失败\n");
	}
	getch();
}
void transf(void)			//转账
{
   
	Account acc = {
   };
	Msg msg = {
   114};
	printf("请输入转帐金额:");
	scanf("%lf",&acc.money);
	getchar();
	acc.user = online;	
	msg.acc = acc;
	msg.flag = 0;
	msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);

	Msg msg2 = {
   };
	// 接收消息
	msgrcv(msgid_stoc,&msg2,sizeof(Msg),224,MSG_NOERROR);
	if(msg2.flag == 0)
	{
   
		printf("请输入要转帐的帐号:");
		scanf("%ld",&acc.user);
		getchar();
		msg.acc = acc;
		msg.flag = 1;
		msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);
		
		// 接收消息
		msgrcv(msgid_stoc,&msg2,sizeof(Msg),224,MSG_NOERROR);
		
		if(msg2.flag == 2)  printf("转帐成功\n");
		else printf("转帐失败\n");
	}
	else
	{
   
		printf("余额不足\n");
	}
	getch();
}
void select_money(void)			//余额查询
{
   
	Account acc = {
   };
	Msg msg = {
   115};
	acc.user = online;	
	msg.acc = acc;
	msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);

	Msg msg2 = {
   };
	// 接收消息
	msgrcv(msgid_stoc,&msg2,sizeof(Msg),225,MSG_NOERROR);
	if(msg2.acc.user == online)
	{
   
		printf("余额:%.2lf\n",msg2.acc.money);
	}
	else
	{
   
		printf("查询失败\n");
	}
	getch();
}
void change_pw(void)			//修改密码
{
   
	Account acc = {
   };
	Msg msg = {
   116};
	printf("请输入新密码:");
	get_pw(acc.pw,true,L_PW);
	acc.user = online;	
	msg.acc = acc;
	msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);

	Msg msg2 = {
   };
	// 接收消息
	msgrcv(msgid_stoc,&msg2,sizeof(Msg),226,MSG_NOERROR);
	if(msg2.acc.user == online)
	{
   
		printf("\n改密成功\n");
	}
	else
	{
   
		printf(
  • 18
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值