-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDate.cpp
More file actions
115 lines (101 loc) · 2.87 KB
/
Date.cpp
File metadata and controls
115 lines (101 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// Fig. 10. 7: Date.cpp
// Date class member- and friend function definitions.
#include <iostream>
#include <string>
#include "Date.h"
using namespace std;
// initialize static member; one classwide copy
const array<unsigned int, 13> Date::days{
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
// Date constructor
Date::Date(int month, int day, int year) {
setDate(month, day, year);
}
// set month, day and 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" };
}
// test for a leap year
if ((mm == 2 && leapYear(year) && dd >= 1 && dd <= 29) ||
(dd >= 1 && dd <= days[mm])) {
day = dd;
}
else {
throw invalid_argument{
"Day is out of range for current month and year"};
}
}
// return month for validate employee's birthday
unsigned int Date::getMonth(){
return month;
}
// overloaded prefix increment operator
Date& Date::operator++() {
helpIncrement(); // increment date
return *this; // reference return to create an lvalue
}
// overloaded postfix increment operator; note that the
// dummy integer parameter does not have a parameter name
Date Date::operator++(int) {
Date temp{ *this }; // hold current state of object
helpIncrement();
// return unincremented, saved, temporary object
return temp; // value return; not a reference return
}
// add specified number of days to date
Date& Date::operator+=(unsigned int additionalDays) {
for (unsigned int i = 0; i < additionalDays; ++i) {
helpIncrement();
}
return *this; // enables cascading
}
// if the year is a leap year, return true; otherwise, return false
bool Date::leapYear(int testYear) {
return (testYear % 400 == 0 ||
(testYear % 100 != 0 && testYear % 4 == 0));
}
// determine whether the day is the last day of the month
bool Date::endOfMonth(int testDay) const {
if (month == 2 && leapYear(year)) {
return testDay == 29; // last day of Feb. in leap year
}
else {
return testDay == days[month];
}
}
// function to help increment the date
void Date::helpIncrement() {
// day is not end of the month
if (!endOfMonth(day)) {
++day; // increment day
}
else {
if (month < 12) { // day is end of month and month < 12
++month; // increment month
day = 1; // first day of new month
}
else { // last day of year
++year; // increment year
month = 1; // first month of new year
day = 1; // first day of new month
}
}
}
// overloaded output operator
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; // enables cascading
}