(一)背景介绍
最近发生了很多的事情,心中有些迷茫。关于未来的种种选择在现在突然一起出现在了我的面前,让我不得不去思考自己的未来。我又开始迷茫自己未来的道路该如何选择。如果选择读研的话,我就不得不去在那些感觉似乎和我的未来没有什么关系的专业课上投入大量的时间,同时以后还要再浪费一年的时间去准备考研。而如果直接出来工作的话又好像限制了自己的未来。未来究竟该如何?
现在已经到了大二,我在各种课程中忙的焦头烂额,好在距离做出最后的决定还有一段时间,我得更加珍惜自己的时间了。
关于为什么要做这个项目呢其实这是我之前一个同学的结课设计找我帮忙,于是我就突发奇想用 Linux和cpp做一个银行的管理系统。
我知道这个项目没什么难度,花两个晚上应该就能完成了,但我希望可以在这个项目中将之前刚刚学会的几个工具练习一下。比如github,makefile和vscode。
(二)搭建项目的开发环境
我的设想是可以在WINDOWS环境下使用vscode和g++调试代码,然后上传到github上,然后在linux中克隆代码,编写Makefile然后编译运行。
工程目录结构如图。我大概花了两个晚上在windows环境下,编写和调试。
(三)工程源码
代码核心只有两个文件Bank.cpp 和main,cpp
代码如下
Bank.h
/*
*版权所有 (C)2019,Yueyang.
*文件名称:银行储蓄系统
*内容摘要:本项目模拟银行柜台上业务,设计一个支持多名用户开户、存款等功能的软件系统。
*当前版本:V1.0
*作者:杨越
*完成日期:20191015
*/
#ifndef BANK_H
#define BANK_H
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
#define MAXNUM 2000
using namespace std;
class Check
{
public:
string checkid;
string username;
string userid;
string userplace;
string phone;
double money;
double rate;
int passkey;
int state;
friend class BANK;
public:
void Set(string,string,string,string,string,double,double,int);
int getpass();
};
class Bank
{
private:
Check *check[MAXNUM];
int realcount;
friend class Check;
public:
Bank();
~Bank();
void work();
int menushow();
void establish();
void Delete();
void save();
void withdraw();
void find();
void transfer();
void reportloss();
void cancelloss();
void changepass();
};
int inputpass(); //输入密码(由字符型转化为整形)
bool checkkey(int key,Check *u); //验证密码输入是否正确
int decode(int);
int encode(int);
#endif // !BANK_H
Bank.cpp
/*
*版权所有 (C)2019,Yueyang.
*文件名称:银行储蓄系统
*内容摘要:本项目模拟银行柜台上业务,设计一个支持多名用户开户、存款等功能的软件系统。
*当前版本:V1.0
*作者:杨越
*完成日期:20191015
*/
#include "Bank.h"
#define RATE 0.043//银行当前利率
#include <sstream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
string itos(int i) // 将int 转换成string
{
stringstream s;
s << i;
return s.str();
}
Bank::Bank()
{
int i=0;
double Money,Rate,Key;
string id,usename,usid,place,phone;
ifstream infile("data.dat",ios::in);
while (infile>>id>>usename>>usid>>place>>phone
>>Money>>Rate>>Key)
{
check[i]=new Check;
check[i]->Set(id,usename,usid,place,phone,Money,Rate,decode(Key));
i++;
}
realcount=i;
infile.close();
}
//功能:用析构函数,在退出系统时,将数据保存到文件中
Bank::~Bank()
{
ofstream outfile("data.dat",ios::out);
if(!outfile)//测试文件是否打开成功,不成功则提示退出
{
cerr<<"open error!"<<endl;
exit(1);
}
int i;
for(i=0; i<realcount; i++)
{
outfile<<check[i]->checkid<<" ";
outfile<<check[i]->username<<" ";
outfile<<check[i]->userid<<" ";
outfile<<check[i]->userplace<<" ";
outfile<<check[i]->phone<<" ";
outfile<<check[i]->money<<" ";
outfile<<check[i]->rate<<" ";
outfile<<encode(check[i]->passkey)<<" ";
}
outfile.close();
delete []check;
}
int Bank::menushow()
{
int i;
cout<<endl;
cout<<"+--------------------------------------+"<<endl;
cout<<"+ 1 开户 2 销户 3 存款 +"<<endl;
cout<<"+ 4 取款 5 查询 6 转账 +"<<endl;
cout<<"+ 7 挂失 8 解挂 9 改密 +"<<endl;
cout<<"+ 0 退出 +"<<endl;
cout<<"+--------------------------------------+"<<endl;
cout<<"请输入操作指令:";
while(1)
{
cin>>i;
if(i>=0&&i<=9)
break;
else
cout<<"输入错误,请重新选择:";
}
return i;
}
//功能:办理业务
void Bank::work()
{
int choose;
do
{
choose=menushow();
switch(choose)
{
case 0:
break;//退出
case 1:
establish();//开户
break;
case 2:
Delete();//销户
break;
case 3:
save();//存款
break;
case 4:
withdraw();//取款
break;
case 5:
find();//查询
break;
case 6:
transfer();//转账
break;
case 7:
reportloss();//挂失
break;
case 8:
cancelloss();//解挂
break;
case 9:
changepass();//改密
break;
break;
}
}
while(choose);
}
void Bank::establish()
{
if (realcount==MAXNUM)
{
cout<<"非常抱歉,银行储户已达上限"<<endl;
return;
}
double Money,Rate;
string id,usename,usid,place,phone;
int Key0,Key1;
cout<<"请输入姓名:";
cin>>usename;
cout<<endl;
cout<<"请输入身份证号码:";
cin>>usid;
cout<<endl;
cout<<"请输入居住地址:";
cin>>place;
cout<<endl;
cout<<"请输入电话号码:";
cin>>phone;
cout<<endl;
ERR:
cout<<"请输入密码:";
Key0=inputpass();
cout<<endl;
cout<<"请确认密码:" ;
Key1=inputpass();
cout<<endl;
if(Key0!=Key1)
{
goto ERR;
}
check[realcount]=new Check;//动态数组开辟空间
check[realcount]->Set(itos(realcount),usename,usid,place,phone,0,RATE,Key0);
cout<<"开户成功!"<<endl;
cout<<"+------------------------------------------------------------+"<<endl;
cout<<"+ 开户信息 +"<<endl;
cout<<" 姓名: " <<check[realcount]->username <<endl;
cout<<" 单号: " <<check[realcount]->checkid <<endl;
cout<<" 密码: " <<"******" <<endl;
cout<<" 地址: " <<check[realcount]->userplace <<endl;
cout<<" 电话: " <<check[realcount]->phone <<endl;
cout<<"+-------------------------------------------------------------+"<<endl;
realcount++;
}
void Bank::Delete()
{
int id;
int Key;
cout<<"请输入销户账号:";
cin>>id;
cout<<endl;
if(id<0||id>=realcount)
{
cout<<"该账户不存在!"<<endl;
return;
}
if(check[id]->state==0)
{
cout<<"该账户已销户!"<<endl;
return;
}
cout<<"请输入密码:";
Key=inputpass();
cout<<endl;
if(checkkey(Key,check[id]))
{
check[id]->state=0;
cout<<"销户成功!请取款"<<check[id]->money<<"元."<<endl;
check[id]->money=0;
}
else
{
cout<<"操作取消!"<<endl;
}
}
void Bank::find()
{
int num,key;
string sta[3]= {"注销","正常","挂失"};
cout<<"请输入账号:";
cin>>num;
if(num<0||num>=realcount)
{
cout<<"该账户不存在!"<<endl;
return;
}
cout<<"姓名:"<<check[num]->username<<endl;
cout<<"请输入密码:";
key=inputpass();
if(checkkey(key,check[num]))
{
cout<<"身份证号:"<<check[num]->userid<<endl;
cout<<"家庭住址:"<<check[num]->userplace<<endl;
cout<<"余额:"<<check[num]->money<<endl;
cout<<"状态:"<<sta[check[num]->state]<<endl;
}
else
cout<<"操作失败!"<<endl;
}
//功能:存款
//说明:增加账户金额,需要保证账户存在,且处于正常状态
void Bank::save()
{
int num;
double m;
cout<<"请输入账号:";
cin>>num;
if(num<0||num>=realcount)
{
cout<<"该账户不存在!"<<endl;
return;
}
if(check[num]->state!=1)
{
cout<<"该账户已经处于"<<(check[num]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;
return ;
}
cout<<"姓名:"<<check[num]->username<<endl;
cout<<"请输入存款金额:";
cin>>m;
check[num]->money+=m;
cout<<"存款成功!"<<endl;
cout<<"余额:"<<check[num]->money<<endl;
}
//功能:取款
//说明:减少账户金额。需要保证账户存在,且处于正常状态,另外,余额要足够取
void Bank::withdraw()
{
int num,key;
double m;
cout<<"请输入账号:";
cin>>num;
if(num<0||num>=realcount)
{
cout<<"该账户不存在!"<<endl;
return;
}
if(check[num]->state!=1)
{
cout<<"该账户已经处于"<<(check[num]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;
return ;
}
cout<<"姓名:"<<check[num]->username<<endl;
cout<<"请输入密码:";
key=inputpass();
if(checkkey(key,check[num]))
{
cout<<"余额:"<<check[num]->money<<endl;
cout<<"请输入取款金额:";
cin>>m;
if(m<=check[num]->money)
{
check[num]->money-=m;
cout<<"取款成功!"<<endl;
cout<<"余额:"<<check[num]->money<<endl;
}
else
cout<<"余额不足!"<<endl;
}
else
cout<<"操作取消!"<<endl;
}
//功能:转账
//说明:需要保证两个账户都存在,且处于正常状态,另外,转出账户的余额要足够
void Bank::transfer()
{
int in,out,key;
double m;
cout<<"输入转出账号:";
cin>>out;
if(out<0||out>=realcount)
{
cout<<"该账户不存在!"<<endl;
return;
}
if(check[out]->state!=1)
{
cout<<"该账户已经处于"<<(check[out]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;
return ;
}
cout<<"姓名:"<<check[out]->username<<endl;
cout<<"请输入密码:";
key=inputpass();
if(checkkey(key,check[out]))
{
cout<<"余额:"<<check[out]->money<<endl;
cout<<"请输入转账金额:";
cin>>m;
if(m<=check[out]->money)
{
cout<<"输入转入帐号:";
cin>>in;
if(in<0||in>=realcount)
{
cout<<"该账户不存在!"<<endl;
return;
}
if(check[in]->state!=1)
{
cout<<"该账户已经处于"<<(check[in]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;
return ;
}
check[out]->money-=m;
check[in]->money+=m;
cout<<"转账成功!"<<endl;
cout<<"余额:"<<check[out]->money<<endl;
}
else
cout<<"余额不足!"<<endl;
}
else
cout<<"操作取消!"<<endl;
}
//功能:挂失
//说明:将用户账户状态改为挂失
void Bank::reportloss()
{
int num,key;
cout<<"请输入账号:";
cin>>num;
if(num<0||num>=realcount)
{
cout<<"该账户不存在!"<<endl;
return;
}
if(check[num]->state!=1)
{
cout<<"该账户已经处于"<<(check[num]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;
return ;
}
cout<<"姓名:"<<check[num]->username<<endl;
cout<<"请输入密码:";
key=inputpass();
if(checkkey(key,check[num]))
{
check[num]->state=2;
cout<<"挂失成功!"<<endl;
}
else
cout<<"操作取消!"<<endl;
}
//功能:解挂
//说明:将用户账户状态改为正常
void Bank::cancelloss()
{
int num,key;
cout<<"请输入账号:";
cin>>num;
if(num<0||num>=realcount)
{
cout<<"该账户不存在!"<<endl;
return;
}
if(check[num]->state!=2)
{
cout<<"该账户已经处于"<<(check[num]->state==0?"销户状态,无法操作!":"正常状态,无需解挂。")<<endl;
return ;
}
cout<<"姓名:"<<check[num]->username<<endl;
cout<<"请输入密码:";
key=inputpass();
if(checkkey(key,check[num]))
{
check[num]->state=1;
cout<<"解挂成功!"<<endl;
}
else
cout<<"操作取消!"<<endl;
}
//功能:改密
//说明:更改账户密码,需在账户正常的状态下进行
void Bank::changepass()
{
int num,key,key1,key2;
cout<<"请输入账号:";
cin>>num;
if(num<0||num>=realcount)
{
cout<<"该账户不存在!"<<endl;
return;
}
if(check[num]->state!=1)
{
cout<<"该账户已经处于"<<(check[num]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;
return ;
}
cout<<"姓名:"<<check[num]->username<<endl;
cout<<"请输入密码:";
key=inputpass();
if(checkkey(key,check[num]))
{
cout<<"输入新密码:";
key1=inputpass();
cout<<"确认密码:";
key2=inputpass();
if(key1==key2)
{
check[num]->passkey=key1;
cout<<"修改密码成功!"<<endl;
}
else
cout<<"2次密码不一致,修改失败!"<<endl;
}
else
cout<<"操作取消!"<<endl;
}
void itoa(int i, char *string)
{
int power = 0, j = 0;
j = i;
for (power = 1; j>10; j /= 10)
power *= 10;
for (; power>0; power /= 10)
{
*string++ = '0' + i / power;
i %= power;
}
*string = '\0';
printf("%s\n", string);
}
int atoi(char *str)
{
if (!str)
return -1;
bool bMinus = false;
int result = 0;
if (('0'>*str || *str>'9') && (*str == '+' || *str == '-'))
{
if (*str == '-')
bMinus = true;
*str++;
}
while (*str != '\0')
{
if ('0'> *str || *str>'9')
break;
else
result = result * 10 + (*str++ - '0');
}
if (*str != '\0')//no-normal end
return -2;
return bMinus ? -result : result;
}
int encode(int key)
{
char CK[7];
itoa(key,CK);
for(int i=0;i<=5;i++)
{
CK[i]++;
}
return atoi(CK);
}
int decode(int key)
{
char CK[7];
itoa(key,CK);
for(int i=0;i<=5;i++)
{
CK[i]--;
}
return atoi(CK);
}
int inputpass()
{
cout<<"密码格式为六位数字!!!点击P确认"<<endl;
int pass=0,i;
char ch;
while(ch!='p')
{
cout<<"点击P确认"<<endl;
cin>>ch;
}
ERR:
for(i=0;i<6;i++)
{
ch=getchar();
putchar('*');
if(ch>='0'&&ch<='9')
{
pass=pass*10+(ch-'0');
}
else
{
pass=0;
break;
}
}
if(pass==0)
{
cout<<"请输入密码:"<<endl;
goto ERR;
}
cout<<endl;
return encode(pass);
}
//功能:验证密码输入是否正确
bool checkkey(int key,Check *u)
{
int temp=u->getpass();
if(key==temp)
return true;
else
cout<<"密码错误!"<<endl;
return false;
}
int Check::getpass()
{
return passkey;
}
void Check::Set(string id,string usename,string usid,string place,string pon,double m,double rate,int key)
{
checkid=id;
username=usename;
userid=usid;
userplace=place;
phone=pon;
passkey=key;
state=1;
money=m;
}
main.cpp
/*
*版权所有 (C)2019,Yueyang.
*文件名称:银行储蓄系统
*内容摘要:本项目模拟银行柜台上业务,设计一个支持多名用户开户、存款等功能的软件系统。
*当前版本:V1.0
*作者:杨越
*完成日期:20191015
*/
#include <iostream>
#include "Bank.h"
using namespace std;
int main()
{
cout<<"+-------------------------------+"<<endl;
cout<<" 欢迎光临我的银行!"<<endl;
cout<<"+-------------------------------+"<<endl;
Bank bank;
bank.work();
return 0;
}
(四)编写Makefile上传到LINUX编译运行
之前自己传文件到LINUX上都是通过SSH,改一点就要传一点非常麻烦,现在使用github当真非常方便。特别是使用了vscode 后可以直接使用图形界面控制git.
Makefile
CXX = g++
LIB = -L
INC = -I./include
CXXFLAGS = -DSNACC_DEEP_COPY -DHAVE_VARIABLE_SIZED_AUTOMATIC_ARRAYS -Wno-deprecated -fPIC
TARGET=./bin/main
SRC=$(wildcard ./src/*.cpp)
OBJ=$(patsubst %.cpp, %.o, $(SRC))
$(TARGET): $(OBJ)
$(CXX) $(CXXFLAGS) -o $@ $^ $(LIB) -lprotobuf
$(OBJ):%.o: %.cpp
$(CXX) $(CXXFLAGS) $(INC) -o $@ -c $<
clean:
rm -f *.o
rm -f $(TARGET)
运行效果
(五)总结
还是那句话:静下心来求知,这一次这句话说给我自己。
无论多么困难,依旧不忘初心,不管未来是如何,不管自己未来要干什么,都要珍惜当下的每一天。