跪求一个c语言编写的日历程序(最好加上注释)

以1900年一月一日是星期一为基础,编写程序(要考虑闰年)。1随意输入某年某月某日就可以推算出星期几。2输出一个月的月历。
输入年份便罗列出该年的日历

第1个回答  2012-06-08
#include<iostream>
#include<time.h>
using namespace std;
class calendar
{
int day[2][12];
public:
calendar();
~calendar(){}
int leap(int year)const;
int week(int year,int month)const;
void showYear()const;
void showMonth()const;
void showDay()const;
};
calendar::calendar()
{
int i,j;
int days[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}};
for(i=0;i<2;i++)
for(j=0;j<12;j++)
day[i][j]=days[i][j];
}
//判断year是否是闰年,是闰年返回1,不是返回0.
int calendar::leap(int year)const
{
if(!(year%400)||(year%100)&&!(year%4))
return 1;
else return 0;
}
//判断year年month月的第一天是星期几的函数,0为星期日,1为星期一,依次类推.
int calendar::week(int year,int month)const
{
int i,w_day=6;
if(year-2000>=0)
{
for(i=2000;i<year;i++)
w_day+=1+leap(i);
}
else
{
for(i=1999;i>=year;i--)
w_day+=6-leap(i);
}
for(i=1;i<month;i++)
w_day+=day[leap(year)][i-1];
return w_day%7;
}
//通过输入的年份,输出这一年的日历.
void calendar::showYear()const
{
int i,j;
int Year,Month,Day,Week;
int Leap;
system("cls");
cout<<"请输入年份"<<endl;
cin>>Year;
Leap=leap(Year);
cout<<Year<<"年的日历"<<endl;
for(Month=1;Month<=12;Month++)
{
Day=day[Leap][Month-1];
Week=week(Year,Month);
cout<<Month<<"月"<<endl;
cout<<"日\t一\t二\t三\t四\t五\t六"<<endl;
for(i=0;i<=Day;i++)
{
if(i==0)
{
for(j=0;j<Week;j++)
cout<<"\t";
}
else
{
cout<<i;
if((i+Week)%7)
cout<<"\t";
else
cout<<endl;
}
}
cout<<endl;
}
}
//通过输入的年份月份,输出这该月的日历.
void calendar::showMonth()const
{
int i,j;
int Year,Month,Day,Week;
system("cls");
cout<<"请输入年份与月份"<<endl;
cin>>Year>>Month;
Day=day[leap(Year)][Month-1];
Week=week(Year,Month);
cout<<Year<<"年"<<Month<<"月"<<endl;
cout<<"日\t一\t二\t三\t四\t五\t六"<<endl;
for(i=0;i<=Day;i++)
{
if(i==0)
{
for(j=0;j<Week;j++)
cout<<"\t";
}
else
{
cout<<i;
if((i+Week)%7)
cout<<"\t";
else
cout<<endl;
}
}
cout<<endl;
}
//通过输入的年月日,输出这一天与今年差几天,是星期几,是不是公历节日.
void calendar::showDay()const
{
int i,j=0,flag=1,a[6],sum,Day_tem=0,Week;
int year1,month1,day1,year2,month2,day2,sumDay1=0,sumDay2=0;
time_t t;
time(&t);
day1=localtime(&t)->tm_mday;
month1=localtime(&t)->tm_mon;
year1=localtime(&t)->tm_year+1900;
system("cls");
cout<<"请输入年月日"<<endl;
cin>>year2>>month2>>day2;
sumDay1=localtime(&t)->tm_yday;
for(i=1;i<month2;i++)
{
if(leap(year2))
sumDay2+=day[1][i-1];
else
sumDay2+=day[0][i-1];
}
sumDay2+=day2-1;
if(year2>=year1)
{
for(i=year1;i<year2;i++)
Day_tem+=365+leap(i);
if(Day_tem+sumDay2-sumDay1>=0)
cout<<"距"<<year2<<"年"<<month2<<"月"<<day2<<"日还有"<<Day_tem+sumDay2-sumDay1<<"天"<<endl;
else
cout<<"你输入的天数已经过去"<<sumDay1-sumDay2<<"天"<<endl;
}
else
{
for(i=year2;i<year1;i++)
Day_tem+=365+leap(i);
if(Day_tem+sumDay1-sumDay2>=0)
cout<<"你输入的天数已经过去"<<Day_tem+sumDay1-sumDay2<<"天"<<endl;
else
cout<<"距"<<year2<<"年"<<month2<<"月"<<day2<<"日还有"<<sumDay2-sumDay1<<"天"<<endl;
}
Week=week(year2,month2);
Week=(Week+day2-1)%7;
cout<<year2<<"年"<<month2<<"月"<<day2<<"日是";
switch(Week)
{
case 0:cout<<"星期日"<<endl;break;
case 1:cout<<"星期一"<<endl;break;
case 2:cout<<"星期二"<<endl;break;
case 3:cout<<"星期三"<<endl;break;
case 4:cout<<"星期四"<<endl;break;
case 5:cout<<"星期五"<<endl;break;
case 6:cout<<"星期六"<<endl;break;
}
cout<<year2<<"年"<<month2<<"月"<<day2<<"日是";

//1月最后一个星期日 国际麻风节
Week=week(year2,1);
sum=day[leap(year2)][0];
for(i=0,j=0;i<sum;i++)
{
if(!((Week+i)%7))
a[j++]=i;
}
if(sumDay2==a[--j])
{
cout<<"国际麻风节 ";
flag=0;
}

//3月最后一个完整周的星期一 中小学生安全教育日
Week=week(year2,3);
sum=day[leap(year2)][2];
for(i=0,j=0;i<sum;i++)
{
if((Week+i)%7==6)
a[j++]=i-5;
}
j--;
for(i=0;i<2;i++)
a[j]+=day[leap(year2)][i];
if(sumDay2==a[j])
{
cout<<"中小学生安全教育日 ";
flag=0;
}

//5月第二个星期日 母亲节
//5月第三个星期日 全国助残日
Week=week(year2,5);
sum=day[leap(year2)][4];
for(i=0,j=0;i<sum;i++)
{
if(!((Week+i)%7))
a[j++]=i;

}

for(i=0;i<4;i++)
{
a[1]+=day[leap(year2)][i];
a[2]+=day[leap(year2)][i];
}
if(sumDay2==a[1])
{
cout<<"母亲节 ";
flag=0;
}
if(sumDay2==a[2])
{
cout<<"全国助残日 ";
flag=0;
}

//6月第三个星期日 父亲节
Week=week(year2,6);
sum=day[leap(year2)][5];
for(i=0,j=0;i<sum;i++)
{
if(!((Week+i)%7))
a[j++]=i;
}

for(i=0;i<5;i++)
a[2]+=day[leap(year2)][i];
if(sumDay2==a[2])
{
cout<<"父亲节 ";
flag=0;
}

//9月第三个星期二 国际和平日
Week=week(year2,9);
sum=day[leap(year2)][8];
for(i=0,j=0;i<sum;i++)
{
if((Week+i)%7==2)
a[j++]=i;
}
for(i=0;i<8;i++)
a[2]+=day[leap(year2)][i];
if(sumDay2==a[2])
{
cout<<"国际和平日 ";
flag=0;
}

//9月第三个星期六 全国国防教育日
for(i=0,j=0;i<sum;i++)
{
if((Week+i)%7==6)
a[j++]=i;
}
for(i=0;i<8;i++)
a[2]+=day[leap(year2)][i];
if(sumDay2==a[2])
{
cout<<"全国国防教育日 ";
flag=0;
}

//9月第四个星期日 国际聋人节
for(i=0,j=0;i<sum;i++)
{
if(!((Week+i)%7))
a[j++]=i;
}
for(i=0;i<8;i++)
a[3]+=day[leap(year2)][i];
if(sumDay2==a[3])
{
cout<<"国际聋人节 ";
flag=0;
}

// 10月的第一个星期一 世界住房日
Week=week(year2,10);
sum=day[leap(year2)][9];
for(i=0,j=0;i<sum;i++)
{
if((Week+i)%7==1)
a[j++]=i;
}
for(i=0;i<9;i++)
a[0]+=day[leap(year2)][i];
if(sumDay2==a[0])
{
cout<<"世界住房日 ";
flag=0;
}

//10月的第二个星斯一 加拿大感恩节
for(i=0,j=0;i<sum;i++)
{
if((Week+i)%7==1)
a[j++]=i;
}
for(i=0;i<9;i++)
a[1]+=day[leap(year2)][i];
if(sumDay2==a[1])
{
cout<<"加拿大感恩节 ";
flag=0;
}

//10月第二个星期三 国际减轻自然灾害日
for(i=0,j=0;i<sum;i++)
{
if((Week+i)%7==3)
a[j++]=i;
}
for(i=0;i<9;i++)
a[1]+=day[leap(year2)][i];
if(sumDay2==a[1])
{
cout<<"国际减轻自然灾害日 ";
flag=0;
}

//10月第二个星期四 世界爱眼日
for(i=0,j=0;i<sum;i++)
{
if((Week+i)%7==4)
a[j++]=i;
}
for(i=0;i<9;i++)
a[1]+=day[leap(year2)][i];
if(sumDay2==a[1])
{
cout<<"世界爱眼日 ";
flag=0;
}

//11月最后一个星期四 美国感恩节
Week=week(year2,11);
sum=day[leap(year2)][10];
for(i=0,j=0;i<sum;i++)
{
if((Week+i)%7==4)
a[j++]=i;
}
j--;
for(i=0;i<10;i++)
a[j]+=day[leap(year2)][i];
if(sumDay2==a[j])
{
cout<<"美国感恩节 ";
flag=0;
}

if((sumDay2>59)&&(leap(year2)))
sumDay2--;
switch(sumDay2)
{
case 0:cout<<"元旦"<<endl;break;
case 32:cout<<"世界湿地日"<<endl;break;
case 44:cout<<"情人节"<<endl;break;
case 61:cout<<"全国爱耳日"<<endl;break;
case 63:cout<<"青年志愿者服务日"<<endl;break;
case 66:cout<<"国际妇女节"<<endl;break;
case 67:cout<<"保护母亲河日"<<endl;break;
case 70:cout<<"中国植树节"<<endl;break;
case 72:cout<<"白色情人节 国际警察日"<<endl;break;
case 73:cout<<"世界消费者权益日"<<endl;break;
case 79:cout<<"世界森林日 世界睡眠日"<<endl;break;
case 80:cout<<"世界水日"<<endl;break;
case 81:cout<<"世界气象日"<<endl;break;
case 82:cout<<"世界防治结核病日"<<endl;break;
case 90:cout<<"愚人节"<<endl;break;
case 94:cout<<"清明节"<<endl;break;
case 96:cout<<"世界卫生日 "<<endl;break;
case 111:cout<<"世界地球日"<<endl;break;
case 115:cout<<"世界知识产权日"<<endl;break;
case 120:cout<<"国际劳动节"<<endl;break;
case 122:cout<<"世界哮喘日"<<endl;break;
case 123:cout<<"中国青年节"<<endl;break;
case 127:cout<<"世界红十字日"<<endl;break;
case 131:cout<<"国际护士节"<<endl;break;
case 134:cout<<"国际家庭日"<<endl;break;
case 136:cout<<"世界电信日"<<endl;break;
case 139:cout<<"全国学生营养日 "<<endl;break;
case 142:cout<<"国际牛奶日"<<endl;break;
case 150:cout<<"世界无烟日 "<<endl;break;
case 151:cout<<"国际儿童节"<<endl;break;
case 155:cout<<"世界环境日"<<endl;break;
case 156:cout<<"全国爱眼日"<<endl;break;
case 167:cout<<"世界防治荒漠化和干旱日"<<endl;break;
case 173:cout<<"国际奥林匹克日"<<endl;break;
case 175:cout<<"全国土地日"<<endl;break;
case 176:cout<<"国际禁毒日"<<endl;break;
case 181:cout<<"中国共产党诞生日 国际建筑日"<<endl;break;
case 187:cout<<"中国人民抗日战争纪念日"<<endl;break;
case 191:cout<<"世界人口日"<<endl;break;
case 212:cout<<"中国人民解放军建军节"<<endl;break;
case 223:cout<<"国际青年节"<<endl;break;
case 250:cout<<"国际扫盲日"<<endl;break;
case 252:cout<<"中国教师节"<<endl;break;
case 258:cout<<"中国脑健康日 国际臭氧层保护日"<<endl;break;
case 262:cout<<"全国爱牙日"<<endl;break;
case 263:cout<<"世界停火日"<<endl;break;
case 269:cout<<"世界旅游日"<<endl;break;
case 273:cout<<"中华人民共和国国庆节 国际音乐日 国际老年人日"<<endl;break;
case 276:cout<<"世界动物日"<<endl;break;
case 277:cout<<"世界教师日"<<endl;break;
case 280:cout<<"全国高血压日"<<endl;break;
case 281:cout<<"世界邮政日"<<endl;break;
case 282:cout<<"世界精神卫生日"<<endl;break;
case 286:cout<<"世界标准日"<<endl;break;
case 287:cout<<"国际盲人节 世界农村妇女日"<<endl;break;
case 288:cout<<"世界粮食日"<<endl;break;
case 289:cout<<"国际消除贫困日"<<endl;break;
case 296:cout<<"联合国日 世界发展新闻日"<<endl;break;
case 300:cout<<"中国男性健康日"<<endl;break;
case 301:cout<<"国际生物多样性日"<<endl;break;
case 303:cout<<"万圣节"<<endl;break;
case 311:cout<<"中国记者节"<<endl;break;
case 312:cout<<"消防宣传日"<<endl;break;
case 317:cout<<"世界糖尿病日"<<endl;break;
case 320:cout<<"国际大学生节 "<<endl;break;
case 328:cout<<"国际消除对妇女的暴力日"<<endl;break;
case 334:cout<<"世界爱滋病日"<<endl;break;
case 336:cout<<"世界残疾人日"<<endl;break;
case 337:cout<<"全国法制宣传日"<<endl;break;
case 342:cout<<"世界足球日"<<endl;break;
case 358:cout<<"圣诞节"<<endl;break;
case 362:cout<<"国际生物多样性日"<<endl;break;
default:if(flag) cout<<"没有节日滴"<<endl;else cout<<endl;break;
}
}

main()
{
calendar obj;
int i,flag=1;
while(flag)
{
system("cls");
cout<<"年历显示\n请按以下数字进行操作"<<endl;
cout<<"1,输入一个年份,输出是在屏幕上显示该年的日历"<<endl;
cout<<"2,输入年月,输出该月的日历"<<endl;
cout<<"3,输入年月日,输出距今天还有多少天,星期几,是否是公历节日"<<endl;
cout<<"4,退出"<<endl;
scanf("%d",&i);
switch(i)
{
case 1:obj.showYear();system("pause");break;
case 2:obj.showMonth();system("pause");break;
case 3:obj.showDay();system("pause");break;
case 4:flag=0;break;
default:cout<<"输入有误,请重新输入"<<endl;system("pause");break;
}
}
return 0;
}
第2个回答  2012-06-06
相似回答