本项目使用模块化编程、使用数据结构:线性表,模拟实现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
#include
#include
#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
#include
#include
#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;
}