Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

#include \"Date.h\" Date::Date() { //constructor to assign todays date to date c

ID: 3704131 • Letter: #

Question

#include "Date.h"

Date::Date() {

   //constructor to assign todays date to date

   char data[9]; //holder for the date

   _strdate_s(data); //gets the current date mm/dd/yy (THIS IS ONE OF THE MISTAKES)

   string date=data; //copy to a string for parsing

   month=stoi(date.substr(0,2)); //gets characters 0 and 1 of date and converts to int

   day=stoi(date.substr(3,2)); //gets characters 3 and 4 of date and converts to int

   year=stoi(date.substr(6,2))+2000; //gets characters 6 and 7 of date and converts to int

   if(leapYear()) days2[2]=29; else days2[2]=28;

   for(int m=0;m<13;m++) days[m]=days2[m];

}//constructor for today

static bool validDate(int m, int d, int y) { (THIS IS THE OTHER MISTAKE)

   bool valid=true; //assume it is valid until found to be invalid

   if(y<1000) valid=false;

   if(m<1 || m>12) valid=false;

   if(leapYear(y)) days2[2]=29; else days2[2]=28;

   if(d<1 || d>days2[m]) valid=false;

   return valid;

}//validDate

Date::Date(int m, int d, int y) {

   //constructor to assign values to month day and year

   if(validDate(m,d,y)) {

month=m;

day=d;

year=y;

   }

   else {

month=day=1;

year=1970; //Unix time starting point

   } //not valid: set to default valid date

   for(int m=0;m<13;m++) days[m]=days2[m];

} //constructor with assigned values

Date::Date(int julian) {

//Fliegel-Van Flandern algorithm to convert Julian date to Gregorian number month, day, and year

gregorian(julian,month,day,year);

if(leapYear()) days2[2]=29; else days2[2]=28;

for(int m=0;m<13;m++) days[m]=days2[m];

}//Date Julian

Date::Date (string str) { //constructor for todays date as "mm/dd/year

//Parse str by adding one char at a s time to the token until a "/" is encounter.

//When "/" is encountered start the next token

//int p=0;

int count=0;

int num[3];

string token[3];

int len=str.length();

for(int p=0; p<len;p++) {

   if(str.substr(p,1)=="/") count++;

   else token[count]+=str.substr(p,1);

}//parse str to create array of tokens

bool error=false;

for(int p=0;p<3;p++) {

      try {

       num[p]=stoi(token[p]);

      }//try to convert to int

   catch(invalid_argument&) {

       num[p]=-1;

       error=true;

   } //catch

}//each of the 3 tokens

if(!error && validDate(num[0],num[1],num[2])) {

month=num[0];

day=num[1];

year=num[2];

} //no error

else {

month=day=1;

year=1970; //Unix time starting point

} //not valid: set to default valid date

for(int m=0;m<13;m++) days[m]=days2[m];

}//constructor with string such as "10/31/2016"

Date Date::operator=(const Date& otherDate) {

   //assigns another instance of the date class to this.

   month=otherDate.month;

   day=otherDate.day;

   year=otherDate.year;

   return *this; //allows date1=date=date3;

}//overloaded operator =

Date Date::operator+(int numDays) {

   //Adds the number of days to the Julian date.

   Date other(month,day,year); //make copy of the date

   int jd=other.julian(); //find the Julian date

   jd+=numDays; //add the number of days to the Julian date

   gregorian(jd,other.month,other.day,other.year); //Convert the Julian date back to Gregorian

   if(other.leapYear()) days2[2]=29; else days2[2]=28;

   for(int m=0;m<13;m++) other.days[m]=days2[m];

   return other;

} //operator +

int Date::dayofYear() const {

   //returns the day of the year, ie 2/1/???? is the 32 day of the year

   int total=day;

   for(int m=1;m<month;m++) total+=days[m];

   return total;

}//dayofYear

void gregorian(int julian, int &mth, int &d, int &y) {

//Fliegel-Van Flandern algorithm to convert Julian date to Gregorian month, day, and year

int p,q,r,s,t,u,v;

p = julian + 68569;

q = 4*p/146097;

r = p - (146097*q + 3)/4;

s = 4000*(r+1)/1461001;

t = r - 1461*s/4 + 31;

u = 80*t/2447;

v = u/11;

y = 100*(q-49)+s+v;

mth = u + 2 - 12*v;

d = t - 2447*u/80;

} //Gregorian

int Date::julian() const {

   int jd= day-32075+1461*(year+4800+(month-14)/12)/4+

       367*(month-2-(month-14)/12*12) /12-3*((year+4900+(month-14)/12)/100)/4;

   return jd;

}

bool Date::leapYear() const {

   bool leap=false;

   if(year%4==0) leap=true;

   if(year%100==0 && year%400!=0) leap=false;

   return leap;

}//leapYear

SO I HAVE 2 SEMANTIC ERRORS THAT I CANNOT SEEM TO FIX OR UNDERSTAND, PLEASE LET ME KNOW HOW

bool leapYear(int yr) {

   bool leap=false;

   if(yr%4==0) leap=true;

   if(yr%100==0 && yr%400!=0) leap=false;

   return leap;

}//leapYear

int Date::weekday() const {

   //returns 0 for Sunday, 1 for Monday, etc.

   static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };

   int y =year;

   y-= month < 3;

   return ( y + y/4 - y/100 + y/400 + t[month-1] + day) % 7;

}//weekday

int Date::getMonth() const {

   //private variables cannot be accessed directly but require "getter" functions

   return month;

}//getMonth

int Date::getDay() const {

   return day;

}//

int Date::getYear() const {

   return year;

}//getYear

string Date::toString() const {

stringstream oss; //a stream to append the values

oss<<month<<"/"<<day<<"/"<<year;

return oss.str();

}

bool Date::operator==(const Date& otherDate) {

   return (month==otherDate.month && day==otherDate.day && year==otherDate.year);

}//operator ==

bool Date::operator<(const Date& otherDate) {

   //A date is less than another date if is earlier

   bool result=false; //assume false until proven true

   if(year<otherDate.year) result=true;

   else if(year==otherDate.year && month<otherDate.month) result=true;

   else if(year==otherDate.year && month==otherDate.month && day<otherDate.day) result=true;

   return result;

}//operator

bool Date::operator>(const Date& otherDate) {

   //Convert both dates to Julian and compare the Julian dates

   int jd1=julian();

   int jd2=otherDate.julian();

   return jd1>jd2;

}//operator

ostream& operator << (ostream &output, const Date &d) {

   output << d.toString();

   return output;

} // operator <<

istream& operator >> (istream &input, Date &d) {

   string s;

   input >> s;

   Date other(s); //create a new Date

   d=other; //assign the new Date to d

   return input;

} // operator >>

Explanation / Answer

For the first one:

#include <time.h>
#include <stdio.h>

time_t t = time(0);
tm* lt = localtime(t);
char date[11];
sprintf(date, "%02d/%02d/%04d", lt->tm_mday, lt->tm_mon + 1, lt->year +
1900

For the second one, I would suggest manually check)

if(d==29 && m==2 && !lleapYear(y))

valid=false;
if(d==31 && (m==2 || m==4 || m==6 || m==9 || m==11)

valid=false;

i