您的位置:首页 > 理论基础 > 数据结构算法

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;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
远筝 发布了2 篇原创文章 · 获赞 3 · 访问量 492 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: