您的位置:首页 > 其它

课程实训——银行储蓄系统

2015-07-18 02:19 387 查看
main.cpp

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

int main()
{
cout<<"+---------------------------------------+"<<endl;
cout<<"+\t欢迎使用TNT银行系统 \t+"<<endl;
cout<<"+---------------------------------------+"<<endl<<endl;

Bank b;
if (pass())
{
b.work();
}
return 0;
}


bank.h

#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include <cstring>
#include <iostream>
using namespace std;

const int upNum=2000;//本系统暂设最多支持2000个账户

int choosemenu();
int pass();//通过业务员账号
int inputcode();//使密码以*号显示

class user
{
public:
void set_user(int acc, string nam, int pw, double bal,int sta,string ID,string add);
void show_name();//显示用户信息
void show_balance();//显示余额

bool passwordIsRight();//判断密码和账户是否相符
bool isNormalUser();
friend class Bank;

private:
int ACCOUNT;//用户账户
string NAME;//用户的名字
int PASSWORD;//用户密码
double BALANCE;//用户余额
int STATUS;//用户状态
string id;//用户身份证号
string address;//用户家庭住址
};

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();//更改密码
int getUser();//输入账号查询用户,返回用户在对象数组中的下标
private:
int N;//实际用户数目
user users[upNum];
};
#endif // BANK_H_INCLUDED


bank.cpp

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

Bank::Bank()//开机时从文件中读数据,存在数组中
{
ifstream infile("account.txt",ios::in);
if (!infile)
{
cerr<<"open account.txt error!"<<endl;
exit(1);
}
int i=0;
int acc;//账号
string nam;
int pw;
double bal;//金额
int sta;//状态
string ID;
string add;
while (infile>>acc>>nam>>pw>>bal>>sta>>ID>>add) //读取成功时
{
users[i].set_user(acc,nam,pw,bal,sta,ID,add);
i++;
}
N=i;//用静态数据成员储存
infile.close();
}
Bank::~Bank()//关机前将数据写入到文件中
{
ofstream outfile("account.txt",ios::out);
if (!outfile)
{
cerr<<"open account.txt error!"<<endl;
exit(1);
}
int i=1;
for (i=0; i<N; i++)
{
outfile<<users[i].ACCOUNT<<" ";
outfile<<users[i].NAME<<" ";
outfile<<users[i].PASSWORD<<" ";
outfile<<users[i].BALANCE<<" ";
outfile<<users[i].STATUS<<" ";
outfile<<users[i].id<<" ";
outfile<<users[i].address<<endl;
}
outfile.close();

}
void Bank::work()
{
int iChoice;//选择
do
{
iChoice = choosemenu();
switch (iChoice)
{
case 1:
openAccount(); //开户
break;
case 2:
cancelAccount();  //注销账户
break;
case 3:
save();  //存款
break;
case 4:
withdraw();   //取款
break;
case 5:
showAccount(); //查询余额
break;
case 6:
transferAccounts();  //转账
break;
case 7:
reportLoss();  //挂失
break;
case 8:
cancelLoss();  //解除挂失
break;
case 9:
updatePassword();   //更改密码
break;
case 0:
cout<<"欢迎您再来. "<<endl;
}

}
while(iChoice);
}

