Home: rushilpaul | Original Message | Reply | Subject: Contributed Answer/Explanation to Q. 3 | Look at the code and follow the algorithm written after it
#include <iostream>
#include <sstream>
using namespace std;
bool checkleap(int y);
string printdate(int n, int y);
bool checkleap(int y)
{
return y % 400 == 0 || (y % 4 == 0 && y % 100 != 0);
}
string printdate(int n, int y)
{
int year = y, month=1, days=n;
y = checkleap(y) ? 1 : 0;
while( n > 0)
{
if(month > 12)
{
y = checkleap(++year) ? 1 : 0;
month = 1;
}
days = n;
if(month == 2) if(y==1) n -= 29;
else n -= 28;
else if(month <= 7) if(month % 2 == 1) n -= 31;
else n -= 30;
else
{
if(month % 2 == 0) n -= 31;
else n -= 30;
}
month++;
}
string months[] = { "January", "February",
"March", "April", "May", "June",
"July", "August", "September",
"October", "November", "December" };
string app = "th";
if( days % 10 == 1) app = "st";
else if(days % 10 == 2) app = "nd";
else if(days % 10 == 3) app = "rd";
stringstream val;
val << days << app << " " <<
months[month-2] << " " << year;
return val.str();
}
int main()
{
int n,y,after;
cout << "Enter the number of days, year and additional
number of days: ";
cin >> n >> y >> after;
bool err = n < 1 || n > 366;
if(!checkleap(y)) if( n > 365) err = true;
if(err) { cout << "Incorrect input." << endl;
return 1; }
cout << "Current Date: \t" << printdate(n,y)
<< endl << "Date after " << after <<
" days: " << printdate(n+after,y) << endl;
return 0;
} // end of program
-----------------------------ALGORITHM--------------------------------------
--------
The first seven months of the year have 31 and 30 days alternately with an
exception of February.
That means for all m <= 7, if m is divisble by 2, then no. of days is 30,
else 31. and if m = 2, then check for leap year.
This is very simple: (y is divisble by 4 but not by 100) or (y is divisible
by 400).
Continuing, months from 8 to 12 have 31 and 30 days alternately. Again
check if m is divisible by 2. If yes then its 31 else 30. (this time it gets
reversed since Jul and Aug, both have 31 days)
Keep on subtracting the number of days in each month from variable days
(which was the input), and check whether the number of remaining days are
<= 0.
If yes, then break out of the loop and the last positive value of variable
"days" will be the date. (assign another variable the value of n
just before changing value of "days")
For months, keep a counter which starts from 1.
As soon as months reaches a value > 12, assign it 1, increment year, and
check for leap year again.
Put all of this in a function and call it twice.
The second time, call it giving number of days = earlier no. of days +
second inputted no. of days. printdate( days + after )
Posted at: Tue Jan 17 20:35:50 2012 (GMT) |
Page 1 of 1 | From: rushilpaul | Reply 1 of 2 | Reply | | Subject: Contributed Answer/Explanation to Q. 3 | Look at the code and follow the algorithm written after it
#include
#include
using namespace std;
bool checkleap(int y);
string printdate(int n, int y);
bool checkleap(int y)
{
return y % 400 == 0 || (y % 4 == 0 && y % 100 != 0);
}
string printdate(int n, int y)
{
int year = y, month=1, days=n;
y = checkleap(y) ? 1 : 0;
while( n > 0)
{
if(month > 12)
{
y = checkleap(++year) ? 1 : 0;
month = 1;
}
days = n;
if(month == 2) if(y==1) n -= 29;
else n -= 28;
else if(month <= 7) if(month % 2 == 1) n -= 31;
else n -= 30;
else
{
if(month % 2 == 0) n -= 31;
else n -= 30;
}
month++;
}
string months[] = { "January", "February",
"March", "April", "May", "June",
"July", "August", "September",
"October", "November", "December" };
string app = "th";
if( days % 10 == 1) app = "st";
else if(days % 10 == 2) app = "nd";
else if(days % 10 == 3) app = "rd";
stringstream val;
val << days << app << " " <<
months[month-2] << " " << year;
return val.str();
}
int main()
{
int n,y,after;
cout << "Enter the number of days, year and additional number of
days: ";
cin >> n >> y >> after;
bool err = n < 1 || n > 366;
if(!checkleap(y)) if( n > 365) err = true;
if(err) { cout << "Incorrect input." << endl; return
1; }
cout << "Current Date: \t" << printdate(n,y) <<
endl << "Date after " << after << " days:
" << printdate(n+after,y) << endl;
return 0;
} // end of program
-----------------------------ALGORITHM--------------------------------------
--------
The first seven months of the year have 31 and 30 days alternately with an
exception of February.
That means for all m <= 7, if m is divisble by 2, then no. of days is 30,
else 31. and if m = 2, then check for leap year.
This is very simple: (y is divisble by 4 but not by 100) or (y is divisible
by 400).
Continuing, months from 8 to 12 have 31 and 30 days alternately. Again
check if m is divisible by 2. If yes then its 31 else 30. (this time it gets
reversed since Jul and Aug, both have 31 days)
Keep on subtracting the number of days in each month from variable days
(which was the input), and check whether the number of remaining days are
<= 0.
If yes, then break out of the loop and the last positive value of variable
"days" will be the date. (assign another variable the value of n
just before changing value of "days")
For months, keep a counter which starts from 1.
As soon as months reaches a value > 12, assign it 1, increment year, and
check for leap year again.
Put all of this in a function and call it twice.
The second time, call it giving number of days = earlier no. of days +
second inputted no. of days. i.e. printdate( days + after )
Posted at: Tue Jan 17 20:50:11 2012 (GMT)
|
From: rushilpaul | Reply 2 of 2 | Reply | | Subject: Contributed Answer/Explanation to Q. 3 | Look at the code and follow the algorithm written after it
#include "iostream"
#include "sstream"
using namespace std;
bool checkleap(int y);
string printdate(int n, int y);
bool checkleap(int y)
{
return y % 400 == 0 || (y % 4 == 0 && y % 100 != 0);
}
string printdate(int n, int y)
{
int year = y, month=1, days=n;
y = checkleap(y) ? 1 : 0;
while( n > 0)
{
if(month > 12)
{
y = checkleap(++year) ? 1 : 0;
month = 1;
}
days = n;
if(month == 2) if(y==1) n -= 29;
else n -= 28;
else if(month <= 7) if(month % 2 == 1) n -= 31;
else n -= 30;
else
{
if(month % 2 == 0) n -= 31;
else n -= 30;
}
month++;
}
string months[] = { "January", "February",
"March", "April", "May", "June",
"July", "August", "September",
"October", "November", "December" };
string app = "th";
if( days % 10 == 1) app = "st";
else if(days % 10 == 2) app = "nd";
else if(days % 10 == 3) app = "rd";
stringstream val;
val << days << app << " " <<
months[month-2] << " " << year;
return val.str();
}
int main()
{
int n,y,after;
cout << "Enter the number of days, year and additional number of
days: ";
cin >> n >> y >> after;
bool err = n < 1 || n > 366;
if(!checkleap(y)) if( n > 365) err = true;
if(err) { cout << "Incorrect input." << endl; return
1; }
cout << "Current Date: \t" << printdate(n,y) <<
endl << "Date after " << after << " days:
" << printdate(n+after,y) << endl;
return 0;
} // end of program
-----------------------------ALGORITHM--------------------------------------
--------
The first seven months of the year have 31 and 30 days alternately with an
exception of February.
That means for all m <= 7, if m is divisble by 2, then no. of days is 30,
else 31. and if m = 2, then check for leap year.
This is very simple: (y is divisble by 4 but not by 100) or (y is divisible
by 400).
Continuing, months from 8 to 12 have 31 and 30 days alternately. Again
check if m is divisible by 2. If yes then its 31 else 30. (this time it gets
reversed since Jul and Aug, both have 31 days)
Keep on subtracting the number of days in each month from variable days
(which was the input), and check whether the number of remaining days are
<= 0.
If yes, then break out of the loop and the last positive value of variable
"days" will be the date. (assign another variable the value of n
just before changing value of "days")
For months, keep a counter which starts from 1.
As soon as months reaches a value > 12, assign it 1, increment year, and
check for leap year again.
Put all of this in a function and call it twice.
The second time, call it giving number of days = earlier no. of days +
second inputted no. of days. i.e. printdate( days + after )
Posted at: Tue Jan 17 20:58:24 2012 (GMT)
|
Page 1 of 1
|
|