你可以看看我写的这个程序:
#include <iostream.h>
// the use of setw
#include <iomanip.h>
#define BEGINYEAR 2000 // the year i use to begin
#define BEGINDAY 6 // 2000`s first day
const int aiMounth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // everymounth`s days
// the fuction i call
int GetBeginDay( int, int ); // Get the first day of the mounth
int GetDays( int, int ); // Get the number of the days in a mounth
void PrintTitle(); // print the title
void PrintDate( int, int ); // print the date
int GetDaysOfaYear( int ); // get the number of days of a year
// the main begin here
int main()
{
int iYear, iMounth, iBeginDayOfaWeek, iDays;
// prompt and get the paramters i need
cout << "Please Input The Year Of The Date:" << endl;
cin >> iYear;
cout << "Please Input The Mounth Of The Date:" << endl;
cin >> iMounth;
// if Input a wrong num
if( iYear <= 0 || iMounth <= 0 || iMounth > 12 )
{
cout << "Input Error!" << endl;
return 0;
}
// do what you want me to do
iBeginDayOfaWeek = GetBeginDay( iYear, iMounth );
iDays = GetDays( iYear, iMounth );
PrintTitle();
PrintDate( iBeginDayOfaWeek, iDays );
// the fuction end here
return 0;
}
int GetBeginDay( int iYear, int iMounth )
{
int iResult;
int iDifference = iYear - BEGINYEAR; // i want to know if input if larger than my begin year
long lSumOfDays = 0;
if( iDifference >= 0 ) // if input is larger than my begin year
{
for( int i = BEGINYEAR; i < iYear; i++ )
lSumOfDays += GetDaysOfaYear( i );
for( int k = 1; k < iMounth; k++ )
if( 2 == k && ( ( iYear % 4 == 0 && iYear % 100 != 0 ) || iYear % 400 == 0 ) )
lSumOfDays += 29;
else
lSumOfDays += aiMounth[k-1];
iResult = ( int )( ( lSumOfDays + 6 ) % 7 );
} // end the if part of if/else
else // if input is smaller than my begin year
{
for( int j = iYear + 1; j < BEGINYEAR; j++ )
lSumOfDays += GetDaysOfaYear( j );
for( int m = iMounth; m <= 12 ; m++ )
if( 2 == m && ( ( iYear % 4 == 0 && iYear % 100 != 0 ) || iYear % 400 == 0 ) )
lSumOfDays += 29;
else
lSumOfDays += aiMounth[m-1];
iResult = ( int )( ( lSumOfDays + 1 ) % 7 );
// change the code
switch( iResult )
{
case 1:
iResult = 6;
break;
case 2:
iResult = 5;
break;
case 3:
iResult = 4;
break;
case 4:
iResult = 3;
break;
case 5:
iResult = 2;
break;
case 6:
iResult = 1;
break;
default:
break;
} // end switch inside
} // end else part of if/else
return iResult;
}
int GetDays( int iYear, int iMounth )
{
if( 2 == iMounth && ( ( iYear % 4 == 0 && iYear % 100 != 0 ) || iYear % 400 == 0 ) )
return 29; // if the year is a leap year
return aiMounth[ iMounth - 1 ]; // normal year
}
void PrintTitle()
{
cout << setw(10) << "Sunday" << setw(10) << "Monday" << setw(10) << "Tuesday"
<< setw(10) << "Wednesday" << setw(10) << "Thursday"
<< setw(10) << "Friday" << setw(10) << "Saturday" << endl;
}
void PrintDate( int iBeginDayOfaWeek, int iDays )
{
// format the output
for( int i = 0; i < iBeginDayOfaWeek; i++ )
cout << " ";
// out put the date
for( i = 1; i <= iDays; i++ )
{
if( ( 0 == ( i + iBeginDayOfaWeek - 1 ) % 7 ) && i != 1 )
cout << endl; // if the day is Sunday
cout << setw(10) << i;
}
cout << endl;
}
int GetDaysOfaYear( int iYear )
{
if( ( iYear % 4 == 0 && iYear % 100 != 0 ) || iYear % 400 == 0 )
return 366; // if the year is a leap year
return 365; // normal year
}
这个程序可以实现,随便你输入一个日期,然后显示出该日期所在月份的月历(显示效果和日历一模一样)。程序的大概思想就是计算出当前输入日期与一特定日期(已知该日期是星期几,程序中取的是2000年的1月1日,这天是周6)相差多少天。然后通过这个天数计算出输入日期是星期几。