void Bank::openAccount()//开户
{
if(N==upNum)
{
cout<<"用户数已经达到上限,无法再开户";
return;
}
int acc;   //账号
string nam;   //姓名
int pw1,pw2;   //密码
double bal;   //金额
int sta;   //状态
string ID;
string add;
cout<<"开户中…"<<endl;
acc=10001+N;
cout<<"账号:"<<acc<<endl;
cout<<"户主姓名:";
cin>>nam;
cout<<"户主身份证号:";
cin>>ID;
cout<<"户主家庭住址:";
cin>>add;
cout<<"密码:";
pw1=inputcode();  //输入密码1
cout<<"确认密码:";
pw2=inputcode();  //输入密码2
if(pw1==pw2)
{
sta=0; //状态“正常”
cout<<"存款金额:";
cin>>bal;
users
.set_user(acc, nam, pw1, bal, sta,ID,add);
N++; //正式用户数增加1
cout<<"开户成功!"<<endl;
}
else
{
cout<<"两次密码不一致,未成功开户!"<<endl; //没有N++,则读入的值无效
}
}
void Bank::cancelAccount()//注销账户
{
int getU;
getU = getUser();  //根据账号查询用户,返回用户的下标
if(getU>=0)   //说明id账户存在
{
users[getU].show_name();
if(users[getU].passwordIsRight())
{
cout<<"余额:";
users[getU].show_balance();   //显示金额
cout<<"是否确认销户(y/n)?";
if(tolower(getchar())=='y')
{
cout<<"销户成功!您的余额";
users[getU].show_balance();
cout<<"将被全部取出!"<<endl;
users[getU].BALANCE=0;  //取款后余额变0
users[getU].STATUS=2;  //状态变为注销
}
else
{
cout<<"你取消了操作,销户失败!"<<endl;
}
fflush(stdin);  //清除了getchar()时在键盘缓存中的遗留,以免影响后续操作
}
}
}
void Bank::save()//存款
{
int getU;
double money;
getU = getUser();  //根据账号查询用户,返回用户的下标
if(getU >=0)   //说明id账户存在
{
if(users[getU].STATUS==0)
{
users[getU].show_name();
cout<<"输入存款额:";
cin>>money;
users[getU].BALANCE+=money;
cout<<"存款后,您的账户将有金额:";
users[getU].show_balance();
}
else if(users[getU].STATUS==1)
{
cout<<"该用户处于挂失状态,存款失败!"<<endl;
}
else
{
cout<<"该用户已经销户,存款失败!"<<endl;
}
}
return;
}
void Bank::withdraw()//取款
{

int getU ;
double money;
getU = getUser();  //根据账号查询用户,返回用户的下标
if(getU >=0)   //说明id账户存在
{
if(users[getU ].isNormalUser())
{
users[getU ].show_name();
if(users[getU ].passwordIsRight())
{
cout<<"输入取款额:";
cin>>money;
if(money>users[getU ].BALANCE)  //亲,不玩透支
{
cout<<"余额不足,取款失败!"<<endl;
}
else
{
users[getU ].BALANCE-=money;
cout<<"取款后,余额为:";
users[getU ].show_balance();
}
}
}

}
return;

}
void Bank::showAccount()//查询账户
{
int getU ;
string sta[3]= {"正常","挂失","已经销户"};
getU = getUser();  //根据账号查询用户,返回用户的下标
if(getU >=0)   //说明id账户存在
{
users[getU ].show_name();
if(users[getU ].passwordIsRight())
{
cout<<"账户余额为:";
cout<<"账号身份证号:"<<users[getU].id<<endl;
cout<<"账号家庭住址:"<<users[getU].address<<endl;
users[getU ].show_balance();
cout<<"状态:"<<sta[users[getU ].STATUS]<<endl;
}
}
return;
}
void Bank::transferAccounts()//转账
{
int Win,Wout;
double money;
cout<<"转账自";
Wout= getUser();
if(Wout>=0)
{
if(users[Wout].isNormalUser())
{
users[Wout].show_name();
if(users[Wout].passwordIsRight())
{
cout<<"输入转账金额:";
cin>>money;
if(money>users[Wout].BALANCE)  //防止透支
{
cout<<"余额不足,转账失败!"<<endl;
}
else
{
cout<<"转出到";
Win = getUser();
if(Win>=0)
{
if(users[Win].isNormalUser())
{
users[Wout].BALANCE-=money;
users[Win].BALANCE+=money;
cout<<"转账后,您的余额为:";
users[Wout].show_balance();
}
}
}
}
}
}
}
void Bank::reportLoss()//挂失
{
int getU;
getU  = getUser();  //根据账号查询用户,返回用户的下标
if(getU >=0)   //说明id账户存在
{
users[getU ].show_name();
if(users[getU ].passwordIsRight())
{
if(users[getU ].STATUS==0)
{
users[getU ].STATUS=1;
cout<<"挂失成功"<<endl;
}
else if(users[getU ].STATUS==1)
{
cout<<"该账户已经处于挂失状态"<<endl;
}
else
{
cout<<"该账户已销户,不能挂失"<<endl;
}
}
}
return;
}
void Bank::cancelLoss()//解挂
{
int getU;
getU=getUser();
if (getU>=0)
{
users[getU].show_name();
if(users[getU ].passwordIsRight())
{
if(users[getU ].STATUS==1)
{
users[getU ].STATUS=0;
cout<<"解挂成功"<<endl;
}
else if(users[getU ].STATUS==0)
{
cout<<"该账户无需解挂"<<endl;
}
else
{
cout<<"该账户已销户,不能挂失"<<endl;
}
}
}
return;
}

