实训项目报告书

 


项目完成人:       刘镇       


一、需求分析:

用例图:

 

 

   

银行存储系统架构图 银行储蓄系统结构图_string

 

 

二、概要设计:

类间关系图:

 

 

银行存储系统架构图 银行储蓄系统结构图_c++_02

 

 

 

三、详细设计:

类图:

 

 

银行存储系统架构图 银行储蓄系统结构图_c++_03

 

 

银行存储系统架构图 银行储蓄系统结构图_null_04

 

银行存储系统架构图 银行储蓄系统结构图_c++_05

 

银行存储系统架构图 银行储蓄系统结构图_银行存储系统架构图_06

 

 

 

 

 

 

银行存储系统架构图 银行储蓄系统结构图_c++_07

 

四、编码实现:

 

//Record.h:

#ifndef HEADER_RECORD                     //条件编译
#define HEADER_RECORD
#include <string>
using namespace std;

class Record
{
private:
	int number;
	string userName;
	string passWord;
    double balance;
	int flag;
public:
	Record();
	void set_number(int number);
	void set_userName(string userName);
	void set_passWord(string passWord);
	void set_balance(double balance);
	void set_flag(int flag);
	int get_number();
	string get_userName();
	string get_passWord();
	double get_balance();
	int get_flag();
	void display_Record();
};
#endif




//Record.cpp:




#include "Record.h"
#include <iostream>
using namespace std;

Record::Record()
{
	this->number = 0;
	this->userName = "";
	this->passWord = "";
	this->balance = 0;
	this->flag = -1;
}

void Record::set_number(int number)
{
	this->number = number;
}

void Record::set_userName(string userName)
{
	this->userName = userName;
}

void Record::set_passWord(string passWord)
{
	this->passWord = passWord;
}

void Record::set_balance(double balance)
{
	this->balance = balance;
}

void Record::set_flag(int flag)
{
	this->flag = flag;
}

int Record::get_number()
{
	return this->number;
}

string Record::get_userName()
{
	return this->userName;
}

string Record::get_passWord()
{
	return this->passWord;
}

double Record::get_balance()
{
	return this->balance;
}

int Record::get_flag()
{
	return this->flag;
}

void Record::display_Record()                         //用于显示打印信息
{
	cout << "打印用户信息中..." << endl;

	cout << "+---------------------------------------+" << endl;
	cout << "|" << "账号" << '\t' << "|" << "户名" << '\t' << "|" << "密码" << '\t' << "|" << "余额" << '\t' << "|" << "状态" << '\t' << "|"<< endl;
	cout << "|----------------------------------------" << endl;
	cout << "|" << this->number << '\t' << "|" << this->userName << '\t' << "|" << this->passWord << '\t' << "|" << this->balance << '\t' << "|" ;

	if(this->flag == 1)
	{
		cout << "正常";
	}
	else
	{
		cout << "销户";
	}

	cout << '\t' << "|" << endl;
	cout << "|---------------------------------------+" << endl;
}


//Node.h:

#ifndef HEADER_NODE
#define HEADER_NODE
#include "Record.h"
using namespace std;

class Node
{
private:
	Record * record;
	Node * next;
public:
	Node();
	~Node();
	void set_record(Record * record);
	void set_next(Node * next);
	Record * get_record();
	Node  * get_next();
	void display_Node();
};
#endif











//Node.cpp:


#include "Node.h"
#include <iostream>
using namespace std;

Node::Node()
{
	this->record = NULL;
	this->next = NULL;
}
Node::~Node()
{
	delete this->record;
	this->record = NULL;
	this->next = NULL;
}

void Node::set_record(Record * record)
{
	this->record = record;
}

void Node::set_next(Node * next)
{
	this->next = next;
}

Record * Node::get_record()
{
	return this->record;
}

Node * Node::get_next()
{
	return this->next;
}

void Node::display_Node()
{
	cout << "打印用户信息中..." << endl;

	if(this->record != NULL)                              //当出现空链表时执行
	{
		Record * r = this->record;
		r->display_Record();
	}
	else
	{
		cout << "记录为空..." << endl;
	}

	cout << "Next * : " << this->next << endl;
	cout << "结点结束..." << endl;
}



