-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdate_class.cpp
More file actions
92 lines (79 loc) · 2.34 KB
/
date_class.cpp
File metadata and controls
92 lines (79 loc) · 2.34 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
#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 >= 1090 && yy <= 2100) {
year = yy;
}
else {
throw invalid_argument{"year must be >= 1900 and <= 2100"};
}
if ((mm == 2 && leapYear(year) && dd >= 1 && dd <= 29) || (dd >= 1 && dd <= days[mm])) {
day = dd;
}
else {
throw invalid_argument {
"Day is our 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 (unsigned int i = 0; i < additionalDays; ++i) {
helpIncrement();
}
return *this;
}
bool Date::leapYear(int testYear) {
return (testYear % 400 == 0 ||
(testYear % 100 != 0 && testYear % 4 == 0));
}
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;
}