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

(20 points) Complete the code for the day_of_week function in Chrono.cpp and wri

ID: 3565295 • Letter: #

Question

(20 points) Complete the code for the day_of_week function in Chrono.cpp and write hw6pr1.cpp to repeatedly ask for a date and print out the day of the week,

like this:

Date (year, month, day)? (2014,10,21)

That is a Tuesday.

Date (year, month, day)? (2000,3,1)

That is a Wednesday.

Date (year, month, day)? (1900,3,1)

That is a Thursday.

Hints: Look up Zeller's Congruence. Be careful about encoding Sunday as a 0 or a 1. Be careful about int divided by int. Don't forget to code the leapyear function correctly.

#include "Chrono.h"

namespace Chrono {

// member function definitions:

//------------------------------------------------------------------------------

Date::Date(int yy, Month mm, int dd)
    : y(yy), m(mm), d(dd)
{
    if (!is_date(yy,mm,dd)) throw Invalid();
}

//------------------------------------------------------------------------------

const Date& default_date()
{
    static const Date dd(2001,Date::jan,1); // start of 21st century
    return dd;
}


//------------------------------------------------------------------------------

Date::Date()
    :y(default_date().year()),
     m(default_date().month()),
     d(default_date().day())
{
}

//------------------------------------------------------------------------------

void Date:: add_day(int n)
{
    d++;
// add date
}

//------------------------------------------------------------------------------

void Date::add_month(int n)
{
    int temp = int(m);
temp++;
m = Month(temp);
//add month
}

//------------------------------------------------------------------------------

void Date::add_year(int n)
{
    if (m==feb && d==29 && !leapyear(y+n)) { // beware of leap years!
        m = mar;        // use March 1 instead of February 29
        d = 1;
    }
    y+=n;
}

//------------------------------------------------------------------------------

// helper functions:

bool is_date(int y, Date::Month m, int d)
{
    // assume that y is valid

    if (d<=0) return false;            // d must be positive

    int days_in_month = 31;            // most months have 31 days

    switch (m) {
case Date::feb:                        // the length of February varies
    days_in_month = (leapyear(y))?29:28;
    break;
case Date::apr: case Date::jun: case Date::sep: case Date::nov:
    days_in_month = 30;                // the rest have 30 days
    break;
    }

    if (days_in_month<d) return false;

    return true;
}

//------------------------------------------------------------------------------

bool leapyear(int y)
{
    // See exercise ???
    return false;
}

//------------------------------------------------------------------------------

bool operator==(const Date& a, const Date& b)
{
    return a.year()==b.year()
        && a.month()==b.month()
        && a.day()==b.day();
}

//------------------------------------------------------------------------------

bool operator!=(const Date& a, const Date& b)
{
    return !(a==b);
}

//------------------------------------------------------------------------------

ostream& operator<<(ostream& os, const Date& d)
{
    return os << '(' << d.year()
              << ',' << d.month()
              << ',' << d.day()
              << ')';
}

//------------------------------------------------------------------------------

istream& operator>>(istream& is, Date& dd)
{
    int y, m, d;
    char ch1, ch2, ch3, ch4;
    is >> ch1 >> y >> ch2 >> m >> ch3 >> d >> ch4;
    if (!is) return is;
    if (ch1!='(' || ch2!=',' || ch3!=',' || ch4!=')') { // oops: format error
        is.clear(ios_base::failbit);                    // set the fail bit
        return is;
    }
    dd = Date(y,Date::Month(m),d);     // update dd
    return is;
}

//------------------------------------------------------------------------------

enum Day {
    sunday, monday, tuesday, wednesday, thursday, friday, saturday
};

//------------------------------------------------------------------------------

Day day_of_week(const Date& d)
{
    // ...
    return sunday;
}

//------------------------------------------------------------------------------

Date next_Sunday(const Date& d)
{
    // ...
    return d;
}

//------------------------------------------------------------------------------

Date next_weekday(const Date& d)
{
    // ...
    return d;
}

Date& Date::operator++()
{
add_day(1);
if (is_date(year(),month(),day())==false)
{
  d=1;
  if (month()==Date::Month::dec)
  {
        m=Date::Month::jan;
        add_year(1);
  }
        else
  {
  add_month(1);
       
  }
  return *this;
  //d=1;
    }
}

//------------------------------------------------------------------------------

} // Chrono

// file Chrono.h

namespace Chrono {

//------------------------------------------------------------------------------

class Date {
public:
    enum Month {
        jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
    };

class Invalid { };                 // to throw as exception

    Date(int y, Month m, int d);       // check for valid date and initialize
    Date();                            // default constructor
    // the default copy operations are fine

    // non-modifying operations:
    int   day()   const { return d; }
    Month month() const { return m; }
    int   year() const { return y; }
  
    // modifying operations:
    void add_day(int n);       
    void add_month(int n);
    void add_year(int n);

Date& operator++();
private:
    int   y;
    Month m;
    int   d;

};


bool is_date(int y, Date::Month m, int d); // true for valid date

bool leapyear(int y);                  // true if y is a leap year

bool operator==(const Date& a, const Date& b);
bool operator!=(const Date& a, const Date& b);

ostream& operator<<(ostream& os, const Date& d);
istream& operator>>(istream& is, Date& dd);

const Date& default_date();
} // Chrono

#endif

.

Explanation / Answer

#include using namespace std; // file Chrono.h namespace Chrono { //------------------------------------------------------------------------------ class Date { public: enum Month { jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec }; class Invalid { }; // to throw as exception Date(int y, Month m, int d); // check for valid date and initialize Date(); // default constructor // the default copy operations are fine // non-modifying operations: int day() const { return d; } Month month() const { return m; } int year() const { return y; } // modifying operations: void add_day(int n); void add_month(int n); void add_year(int n); private: int y; Month m; int d; }; bool is_date(int y, Date::Month m, int d); // true for valid date bool leapyear(int y); // true if y is a leap year bool operator==(const Date& a, const Date& b); bool operator!=(const Date& a, const Date& b); ostream& operator(istream& is, Date& dd); const Date& default_date(); } // Chrono //------------------------------------------------------------------------------ //The definitions go into Chrono.cpp: // Chrono.cpp namespace Chrono { // member function definitions: Date::Date(int yy, Month mm, int dd) : y(yy), m(mm), d(dd) { if (!is_date(yy,mm,dd)) throw Invalid(); } const Date& default_date(); Date::Date() :y(default_date().year()), m(default_date().month()), d(default_date().day()) { } int days_in_month(int y, Date::Month m); void Date::add_day(int n) { // use linear_day() below or things get really messy if (n