//Linklist.h:


#ifndef HEADER_LINKLIST
#define HEADER_LINKLIST
#include "Node.h"
using namespace std;

class Linklist
{
private:
	Node * head;
	int len;
public:
	Linklist();
	~Linklist();
	void set_head(Node * head);
	void set_len(int len);
	Node * get_head();
	int get_len();

	Node * make_node(Record * record);
	void insert_node(Node * node);
	Node * find_node(int number);
	void display_Linklist();
};
#endif



//Linklist.cpp:


#include "Linklist.h"
#include <iostream>
using namespace std;

Linklist::Linklist()
{
	this->head = NULL;
	this->len = 0;
}

Linklist::~Linklist()
{
	Node * p, * q;
	p = this->head;

	while(p != NULL)
	{
		q = p;
		p = p->get_next();
		delete q;
	}

	this->head = NULL;
	this->len = 0;
}

void Linklist::set_head(Node * head)
{
	this->head = head;
}

void Linklist::set_len(int len)
{
	this->len = len;
}

Node * Linklist::get_head()
{
	return this->head;
}

int Linklist::get_len()
{
	return this->len;
}

Node * Linklist::make_node(Record * record)
{
	Node * node = new Node();
	node->set_record(record);
	node->set_next(NULL);

	return node;
}

void Linklist::insert_node(Node * node)
{
	Node * p = this->head;

	if(p == NULL)
	{
		this->head = node;
		this->len++;

		return;
	}

	while(p->get_next() != NULL)
	{
		p = p->get_next();
	}

	p->set_next(node);
	this->len++;

	return;
}


Node * Linklist::find_node(int number)
{
	Node * p = this->head;

	while(p != NULL)
	{
		Record * r = p->get_record();

		if(r->get_number() == number)
		{
			return p;                    //返回找到的结点
		}
		else
		{
			p = p->get_next();
		}
	}

	return p;                     //return NULL;
}

void Linklist::display_Linklist()
{
	cout << "打印用户信息中..." << endl;
	
	Node * p = this->head;

	if(p == NULL)
	{
		cout << "链表为空..." << endl;
		cout << "链长: " << this->len << endl;
		cout << "记录结束..." << endl;

		return;
	}

	while(p != NULL)
	{
		p->display_Node();
		p = p->get_next();
	}

	cout << "链长: " << this->len << endl;
	cout << "链表结束..." << endl;
}



//Bank.h:

#ifndef HEADER_BANK
#define HEADER_BANK
#include "Linklist.h"
using namespace std;

class Bank
{
private:
	Linklist * list;
	int account_number;
public:
	Bank();
	~Bank();
	
	void set_list(Linklist * list);
	Linklist * get_list();
	Linklist * make_linklist();
	Record * make_record(string username, string password, double balance);
	int creat_number();
	int get_number();
	string get_userName();
	string get_passWord();
	double get_balance();
	Record * find_record(int account_number);

	void open_account();
	void close_account();
	void find_account();
	void deposit();
	void withdraw();
	void transfer_account();
};
#endif




//Bank.cpp:
#include<conio.h>
#include "Bank.h"
#include <iostream>
using namespace std;

Bank::Bank()
{
	this->list = this->make_linklist();
	this->account_number = 10000;          //未开户
}

Bank::~Bank()                         //将调用所有类的析构函数
{
	delete this->list;
	this->list = NULL;
}

void Bank::set_list(Linklist *list)
{
	this->list = list;
}

Linklist * Bank::get_list()
{
	return this->list;
}

Linklist * Bank::make_linklist()
{
	return new Linklist();
}

Record * Bank::make_record(string username, string password, double balance)
{
	Record * r = new Record();
	int number = this->creat_number();
	r->set_number(number);
	r->set_passWord(password);
	r->set_userName(username);
	r->set_balance(balance);
	r->set_flag(1);

	return r;
}

int Bank::creat_number()
{
	return this->account_number = this->account_number + 1;
}

int Bank::get_number()
{
	int number;

	cout << "请输入账号..." << endl;
	cin >> number;
	cout << "账号: " << number << endl;

	return number;
}

