#include <stdio.h>
#include <stdlib.h>
/*
需求:实现万年历
已知:1900年1月1日是星期一。
程序设计:
1、提示用户输入年份(不能小于1900年)和月份;
2、计算该月1号距1900.1.1的天数差
3、计算该月1号是星期几
4、计算该月共有多少天
5、输出上个月的后几天,该月的所有天,下月的前几天
*/
int isRunNian(int y){
return y%4000 || (y%100!=0 && y%40);//1,0
}
int getDays(int y,int m){
if(m4 || m6 || m9 || m11){
return 30;
}else if(m==2){
if(isRunNian(y)){
return 29;
}else{
return 28;
}
}else{
return 31;
}
}
int main3(){
int year,month;
int i,j;
int days=0;
printf("请输入你要查看的年份和月份(用空格分隔):");
scanf("%d%d",&year,&month);
// 1998 8
// 计算该月1号距1900.1.1的天数差
//将过去的年份中的天数累计
for(i=1900;i<year;i++){
for(j=1;j<=12;j++){
days+=getDays(i,j);
}
}
//加入当年经过的月份的天数
for(i=1;i<month;i++){
days+=getDays(year,i);
}
printf("经过了%d天\n",days);
// 计算该月1号是星期几
int week=days%7+1;
week%=7;
printf("该月的1号为星期%d\n",week);
//4、计算该月共有多少天
int daysInMonth=getDays(year,month);
printf("该月有%d天\n",daysInMonth);
//5、输出上个月的后几天,该月的所有天,下月的前几天
printf("日\t一\t二\t三\t四\t五\t六\t\n");
int count=0;
// 获取上个月的天数
int preMonthDays;
if(month>1){
preMonthDays=getDays(year,month-1);
}else{
preMonthDays=getDays(year-1,12);
}
//上个月剩余的几天
for(i=preMonthDays-week+1;i<=preMonthDays;i++){
printf("%d\t",i);
count++;
}
//本月的天数
for(i=1;i<=daysInMonth;i++){
printf("%d\t",i);
count++;
if(count%7==0){
printf("\n");
}
}
//下个月的前几天
for(i=1;count<42;i++){
printf("%d\t",i);
count++;
if(count%7==0){
printf("\n");
}
}
return 0;
}