C++ Coding Practise 1 — Virtual Bank
上个周末的时候答应SS zt说帮他做一个程序
很简单的
还不用考虑错误兼容
当然啦
我知道肯定不是他自己要的
而是他自己懒得写
但是又不好拒绝别人
lol
当时我正为自己定了一些训练计划
C++也是其中的一项
然后也就同意了
25日建了工程
什么都没做
昨晚上闲来没事
于是开始
题目是这样的:
1。每笔存款的储户信息和办理该笔存款的营业员信息,这些信息存放于存款文件中。
其中,储户信息包括:帐号,姓名,密码,地址,储种(定期1年,3年,5年),本金,收储日期,是否已挂失和挂失日期,
营业员信息包括:接待该储户的营业员的姓名与工号。
2。每笔取款的储户信息和办理该笔取款的营业员信息,这些信息存放于取款文件中。
系统功能要求如下:
1。创建存款文件(第一次输入储户信息时);
2。创建取款文件(第一次办理取款时);
3。接收储蓄。接收储户与营业员信息并将以上信息添加到存款文件中;
4。处理挂失。根据储户提供的帐号,姓名,密码,地址,储种,储金核查有无此项存款,
有则对此帐号加入挂失标记,若无此项存款,则需判断是否领走还是未发生过这笔存款。
5。办理取款:
1,根据储户提供的存款单(上面有帐号,姓名,储种,本金,日期)判断是否到期,检查有否挂失,
根据储户提供的密码判断是否正确。若以上判断通过,执行以下操作。
2,在取款文件中添加这笔取款的储户和营业员的所有信息和取款日期,以便复查。
3,打印利息单,其内容包括:帐号,姓名,储种,起息日期,支取日期,本金,利息和支取金额。
利息计算方法如下:1年到期利率1.98%;3年到期利率2.25%;5年到期利率3.5%,每逾期一天,每天利率0.05%;
若未到期提前支取,按每天利率0.05%计,利息税按20%扣除。
4,在存款文件中对这笔存款删除。
6。统计今后3天每天到期的储金数,以便备款。
[提示]
创建一个存款信息类,包含储户和营业员等信息,创建取款信息类,包含必要信息
。定义存款信息类和取款信息类的文件,链表或数组。通过菜单的选择实现题目中所
要求的各种功能。
看完要求之后依样画葫芦地设计了一下。这里很tb,拼音,英文,Chinglish混杂,而且有些类型也是很乱的
几个Singleton类,
你问我为什么要用Singleton?
我的答案是,……,errr,需要吗?不需要吗?
GetMoneyInfo
PutMoneyInfo
GetMoneyInfoFile
PutMoneyInfoFile
设计了共用的记录存储格式
struct CustomerInfo
{
int account;
char name[20];
char password[8];
char address[50];
int type;
int corpus;
time_t putdate;
time_t getdate;
bool reportloss;
time_t reportlossdate;
};
struct ClerkInfo
{
char name[20];
int code;
};
typedef struct _MoneyRecord
{
CustomerInfo customer;
ClerkInfo clerk;
}MoneyRecord, GetMoneyRecord, PutMoneyRecord;
#define GETMONEYDATFILE "getmoney.dat"
#define PUTMONEYDATFILE "putmoney.dat"
#define rate(x) (x==1)?1.98:(x==3?2.25:(x==5?3.5:1.98*x))
然后,参考gof的设计模式书上的例子画了四个Singleton类
GetMoneyInfo,PutMoneyInfo,GetMoneyInfoFile,PutMoneyInfoFile
其中xxxInfo又有内部变量是xxxInfoFile类型
//singleton.h
class CSingleton
{
public:
static CSingleton* Instance(void);
~CSingleton(void);
protected:
CSingleton(void);
private:
static CSingleton* _instance;
};
//singleton.cpp
#include "singleton.h"
CSingleton* CSingleton::_instance = 0;
CSingleton::CSingleton(void)
{
}
CSingleton * CSingleton::Instance(void)
{
if (_instance == 0) {
_instance = new CSingleton;
}
cout<<"xx";
return _instance;
}
CSingleton::~CSingleton(void)
{
}
本来事情发展就很顺利了
但是我遇到一个问题
就是
iostream的bt问题
做个笔记吧
以往的时候也都遇到过
就是cin>>输入了不符合要求的数据之后
后面的cin>>都会被跳过
这是因为,cin在某次输入错误之后
设置了cin内部的bit位
只需要在cin>>之前调用cin.clear()即可
当年我似乎是用fflush还是flushall来解决问题的
当然啦,fstream也遇到问题了
无奈之下,只好也用了这种办法
为什么会遇到呢?
请看第一第二个需求
文件不存在的时候自动创建
fs.open( PUTMONEYDATFILE, ios_base::in);
if( !fs ) {
fs.close();
fs.open( PUTMONEYDATFILE, ios_base::out);
}
fs.close();
好,那我先用ios_base::in的模式来打开
fs.open("blah")
不行的话说明文件不存在,
再用ios_base::out模式试图打开某文件然后关闭就有这个文件了
注意了,这个时候,fs是被设置了badbit的
情况和上面讲的cin>>输入错误的数据之后cin流的状态类似
因此这个时候如果write的话是写不了数据的
因为write会先检查state是否ok
所以我们需要clear一下
另外要声明
fs是singleton的内部变量
所以才会在其他方法中涉及读写的时候出这个问题
iostream这块还是有点迷迷糊糊的
整个流程基本上是
一个小时时间设计
四个小时边coding边改bug
中间灌灌水聊聊天
15k左右的代码
是比以前慢了
还有很多可以优化的地方
比方说两个文件操作类可以合成一个
类的抽象程度不够
代码复用率低
很困了,写得很乱
不知道有几多人看得懂
昨晚在down Swordsman.AIO.Remastered.iNT.DVDRip.XviD.DualAudio-NDRT
包含了笑傲江湖的三部
有兴趣的朋友可以去找来看看
经典之作,呵呵
向关心我身体健康的朋友们说声sorry
哎
四点的时候就可以睡了的
不过那时候躺了一会儿
前半夜的时候脑子很清醒可惜多数时间浪费了
后半夜又很困
犯了低级错误造成的一个bug花了半小时才找出来
五点半交给SS zt
据他说九点那人就走了
所以要赶在这时间之前
得到bg一场
哈,也不算白辛苦