c++实验报告同名12568.docx
《c++实验报告同名12568.docx》由会员分享,可在线阅读,更多相关《c++实验报告同名12568.docx(17页珍藏版)》请在冰豆网上搜索。
![c++实验报告同名12568.docx](https://file1.bdocx.com/fileroot1/2023-2/8/7bb19cc0-0d29-46fe-9c21-afb538c02e9f/7bb19cc0-0d29-46fe-9c21-afb538c02e9f1.gif)
c++实验报告同名12568
c++实验报告(同名12568)
C++课程设计报告
学号:
班级:
13级计科二班
姓名:
指导教师:
王定成
个人银行综合实例
一.设计目的
将理论教学中涉及到的知识点贯穿起来,对不同的数据类型,程序控制结构,数据结构做一比较和总结,结合设计题目进行综合性应用,对所学知识打到融会贯通的程度。
通过课程设计,学生在下述方面的能力应该得到提升:
1)进一步巩固加深学生所学专业课程,理论联系实际,进一步培养学生综合分析能力,解决问题的能力。
2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
5)掌握面向对象程序设计的方法。
6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。
7)进一步掌握在集成环境下如何调试程序和修改程序。
二.设计说明:
一个人可以有多个活期储蓄账户,一个活期储蓄账户包括账号(id),余额(balance),年利率(rate)等信息,还包括显示账户信息(show),存款(deposit),取款(withdraw),结算利息(settle)等操作。
设计一个类SavingsAccount,将id,balance,rate均作为其成员数据,将show,deposit,withdraw,settle均作为其成员函数。
无论存款,取款还是结算利息,都需要修改当前的余额并且将余额的变动输出,这些公共操作由私有成员函数record来执行。
实现该类的难点在于利息的计算。
由于账户的月是不断变化的,因此不能通过余额与年利率相乘的办法来计算年利,而是需要将一年当中每天的余额累积起来再除以一年的总天数,得到一个日均余额,再乘以年利率。
为了计算余额的按日累积值,SavingsAccount引入了私有数据成员lastDate,accumulation和私有成员函数accumulate。
lastDate用来存储上一次余额变动的日期,accumulation用来存储上次计算利息以后直到最近一次余额变动时余额按日累加的值,accumulate成员函数用来计算截至指定日期的账户余额按日累积值。
三.源代码
8-8.cpp
#include"account.h"
#include
usingnamespacestd;
intmain()//起始日期
{Datedate(2008,11,1);
//建立几个帐户
SavingsAccountsa1(date,"s3755217",0.015);
SavingsAccountsa2(date,"02342342",0.015);
CreditAccountca(date,"c5392394",10000,0.0005,50);
Account*accounts[]={&sa1,&sa2,&ca};//账户总数
constintn=sizeof(accounts)/sizeof(Account*);
cout<<"(d)deposit(w)withdraw(s)show(c)changeday(n)nextmonth(e)exit"<charcmd;
do{//显示日期和总金额
date.show();
cout<<"\tTotal:
"<:
getTotal()<<"\tcommand>";
intindex,day;
doubleamount;
stringdesc;
cin>>cmd;
switch(cmd){
case'd':
//存入现金
cin>>index>>amount;
getline(cin,desc);
accounts[index]->deposit(date,amount,desc);
break;
case'w':
//取出现金
cin>>index>>amount;
getline(cin,desc);
accounts[index]->withdraw(date,amount,desc);
break;
case's':
//查询各帐户信息
inti;
for(i=0;icout<<"["<
accounts[i]->show();
cout<}
break;
case'c':
//改变日期
cin>>day;
if(daycout<<"Youcannotspecifyapreviousday";
elseif(day>date.getMaxDay())
cout<<"Invalidday";
elsedate=Date(date.getYear(),date.getMonth(),day);
break;
case'n':
//进入下个月
if(date.getMonth()==12)
date=Date(date.getYear()+1,1,1);
else
date=Date(date.getYear(),date.getMonth()+1,1);
for(i=0;iaccounts[i]->settle(date);
break;
}
}while(cmd!
='e');
return0;
}
account.cpp
#include"account.h"
#include
#include
usingnamespacestd;
doubleAccount:
:
total=0;//Account类的实现
Account:
:
Account(constDate&date,conststring&id)
:
id(id),balance(0)
{date.show();
cout<<"\t#"<}
voidAccount:
:
record(constDate&date,doubleamount,conststring&desc){
amount=floor(amount*100+0.5)/100;//保留小数点后面两位
balance+=amount;
total+=amount;
date.show();
cout<<"\t#"<}
voidAccount:
:
error(conststring&msg)const
{cout<<"Error(#"<"<//voidSavingsAccount:
:
deposit(constDate&date,doubleamount,conststring&desc)
//{record(date,amount,desc);}
voidAccount:
:
show()const{
cout<}
//SavingsAccount类相关成员函数的实现
SavingsAccount:
:
SavingsAccount(constDate&date,conststring&id,doublerate):
Account(date,id),rate(rate),acc(date,0){}
voidSavingsAccount:
:
deposit(constDate&date,doubleamount,conststring&desc){
record(date,amount,desc);
acc.change(date,getBalance());}
voidSavingsAccount:
:
withdraw(constDate&date,doubleamount,conststring&desc)
{
if(amount>getBalance())
error("notenoughmoney");
else
{record(date,-amount,desc);
acc.change(date,getBalance());
}
}
voidSavingsAccount:
:
settle(constDate&date)
{if(date.getMonth()==1){
doubleinterest=acc.getSum(date)*rate/(date-Date(date.getYear()-1,1,1));
//计算年息
if(interest!
=0)
record(date,interest,"interest");
acc.reset(date,getBalance());
}
}
//CreditAccount类相关成员函数的实现
CreditAccount:
:
CreditAccount(constDate&date,conststring&id,doublecredit,doublerate,doublefee)
:
Account(date,id),credit(credit),rate(rate),fee(fee),acc(date,0){}
voidCreditAccount:
:
deposit(constDate&date,doubleamount,conststring&desc)
{record(date,amount,desc);
acc.change(date,getDebt());}
voidCreditAccount:
:
withdraw(constDate&date,doubleamount,conststring&desc)
{
if(amount-getBalance()>credit)
error("notenoughcredit");
else
{record(date,-amount,desc);
acc.change(date,getDebt());
}
}
voidCreditAccount:
:
settle(constDate&date)
{
doubleinterest=acc.getSum(date)*rate;
if(interest!
=0)
record(date,interest,"interest");
if(date.getMonth()==1)
record(date,-fee,"annualfee");
acc.reset(date,getDebt());
}
voidCreditAccount:
:
show()const{
Account:
:
show();
cout<<"\tAvailablecredit:
"<}
account.h
#ifndef_ACCOUNT_H_
#define_ACCOUNT_H_
#include"date.h"
#include"accumulator.h"
#include
classAccount{//账户类
private:
std:
:
stringid;//账号
doublebalance;//余额
staticdoubletotal;//所有账户的总金额
protected:
//供派生类调用的构造函数,id为账户
Account(constDate&date,conststd:
:
string&id);
//记录一笔账,date为日期,account为金额,desc为说明
voidrecord(constDate&date,doubleamount,conststd:
:
string&desc);
//报告错误信息
voiderror(conststd:
:
string&msg)const;
public:
conststd:
:
string&getId()const{returnid;}
doublegetBalance()const{returnbalance;}
staticdoublegetTotal(){returntotal;}
//显示账户信息
virtualvoiddeposit(constDate&date,doubleamount,conststd:
:
string&desc)=0;
virtualvoidwithdraw(constDate&date,doubleamount,conststd:
:
string&desc)=0;
virtualvoidsettle(constDate&date)=0;
virtualvoidshow()const;
};
classSavingsAccount:
publicAccount
{//储蓄账户类
private:
Accumulatoracc;//辅助计算利息的累加器
doublerate;//存储的年利率
public:
//构造函数
SavingsAccount(constDate&date,conststd:
:
string&id,doublerate);
doublegetRate()const{returnrate;}
//存入现金
voiddeposit(constDate&date,doubleamount,conststd:
:
string&desc);
//取出现金
voidwithdraw(constDate&date,doubleamount,conststd:
:
string&desc);
voidsettle(constDate&date);//结算利息,每年1月1日调用一次该函数
};
classCreditAccount:
publicAccount{//信用账户类
private:
Accumulatoracc;//辅助计算利息的累加器
doublecredit;//信用额度
doublerate;//欠款的日利率
doublefee;//信用卡年费
doublegetDebt()const{//获得欠款额
doublebalance=getBalance();
return(balance<0?
balance:
0);}
public:
//构造函数
CreditAccount(constDate&date,conststd:
:
string&id,doublecredit,doublerate,doublefee);
doublegetCredit()const{returncredit;}
doublegetRate()const{returnrate;}
doublegetFee()const{returnfee;}
doublegetAvailableCredit()const{//获得可用信用额度
if(getBalance()>0)
returncredit+getBalance();
else
returncredit;}
//存入现金
voiddeposit(constDate&date,doubleamount,conststd:
:
string&desc);
//取出现金
voidwithdraw(constDate&date,doubleamount,conststd:
:
string&desc);
voidsettle(constDate&date);//结算利息,每年1月1日调用一次该函数
voidshow()const;
};
#endif
accumulator.h
#ifndef_ACCUMULATOR_H_
#define_ACCUMULATOR_H_
#include"date.h"
classAccumulator{//将某个数值按日累加
private:
DatelastDate;//上次变更数值的日期
doublevalue;//数值的当前值
doublesum;//数值按日累加之和
public:
//构造函数,date为开始累加的日期,value为初始值
Accumulator(constDate&date,doublevalue):
lastDate(date),value(value),sum(0){}
//获得日期date的累加结果
doublegetSum(constDate&date)const{returnsum+value*(date-lastDate);}
//在date将数值变更为value
voidchange(constDate&date,doublevalue)
{
sum=getSum(date);
lastDate=date;
this->value=value;
}
//初始化,将日期变为date,数值变为value,累加器清零
voidreset(constDate&date,doublevalue){
lastDate=date;this->value=value;sum=0;}
};
#endif
date.cpp
#include"date.h"
#include
#include
usingnamespacestd;
namespace{//namespace使下面的定义只在当前文件中有效
//存储平年中的某个月1日之前有多少天,为便于getMaxDay函数的实现,该数组多出一项
constintDAYS_BEFORE_MONTH[]={0,31,59,90,120,151,181,212,
243,273,304,334,365};}
Date:
:
Date(intyear,intmonth,intday):
year(year),month(month),day(day)
{
if(day<=0||day>getMaxDay())
{
cout<<"Invaliddate:
";
show();
cout<exit
(1);
}
intyears=year-1;
totalDays=years*365+years/4-years/100+years/400+
DAYS_BEFORE_MONTH[month-1]+day;
if(isLeapYear()&&month>2)totalDays++;
}
intDate:
:
getMaxDay()
const{
if(isLeapYear()&&month==2)
return29;
else
returnDAYS_BEFORE_MONTH[month]-DAYS_BEFORE_MONTH[month-1];
}
voidDate:
:
show()
const{
cout<}
date.h
#ifndef_DATE_H_
#define_DATE_H_
classDate{//日期类
private:
intyear;//年
intmonth;//月
intday;//日
inttotalDays;//该日期是从公元元年1月1日开始的第几天
public:
Date(intyear,intmonth,intday);//用年,月,日构造日期
intgetYear()const{returnyear;}
intgetMonth()const{returnmonth;}
intgetDay()const{returnday;}
intgetMaxDay()const;//获得当月有多少天
boolisLeapYear()const{//判断当年是否为闰年
returnyear%4==0&&year%100!
=0||year%400==0;}
voidshow()const;//输出当前日期
intoperator-(constDate&date)const{//计算两个日期之间差多少天
returntotalDays-date.totalDays;}
};
#endif
四.实验结果
、
五.实验总结
通过这次对C++课程设计的学习,我了解到了软件编程的基本操作,并感受到了学习编程的乐趣。
在此次学习中,我在老师的帮助下完成了对银行管理系统的编写,并成功运行。
尽管我的程序还很简单,也有很多漏洞,但是却是我尽心尽力编写完成的。
我的水平可能还不足以完成更加复杂和困难的程序,但是我会再接再厉,一直认真学习下去的。
六.参考资料
1.《C++程序设计课程设计》,机械工业出版社,刘振安,刘燕君,孙忱,2004
2.《Visual C++课程设计案例精编(第二版)》,中国水利水电出版社,严华峰,2002.
3.《Visual C++课程设计语系统开发案例》,清华大学出版社,伍俊良,2002.
4.《面向对象程序设计与VC++实践》,西安电子科技大学出版社,揣锦华,2005.