【问题描述】编写一个万年历的程序。输入年份和月份的值后,即可将对应的12个月的日历打印出来。附加功能:判断是否为闰年。
【要 求】分屏输出月份的信息,每季度(3个月)在一个屏幕内显示出来,然后停止,之后按任意键继续显示下一屏幕信息。
你试一下下面这个代码吧
#include <stdio.h>
#define LMonth 31
#define SMonth 30
#define VMonth 28
typedef enum {
Sun,
Mon,
Jue,
Wed,
Thu,
Fri,
Sat
} WEEK;
typedef enum {
January =1,
February,
Match,
Apirl,
May,
June,
July,
August,
September,
October,
November,
December
} MONTH;
void printMonHead(void)
{
printf(" Sun Mon Jue Wed Thu Fri Sat\n");
}
void printMonth(const WEEK firstDay, int length )
{
WEEK weekDay = firstDay %7;
int i;
printMonHead();
for (i=0; i<weekDay;++i)
{
printf("");
}
for(i=1;i<=length;++i)
{
weekDay = (++weekDay)%7;
printf("%7d", i);
if(weekDay==0) printf("\n");
}
printf("\n");
}
int isLeapYear(const int yr)
{
return ( yr%( yr%100?4:400) ?0 : 1);
}
int getYearDay(const int year)
{
int lastYear = year-1;
int yearNum = lastYear-1899;
int walker,counter=0;
for(walker=1900; walker < year; ++walker)
{
if(isLeapYear(walker)==1)
++counter;
}
return (365*yearNum+counter+1)%7;
}
void printYear(const int y)
{
WEEK yDay = getYearDay(y);
int vDay = isLeapYear(y);
int monWeeks[13];
int monLen [13];
monLen[0]=0;
monLen[January]=31; monLen[February]=28+vDay; monLen[Match]=31;
monLen[Apirl]=30; monLen[May]=31; monLen[June]=30;
monLen[July]=31; monLen[August]=31; monLen[September]=30;
monLen[October]=31; monLen[November]=30; monLen[December]=31;
monWeeks[0]=0;
monWeeks[January] = yDay;
monWeeks[February] = ((monWeeks[January] +monLen[January] )%7);
monWeeks[Match] = ((monWeeks[February] +monLen[February] )%7);
monWeeks[Apirl] = ((monWeeks[Match] +monLen[Match] )%7);
monWeeks[May] = ((monWeeks[Apirl] +monLen[Apirl] )%7);
monWeeks[June] = ((monWeeks[May] +monLen[May] )%7);
monWeeks[July] = ((monWeeks[June] +monLen[June] )%7);
monWeeks[August] = ((monWeeks[July] +monLen[July] )%7);
monWeeks[September] = ((monWeeks[August] +monLen[August] )%7);
monWeeks[October] = ((monWeeks[September] +monLen[September] )%7);
monWeeks[November] = ((monWeeks[October] +monLen[October] )%7);
monWeeks[December] = ((monWeeks[November] +monLen[November] )%7);
int i;
for(i=January; i<=December; ++i)
{
if (i%3==0)
{
printf("请按任意键继续...");
}
printf("\n-------------------------------------------------\n");
printf(" %d, %d \n",y,i);
printf("-------------------------------------------------\n");
printMonth(monWeeks[i],monLen[i]);
printf("\n");
}
return;
}
int main(void)
{
// int y3 = 2000;
// int y3 = 1946;
// printYear(y3);
int y;
int quit=0;
do
{
printf("Please enter which Year to Print For You (0 to quit): ");
scanf("%d",&y);
printf("\n");
if(y==0)
quit =1;
else
printYear(y);
}while(!quit);
return 0;
}
#include <stdio.h>
#define LMonth 31
#define SMonth 30
#define VMonth 28
typedef enum {
Sun,
Mon,
Jue,
Wed,
Thu,
Fri,
Sat
} WEEK;
typedef enum {
January =1,
February,
Match,
Apirl,
May,
June,
July,
August,
September,
October,
November,
December
} MONTH;
void printMonHead(void)
{
printf(" Sun Mon Jue Wed Thu Fri Sat\n");
}
void printMonth(const WEEK firstDay, int length )
{
WEEK weekDay = firstDay %7;
int i;
printMonHead();
for (i=0; i<weekDay;++i)
{
printf("");
}
for(i=1;i<=length;++i)
{
weekDay = (++weekDay)%7;
printf("%7d", i);
if(weekDay==0) printf("\n");
}
printf("\n");
}
int isLeapYear(const int yr)
{
return ( yr%( yr%100?4:400) ?0 : 1);
}
int getYearDay(const int year)
{
int lastYear = year-1;
int yearNum = lastYear-1899;
int walker,counter=0;
for(walker=1900; walker < year; ++walker)
{
if(isLeapYear(walker)==1)
++counter;
}
return (365*yearNum+counter+1)%7;
}
void printYear(const int y)
{
WEEK yDay = getYearDay(y);
int vDay = isLeapYear(y);
int monWeeks[13];
int monLen [13];
monLen[0]=0;
monLen[January]=31; monLen[February]=28+vDay; monLen[Match]=31;
monLen[Apirl]=30; monLen[May]=31; monLen[June]=30;
monLen[July]=31; monLen[August]=31; monLen[September]=30;
monLen[October]=31; monLen[November]=30; monLen[December]=31;
monWeeks[0]=0;
monWeeks[January] = yDay;
monWeeks[February] = ((monWeeks[January] +monLen[January] )%7);
monWeeks[Match] = ((monWeeks[February] +monLen[February] )%7);
monWeeks[Apirl] = ((monWeeks[Match] +monLen[Match] )%7);
monWeeks[May] = ((monWeeks[Apirl] +monLen[Apirl] )%7);
monWeeks[June] = ((monWeeks[May] +monLen[May] )%7);
monWeeks[July] = ((monWeeks[June] +monLen[June] )%7);
monWeeks[August] = ((monWeeks[July] +monLen[July] )%7);
monWeeks[September] = ((monWeeks[August] +monLen[August] )%7);
monWeeks[October] = ((monWeeks[September] +monLen[September] )%7);
monWeeks[November] = ((monWeeks[October] +monLen[October] )%7);
monWeeks[December] = ((monWeeks[November] +monLen[November] )%7);
int i;
for(i=January; i<=December; ++i)
{
if (i%3==0)
{
printf("请按任意键继续...");
}
printf("\n-------------------------------------------------\n");
printf(" %d, %d \n",y,i);
printf("-------------------------------------------------\n");
printMonth(monWeeks[i],monLen[i]);
printf("\n");
}
return;
}
int main(void)
{
// int y3 = 2000;
// int y3 = 1946;
// printYear(y3);
int y;
int quit=0;
do
{
printf("Please enter which Year to Print For You (0 to quit): ");
scanf("%d",&y);
printf("\n");
if(y==0)
quit =1;
else
printYear(y);
}while(!quit);
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答 2011-12-22
#include <iostream>
#include <iomanip>
using namespace std;
class Data
{
private:
int year;
public:
void getyear();
int judgeyear();
int weekday();
int monthday(int i);
void show();
};
char* weekd[7]={"一","二","三","四","五","六","七"};
void Data::getyear()
{
cout<<"年份:";
cin>>year;
}
int Data::judgeyear()
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;
else
return 0;
}
int Data::weekday()//一年中德一号是星期几
{
int n=year-1900;
n=n+(n-1)/4+1;
n=n%7;
if(n==0)
return 7;
else
return n;
}
int Data::monthday(int i)//判断月份的天数
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
return 31;
else if (i==2) if(judgeyear())
return 29;
else return 28;
else
return 30;
}
void Data::show()//显示一年中全部日期
{
int i;
int n=weekday();
for(i=1;i<=12;i++)
{
int lemp=1;
cout<<endl<<setw(5)<<i<<"月份"<<endl;
for(int j=0;j<7;j++)
cout<<setw(5)<<weekd[j];
cout<<endl<<endl;
for(int k=1;k<n;k++,lemp++)
cout<<setw(5)<<" ";
for(int d=1;d<=monthday(i);d++,lemp++)
{
cout<<setw(5)<<d;
if(lemp==7)
{
cout<<endl;
lemp=0;
}
}
n=lemp%7;
if(n==0)
n=7;
}
}
int main()//主函数
{
Data a;
cout<<endl;
a.getyear();
a.show();
return 0;
}
#include <iomanip>
using namespace std;
class Data
{
private:
int year;
public:
void getyear();
int judgeyear();
int weekday();
int monthday(int i);
void show();
};
char* weekd[7]={"一","二","三","四","五","六","七"};
void Data::getyear()
{
cout<<"年份:";
cin>>year;
}
int Data::judgeyear()
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;
else
return 0;
}
int Data::weekday()//一年中德一号是星期几
{
int n=year-1900;
n=n+(n-1)/4+1;
n=n%7;
if(n==0)
return 7;
else
return n;
}
int Data::monthday(int i)//判断月份的天数
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
return 31;
else if (i==2) if(judgeyear())
return 29;
else return 28;
else
return 30;
}
void Data::show()//显示一年中全部日期
{
int i;
int n=weekday();
for(i=1;i<=12;i++)
{
int lemp=1;
cout<<endl<<setw(5)<<i<<"月份"<<endl;
for(int j=0;j<7;j++)
cout<<setw(5)<<weekd[j];
cout<<endl<<endl;
for(int k=1;k<n;k++,lemp++)
cout<<setw(5)<<" ";
for(int d=1;d<=monthday(i);d++,lemp++)
{
cout<<setw(5)<<d;
if(lemp==7)
{
cout<<endl;
lemp=0;
}
}
n=lemp%7;
if(n==0)
n=7;
}
}
int main()//主函数
{
Data a;
cout<<endl;
a.getyear();
a.show();
return 0;
}