Problem Definition Build a Date class and a main function to

Problem Definition

Build a Date class and a main function to test it.

Specifications

Below is the interface for the Date class: it is our \"contract\" with you: you have to implement everything it describes, and show us that it works with a test harness that puts it through its paces. The comments in the interface below should be sufficient for you to understand the project (use these comments in your Date declaration), without the need of any further documentation. But of course, as always, you can ask us any questions you may have on Piazza.

Note: Placing the error messages into the constructors like is not necessarily a good way to handle constructor errors, but until you learn about exceptions in CS 14, it\'s the best we can do.

Private Member Functions

The functions declared private above, isLeap, daysPerMonth, name, number, are helper functions - member functions that will never be needed by a user of the class, and so do not belong to the public interface (which is why they are \"private\"). They are, however, needed by the interface functions (public member functions), which use them to test the validity of arguments and construct valid dates. For example, the constructor that passes in the month as a string will call the number function to assign a value to the unsigned member variable month.

isLeap: The rule for whether a year is a leap year is:

(year % 4 == 0) implies leap year

except (year % 100 == 0) implies NOT leap year

except (year % 400 == 0) implies leap year

So, for instance, year 2000 is a leap year, but 1900 is NOT a leap year. Years 2004, 2008, 2012, 2016, etc. are all leap years. Years 2005, 2006, 2007, 2009, 2010, etc. are NOT leap years.

Output Specifications

Read the specifications for the print function carefully. The only cout statements within your Date member functions should be:

the \"Invalid Date\" warnings in the constructors

in your two print functions

Required Main Function

You must use this main function and global function getDate as they are here. You may not change these functions at all. Copy-and-paste these into your main.cpp file and then add the Date class.

Solution

// Date.h
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string.h>
using namespace std;

class Date
{
private:
unsigned day;
unsigned month;
string monthName;
unsigned year;

public:
Date();
Date(unsigned m, unsigned d, unsigned y);
Date(const string &mn, unsigned d, unsigned y);
void printNumeric() const;
void printAlpha() const;

private:
bool isLeap(unsigned y) const;
unsigned daysPerMonth(unsigned m, unsigned y) const;
string name(unsigned m) const;
unsigned number(const string &mn) const;
};

//Date.cpp
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string.h>
using namespace std;
#include \"Date.h\"

// creates the date January 1st, 2000.
Date::Date()
{
   day = 1;
   month = 1;
   monthName = \"January\";
   year = 2000;
}

/* parameterized constructor: month number, day, year
- e.g. (3, 1, 2010) will construct the date March 1st, 2010

If any of the arguments are invalid (e.g. 15 for month or 32 for day)
then the constructor will construct instead a valid Date as close
as possible to the arguments provided - e.g. in above example,
Date(15, 32, 2010), the Date would be corrected to Dec 31st, 2010.
In case of such invalid input, the constructor will issue a console error message:

Invalid date values: Date corrected to 12/31/2010.
(with a newline at the end).
*/
Date::Date (unsigned m, unsigned d, unsigned y)
{
   bool invalid = false;
  
   //if invalid month input, change to closest month
   if (m < 1)
   {
       m = 1;
       invalid = true;
   }
   else if (m > 12)
   {
       m = 12;
       invalid = true;
   }
  
   //invalid day
   if (d > daysPerMonth(m, y))
   {
       d = daysPerMonth(m,y);
       invalid = true;
   }
  
   day = d;
   month = m;
   monthName = name(m);
   year = y;
  
   if (invalid)
   {
       cout << \"Invalid date values: Date corrected to \";
       cout << month << \"/\" << day << \"/\" << year << \".\" << endl;
   }
}

/* parameterized constructor: month name, day, year
­ - e.g. (December, 15, 2012) will construct the date December 15th, 2012

If the constructor is unable to recognize the string argument as a valid month name,
then it will issue a console error message:

Invalid month name: the Date was set to 1/1/2000.
(with a newline at the end).

If the day argument is invalid for the given month (but the month name was valid),
then the constructor will handle this error in the same manner as the other
parameterized constructor.

This constructor will recognize both \"december\" and \"December\"
as month name.
*/
Date::Date (const string &mName, unsigned d, unsigned y)
{
   //will change to true if invalid day
   bool invalidDay = false;
   //will change to true if invalid month
   bool invalidMonth = false;
  
   if (mName == \"January\" || mName == \"january\")
   {  
       month = number(\"January\");
       monthName = \"January\";
   }
   else if (mName == \"February\" || mName == \"february\")
   {
       month = number(\"February\");
       monthName = \"February\";
   }
   else if (mName == \"March\" || mName == \"march\")
   {
       month = number(\"March\");
       monthName = \"March\";
   }
   else if (mName == \"April\" || mName == \"april\")
   {
       month = number(\"April\");
       monthName = \"April\";
   }
   else if (mName == \"May\" || mName == \"may\")
   {
       month = number(\"May\");
       monthName = \"May\";
   }
   else if (mName == \"June\" || mName == \"june\")
   {
       month = number(\"June\");
       monthName = \"June\";
   }
   else if (mName == \"July\" || mName == \"july\")
   {
       month = number(\"July\");
       monthName = \"July\";
   }
   else if (mName == \"August\" || mName == \"august\")
   {
       month = number(\"August\");
       monthName = \"August\";
   }
   else if (mName == \"September\" || mName == \"september\")
   {
       month = number(\"September\");
       monthName = \"September\";
   }
   else if (mName == \"October\" || mName == \"october\")
   {
       month = number(\"October\");
       monthName = \"October\";
   }
   else if (mName == \"November\" || mName == \"november\")
   {
       month = number(\"November\");
       monthName = \"November\";
   }
   else if (mName == \"December\" || mName == \"december\")
   {
       month = number(\"December\");
       monthName = \"December\";
   }
   //If invalid month name, change date to 1/1/2000
   else
   {
       day = 1;
       month = number(\"January\");
       monthName = \"January\";
       year = 2000;
      
       invalidMonth = true;
   }

   //if monthName is correct but day number is invalid, change to closest day
   if ((!invalidMonth) && (d > daysPerMonth(month, y)))
   {
       day = daysPerMonth(month,y);
       invalidDay = true;
   }
  
   //outputs message if input was invalid
   if (invalidDay || invalidMonth)
   {
       cout << \"Invalid date values: Date corrected to \";
       if (invalidDay)
       {
           year = y;
       }
       cout << month << \"/\" << day << \"/\" << year << \".\" << endl;
   }

   else
   {
       day = d;
       year = y;
   }
}


/* Outputs to the console (cout) a Date exactly in the format \"3/1/2012\".
Does not output a newline at the end.
*/
void Date::printNumeric () const
{
   cout << month << \"/\" << day << \"/\" << year;
}

/* Outputs to the console (cout) a Date exactly in the format \"March 1, 2012\".
The first letter of the month name is upper case, and the month name is
printed in full - January, not Jan, jan, or january.
Does not output a newline at the end.
*/
void Date::printAlpha () const
{
   cout << monthName << \" \" << day << \", \" << year;
}

/* Returns true if the year passed in is a leap year, otherwise returns false.
*/
bool Date::isLeap(unsigned y) const
{
   //implies leap year
   if (y % 4 == 0)
   {
       //does not imply leap year
       if (y % 100 == 0)
       {
           //unless its a multiple of 400
           if (y % 400 == 0)
           {
               return true;
           }
           return false;
       }
       return true;
   }
   return false;
}

/* Returns number of days allowed in a given month
- e.g. daysPerMonth(9, 2000) returns 30.
Calculates February\'s days for leap and non-­leap years,
thus, the reason year is also a parameter.
*/
unsigned Date::daysPerMonth(unsigned m, unsigned y) const
{
   if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)
   {
       return 31;
   }
   else if (m == 4 || m == 6 || m == 9 || m == 11)
   {
       return 30;
   }
   else if (isLeap(y))
   {
       return 29;
   }
   return 28;
}

/* Returns the name of a given month
- e.g. name(12) returns the string \"December\"
*/
string Date::name(unsigned m) const
{
   if (m <= 1)
   {
       return \"January\";
   }
   else if (m >= 12)
   {
       return \"December\";
   }
  
   if (m == 2)
   {
       return \"February\";
   }
   else if (m == 3)
   {
       return \"March\";
   }
   else if (m == 4)
   {
       return \"April\";
   }
   else if (m == 5)
   {
       return \"May\";
   }
   else if (m == 6)
   {
       return \"June\";
   }
   else if (m == 7)
   {
       return \"July\";
   }
   else if (m == 8)
   {
       return \"August\";
   }
   else if (m == 9)
   {
       return \"September\";
   }
   else if (m == 10)
   {
       return \"October\";
   }
   else if (m == 11)
   {
       return \"November\";
   }
}
      
/* Returns the number of a given named month
- e.g. number(\"March\") returns 3
*/
unsigned Date::number(const string &mName) const
{
   if (mName == \"January\")
   {
       return 1;
   }
   else if (mName == \"February\")
   {
       return 2;
   }
   else if (mName == \"March\")
   {
       return 3;
   }
   else if (mName == \"April\")
   {
       return 4;
   }
   else if (mName == \"May\")
   {
       return 5;
   }
   else if (mName == \"June\")
   {
       return 6;
   }
   else if (mName == \"July\")
   {
       return 7;
   }
   else if (mName == \"August\")
   {
       return 8;
   }
   else if (mName == \"September\")
   {
       return 9;
   }
   else if (mName == \"October\")
   {
       return 10;
   }
   else if (mName == \"November\")
   {
       return 11;
   }
   else if (mName == \"December\")
   {
       return 12;
   }
}


// main.cpp
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string.h>
#include \"Date.h\"

using namespace std;

Date getDate();


int main() {

Date testDate;
testDate = getDate();
cout << endl;
cout << \"Numeric: \";
testDate.printNumeric();
cout << endl;
cout << \"Alpha: \";
testDate.printAlpha();
cout << endl;

return 0;
}

Date getDate() {
int choice;
unsigned monthNumber, day, year;
string monthName;

cout << \"Which Date constructor? (Enter 1, 2, or 3)\" << endl
<< \"1 - Month Number\" << endl
<< \"2 - Month Name\" << endl
<< \"3 - default\" << endl;
cin >> choice;
cout << endl;

if (choice == 1) {
cout << \"month number? \";
cin >> monthNumber;
cout << endl;
cout << \"day? \";
cin >> day;
cout << endl;
cout << \"year? \";
cin >> year;
cout << endl;
return Date(monthNumber, day, year);
} else if (choice == 2) {
cout << \"month name? \";
cin >> monthName;
cout << endl;
cout << \"day? \";
cin >> day;
cout << endl;
cout << \"year? \";
cin >> year;
cout << endl;
return Date(monthName, day, year);
} else {
return Date();
}
}


/*
output:

Which Date constructor? (Enter 1, 2, or 3)
1 - Month Number
2 - Month Name
3 - default
3

Numeric: 1/1/2000
Alpha: January 1, 2000


Which Date constructor? (Enter 1, 2, or 3)
1 - Month Number
2 - Month Name
3 - default
2

month name? march

day? 32

year? 1994

Invalid date values: Date corrected to 3/31/1994.

Numeric: 3/31/1994
Alpha: March 31, 1994


*/

Problem Definition Build a Date class and a main function to test it. Specifications Below is the interface for the Date class: it is our \
Problem Definition Build a Date class and a main function to test it. Specifications Below is the interface for the Date class: it is our \
Problem Definition Build a Date class and a main function to test it. Specifications Below is the interface for the Date class: it is our \
Problem Definition Build a Date class and a main function to test it. Specifications Below is the interface for the Date class: it is our \
Problem Definition Build a Date class and a main function to test it. Specifications Below is the interface for the Date class: it is our \
Problem Definition Build a Date class and a main function to test it. Specifications Below is the interface for the Date class: it is our \
Problem Definition Build a Date class and a main function to test it. Specifications Below is the interface for the Date class: it is our \
Problem Definition Build a Date class and a main function to test it. Specifications Below is the interface for the Date class: it is our \
Problem Definition Build a Date class and a main function to test it. Specifications Below is the interface for the Date class: it is our \

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site