Trying to clean up this program: #include <iostream> #include <iomanip> using na
ID: 3667060 • Letter: T
Question
Trying to clean up this program:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int year, month, day;
char c;
bool validInput = false;
while ((cin) && !validInput)
{
cout << "Enter a date in the form YYYY-MM-DD: " << flush;
cin >> year >> c >> month >> c >> day;
// Check to see if this is a valid date
// The Gregorian calendar began On Oct 15, 1582. Earlier dates
// are invalid.
if (year < 1582)
validInput= false;
else if (year == 1582 && month < 10)
validInput = false;
else if (year == 1582 && month == 10 && day < 15)
validInput = false;
// Months must be in the range 1..12
else if (month < 1 || month > 12)
validInput = false;
// Days must be in the range 1..K where K is the number of
// days in that month.
else
{
int numberOfDaysInMonth = 0;
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numberOfDaysInMonth = 31;
break;
case 4:
case 6:
case 9:
case 11:
numberOfDaysInMonth = 30;
break;
case 2:
if (((year % 4 == 0) && (year % 100 != 0))
|| (year % 400 == 0))
numberOfDaysInMonth = 29;
else
numberOfDaysInMonth = 28;
}
if (day < 1 || day > numberOfDaysInMonth)
validInput = false;
else
validInput = true;
}
if (!validInput)
{
cout << "Sorry, that is not a valid date" << endl;
string garbage;
getline (cin, garbage); // discard the rest ofthe input line
}
}
if (!cin)
{
cout << "Could not obtain valid input." << endl;
return -1;
}
// Input is valid - compute the day number
// Add up the number of days in all earlier months
// of this year
int sum = 0;
for (int m = 1; m < month; ++m)
{
int monthLength = 0;
switch (m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
monthLength = 31;
break;
case 4:
case 6:
case 9:
case 11:
monthLength = 30;
break;
case 2:
if (((year % 4 == 0) && (year % 100 != 0))
|| (year % 400 == 0))
monthLength = 29;
else
monthLength = 28;
}
sum += monthLength;
}
// Then add the day number to that sum
int dayNum = sum + day;
cout << setw(2) << setfill('0') << month
<< "/" << setw(2) << setfill('0') << day << "/"
<< setw(4) << year;
cout << " is day #" << dayNum << " of that year." << endl;
return 0;
}
Rewrite the program by grouping the calculations into functions. In particular, you should introduce the following functions:
A function named numberOfDaysInMonth that returns an int containing the number of days in a month, given the month and year, (passed, in that order, as int parameters).
A function named dateIsValid that tests a date to see if it is a valid date in the Gregorian calendar, returning true if it is valid and false if it is not. The inputs are the year, month, and day (passed, in that order, as int parameters).
A function isALeapYear that takes a year (int) as a parameter and determines whether a given year is a leap year or not, returning true or false as appropriate
A function named dayOfTheYear to compute the day number within the year. This function will have no return value. Its parameters, all integers, will be, in order, the year, month, and day (inputs) and the day number (output).
As you introduce each function, replace the code in main() by calls to your new functions as appropriate. In particular, note that some of these new functions may be called from within the bodies of some of the other functions.
Remember that this program was already working. You should not alter the input or output of the program, as it would be observed by someone running the program, in any way.
Explanation / Answer
#include<iostream>
#include<iomanip>
using namespace std;
bool isALeapYear(int year){
if (((year % 4 == 0) && (year % 100 != 0))|| (year % 400 == 0))
return true;
else
return false;
}
int numberOfDaysInMonth(int month, int year){
int numberOfDays = 0;
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numberOfDays = 31;
break;
case 4:
case 6:
case 9:
case 11:
numberOfDays = 30;
break;
case 2:
if (isALeapYear(year))
numberOfDays = 29;
else
numberOfDays = 28;
}
return numberOfDays;
}
bool dateIsValid(int year, int month, int day){
// The Gregorian calendar began On Oct 15, 1582. Earlier dates
// are invalid.
bool validInput = false;
if (year < 1582)
validInput= false;
else if (year == 1582 && month < 10)
validInput = false;
else if (year == 1582 && month == 10 && day < 15)
validInput = false;
// Months must be in the range 1..12
else if (month < 1 || month > 12)
validInput = false;
else {
int numberOfDays = numberOfDaysInMonth(month, year);
if (day < 1 || day > numberOfDays)
validInput = false;
else
validInput = true;
}
return validInput;
}
void dayOfTheYear(int year, int month, int day){
// Add up the number of days in all earlier months
// of this year
int sum = 0;
for (int m = 1; m < month; ++m)
{
int monthLength = 0;
switch (m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
monthLength = 31;
break;
case 4:
case 6:
case 9:
case 11:
monthLength = 30;
break;
case 2:
if (isALeapYear(year))
monthLength = 29;
else
monthLength = 28;
}
sum += monthLength;
}
// Then add the day number to that sum
int dayNum = sum + day;
cout << setw(2) << setfill('0') << month
<< "/" << setw(2) << setfill('0') << day << "/"
<< setw(4) << year;
cout << " is day #" << dayNum << " of that year." << endl;
}
int main()
{
int year, month, day;
char c;
bool validInput = false;
while ((cin) && !validInput)
{
cout << "Enter a date in the form YYYY-MM-DD: " << flush;
cin >> year >> c >> month >> c >> day;
if (!dateIsValid(year,month,day))
{
cout << "Sorry, that is not a valid date" << endl;
string garbage;
getline (cin, garbage); // discard the rest ofthe input line
}
else{
validInput = true;
dayOfTheYear(year,month,day);
}
}
if (!cin)
{
cout << "Could not obtain valid input." << endl;
return -1;
}
return 0;
}