void Bank::updatePassword()//更改密码
{
int getU,pw1,pw2;
getU=getUser();
if (getU>=0)
{
users[getU].show_name();
if(users[getU ].passwordIsRight())
{
cout<<"请输入新密码:";
pw1=inputcode();
cout<<"请重复密码:";
pw2=inputcode();
if (pw1==pw2)
{
users[getU].PASSWORD=pw1;
cout<<"密码修改成功!"<<endl;
}
else
{
cout<<"两次密码不一致,未成功开户!"<<endl;
}
}
}
return;
}
int Bank::getUser()//输入账号查询用户,返回用户在对象数组中的下标
{
//使用二分查找法查找账户
int id,mid;
int ind=-1,high=N-1,low=0;
cout<<"账号:";
cin>>id;
while(low<=high)
{
mid=(low+high)/2;
if (users[mid].ACCOUNT==id)
{
ind=mid;
break;
}
else if (users[mid].ACCOUNT>id)
high=mid-1;
else
low=mid+1;
}
if(ind<0)
cout<<"该用户不存在,本次操作失败!"<<endl;
return ind; //若找到,其值在0~N-1间,否则,保持-1
}


user.cpp

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

void user::set_user(int acc,string nam,int pw,double bal,int sta,string ID,string add)
{
ACCOUNT=acc;
NAME=nam;
PASSWORD=pw;
BALANCE=bal;
id=ID;
address=add;
}
void user::show_name()
{
cout<<"姓名:"<<NAME<<endl;
}
void user::show_balance()//显示余额
{
cout<<BALANCE<<" 元"<<endl;
}
bool user::passwordIsRight()//校验密码,正确返回true
{
int pw;
bool right=true;
cout<<"输入密码:";
pw=inputcode();
if (pw!=PASSWORD)
{
right=false;
cout<<"密码错误,无法继续操作!"<<endl;
}
return right;
}
bool user::isNormalUser()//判断是否处于“正常”,是则返回true,否则返回false
{
bool normal=true;
if(STATUS!=0)
{
normal=false;
cout<<"该账户处于"<<(STATUS==1?"挂失":"销户")<<"状态,不能继续操作!"<<endl;
}
return normal;
}


work.cpp

#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <conio.h>  //getch要用
#include <cstring>
#include "Bank.h"
using namespace std;
int choosemenu()
{
int i;
while(1)
{
cout<<endl;;
cout<<"+--------------------------------------+"<<endl;
cout<<"+ 1 开户\t2 销户\t\t3 存款 +"<<endl;
cout<<"+ 4 取款\t5 查询\t\t6 转账 +"<<endl;
cout<<"+ 7 挂失\t8 解挂\t\t9 改密 +"<<endl;
cout<<"+ 0 退出\t\t\t       +"<<endl;
cout<<"+--------------------------------------+"<<endl;
cout<<"请输入操作指令:";
cin>>i;
if(i>=0 && i<=9)
break;
else
cout<<"请重新选择功能"<<endl;;
}
return i;
}