string Bank::get_userName()
{
	string username;

	cout << "请输入户名..." << endl;
	cin >> username;
	cout << "户名: " << username << endl;

	return username;
}

string Bank::get_passWord()
{
	string password;

	cout << "请输入密码..." << endl;
	cin >> password;
	cout << "密码: " << password << endl;

	return password;
}

double Bank::get_balance()
{
	double balance;

	cout << "请输入金额..." << endl;
	cin >> balance;
	cout << "金额:" << balance << endl;

	return balance;
}

Record * Bank::find_record(int account_number)
{
	Node * n = this->list->find_node(account_number);

	if(n != NULL)
	{
		return n->get_record();
	}

	return NULL;
}

//开户功能:

void Bank::open_account()
{
	//  获取用户输入的账户信息

	string userName = this->get_userName();
	string passWord = this->get_passWord();
	double balance = this->get_balance();

	//  使用输入数据创建Record对象
	Record * r  = this->make_record(userName, passWord, balance);

	//  创建Node结点,封装Record对象
	Node * n = this->list->make_node(r);

	//  将Node结点插入到Linklist链表
	this->list->insert_node(n);

	//显示账户信息

	r->display_Record();

	cout << "开户成功!按任意键退出..." << endl;
	getch();

	return;
}

//销户功能:

void Bank::close_account()
{
	// 获取销户账号

	int Number = this->get_number();

	// 查找账户

	Record * back_record = this->find_record(Number);

	if(back_record == NULL)
	{
		cout << "查无此帐户!按任意键退出..."  << endl;
		getchar();

		return;
	}

	//获取账户密码,判断密码是否正确

	string passWord = this->get_passWord();

	if(passWord != back_record->get_passWord())
	{
		cout << "密码不正确!按任意键退出..." << endl;
		getchar();

		return;
	}

	//判断账户状态

	if(back_record->get_flag() == 0)
	{
		cout << "该帐户已经销户,不能再次销户!" << endl;
		getchar();

		return;
	}

	//获取用户输入的选择信息,确认是否销户

	string userAnswer;

	cout << "确认销户? [1:销户| 其他:不销户] " << endl;
	cin >> userAnswer;

	//销户

	if(userAnswer == "1")
	{
		back_record->set_flag(0);
		back_record->set_balance(0);

		back_record->display_Record();

		cout << "销户成功!按任意键退出..." << endl;
		getchar();

		return;
	}

	cout << "销户用户取消销户!" << endl;

	return;
}

//查询功能:

void Bank::find_account()
{
	// 获取查询账号

	int Number = this->get_number();

	// 查找账户

	Record * back_record = this->find_record(Number);

	if(back_record == NULL)
	{
		cout << "查无此帐户!按任意键退出..."  << endl;
		getch();

		return;
	}

	//获取账户密码,判断密码是否正确

	string passWord = this->get_passWord();

	if(passWord != back_record->get_passWord())
	{
		cout << "密码不正确!按任意键退出..." << endl;
		getch();

		return;
	}

	//显示查询到的用户信息

	back_record->display_Record();

	cout << "查询成功!按任意键退出..." << endl;
	getch();

	return;
}


//存款功能:

void Bank::deposit()
{
	//获取存款账号

	int Number = this->get_number();

	//查找账号

	Record * back_record = this->find_record(Number);

	//判断用户是否存在

	if(back_record == NULL)
	{
		cout << "查无此帐户!按任意键退出..."  << endl;
		getch();

		return;
	}

	//显示账户信息

	back_record->display_Record();

	//判断账户是否销户

	if(back_record->get_flag() == 0)
	{
		cout << "该帐户已经销户!按任意键退出..." << endl;
		getch();

		return;
	}

	double cash = 0;

	cout << "输入存款金额: " << endl;
	cin >> cash;
	cout << "存款金额为:" << cash << endl;

	cash = back_record->get_balance() + cash;
	back_record->set_balance(cash);

	//显示账户信息

	back_record->display_Record();

	cout << "存款结束! 按任意键退出..." << endl; 
	getch();

	return; 
}

//取款功能:

