C语言模块化编程、数据结构,模拟实现ATM存取款系统

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 
#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;
}

你可能感兴趣的:(C语言,数据结构,模块化编程,数据结构,c语言)