ex3-5.cpp - Example 3-5 The Date class

// File:  ex3-5.cpp - The Date class

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

const unsigned DaysPerMonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};

class Date
{
private:
	unsigned day;
	unsigned month;
	unsigned year;
	void errmsg(const char* msg);
public:
	void set(const char* mmddyy);
	void increment(void);
	void display(void) const;
};

void Date::set(const char* mm_dd_yy)
{
	char* temp;
	char copy[9];

	// assume user enters date as mm/dd/yy
	if (strlen(mm_dd_yy) != 8) errmsg(mm_dd_yy);

	// use a copy of mm_dd_yy		What is the impact to the function?
	strcpy(copy,mm_dd_yy);

	// parse the date and get the month
	temp = strtok(copy,"/");	// strtok() replaces the "/" with a NULL
	if (temp != NULL) month = atoi(temp);	// atoi() converts a string to an int
	else errmsg(copy);

	// parse the date and get the day
	temp = strtok(NULL,"/");	// strtok() finds the next "/"
	if (temp != NULL) day = atoi(temp);
	else errmsg(copy);

	// parse the date and get the year
	temp = strtok(NULL,"/");
	if (temp != NULL) year = atoi(temp);
	else errmsg(copy);

	// Make a Y2K correction for a 2-digit year
	if (year < 50) year += 2000;
	else if (year < 100) year += 1900;
	else ;	// assume the year is right
}

void Date::increment (void)
{
	// increment the day
	day++;

	// check for the end of the month
	if (day > DaysPerMonth[month - 1])    // gone past end of current month?
	{
		month ++;
		day = 1;
	}

	// check for the end of the year
	if (month > 12)
	{
		year ++;
		month = 1;
	}

	return;
}

void Date::display(void) const
{
	cout << "The date is " << month << '/' << day << '/'
		<< (year%100< 10?"0":"") << year%100 << endl;
	if (day % DaysPerMonth[month-1] == 0) cout << endl;
	return;
}

void Date::errmsg(const char* msg)
{
	cerr << "Invalid date format: " << msg << endl;
	exit(EXIT_FAILURE);
}

int main(void)
{
	Date d;
	char mmddyy[9];
	cout << "Enter the starting date <mm/dd/yy> => ";
	cin >> mmddyy;
	d.set(mmddyy);
	for (int i = 0; i < 375; i++)
	{
		d.display();
		d.increment();
	}
	return 0;
}



CIS27: Programming in C++    Instructor: Joe Bentley