fig10.6

Date.h

#pragma once
#include<array>
#include<iostream>

class Date
{
	friend std::ostream &operator<<(std::ostream &, const Date &);
public:
	Date(int m = 1, int d = 1, int y = 1900);
	void setDate(int, int, int);
	Date &operator++();
	Date operator++(int);
	Date &operator+=(unsigned int);
	static bool leapYear(int);
	bool endOfMonth(int) const;
private:
	unsigned int month;
	unsigned int day;
	unsigned int year;

	static const std::array<unsigned int, 13>days;
	void helpIncrement();


};

Date.cpp

#include<iostream>
#include<string>
#include"Date.h"

using namespace std;

const array<unsigned int, 13>Date::days =
{ 0,31,28,31,30,31,30,31,31,30,31,30,31 };

Date::Date(int month, int day, int year)
{
	setDate(month, day, year);

}

void Date::setDate(int mm, int dd, int yy)
{
	if (mm >= 1 && mm <= 12)
		month = mm;
	else
		throw invalid_argument("Month must be 1-12");

	if (yy >= 1900 && yy <= 2100)
		year = yy;
	else
		throw invalid_argument("Year must be >= 1900 and <= 2100");

	if ((month == 2 && leapYear(year) && dd >= 1 && dd <= 29) ||
		(dd >= 1 && dd <= days[month]))
		day = dd;
	else
		throw invalid_argument(
			"Day is out of range for current month and year");
}


Date &Date::operator++()
{
	helpIncrement();
	return *this;
}

Date Date::operator++(int)
{
	Date temp = *this;
	helpIncrement();
	return temp;
}

Date &Date::operator+=(unsigned int additionalDays)
{
	for (int i = 0; i < additionalDays; ++i)
		helpIncrement();
	return *this;
}

bool Date::leapYear(int testYear)
{
	if (testYear % 400 == 0 ||
		(testYear % 100 != 0 && testYear % 4 == 0))
		return true;
	else
		return false;


}

bool Date::endOfMonth(int testDay) const
{
	if (month == 2 && leapYear(year))
		return testDay == 29;
	else
		return testDay == days[month];

}

void Date::helpIncrement()
{
	if (!endOfMonth(day))
		++day;
	else
		if (month < 12)
		{
			++month;
			day = 1;
		}
		else
		{
			++year;
			month = 1;
			day = 1;
		}
}

ostream &operator<<(ostream &output, const Date &d)
{
	static string monthName[13] = { "", "January","February",
		"March", "April","May","June","July","August",
		"September", "October","November","December" };
	output << monthName[d.month] <<' '<< d.day << ", " << d.year;
	return output;

}

fig10_08.cpp

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

int main()
{
	Date d1(12, 27, 2010);
	Date d2;

	cout << "d1 is " << d1 << "\nd2 is " << d2;
	cout << "\n\nd1 += 7 is " << (d1 += 7);
	d2.setDate(2, 28, 2008);
	cout << "\n\n d2 is " << d2;
	cout << "\n++d2 is " << ++d2 << "(leap year allows 29th)";

	Date d3(7, 13, 2010);

	cout << "\n\nTesting the prefix increment operator:\n"
		<< " d3 is " << d3 << endl;
	cout << "++d3 is " << ++d3 << endl;
	cout << " d3 is " << d3;


	cout <<"\n\nTesting the postfix increment operator:\n"
		<<" d3 is " << d3 << endl;
	cout << "d3++ is" << d3++ << endl;
	cout << " d3 is " << d3 << endl;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值