void Bank::withdraw()
{
	// 获取取款账号

	int Number = this->get_number();

	// 查找账户

	Record * back_record = this->find_record(Number);

	if(back_record == NULL)
	{
		cout << "查无此帐户!按任意键退出..."  << endl;
		getch();

		return;
	}

	//获取账户密码,判断密码是否正确

	string passWord = this->get_passWord();

	if(passWord != back_record->get_passWord())
	{
		cout << "密码不正确!按任意键退出..." << endl;
		getch();

		return;
	}

	// 确定用户账户状态

	if(back_record->get_flag() == 0)
	{
		cout << "该帐户已经销户!按任意键退出..." << endl;
		getch();

		return;
	}

	double cash = 0;

	cout << "请输入取款金额:" << endl;
	cin >> cash;

	if(cash > back_record->get_balance())
	{
		cout << "账户余额不足!按任意键退出..." << endl;
		getch();

		return;
	}

	cash = back_record->get_balance() - cash;
	back_record->set_balance(cash);

	//显示账户信息

	back_record->display_Record();

	cout << "取款结束! 按任意键退出..." << endl; 
	getch();

	return; 
}

//转账功能:

void Bank::transfer_account()
{
	// 获取转入账号

	int number;

	cout << "请输入转出账号:" << endl;
	cin >> number;

	// 查找账号

	Record * back_record = this->find_record(number);

	if(back_record == NULL)
	{
		cout << "查无此帐户!按任意键退出..."  << endl;
		getch();

		return;
	}

	//获取账户密码,判断密码是否正确

	string passWord;

	cout << "请输入账户密码:" << endl;
	cin >> passWord;

	if(passWord != back_record->get_passWord())
	{
		cout << "密码不正确!按任意键退出..." << endl;
		getch();

		return;
	}

	// 确定用户账户状态

	if(back_record->get_flag() == 0)
	{
		cout << "该帐户已经销户!按任意键退出..." << endl;
		getch();

		return;
	}

	//获取转账账号

	int transfer_number;

	cout << "请输入转入账号:" << endl;
	cin >> transfer_number;

	//查找转账账户

	Record * transfer_record = this->find_record(transfer_number);

	if(back_record == NULL)
	{
		cout << "查无此帐户!按任意键退出..."  << endl;
		getch();

		return;
	}

	// 确定用户账户状态

	if(back_record->get_flag() == 0)
	{
		cout << "该帐户已经销户!按任意键退出..." << endl;
		getch();

		return;
	}

	//获取转账金额

	double cash = 0;

	cout << "请输入转入金额:" << endl;
	cin >> cash;

	//判断转账金额是否合法

	if(cash > back_record->get_balance())
	{
		cout << "账户余额不足!按任意键退出..." << endl;
		getch();

		return;
	}

	//资金转账

	transfer_record->set_balance(transfer_record->get_balance() + cash);
	back_record->set_balance(back_record->get_balance() - cash);

	//显示当前帐户信息及转账账户信息

	cout << "转出帐户信息:" << endl;
	back_record->display_Record();

	cout << "转入账户信息:" << endl;
	transfer_record->display_Record();

	//转账结束

	cout << "转账结束! 按任意键退出..." << endl; 
	getch();

	return; 
}


//Main.cpp:

#include "Bank.h"
#include <iostream>
using namespace std;

void welcome();
void login(Bank * bank);
void mainmenu(Bank * bank);

int main()
{
	Bank * bank = new Bank();

	welcome();

	login(bank);

	return 0;
}

void welcome()
{
	cout << "+--------------------------------------+" << endl;
	cout << "|                                      |" << endl;
	cout << "|         欢迎使用储蓄综合业务平台    |" << endl;
	cout << "|                                      |" << endl;
	cout << "+--------------------------------------+" << endl;
}

