CPP课程实训
2015年7月
题目:银行储蓄系统
得分项目:1,功能扩充:按接近实际业务的要求,处理业务实体中较完善的信息,并在相关业务中使用;
2,链表:用链表储存用户信息;
3,链表:使用了继承机制;
4,链表:链表定义成模板类;
5,储存:用二进制文件。
(多文件)代码:
list.h
</pre><pre name="code" class="cpp">/*
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*
*文件名称:CPP-KCSX.cpp
*文件标识:无
*内容摘要:银行系统
*其他说明:无
*当前版本:V1.0
*作 者:王**
*完成日期:2015年7月15日
*
*修改记录:
*修改日期:
*版本号:
*修改人:
*修改内容:
*/
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED
/* 单链表的结点定义 */
template<class T>
class LinkNode
{
public:
T data;
LinkNode(): next(NULL) {}
LinkNode(T &item)
{
data=item;
next = NULL;
}
LinkNode<T> *next;
};
/* 带头结点的单链表定义 */
template<class T>
class LinkList : public LinkNode<T>
{
public:
LinkList() //无参数的构造函数
{
head = current = NULL;
}
LinkList(const T &item) //带参数的构造函数
{
head = new LinkNode<T>(item);
}
~LinkList() //析构函数(连表清空)
{
Clear();
}
void Clear(); //链表清空
T getT(); //返回head T
void Pophead(); //头结点移动
bool FindID(T &item); //查找ID是否存在
T ReturnID(T &item); //定位指定的位置,返回该位置上的结点指针
bool Replace(T &item); //更改
void Append(T &item); //尾部追加
bool IsEmpty() const //判断链表是否为空
{
if(*head==NULL)return false;
else return true;
}
private:
LinkNode<T> *head;
LinkNode<T> *current;
};
///链表模板函数
/*
功能:弹出头结点数据
*/
template<class T>
T LinkList<T>::getT()
{
LinkNode<T> *poi=new LinkNode<T>;
poi=head;
return poi->data;
}
/*
功能:弹出头结点
*/
template<class T>
void LinkList<T>::Pophead()
{
LinkNode<T> *p ;
if(head!=NULL)
{
p=head;
head=head->next;
delete p;
}
}
/*
功能:尾部添加数据
*/
template<class T>
void LinkList<T>::Append(T &item)
{
LinkNode<T> *pt=new LinkNode<T>;
(*pt).data=item;
if(head==NULL)
head=pt;
else
{
LinkNode<T> *pts=head;
LinkNode<T> *pte=pts->next;
while(pte)
{
pts=pte;
pte=pts->next;
}
pts->next=pt;
}
}
/*
功能:账户信息更新
*/
template<class T>
bool LinkList<T>::Replace(T &item)
{
current = head;
while(current != NULL)
{
if(current->data==item)
{
current->data=item;
break;
} //循链找含x结点
else current = current->next;
}
if(current->next!=NULL)return true;
else return false;
}
/*
功能:判断ID是否存在
*/
template<class T>
bool LinkList<T>::FindID(T &item)
{
current = head;
while(current != NULL)
{
if(current->data==item)return true; //循链找含x结点
current = current->next;
}
return false;
}
/*
功能:弹出头对应ID数据
*/
template<class T>
T LinkList<T>::ReturnID(T &item)
{
//在表中搜索含数据x的结点,搜索成功时函数返回该结点地址;否则返回NULL值。
LinkNode<T> *poi=new LinkNode<T>;
poi=head;
while(poi != NULL)
{
if(poi->data==item) break;
else poi = poi->next;
}
return poi->data;
/*T item;
if(IsEmpty())
return false; //检查是否为空
do{
if(item.account == id)
return true;
}while(getNext(item));
return false;*/
}
/*
功能:链表清空
*/
template<class T>
void LinkList<T>::Clear()
{
LinkNode<T> *p ;
while(head!=NULL)
{
p=head;
head=head->next;
delete p;
}
}
#endif // LIST_H_INCLUDED
bank.h
#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include <cstring>
#include "list.h"
using namespace std;
//class LinkNode;
//class LinkList;
class Bank;
class User
{
public:
void setUser(int acc, string nam, int pw, double bal,int stam,string id,string pho);
void showName();//输出姓名
void showBalance(string prompt); //显示余额,前面加上提示词prompt
bool passwordIsRight(); //校验密码,输入的密码正确则返回true
bool isNormalUser(); //存款、取款、转帐等功能,需要账户处于正常姿态,处于正常状态时返回true,其他情形返回false并提示
friend class Bank; //将Bank声明为友元类,方便其访问数据成员
bool operator==(User &b) // 运算符重载 用于查找用户
{
return(account==b.account);
}
friend ostream& operator<<(ostream&, User&);
// friend istream& operator>>(istream&, User&);
private:
string ID; //身份证号
string phone; //手机号
int account; //账号
int password; //密码
string name; //用户名
double balance; //账户余额
int status; //状态 0-正常 1-挂失 2-销户
};
class Bank
{
public:
Bank(); //开始前从文件中读数据,存在链表中
~Bank(){};
void work(); //业务驱动
void openAccount(); //开户
void cancelAccount(); //注销账户
void save(); //存款
void withdraw(); //取款
void showAccount(); //查询余额
void transferAccounts(); //转账
void reportLoss(); //挂失
void cancelLoss(); //解除挂失
void updatePassword(); //更改密码
void writedate();//存档
private:
int N; //实际的用户数目
/// User users[upNum]; //User数组,耗空间啊!改进方案:1.对象指针数组;2. 动态数组;3. 链表
LinkList<User> users; //采用链表
};
int pass(); //业务员登录
int chooseInMenu(); //显示菜单并由业务员选择
int inputPassword(); //返回键盘输入的密码
#endif // BANK_H_INCLUDED
main.cpp