C语言模块化编程、数据结构,模拟实现ATM存取款系统
2020-02-11 16:25
621 查看
C语言模块化编程、数据结构,模拟实现ATM存取款系统
本项目使用模块化编程、使用数据结构:线性表,模拟实现ATM存取款系统。
银行ATM存取款系统:
银行ATM存取款系统能为用户提供存款、取款、查询、转账和修改密码的功能。为了模拟真实的ATM业务环境,本系统必须实现存款、取款、查询、转账、修改密码以及开户的功能。用户通过开户业务在本系统开立银行账户,之后可以通过该银行账户登陆ATM系统,在系统中实现存款、取款、查询账户信息、修改密码的操作。本系统各个业务有如下注意点:
(1) 登陆系统
用户登陆之前,必须在登陆界面输入其银行账户,通过其正确输入的银行账户登陆系统。
(2) 开户业务
要使用本系统必须首先执行开户业务开立新的银行账户,并且将此新开的银行存储于文件当中。同时,系统以身份证号码作为开户的充分条件,即一个身份证号码只能开立一次银行账户。
(3) 存款业务
客户登陆系统后,选择存款业务,即可以将输入的存款金额存入相应的账户。
(4) 取款业务
客户登陆系统后,选择取款业务,即可以将输入的取款金额从相应的银行账户取出,但是取款金额必须大于目前的账户余额。
(5) 查询业务
客户登陆系统后,可以选择查询业务,查询账户余额。
(6) 转账业务
客户登陆系统后,可以选择转账业务,进行转账。注意的是转账的目的账户必须是本系统已经存在的银行账户。
(7) 修改密码
客户登陆系统后,可以选择修改密码业务,进行密码修改。
源代码:
/* * user.h * 详情:用户模块头文件 */ #ifndef __USER_H__ #define __USER_H__ struct user; /* * 功能: 创建指向所有用户的指针,并将文件中的所有用户读出到指针所指向的堆内存中 * * 参数: 无 * * 返回值: 指向所有用户的指针 */ struct user *user_init(); /* * 功能: 检查用户账号是否存在 * * 参数: user:指向所有用户的指针 * id_card[18]:要检查的用户账号 * * 返回值: 0:该账号不存在 * 1:该账号存在 */ int user_check_id(struct user *user, char *id_card); /* * 功能: 检查用户账号和密码是否存在(登录用) * * 参数: user:指向所有用户的指针 * id_card[18]:要检查的用户账号 * password:要检查的账户密码 * * 返回值: 0:该账号和密码不存在 * 1:该账号和密码存在 */ int user_check_user(struct user *user, char *id_card, int password); /* * 功能: 向用户存储结构中添加一个用户(注册用),同时文件保存 * * 参数: user:指向所有用户的指针 * id_card[18]:要添加的用户账号 * password:要添加的账户密码 * * 返回值: 无 */ void user_put(struct user *user, char *id_card, int password); /* * 功能: 修改指定账户的密码,同时文件保存 * * 参数: user:指向所有用户的指针 * id_card:要修改的用户账号 * password:要修改的账户的密码 * new_password:修改后的密码 * * 返回值: 0:该账号和密码不存在,修改密码失败 * 1:该账号和密码存在,修改密码成功 */ int change_password(struct user *user, char *id_card, int password, int new_password); /* * 功能: 向指定用户转账,同时文件保存 * * 参数: user:指向所有用户的指针 * id_card:要转入的用户账号 * money:要转入的金额 * * 返回值: 0:该账号不存在,转账失败 * 1:该账号存在,转账成功 */ int transfer_get_money(struct user *user, char *id_card, int money); /* * 功能: 从指定账户中取出金额,同时文件保存 * * 参数: user:指向所有用户的指针 * id_card:要取钱的用户账号 * password:要取钱的账户的密码 * money:要取出的金额 * * 返回值: 0:该账号不存在,取出失败 * 1:该账号存在,取出成功 */ int out_money(struct user *user, char *id_card, int password, int money); /* * 功能: 查询指定账户的余额 * * 参数: user:指向所有用户的指针 * id_card:要查余的用户账号 * password:要查余的账户的密码 * * 返回值: != -1:该账户的余额 * -1:该账号不存在,查询失败 */ int get_money(struct user *user, char *id_card, int password); /* * 功能: 向指定账户中存入金额,同时文件保存 * * 参数: user:指向所有用户的指针 * id_card:要存钱的用户账号 * password:要存钱的账户的密码 * money:要存入的金额 * * 返回值: 0:该账号不存在,存入失败 * 1:该账号存在,存入成功 */ int put_money(struct user *user, char *id_card, int password, int money); /* * 功能:释放堆内存中的所有用户,并释放指针 * * 参数:user:指向所有用户的指针 * * 返回值: 无 */ void user_free(struct user *user); #endif /*__USER_H__*/
/* * user.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "user.h" #define USER_INIT_SIZE 1 /*存储结构初始值*/ #define USER_INCR_SIZE 1 /*存储结构每次扩充值*/ /*用户信息*/ struct element { char id_card[18]; int password; int money; }; /*结构头部*/ struct user { struct element *element; int count; int size; }; /* * 功能: 将所有用户信息存入文件中(内部函数) * * 参数: user:指向所有用户的指针 * * 返回值: 无 */ static void save_user(struct user *user) { FILE * fp; struct element e; fp=fopen("myfile.dat","w"); fclose(fp); if((fp=fopen("myfile.dat","ab+"))==NULL) return; int i; for(i=0; i<user->count; i++) { e = user->element[i]; fwrite(&e,sizeof(struct element),1,fp); } fclose(fp); return; } /* * 功能: 向用户存储结构中添加一个用户(内部函数) * * 参数: user:指向所有用户的指针 * e:用户信息结构体 * * 返回值: 无 */ static void user_add(struct user *user, struct element e) { if (user->count == user->size) { user->element = (struct element *)realloc(user->element, (user->size + USER_INCR_SIZE) * sizeof(struct element)); if (user->element == NULL) { perror("user_add_element realloc error!"); exit(1); } user->size += USER_INCR_SIZE; } user->element[user->count] = e; user->count++; return; } /* * 功能: 创建指向所有用户的指针,并将文件中的所有用户读出到指针所指向的堆内存中 * * 参数: 无 * * 返回值: 指向所有用户的指针 */ struct user *user_init() { FILE *fp; struct element e; struct user *user = NULL; user = (struct user *)malloc(sizeof(struct user)); if (user == NULL) return NULL; user->element = NULL; user->count = 0; user->size = 0; user->element = (struct element *)malloc(sizeof(struct element) * USER_INIT_SIZE); if (user->element == NULL) { free(user); return NULL; } user->size = USER_INIT_SIZE; memset(user->element, 0, sizeof(struct element) * USER_INIT_SIZE); if((fp=(fopen("myfile.dat","ab+")))==NULL) return; if(fgetc(fp) == EOF) { fclose(fp); return user; } rewind(fp); while (1) { fread(&e,sizeof(struct element),1,fp); if(feof(fp)) break; user_add(user, e); } fclose(fp); return user; } /* * 功能: 检查用户账号是否存在 * * 参数: user:指向所有用户的指针 * id_card[18]:要检查的用户账号 * * 返回值: 0:该账号不存在 * 1:该账号存在 */ int user_check_id(struct user *user, char id_card[18]) { int i; struct element e; for(i=0; i<user->count; i++) { e = user->element[i]; if(strcmp(e.id_card, id_card) == 0) { return 1; } } return 0; } /* * 功能: 检查用户账号和密码是否存在(登录用) * * 参数: user:指向所有用户的指针 * id_card[18]:要检查的用户账号 * password:要检查的账户密码 * * 返回值: 0:该账号和密码不存在 * 1:该账号和密码存在 */ int user_check_user(struct user *user, char *id_card, int password) { int i; struct element e; for(i=0; i<user->count; i++) { e = user->element[i]; if(strcmp(e.id_card, id_card) == 0) { if(e.password == password) return 1; } } return 0; } /* * 功能: 向用户存储结构中添加一个用户(注册用),同时文件保存 * * 参数: user:指向所有用户的指针 * id_card[18]:要添加的用户账号 * password:要添加的账户密码 * * 返回值: 无 */ void user_put(struct user *user, char id_card[18], int password) { struct element e; strcpy(e.id_card, id_card); e.password = password; e.money = 0; user_add(user, e); save_user(user); return; } /* * 功能: 修改指定账户的密码,同时文件保存 * * 参数: user:指向所有用户的指针 * id_card:要修改的用户账号 * password:要修改的账户的密码 * new_password:修改后的密码 * * 返回值: 0:该账号和密码不存在,修改密码失败 * 1:该账号和密码存在,修改密码成功 */ int change_password(struct user *user, char *id_card, int password, int new_password) { int i; struct element e; for(i=0; i<user->count; i++) { e = user->element[i]; if(strcmp(e.id_card, id_card) == 0 && e.password == password) { user->element[i].password = new_password; save_user(user); return 1; } } return 0; } /* * 功能: 向指定用户转账,同时文件保存 * * 参数: user:指向所有用户的指针 * id_card:要转入的用户账号 * money:要转入的金额 * * 返回值: 0:该账号不存在,转账失败 * 1:该账号存在,转账成功 */ int transfer_get_money(struct user *user, char *id_card, int money) { int i; struct element e; for(i=0; i<user->count; i++) { e = user->element[i]; if(strcmp(e.id_card, id_card) == 0) { user->element[i].money += money; save_user(user); return 1; } } return 0; } /* * 功能: 从指定账户中取出金额,同时文件保存 * * 参数: user:指向所有用户的指针 * id_card:要取钱的用户账号 * password:要取钱的账户的密码 * money:要取出的金额 * * 返回值: 0:该账号不存在,取出失败 * 1:该账号存在,取出成功 */ int out_money(struct user *user, char *id_card, int password, int money) { int i; struct element e; for(i=0; i<user->count; i++) { e = user->element[i]; if(strcmp(e.id_card, id_card) == 0) { if (e.password == password) if(e.money >= money) { user->element[i].money -= money; save_user(user); return 1; } } } return 0; } /* * 功能: 查询指定账户的余额 * * 参数: user:指向所有用户的指针 * id_card:要查余的用户账号 * password:要查余的账户的密码 * * 返回值: != -1:该账户的余额 * -1:该账号不存在,查询失败 */ int get_money(struct user *user, char *id_card, int password) { int i; struct element e; for(i=0; i<user->count; i++) { e = user->element[i]; if(strcmp(e.id_card, id_card) == 0) { if(e.password == password) return e.money; else return -1; } } } /* * 功能: 向指定账户中存入金额,同时文件保存 * * 参数: user:指向所有用户的指针 * id_card:要存钱的用户账号 * password:要存钱的账户的密码 * money:要存入的金额 * * 返回值: 0:该账号不存在,存入失败 * 1:该账号存在,存入成功 */ int put_money(struct user *user, char *id_card, int password, int money) { int i; struct element e; for(i=0; i<user->count; i++) { e = user->element[i]; if(strcmp(e.id_card, id_card) == 0) { if(e.password == password) { user->element[i].money += money; save_user(user); return 1; } } } return 0; } /* * 功能:释放堆内存中的所有用户,并释放指针 * * 参数:user:指向所有用户的指针 * * 返回值: 无 */ void user_free(struct user *user) { free(user->element); free(user); return; }
/* * main.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "user.h" struct user *user = NULL; /*所有用户*/ char load_id_card[18]; /*当前登录的账户*/ int load_password; /*当前登录账户的密码*/ /*身份证号输入检查功能函数*/ void input_id_card(char *idCard) { while (1) { printf("请输入您的身份证号码:"); scanf("%s",idCard); int i = 0; while(idCard[i++]!='\0'); if(i == 19) { printf("%s\n", idCard); break; } else { printf("您输入的身份证号码有误,请您重新输入!\n"); } } return; } /*主界面*/ int main_ui() { int in; while(1) { system("cls"); printf("----------------------------\n"); printf(" 1.登录 2.注册 3.退出 \n"); printf("----------------------------\n"); printf("请输入对应操作前的数字:"); scanf("%d",&in); if(in!=1 && in!=2 && in!=3) { printf("您的操作有误,请重新输入!\n"); system("PAUSE"); } else { return in; } } } /*登录成功后显示界面*/ int sign_in_ui() { int in; while(1) { system("cls"); printf("---------------------------------------------\n"); printf(" 1.查询 2.存款 3.取款 4.转帐 5.改密 6.退出 \n"); printf("---------------------------------------------\n"); printf("请输入对应操作前的数字:"); scanf("%d", &in); if(in!=1 && in!=2 && in!=3 && in!=4 && in!=5 && in!=6) { printf("您的操作有误,请重新输入!\n"); system("PAUSE"); } else return in; } } /*查余*/ void inquire() { printf("您的余额为:%d\n", get_money(user, load_id_card, load_password)); system("PAUSE"); } /*存款*/ void deposit() { int money; printf("请输入存入金额:"); scanf("%d", &money); if(put_money(user, load_id_card, load_password, money)) printf("存入成功!\n"); else printf("存入失败!\n"); system("PAUSE"); return; } /*取款 */ void withdrawal() { int money; printf("请输入取出金额:"); scanf("%d", &money); if(out_money(user, load_id_card, load_password, money)) printf("取出成功!\n"); else printf("余额不足!\n"); system("PAUSE"); return; } /*转账*/ void transfer_accounts() { int money; char id[18]; printf("请输入转入账户的身份证:"); scanf("%s", id); int i = 0; while(id[i]!='\0') { i++; } if(i == 18) { if(user_check_id(user,id)) { printf("请输入转账金额:"); scanf("%d",&money); if(out_money(user, load_id_card, load_password, money)) { if (transfer_get_money(user, id, money)) printf("转入成功!\n"); else printf("转入失败!\n"); } else printf("余额不足!\n"); } else printf("您输入的转账账户不存在!\n"); } else printf("您输入的转账账户位数有误!\n"); system("PAUSE"); return; } /*改密*/ void ch_password() { int password; printf("请输入新密码:"); scanf("%d",&password); if(change_password(user, load_id_card, load_password, password)) { printf("修改成功!\n"); load_password = password; } else printf("修改失败!\n"); system("PAUSE"); return; } /*登录成功后的操作*/ void sign_successful() { while(1) { switch(sign_in_ui()) { case 1: inquire(); break; case 2: deposit(); break; case 3: withdrawal(); break; case 4: transfer_accounts(); break; case 5: ch_password(); break; case 6: return; default : break; } } } /*退出*/ void my_exit() { exit(0); return; } /*登录*/ void sign_in() { char id[18]; int password; input_id_card(id); if(user_check_id(user,id)) { printf("请输入密码:"); scanf("%d",&password); if(user_check_user(user, id, password)) { printf("登录成功\n"); system("PAUSE"); strcpy(load_id_card,id); load_password = password; sign_successful(); }else { printf("密码错误!\n"); system("PAUSE"); } } else { printf("您输入的账户不存在!\n"); system("PAUSE"); } return; } /*注册*/ void sign_up() { char id[18]; int password; input_id_card(id); if(user_check_id(user,id)) printf("您输入的账户已存在!\n"); else { printf("请输入密码:"); scanf("%d",&password); user_put(user, id, password); printf("注册成功!\n"); } system("PAUSE"); return; } /*主函数*/ int main(int argc, char *argv[]) { while(1) { user = user_init(); int state = main_ui(); switch(state) { case 1: sign_in();break; case 2: sign_up();break; case 3: my_exit();break; default:break; } user_free(user); } system("PAUSE"); return 0; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- <5>c语言实现ATM存取款系统(文件、排序)
- <3>c语言实现ATM存取款系统(数组实现)
- <4>c语言实现ATM存取款系统(链表)
- <1>c语言实现ATM存取款系统(数组)
- Linux下的C语言编程——系统调用read和write函数实现文件拷贝
- 用C语言控制台程序模拟一个ATM 机存取款流程
- 学生信息管理系统简单模拟(C语言实现)
- 用C语言实现高效嵌入式系统编程
- C语言ATM终端机模拟系统
- 【ATM银行系统 友好视图 模拟存取款】
- C语言模块化编程中如何隐藏结构实现细节
- c语言编程 :模拟实现简单扫雷游戏
- 基于C语言实现的电网建设造价模拟系统
- 金融IT——模拟银行ATM系统Java实现
- 用C语言实现高效嵌入式系统编程
- [c语言]模拟银行atm机,实现存款、取款等业务
- C语言模拟通讯录系统的简单实现
- c语言:模拟实现一个输入密码自动取款的程序
- C语言实现 ATM机存取款系统
- c语言实现数据结构中的栈(数组模拟)