Date Program
#include
#include
#include
#include
using namespace std;
const string date::str_months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
const int date::days_in_months[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const string date::str_days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
bool date::isleapyear(int year)
{
return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}
bool date::isvaliddate(int y, int m, int d)
{
if (y >= year_min && y <= year_max && m >= 1 && m <= 12)
{
int lastdayofmonth = days_in_months[m-1];
if (m == 2 && isLeapYear(y))
{
lastdayofmonth = 29;
}
return (d >= 1 && d <= lastdayofmonth);
}
else
{
return false;
}
}
int date::getdayofweek(int y, int m, int d)
{
int centurytable[] = {4, 2, 0, 6, 4, 2, 0, 6};
int monthtable[] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
int monthleapyeartable[] = {6, 2, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
int century = y / 100;
int twodigityear = y % 100;
int centurytableindex = (century - 17) % 8;
if (centurytableindex < 0)
{
centurytableindex += 8;
}
int sum = centurytable[centurytableindex] + twodigityear + twodigityear / 4;
if (isleapyear(y))
{
sum += monthleapyeartable[m-1];
}
else
{
sum += monthtable[m-1];
}
sum += d;
return sum % 7;
}
date::date(int y, int m, int d)
{
setdate(y, m, d);
}
void date::setdate(int y, int m, int d)
{
setyear(y);
setmonth(m);
setday(d);
}
int date::getyear() const
{
return year;
}
void date::setyear(int y)
{
if (y >= year_min && y <= year_max)
{
year = y;
}
else
{
throw invalid_argument("Error: Invalid year (1753-9999)!");
}
}
int date::getmonth() const
{
return month;
}
void date::setmonth(int m)
{
if (m >= 1 && m <= 12)
{
month = m;
}
else
{
throw invalid_argument("Error: Invalid month (1-12)!");
}
}
int date::getday() const
{
return day;
}
void date::setday(int d)
{
int lastdayofmonth = days_in_months[month-1];
if (month == 2 && isleapyear(year))
{
lastdayofmonth = 29;
}
if (d >= 1 && d <= lastdayofmonth)
{
day = d;
}
else
{
throw invalid_argument("Error: Invalid day (1-28|29|30|31)!");
}
}
void date::print() const
{
cout << str_days[getdayofweek(year, month, day)] << ", "
<< day << " " << str_months[month-1] << " " << year << endl;
}
date& date::nextday()
{
int lastdayofmonth = days_in_months[month-1];
if (month == 2 && isleapyear(year))
{
lastdayofmonth = 29;
}
if (++day > lastdayofmonth)
{
day = 1;
if (++month > 12)
{
month = 1;
if (++year > year_max)
{
throw out_of_range("Error: Next day is out of range!");
}
}
}
return *this;
}
date& date::previousday()
{
int lastdayofmonth = days_in_months[month-1];
if (month == 2 && isleapyear(year))
{
lastdayofmonth = 29;
}
if (--day < 1)
{
day = lastdayofmonth;
if (--month < 1)
{
month = 12;
if (--year < year_min)
{
throw out_of_range("Error: Previous day is out of range!");
}
}
}
return *this;
}
date& date::nextmonth()
{
if (++month > 12)
{
month = 1;
if (++year > year_max)
{
throw out_of_range("Error: Next month is out of range!");
}
}
int lastdayofmonth = days_in_months[month-1];
if (month == 2 && isleapyear(year))
{
lastdayofmonth = 29;
}
if (day > lastdayofmonth)
{
day = lastdayofmonth;
}
return *this;
}
date& date::previousmonth()
{
if (--month < 1)
{
month = 12;
if (--year < year_min)
{
throw out_of_range("Error: Previous month is out of range!");
}
}
int lastdayofmonth = days_in_months[month-1];
if (month == 2 && isLeapYear(year))
{
lastdayofmonth = 29;
}
if (day > lastdayofmonth)
{
day = lastdayofmonth;
}
return *this;
}
date& date::nextyear()
{
if (++year > year_max)
{
throw out_of_range("Error: Next year is out of range!");
}
if (month == 2 && day == 29 && !isLeapYear(year))
{
day = 28;
}
return *this;
}
date& date::previousyear()
{
if (--year < year_min)
{
throw out_of_range("Error: Previous year is out of range!");
}
if (month == 2 && day == 29 && !isLeapYear(year))
{
day = 28;
}
return *this;
}
No comments:
Post a Comment