面向对象程序设计——类与对象的应用2

一、实验目的:

  1. 掌握类和对象的概念、定义和使用方法。
  2. 掌握静态数据成员和const修饰的成员函数的用法。
  3. 掌握c++程序的一般结构。

二、实验内容:

在个人的活期储蓄账户类SavingsAccount上修改完成以下内容:

  • 在类SavingsAccount中增加一个静态数据成员total,用来记录各个账户的总金额,并为其增加相应的静态成员函数getTotal用来对其进行访问。
  • 将类SavingsAccount中不需要改变对象状态的成员函数声明为常成员函数,比如getBalance等。
  • 增加日期类Date
class  Date
{
int  year, month, day;
int  totalDays;   //该日期是从公元元年1月1日开始的第几天
  publicDate(int year, int month, int day);	
	 int  getYear() const { return year; }
	 int  getMonth() const { return month; }
	 int  getDay() const { return day; }
	 void  show() const;			//输出当前日期
bool  isLeapYear() const//判断当年是否为闰年
	 int  distance(const Date& date) const//计算当前日期与指定日期之间相差天数
};
  • 类SavingsAccount中的int date都要改成Date类的对象。
  • 将整个程序分为5个文件:date.h account.h是类定义头文件,date.cpp account.cpp是类实现文件,5.cpp是主函数文件。

提示:

  • 利息的计算方式:一年中每天的余额累积起来再除以一年的总天数,得到一个日均余额,再乘以年利率。
  • 两个日期相差天数的计算方式:选取一个基准日期(如公元元年1月1日),在计算两个日期相差天数时,先分别将两个日期与基准日期的相对天数计算出来,再将两个相对天数相减即可。
  • 与基准日期(如公元元年1月1日)相对天数的计算方式:(1)计算公元元年到公元y-1年的总天数。平均每年有365天,闰年多一天,即365*(y-1)加上公元元年到y-1年之间的闰年数。(2)加上当年当月1日到当年1月1日之间相差的天数。(3)加上当年当月当日到当年当月1日之间相差的天数。
  • 可以把每月1日到1月1日天数放在一个数组中,该数组元素值分别是:0,31,59,90,120,151,181,212,243,73,304,334,365
  • 两个头文件里先写:
#ifndef  _DATE_H_                                  
#define  _DATE_H_                 #endif                                       

#ifndef  _ACCOUNT_H_  
#define  _ACCOUNT_H_#endif

要求:
 完成上述成员函数的定义;
 定义类对象,测试程序的正确性
定义两个账户s0和s1,年利率都是1.5%,都在2008年11月1日创建账户,随后s0在2008年11月5日和2008年12月5日分别存入5000元和5500元,s1在2008年11月25日和2008年12月20日分别存入10000元和取出4000元。2009年1月1日是银行的计息日。分别输出s0和s1两个账户的信息(账号、余额)及所有账户的总额。

源代码:

Main.cpp:
#include<iostream>
#include"date.h"
#include"account.h"
using namespace std;
double SavingsAccount::total = 0;
int main()
{
    SavingsAccount s0(1001,0.015,2008,11,1);
    SavingsAccount s1(1002,0.015,2008,11,1);
    cout<<endl;
    Date d01(2008,11,5),d02(2008,12,5),d11(2008,11,25),d12(2008,12,20),d2(2009,1,1);
    s0.deposit(d01,5000);
    s1.deposit(d11,10000);
    s0.deposit(d02,5500);
    s1.withdraw(d12,4000);
    cout<<endl;
    s0.settle(d2);
    cout<<endl;
    s1.settle(d2);
    cout<<endl;
    s0.show();
    s1.show();
    cout<<"所有账户总余额:"<<s0.getTotal()<<endl;
}
Account.h:
#ifndef ACCOUNT_H_
#define ACCOUNT_H_
#include "date.h"
class  SavingsAccount
{
    int  Id;  //帐号
    double  balance;  //余额
    double  Rate;   //年利率
    Date  lastDate; //上次变更余额的日期
    double  accumulation; //余额按日累加之和
    double static total;
    double  accumulate(Date date);   //获得到指定日期为止的存款金额按日累积值
public:
    SavingsAccount(int id, double rate,int year,int month,int day);  //构造函数
    void  deposit(Date date, double amount);  //存入现金,date为日期,amount为金额
    void  withdraw(Date date, double amount);  //取出现金
    void  settle(Date date); //结算利息,每年1月1日调用一次该函数
    void  show();   //输出账户信息
    int getId() const {return Id;}
    double  getBalance () const { return balance;}
    double  getRate() const {return Rate;}
    double static getTotal();
};
#endif // ACCOUNT_H_INCLUDED
Account.cpp:
#include <iostream>
#include "account.h"
using namespace std;
double SavingsAccount::accumulate(Date date)
{
    return balance*lastDate.distance(date);
}
SavingsAccount::SavingsAccount(int id,double rate,int year,int month,int day) :lastDate(year,month,day)
{
    Id=id;
    Rate=rate;
    balance=0;
    cout<<year<<"年"<<month<<"月"<<day<<"日:  \t";
    cout<<"ID为"<<Id<<"的账户创建完成"<<endl;
}
void  SavingsAccount::deposit(Date date, double amount)  存入现金,date为日期,amount为金额
{
    accumulation += accumulate(date);
    balance+=amount;
    lastDate = date;
    total += amount;
    cout<<"ID为"<<Id<<"的账户存入:"<<amount<<" \t"<<Id<<" 该账户余额为:"<<balance<<endl;
}
void  SavingsAccount::withdraw(Date date, double amount) 取出现金
{
    accumulation += accumulate(date);
    if(balance>=amount)
        balance-=amount;
    else
        cout<<"账户余额不足"<<endl;
    lastDate=date;
    total -= amount;
    cout<<"ID为"<<Id<<"的账户取出:"<<amount<<" \t"<<Id<<" 该账户余额:"<<balance<<endl;
}
void  SavingsAccount::settle(Date date)   //结算利息,每年1月1日调用一次该函数
{
    accumulation += accumulate(date);
    double settle = (accumulation/356)*Rate;
    cout<<Id<<"结算利息:"<<settle<<endl;
    deposit(date,settle);
}
void  SavingsAccount::show()    //输出账户信息
{
    cout<<"帐号:"<<Id<<endl<<"余额:"<<balance<<endl;
}
double SavingsAccount::getTotal()
{
    return total;
}
Date.h:
#ifndef DATE_H_INCLUDED
#define DATE_H_INCLUDED
class  Date
{
    int  year, month, day;
    int  totalDays;   //该日期是从公元元年1月1日开始的第几天
public:
    Date(int year, int month, int day);
    int  getYear() const { return year; }
    int  getMonth() const { return month; }
    int  getDay() const { return day; }
    void  show() const;   //输出当前日期
    bool  isLeapYear(int year) const; //判断当年是否为闰年
    int  distance(const Date& date) const;//计算当前日期与指定日期之间相差天数
};
#endif // DATE_H_INCLUDED
Date.cpp:
#include <iostream>
#include "date.h"
using namespace std;
Date::Date(int Year, int Month, int Day)
{
    year=Year;
    month=Month;
    day=Day;
    int Days=0;
    for(int i=0;i<year;i++)
    {
        if(isLeapYear(i)==true)
            Days=Days+366;
        else
            Days=Days+365;
    }
    switch(month){
    case 1:Days+=0;break;
    case 2:Days+=31;break;
    case 3:Days+=59;break;
    case 4:Days+=90;break;
    case 5:Days+=120;break;
    case 6:Days+=151;break;
    case 7:Days+=181;break;
    case 8:Days+=212;break;
    case 9:Days+=243;break;
    case 10:Days+=273;break;
    case 11:Days+=304;break;
    case 12:Days+=334;break;
    default:cout<<"month error!"<<endl;
    }
    totalDays=Days+day;
}
void  Date::show() const
{
    cout<<getYear()<<"年"<<getMonth()<<"月"<<getDay()<<"日:  "<<endl;
} //输出当前日期
bool  Date::isLeapYear(int year) const
{
    if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
        return true;
    else
        return false;
} //判断当年是否为闰年
int  Date::distance(const Date& date) const
{
    cout<<date.year<<"年"<<date.month<<"月"<<date.day<<"日:  "<<"\t";
    return date.totalDays-totalDays;
}    //计算当前日期与指定日期之间相差天数

运行截图:
在这里插入图片描述

学习掌握
类和对象的概念、定义和使用方法、静态数据成员和const修饰的成员函数的用法
c++程序的一般结构,一个大的项目是由小程序逐渐精细化而产生的。
组织各种函数之间的协调调用,达到使用目的,将生活中的一些问题转化成C中相应的实现方法,如在这次实验中的天数问题,就可以使用数组、switch 语句等方法解决。
多个源文件和头文件之间的相互联系也是需要多次调试,方能共同作用。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值