void mainmenu(Bank * bank)
{
	int choice = -1;
	
	do
	{
		cout << endl;
		cout << "+---------------------------------+" << endl;
		cout << "| 开户请按1        取款请按5  |" << endl;
		cout << "| 销户请按2        转账请按6  |" << endl;
		cout << "| 查询请按3        退出请按0  |" << endl;
		cout << "| 存款请按4                     |" << endl;
		cout << "+---------------------------------+" << endl;

		cout << "请输入您的选择: " << endl;
		cin >> choice;

		switch(choice)
		{
		case 0:
			exit(0);
		case 1:
			bank->open_account();
			break;
		case 2:
			bank->close_account();
			break;
		case 3:
			bank->find_account();
			break;
		case 4:
			bank->deposit();
			break;
		case 5:
			bank->withdraw();
			break;
		case 6:
			bank->transfer_account();
			break;
		default:
			cout << "无效选项!" << endl;
			break;
		}
	}
	while(true);
	
}

void login(Bank * bank)
{
	string admin_userName;
	string admin_passWord;

	for(int i = 1; i <= 3; ++i)
	{
		cout << endl;

		cout << "请输入您用的用户名: " << endl;
		cin >> admin_userName;
		
		cout << "请输入您的密码: " << endl;
		cin >> admin_passWord;

		if((admin_userName == "admin") && (admin_passWord == "admin"))
		{
			mainmenu(bank);
		}
		
		else
		{
			if(i < 2)
			{
				cout << "用户名或密码输入错误,请重新输入!" << endl;
			}
			
			else
			{
				cout << "连续输错用户名或密码,退出系统!" << endl;
			}
		}
	}
}

 

 

 

 

 

 

 五、测试:

//TestRecord.cpp:

#include "Record.h"
#include <iostream>
using namespace std;

int main()
{
	Record * record = new Record();

	record->display_Record();
	record->set_number(10001);
	record->set_userName("liuzhen");
	record->set_passWord("123456");
	record->set_balance(2);
	record->set_flag(1);
	record->display_Record();

	return 0;
} 



//TestNode.cpp:

#include "Node.h"
#include <iostream>
using namespace std;

int main()
{
	Node * node = new Node();
	node->display_Node();

	Record * r = new Record();
	r->set_number(10001);
	r->set_passWord("123");
	r->set_userName("zhangsan");
	r->set_balance(10000);
	r->set_flag(1);

	node->set_record(r);
	node->display_Node();

	return 0;
} 


//TestLinklist.cpp:

#include "Linklist.h"
#include <iostream>
using namespace std;

int main()
{
	Linklist * list = new Linklist();
	list->display_Linklist();

	cout << endl;

	Record * r1 = new Record();
	r1->set_number(10001);
	r1->set_passWord("123");
	r1->set_userName("zhangsan");
	r1->set_balance(10000);
	r1->set_flag(1);

	Node * n1 = list->make_node(r1);
	list->insert_node(n1);
	list->display_Linklist();

	cout << endl;

	Record * r2 = new Record();
	r2->set_number(10002);
	r2->set_passWord("456");
	r2->set_userName("lisi");
	r2->set_balance(20000);
	r2->set_flag(2);

	Node * n2 = list->make_node(r2);
	list->insert_node(n2);
	list->display_Linklist();

	cout << endl;

	Node * n3 = list->find_node(10001);         //    先判断是否查找到

	if(n3 == NULL)
	{
		cout << "Not Found..." << endl;
	}
	else
	{
		n3->display_Node();
	}

	return 0;
} 


//TestBank.cpp:

#include "Bank.h"
#include <iostream>
using namespace std;

void welcome();
void mainmenu(Bank * bank);

int main()
{
	Bank * bank = new Bank();

	cout << "开户操作:" << endl;
	bank->open_account();

	cout << "存款操作:" << endl;
	bank->deposit();

	cout << "取款操作:" << endl;
	bank->withdraw();

	cout << "查询操作:" << endl;
	bank->find_account();

	cout << "转账操作:"  << endl;
	bank->transfer_account();

	cout << "销户操作:" << endl;
	bank->close_account();

	return 0;
}

 

 

心得体会:

感觉似乎在完成开户功能时,余下的任何代码都是水到渠成的,也在体会类封装与原来的面向过程时所体现的不同。明显的感觉类更加明确清晰,自己在做什么一目了然。而且即使是我做的主函数套用在同学的代码中依然没有任何错误,这很赏心悦目。