int pass()
{
char sNameInFile[20];   //由文件中读出的业务员用户名
char sPassInFile[20];  //文件中保存的密码,这一版本中,用字符保存密码
ifstream infile("password.txt",ios::in);
if(!infile)
{
cout<<"password file cannot open!"<<endl;
exit(1);
}
infile>>sNameInFile>>sPassInFile;
infile.close();

char sName[20];   //业务员登录时输入的用户名
char sPass[20];  //业务员登录时输入的密码
char ch;
int iTry=3;   //进入系统时尝试的次数
int right = 0;  //要返回的结果:0-不正确 1-正确

//进入系统,密码三次不对将退出
do
{
cout<<"请输入业务员用户名:";
cin>>sName;
cout<<"请输入密码:";
int i=0;
while((ch=getch())!='\r')  //getch在接受输入后,不在屏幕上显示
{
sPass[i++]=ch;
putchar('*');   //接受任何字符,屏幕上只显示*
}
sPass[i]='\0';
fflush(stdin);
cout<<endl;;
if(strcmp(sPass,sPassInFile)==0&&strcmp(sName,sNameInFile)==0)
{
right = 1;
break;
}
else
{
iTry--;
if(iTry>0)
cout<<"超过3次将退出,你还可以尝试"<<iTry<<"次!"<<endl;
else
{
cout<<"对不起,你不能进入系统"<<endl;;
}
}
}
while(iTry);
return right;

}
int inputcode()//使密码以*号显示
{
char ch;
int iPass=0;//用于将输入的字符型数字转换为数字型数字
while(1)
{
for(int i=0; i<6; i++)
{
ch=getch();
putchar('*');   //输入后不显示数字而输出*
if(isdigit(ch))   //!!isdigit(ch)的使用
iPass=iPass*10+(ch-'0');
else
{
iPass=0;
break;  //退出for循环后,再次接受
}
}
fflush(stdin); //!!清除键盘缓存区中已经有的输入,fflush(stdin)的使用
cout<<endl;;
if(iPass==0)  //此条件成立可能由两种情况引起:输入了非数字字符被直接重置为0,或6位全0后正常退出for循环
{
cout<<"密码要求全为数字,且不能全0!"<<endl;;
cout<<"请重新输入密码: ";
}
else
break;
}
return iPass;
}


一年就那么一晃就过去了,从来没想过大学的时间会过的那么快,真的从来没有那么快的度过一年。

都说当一个人找到事做,过得充实才会抓不住时间的尾巴,感受时间的飞逝;但我并不是这一种,我空虚,而时光飞逝。

C++课程学到现在,我只能说我只是略懂皮毛,要到考试的时候就猛看题,很多地方都不是去掌握方法规律,而是死背硬记,如果问我为什么也许我就答不上来了,记得以前班主任骂我说:你不是傻,是你的学习态度有问题。

而我对生活就是得过且过的态度。

是的,我的生活没有目标,仿佛每天都在过着同样的日子,那种自认为是享受的日子,其实我也知道我这是自欺欺人。

有时候安慰自己说谁的青春没有迷茫过,但我还是迷茫得太过了,太久了。最可悲的就是我能意识到自己的不足和知道自己应该改变什么,但从来就没有真正着手改变自己,要不就是三分钟情绪,一阵时间过了又回到了老样子。

我常常在思考”转折“这个词,因为我时常以为我需要一次转折。每一个转折都需要一个点,而这个点往往就是对你内心深处的一种冲击或者触动,然后促使你想着去改变或者强迫被改变。

一个迷茫的人,在试着寻找目标然后找到目标开始为之奋斗的时候,自己都会被自己感动,那种感动充满正能量,这种感受我有过,然后又没有了。

是不是每一个因为打击而变得堕落迷茫的人必须要经过再一次的打击才会重新振作?就像一根用力掰弯的钢筋必须要用同样或者更大的力气才能使他恢复原样甚至做出更完美的形状。

那天特意去看了看贺老的博客,其中有一篇叫《”差生“,不要再拿兴趣说事》对我感触挺深的,因为我就是那么一个喜欢拿兴趣说事的人,前面提到说我的生活没有目标,所以往往当别人问起我为什么没有目标的时候,一般我都会回答:我还没找到我喜欢做的事,现在所做的正因为不是我喜欢的,所以做得不好也理所当然。对此,贺老的几句话就让我无言以对。1.“表面是成绩差,在大学中,实质上的差是,差在保守,不求改变,虚度光阴。”
2. “而大学生呢,已经进入成年人的年龄,这是一个必须开始面对现实的时候了,这句话有理,但不能全拿兴趣说事。” 3. “没有兴趣,很难投入,这是一个事实;但是,不去投入,兴趣不能从天而降,一定的。在类似先有鸡还是先有蛋的争辩中,我的不少同学放下兴趣论,优先通过投入,通过坚持,在同程序中的bug之间的艰苦卓绝的战斗中找到了真正的专业兴趣。” 4.“不必等待和徘徊,要的只是立刻行动起来。拆掉你思维中的那堵墙,将自己解放出来。立即行动,着手改变!”
5.“用行动去表明,你不是差生。”


这本是一篇课程实训报告,却又被我写成了一篇吐槽加思考类的文章,文章的结尾我也不会去写什么从今以后立志要怎样怎样的话。

我只想感谢每一位鼓励我的人,感谢每一位带给我正能量的人。

真心谢谢。





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: