#include <iostream.h>
#include <stdlib.h>
class Calendar
{
private:
int year;
int leapyr;
public:
Calendar(int y);
int NumDays(int mm, int dd)const;
int Leapyear(void)const;
void PrintDate(int ndays)const;
};
Calendar::Calendar(int y):year(y)
{
//a leap year if divisible by 4 and a century not divisible by 400
leapyr=(y%4==0)&&(y%100!=0||y%400==0)
}
int Calendar::NumDays(int mm,int dd)const
{
int daysInMonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31}
int ndays=0;
//February has 29 days in a leap year.
if(leapyr)
daysInMonth[2]=29;
if(mm<1||mm>12)
{
cerr<<"Month is out of range 1-12" << endl;
exit(1);
}
if(dd<1||dd>daysInMonth[mm])
{
cerr << "Day is out of range 1-"<< daysInMonth[mm-1]
exit[1];
}
//for January ndays=dd
if(mm==1)
ndays=dd;
else
{
//if mm>1, compute number of days in preceding months,
//then add in dd.
for(int i=1;i<m;i++)
ndays+=daysInMonth[i];
ndays+=dd;
}
return ndays;
}
int Calendar:: Leapyear(void)const
{
return leapyr;
}
void Calendar::PrintDate(int ndays)const
{
int mm=1,dd;
int daysInMonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31}
int yearlength=365;
//February has 29 days in a leap year and year has 366 days
if(leapyr)
{
daysInMonth[2]=29;
yearLength=366;
}
if(ndays<1||ndays>yearLength)
{
cerr <<"Day is out of range1-"<<yearLength<<endl;
exit(1);
}
//if number of days<=31, month is January
if(ndays<=31)
mm=1;
else
//decrement ndays by the number of days in the succession of
//months from January until ndays is less than the number of
//days in a month. This is the month, and ndays is the number
//of days into that month.
while(daysInMonth[mm]<ndays)
ndays-=daysInMonth[mm++];
cout<<"Date is"<<mm<<'/'<<ndays<<endl;
}
3.7
class State
{
private:
char StateName[16], capital[16],governor[28];
int population;
float area; //measured in square miles
public:
State(char stname[], char cap[], char gov[], int pop, float ar);
//print name of the governor and the capital
void PrintGovernmentInfo(void);
//density is ratio of population to land area.
float Density(void);
....
}
< A test program is included >
#include <iostream.h>
#include <string.h>
#include <strstream.h>
#inlude <stdlib.h>
class Date
{
private:
//private members that specify the date.
int month, day, year;
public:
//constructors. Default date is January 1 1900.
Date(int m=1, int d=1, int y=0);
Date(char *dstr);
// Output the date in format "month, day, year"
void PrintDate(void);
Date IncrementDate(int n) const;
};
//constructor. month day year given as string "mm/dd/yy"
Date::Date(char *dstr)
{
char inputBuffer[16];
char ch;
//copy the string to inputBuffer and declare an array based input stream.
strcpy(inputBuffer,dstr)
istrstream input(inputBuffer, sizeof(inputBuffer));
//read from input stream.use ch to read the '/' characters.
input >> month >> ch >> day >> ch >> year;
year+=1900;
}
//print date with full month name.
void Date:: PrintDate(void)
{//allocate static array of month names. Index 0 is NULL string.
static char *Months[]={"","January","February","March",
"April", "May", "June", "July",
"August","September", "October", "November",
"December"};
cout << Months[month] << " " << day << "," <<year;
}
int IsLeapYear(int y)
{
if(y%4!=0||(y%100==0 && y%400!=0))
return 0;
else
return 1;
}
Date Date::IncrementDate(int n) const
{
int tempday;
int daysInMonth[13]={0, 31, 28,31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Date d(month, day, year-1900); // has same date as current object.
if(n<0 || n>365)
{
cerr << "Increment" << n << "is out of range"" << endl;
exit(1);
}
if(month>1) //current month after January
{
if(IsLeapYear(year))
daysInMonth[2]=29; //next year is a leap year.
}
else
if(IsLeapYear(year))
daysInMonth[2]=29;
tempday=day+n;
while(tempday>daysInMonth[d.month])
{
temday-=daysInMonth[d.month];
if(d.month!=12) //current month not December
d.month++;
else
{
d.year++;
d.month=1; //set month to January of next year.
}
}
d.day=tempday;
return d;
}
void main(void)
{
Date d1(1, 10, 92), d2(1, 10, 93), d3(12, 1, 92), d4(12, 1, 91);
Date d;
d=d1.IncrementDate(50); d.PrintDate();cout << endl;
d=d2.IncrementDate(50); d.PrintDate();cout << endl;
d=d3.IncrementDate(91); d.PrintDate();cout << endl;
d=d4.IncrementDate(91); d.PrintDate();cout << endl;
}
/*
<Run>
February 29, 1992
March 1, 1993
March 2, 1993
March 1, 1992
int DayInterval(Calendar c, int mm1, int dd1, int mm2, int dd2)
{
return c.NumDays(mm2,dd2)-c.NumDays(mm1,dd1);
}