900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > C语言-银行系统的简单实现(存钱 取钱 保存用户信息 销户 开户 转账 查询等功能

C语言-银行系统的简单实现(存钱 取钱 保存用户信息 销户 开户 转账 查询等功能

时间:2021-08-01 16:37:17

相关推荐

C语言-银行系统的简单实现(存钱 取钱 保存用户信息 销户 开户 转账 查询等功能

主要分为两人大模块:

客户端

1、进入时的功能开户、销户、登录、解锁

开户:输入姓名、身份证号、设置密码,如果开户成功,则服务器上保存一个账号信号(一个账号存一个文件,文件名建议是账号)。

销户:输入帐号、密码,服务器询问是否确认销户,如果确认则服务器删除帐号文件,并记录帐号。

登录:输入账号、密码,三次错误账号锁定。

解锁:输入账号、身份证号解锁。

2、登录成功:存钱、取钱、转账、查询、修改密码

存钱:输入存钱金额

取钱:输入取钱金额

转账:目标帐号和要转的金额

查询:不需要输入数据

修改密码:原密码和新密码

服务器

如果识别功能:根据消息的类型识别客户端请求的功能。

开启服务各项功能的子进程

各进程按照消息类型接收消息

Makefile

FLAG=-WerrorSTD=-std=gnu99CC=gccall:$(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 unlockclean: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("\n改密失败\n");}getch();}void destory(void)//销户{Account acc = {};Msg msg = {117};printf("请输入销户帐号:");scanf("%ld",&acc.user);getchar();printf("请输入姓名:");get_str(acc.name,L_NAME);printf("请输入身份证:");get_str(acc.id,L_ID);msg.acc = acc;msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);Msg msg2 = {};// 接收消息msgrcv(msgid_stoc,&msg2,sizeof(Msg),227,MSG_NOERROR);if(msg2.acc.user == 0){printf("销户成功\n");}else if(msg2.acc.user == 1){printf("相关信息错误\n");}else if(msg2.acc.user == 2){printf("帐号不存在\n");}getch();}void unlock(void)//解锁{if(lock < 3){printf("您没有被锁定,sorry\n");getchar();return;}Account acc = {};Msg msg = {118};printf("请输入帐号:");scanf("%ld",&acc.user);getchar();printf("请输入姓名:");get_str(acc.name,20);printf("请输入身份证:");get_str(acc.id,L_ID);msg.acc = acc;msgsnd(msgid_ctos,&msg,sizeof(Msg)-sizeof(msg.type),0);Msg msg2 = {};// 接收消息msgrcv(msgid_stoc,&msg2,sizeof(Msg),228,MSG_NOERROR);printf("in:%ld,back:%ld\n",acc.user,msg2.acc.user);if(acc.user == msg2.acc.user){printf("%ld,解锁成功\n",acc.user);lock = 0;online = acc.user;change_pw();}else{printf("相关信息错误\n");getch();}}void user_menu(void){while(true){system("clear");printf("===0===0=阿强银行=0===0===\n");printf("# 1.存钱 #\n");printf("# 2.取钱 #\n");printf("# 3.转帐 #\n");printf("# 4.查询 #\n");printf("# 5.改密 #\n");printf("# 0.返回 #\n");printf("--------------------------\n");switch(get_cmd('0','5')){case '1':save(); break;case '2':take(); break;case '3':transf(); break;case '4':select_money(); break;case '5':change_pw();break;case '0':return;}}}void menu(void){while(true){system("clear");printf("===0===0=阿强银行=0===0===\n");printf("# 1.开户 #\n");printf("# 2.销户 #\n");printf("# 3.登录 #\n");printf("# 4.解锁 #\n");printf("# 0.退出 #\n");printf("--------------------------\n");switch(get_cmd('0','4')){case '1':open_acc(); break;case '2':destory(); break;case '3':login(); break;case '4':unlock(); break;case '0':return;}}}

server.c 系统端

#include <stdio.h>#include <unistd.h>#include <signal.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/wait.h>#include "struct.h"#include "tools.h"#define ID_NUM 9// 2个消息队列static int msgid_ctos;static int msgid_stoc;// 存储子进程IDstatic pid_t sub_pid[ID_NUM];void sigint(int sig){// 对msqid标识的消息队列执行cmd操作msgctl(msgid_ctos,IPC_RMID,NULL);msgctl(msgid_stoc,IPC_RMID,NULL);int i;for(i=0; i<ID_NUM; i++){kill(sub_pid[i],SIGKILL);}}int main(){// 注册信号 signal(SIGINT,sigint);msgctl(msgid_ctos,IPC_RMID,NULL);msgctl(msgid_stoc,IPC_RMID,NULL);// IPC_CREAT 创建消息队列,IPC_EXCL 如果存在则创建失败// IPC键值,由ftok函数自动生成msgid_ctos = msgget(ftok(".",100),IPC_CREAT|IPC_EXCL|0644);msgid_stoc = msgget(ftok(".",200),IPC_CREAT|IPC_EXCL|0644);// 创建一个新的进程sub_pid[0] = vfork();if(0 == sub_pid[0]){execl("login","login",NULL);printf("登陆子进程创建成功...\n");}sub_pid[1] = vfork();if(0 == sub_pid[1]){execl("open","open",NULL);printf("开户子进程创建成功...\n");}sub_pid[2] = vfork();if(0 == sub_pid[2]){execl("save","save",NULL);}sub_pid[3] = vfork();if(0 == sub_pid[3]){execl("take","take",NULL);}sub_pid[4] = vfork();if(0 == sub_pid[4]){execl("transf","transf",NULL);}sub_pid[5] = vfork();if(0 == sub_pid[5]){execl("select","select",NULL);}sub_pid[6] = vfork();if(0 == sub_pid[6]){execl("change","change",NULL);}sub_pid[7] = vfork();if(0 == sub_pid[7]){execl("destory","destory",NULL);}sub_pid[8] = vfork();if(0 == sub_pid[8]){execl("unlock","unlock",NULL);}//等待子进程的退出while(-1 != wait(NULL));}

open.c 开户

#include <stdio.h>#include <unistd.h>#include <signal.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>#include <dirent.h>#include <sys/stat.h>#include <fcntl.h>#include "struct.h"#include "tools.h"long user=0;//帐号ID//将一个新帐号 存到文件中int createUser(Account acc){char filename[L_PATH]={"./data/"};//为每个帐号建立一个文件sprintf(filename,"./data/%ld.dat",user);acc.user = user;acc.money = 0;int fd = open(filename,O_CREAT|O_RDWR|O_EXCL,0644);if(fd == -1){printf(" %ld ",user);perror("创建帐户文件失败");return -1;}if(write(fd,&acc,sizeof(Account)) < 0){return -1;}close(fd);printf("创建用户成功\n");return 0;}int main(){int msgid_ctos = msgget(ftok(".",100),IPC_CREAT|0644);if(0 > msgid_ctos){perror("msgget");return -1;}int msgid_stoc = msgget(ftok(".",200),IPC_CREAT|0644);if(0 > msgid_stoc){perror("msgget");return -1;}for(;;){Msg msg = {};// 接收消息msgrcv(msgid_ctos,&msg,sizeof(Msg),111,MSG_NOERROR);printf("name:%s\n",msg.acc.name);printf("id:%s\n",msg.acc.id);printf("pw:%s\n",msg.acc.pw);printf("user:%ld\n",user);char name[L_NAME] = {};strcpy(name,msg.acc.name);DIR* dir = opendir("./data");for(struct dirent* d = readdir(dir); NULL!=d; d=readdir(dir)){user++;}user--;int result = createUser(msg.acc);Msg msg2 = {221};if(0==result){strcpy(msg2.acc.name,name);msg2.acc.user = user;user++;msg2.acc.money = 0;}else{char temp[L_PATH] = "error";strcat(temp,name);strcpy(msg2.acc.name,temp);}printf("name:%s,msg2:%s\n",name,msg2.acc.name);msgsnd(msgid_stoc,&msg2,sizeof(Msg)-sizeof(msg2.type),0);}pause();}

destory.c 销户

#include <stdio.h>#include <unistd.h>#include <signal.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "struct.h"#include "tools.h"//销户int del(Account acc){char path[L_PATH] = "./data/";char ex[L_PATH] = ".dat";sprintf(path,"%s%ld%s",path,acc.user,ex);if(0 == access(path,F_OK)){Account buf = {};int fd = open(path,O_RDWR);if(0 != read(fd,&buf,sizeof(Account))){if(strcmp(acc.name,buf.name) == 0 && strcmp(acc.id,buf.id) == 0){close(fd);remove(path);printf("销户成功\n");return 0;}else{printf("输入信息有误\n");close(fd);return -1;}}else{printf("读取信息失败\n");return -2;}}else{printf("此帐号不存在\n");return -2;}}int main(){int msgid_ctos = msgget(ftok(".",100),IPC_CREAT|0644);if(0 > msgid_ctos){perror("msgget");return -1;}int msgid_stoc = msgget(ftok(".",200),IPC_CREAT|0644);if(0 > msgid_stoc){perror("msgget");return -1;}long user = 0;for(;;){Msg msg = {};// 接收消息msgrcv(msgid_ctos,&msg,sizeof(Msg),117,MSG_NOERROR);printf("user:%ld\n",msg.acc.user);printf("name:%s\n",msg.acc.name);printf("id:%s\n",msg.acc.id);int result = del(msg.acc);Msg msg2 = {227};if(result == 0){msg2.acc.user = 0;}else if(result == -1){msg2.acc.user = 1;}else{msg2.acc.user = 2;}msgsnd(msgid_stoc,&msg2,sizeof(Msg)-sizeof(msg2.type),0);}pause();}

login.c 登陆

#include <stdio.h>#include <unistd.h>#include <signal.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "struct.h"#include "tools.h"//登录int login(Account acc){char path[L_PATH] = "./data/";char ex[L_PATH] = ".dat";sprintf(path,"%s%ld%s",path,acc.user,ex);if(0 == access(path,F_OK)){Account buf = {};int fd = open(path,O_RDWR);if(0 != read(fd,&buf,sizeof(Account))){if((acc.user == buf.user) && strcmp(acc.pw,buf.pw) == 0){close(fd);printf("登陆成功\n");return 0;}else{printf("帐号或密码错误\n");close(fd);return -1;}}else{printf("读取信息失败\n");return -1;}}else{printf("此帐号不存在\n");return -1;}}int main(){int msgid_ctos = msgget(ftok(".",100),IPC_CREAT|0644);if(0 > msgid_ctos){perror("msgget");return -1;}int msgid_stoc = msgget(ftok(".",200),IPC_CREAT|0644);if(0 > msgid_stoc){perror("msgget");return -1;}long user = 0;for(;;){Msg msg = {};// 接收消息msgrcv(msgid_ctos,&msg,sizeof(Msg),110,MSG_NOERROR);printf("user:%ld\n",msg.acc.user);printf("pw:%s\n",msg.acc.pw);user = msg.acc.user;int result = login(msg.acc);Msg msg2 = {220};if(result == 0){msg2.acc.user = user;}else{msg2.acc.user = user + 1;}msgsnd(msgid_stoc,&msg2,sizeof(Msg)-sizeof(msg2.type),0);}pause();}

save.c 存钱

#include <stdio.h>#include <unistd.h>#include <signal.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "struct.h"#include "tools.h"//存钱int save(Account acc){char path[L_PATH] = "./data/";char ex[L_PATH] = ".dat";sprintf(path,"%s%ld%s",path,acc.user,ex);Account buf = {};int fd = open(path,O_RDWR);if(0 != read(fd,&buf,sizeof(Account))){printf("原:%.2lf,",buf.money);buf.money += acc.money;printf("现:%.2lf\n",buf.money);close(fd);fd = open(path,O_RDWR);if(write(fd,&buf,sizeof(Account)) < 0){printf("写入失败\n");return -1;}else{printf("写入成功\n");printf("余额:%.2lf元\n",buf.money);return 0;}}else{printf("读取数据丢失\n");return -1;}}int main(){int msgid_ctos = msgget(ftok(".",100),IPC_CREAT|0644);if(0 > msgid_ctos){perror("msgget");return -1;}int msgid_stoc = msgget(ftok(".",200),IPC_CREAT|0644);if(0 > msgid_stoc){perror("msgget");return -1;}long user = 0;for(;;){Msg msg = {};// 接收消息msgrcv(msgid_ctos,&msg,sizeof(Msg),112,MSG_NOERROR);printf("user:%ld\n",msg.acc.user);printf("money:%lf\n",msg.acc.money);user = msg.acc.user;int result = save(msg.acc);Msg msg2 = {222};if(result == 0){msg2.acc.user = user;}else{msg2.acc.user = user + 1;}msgsnd(msgid_stoc,&msg2,sizeof(Msg)-sizeof(msg2.type),0);}pause();}

select.c 查询余额

#include <stdio.h>#include <unistd.h>#include <signal.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "struct.h"#include "tools.h"//查询余额double select_money(Account acc){char path[L_PATH] = "./data/";char ex[L_PATH] = ".dat";sprintf(path,"%s%ld%s",path,acc.user,ex);Account buf = {};int fd = open(path,O_RDWR);if(0 != read(fd,&buf,sizeof(Account))){printf("现:%.2lf\n",buf.money);close(fd);return buf.money;}else{printf("读取数据丢失\n");return -1;}}int main(){int msgid_ctos = msgget(ftok(".",100),IPC_CREAT|0644);if(0 > msgid_ctos){perror("msgget");return -1;}int msgid_stoc = msgget(ftok(".",200),IPC_CREAT|0644);if(0 > msgid_stoc){perror("msgget");return -1;}long user = 0;for(;;){Msg msg = {};// 接收消息msgrcv(msgid_ctos,&msg,sizeof(Msg),115,MSG_NOERROR);printf("user:%ld\n",msg.acc.user);user = msg.acc.user;double result = select_money(msg.acc);Msg msg2 = {225};if(result != -1){msg2.acc.user = user;msg2.acc.money = result;}else{msg2.acc.user = user + 1;}msgsnd(msgid_stoc,&msg2,sizeof(Msg)-sizeof(msg2.type),0);}pause();}

change.c 修改密码

#include <stdio.h>#include <unistd.h>#include <signal.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "struct.h"#include "tools.h"int change(Account acc){char path[L_PATH] = "./data/";char ex[L_PATH] = ".dat";sprintf(path,"%s%ld%s",path,acc.user,ex);Account buf = {};int fd = open(path,O_RDWR);if(0 != read(fd,&buf,sizeof(Account))){printf("原:%s,",buf.pw);strcpy(buf.pw,acc.pw);printf("现:%s\n",buf.pw);close(fd);fd = open(path,O_RDWR);if(write(fd,&buf,sizeof(Account)) < 0){printf("写入失败\n");return -1;}else{printf("写入成功\n");printf("新密码:%s\n",buf.pw);return 0;}}else{printf("读取数据丢失\n");return -1;}}int main(){int msgid_ctos = msgget(ftok(".",100),IPC_CREAT|0644);if(0 > msgid_ctos){perror("msgget");return -1;}int msgid_stoc = msgget(ftok(".",200),IPC_CREAT|0644);if(0 > msgid_stoc){perror("msgget");return -1;}long user = 0;for(;;){Msg msg = {};// 接收消息msgrcv(msgid_ctos,&msg,sizeof(Msg),116,MSG_NOERROR);printf("user:%ld\n",msg.acc.user);printf("pw:%s\n",msg.acc.pw);user = msg.acc.user;int result = change(msg.acc);Msg msg2 = {226};if(result == 0){msg2.acc.user = user;}else{msg2.acc.user = user + 1;}msgsnd(msgid_stoc,&msg2,sizeof(Msg)-sizeof(msg2.type),0);}pause();}

take.c 取钱

#include <stdio.h>#include <unistd.h>#include <signal.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "struct.h"#include "tools.h"//取钱int take(Account acc){char path[L_PATH] = "./data/";char ex[L_PATH] = ".dat";sprintf(path,"%s%ld%s",path,acc.user,ex);Account buf = {};int fd = open(path,O_RDWR);if(0 != read(fd,&buf,sizeof(Account))){if(acc.money > buf.money){printf("余额不足\n");return -2;}printf("原:%.2lf,",buf.money);buf.money -= acc.money;printf("现:%.2lf\n",buf.money);close(fd);fd = open(path,O_RDWR);if(write(fd,&buf,sizeof(Account)) < 0){printf("写入失败\n");return -1;}else{printf("写入成功\n");printf("余额:%.2lf元\n",buf.money);return 0;}}else{printf("读取数据丢失\n");return -1;}}int main(){//通过相同的IPC键值来达到访问同一消息队列的目的int msgid_ctos = msgget(ftok(".",100),IPC_CREAT|0644);if(0 > msgid_ctos){perror("msgget");return -1;}int msgid_stoc = msgget(ftok(".",200),IPC_CREAT|0644);if(0 > msgid_stoc){perror("msgget");return -1;}long user = 0;for(;;){Msg msg = {};// 接收消息msgrcv(msgid_ctos,&msg,sizeof(Msg),113,MSG_NOERROR);printf("user:%ld\n",msg.acc.user);printf("money:%lf\n",msg.acc.money);user = msg.acc.user;int result = take(msg.acc);Msg msg2 = {223};if(result == 0){msg2.acc.user = user;}else if(result == -1){msg2.acc.user = user + 1;}else{msg2.acc.user = user + 2;}//最后将处理后的消息传回msgsnd(msgid_stoc,&msg2,sizeof(Msg)-sizeof(msg2.type),0);}pause();}

tools.c 工具函数

#include"tools.h"//清空输入缓存区void clear_stdin(void){stdin->_IO_read_ptr = stdin->_IO_read_end;}//对输入的字符串进行处理char* get_str(char* str,size_t len){if(NULL==str)//为空返回{perror("str");return NULL;}char *in = fgets(str,len,stdin);//获取输入指定的长度的字符串size_t cnt = strlen(str);if('\n'==str[cnt-1])//将指定长度的最后一位进行截断{str[cnt-1]='\0';}clear_stdin();//清空多余的字符return str;//返回处理好的字符串}//获取命令char get_cmd(char start,char end){clear_stdin();printf("请输入指令:");while(true){char val = getch();if(val>=start && val<=end){printf("%c\n",val);return val;}}}//输入密码的处理//passwd输入 is_show是否显示 size 长度限制char* get_pw(char* passwd,bool is_show,size_t size){if(NULL==passwd) return NULL;//为空返回int count = 0;//记录字符的个数do{char val = getch();if(127==val)//ascii 127 为退格{if(count>0){if(is_show) printf("\b \b");//显示的话要把上一个字符覆盖count--;}continue;}else if(10==val)//10为回车符 结束标志{break;}passwd[count++]=val;if(is_show) printf("*");}while(count<size-1);passwd[count]='\0';return passwd;}

transf.c 转账

#include <stdio.h>#include <unistd.h>#include <signal.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "struct.h"#include "tools.h"long user = 0;//帐号int transf_a(Account acc){char path[L_PATH] = "./data/";char ex[L_PATH] = ".dat";sprintf(path,"%s%ld%s",path,acc.user,ex);Account buf = {};int fd = open(path,O_RDWR);if(0 != read(fd,&buf,sizeof(Account))){printf("余额:%.2lf,",buf.money);if(buf.money < acc.money){printf("余额不足\n");return -1;}else{user = acc.user;return 0;}}else{printf("读取数据丢失\n");return -1;}}int transf_b(Account acc){char path1[L_PATH] = "./data/";char ex1[L_PATH] = ".dat";sprintf(path1,"%s%ld%s",path1,acc.user,ex1);if(0 == access(path1,F_OK)){char path[L_PATH] = "./data/";char ex[L_PATH] = ".dat";sprintf(path,"%s%ld%s",path,user,ex);Account buf = {};int fd = open(path,O_RDONLY);if(0 != read(fd,&buf,sizeof(Account))){//printf("余额:%.2lf\n",buf.money);}else{printf("读取数据丢失\n");}Account buf1 = {};int fd1 = open(path1,O_RDWR);if(0 != read(fd1,&buf1,sizeof(Account))){buf1.money += acc.money;buf.money -= acc.money;close(fd);close(fd1);fd1 = open(path1,O_RDWR);if(write(fd1,&buf1,sizeof(Account)) < 0){printf("写入对方数据失败\n");return -2;}else{printf("转帐成功\n");}fd = open(path,O_RDWR);if(write(fd,&buf,sizeof(Account)) < 0){printf("写入自身数据失败\n");return -2;}else{printf("余额:%.2lf\n",buf.money);return 2;}close(fd);close(fd1);}else{printf("读取对方数据丢失\n");return -2;}}else{printf("对方账号不存在\n");return -2;}}int main(){int msgid_ctos = msgget(ftok(".",100),IPC_CREAT|0644);if(0 > msgid_ctos){perror("msgget");return -1;}int msgid_stoc = msgget(ftok(".",200),IPC_CREAT|0644);if(0 > msgid_stoc){perror("msgget");return -1;}long user1 = 0,user2 = 0;for(;;){Msg msg = {};// 接收消息msgrcv(msgid_ctos,&msg,sizeof(Msg),114,MSG_NOERROR);if(msg.flag == 0){printf("转帐帐号:%ld\n",msg.acc.user);printf("转帐金额:%.2lf\n",msg.acc.money);user1 = msg.acc.user;int result = transf_a(msg.acc);Msg msg2 = {224};if(result == 0){msg2.acc.user = user1;msg2.flag = 0;}else{msg2.flag = -1;}msgsnd(msgid_stoc,&msg2,sizeof(Msg)-sizeof(msg2.type),0);}else{printf("帐向帐号:%ld\n",msg.acc.user);printf("转帐金额:%.2lf\n",msg.acc.money);user2 = msg.acc.user;int result = transf_b(msg.acc);Msg msg2 = {224};if(result != -2){msg2.acc.user = user2;msg2.flag = 2;}else{msg2.flag = -2;}msgsnd(msgid_stoc,&msg2,sizeof(Msg)-sizeof(msg2.type),0);}}pause();}

unlock.c 解锁

#include <stdio.h>#include <unistd.h>#include <signal.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "struct.h"#include "tools.h"int unlock(Account acc){char path[L_PATH] = "./data/";char ex[L_PATH] = ".dat";sprintf(path,"%s%ld%s",path,acc.user,ex);if(0 == access(path,F_OK)){Account buf = {};int fd = open(path,O_RDWR);if(0 != read(fd,&buf,sizeof(Account))){if(strcmp(acc.name,buf.name) == 0 && strcmp(acc.id,buf.id) == 0){close(fd);printf("解锁成功\n");return 0;}else{printf("姓名或身份证错误\n");close(fd);return -1;}}else{close(fd);printf("读取信息失败\n");return -1;}}else{printf("此帐号不存在\n");return -1;}}int main(){int msgid_ctos = msgget(ftok(".",100),IPC_CREAT|0644);if(0 > msgid_ctos){perror("msgget");return -1;}int msgid_stoc = msgget(ftok(".",200),IPC_CREAT|0644);if(0 > msgid_stoc){perror("msgget");return -1;}long user = 0;for(;;){Msg msg = {};// 接收消息msgrcv(msgid_ctos,&msg,sizeof(Msg),118,MSG_NOERROR);printf("user:%ld\n",msg.acc.user);printf("name:%s\n",msg.acc.name);printf("id:%s\n",msg.acc.id);user = msg.acc.user;int result = unlock(msg.acc);Msg msg2 = {228};if(result == 0){msg2.acc.user = user;printf("msg2:%ld\n",msg2.acc.user);}else{msg2.acc.user = user + 1;printf("msg2:%ld\n",msg2.acc.user);}msgsnd(msgid_stoc,&msg2,sizeof(Msg)-sizeof(msg2.type),0);}pause();}

tools.h 工具函数头文件

#ifndef TOOLS_H#define TOOLS_H#include <stdio.h>#include <string.h>#include <getch.h>#include <stdbool.h>void clear_stdin(void);//清空输入缓存区char* get_str(char* str,size_t len);//对输入的字符串进行处理char get_cmd(char start,char end);//获取命令char* get_pw(char* passwd,bool is_show,size_t size);//输入密码的处理#endif//TOOLS_H

struct.h 结构体头文件

#ifndef STRUCT_H#define STRUCT_H#define L_NAME 20//姓名长度#define L_ID 20//身份证号长度#define L_PW 20//密码长度#define L_PATH 20//文件名长度typedef struct Account{long user;//帐号char name[L_NAME];//姓名char id[L_ID];//身份证号char pw[L_PW];//密码double money;//金额}Account;typedef struct Msg//消息结构体{long type;//消息类型int flag;Account acc;//用户结构体}Msg;#endif//STRUCT_H

这个项目还有很多可以优化的地方,之后学习了socket套接字之后可以实现不同主机之间的通信。希望做的更好。

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。