#include<stdio.h>
//获取用户输入的年份(1900-2100
#include<stdio.h>
//获取用户输入的年份(1900-2100),如果用户输入不正确,则提示重新输入
int getUserInputYear(void){
printf("请你输入一个年份(1900-2100):");
int year;
while(scanf("%d",&year)==0 || year<1900 || year>2100){
printf("输入错误,请重新输入:");
fflush(stdin);
}
return year;
}
//获取用户输入的月份(1-12),如果用户输入不正确,则提示重新输入
int getUserInputMonth(void){
printf("请你输入一个月份(1-12):");
int yue;
while(scanf("%d",&yue)==0 || yue<1 || yue>12){
printf("输入错误,请重新输入:");
fflush(stdin);
}
return yue;
}
//判断一个年份是不是闰年
int isLeap(int year){
if((year%4==0&&year%100!=0) || year%400==0){
return 1; //是闰年
}
else{
return 0; //不是闰年
}
}
//得到某年的天数
int getDaysOfYear(int year){
int tianshu;
if(isLeap(year)==1){
tianshu=366;
}
else{
tianshu=365;
}
return tianshu;
}
//得到某年某月的天数
int getDaysOfMonth(int year, int month){
int day;
int a = month;
if(a==1|| a==3 || a==5 || a==7 || a==8 || a==10 || a==12){
day=31;
}
else if(a==2 && isLeap(year)==1){
day=29;
}
else if(a==2 && isLeap(year)!=1){
day=28;
}
else{
day=30;
}
return day;
}
//根据提供的年月日,得到这一天是这一年的第几天
int getDaysInYear(int year, int month, int day){
int sum=0;
for(int i=1;i<month;i++){
int num = getDaysOfMonth(year,i);
sum +=num;
}
return sum+day;
}
//根据提供的年月日,计算从1900-1-1号到这一天经过的天数
int getCrossDaysFrom1900(int year, int month, int day){
int Sum = 0;
for(int i=1900;i<year;i++){
Sum += getDaysOfYear(i);
}
Sum += getDaysInYear(year,month,day); //year当年的 这一天的天数
return Sum-1;
}
//计算某一天是星期几(已知1900-1-1号是星期一)
int getDayOfWeek(int year, int month, int day){
int W = getCrossDaysFrom1900(year,month,day)%7;
return W+1;
}
//在控制台中输出某个月的日历
void printCalendar(int year, int month){
printf("====================================================\n");
printf(" 一 \t 二 \t 三 \t 四 \t 五 \t 六 \t 日 \n");
for(int k=1;k<=(getDayOfWeek(year,month,1)-1);k++){ //前面空格显示;
printf("\t");
}
int a=getDaysOfMonth(year,month); //遍历输出天数;
for(int i=1;i<=a;i++){
printf(" %d\t",i);
if(getDayOfWeek(year,month,i)==7){ //换行;
printf("\n");
}
}
printf("\n");
printf("====================================================\n");
}
int main (void){
int a = getUserInputYear();
int b = getUserInputMonth();
printCalendar(a,b);
}
),如果用户输入不正确,则提示重新输入
int getUserInputYear(void){
printf("请你输入一个年份(1900-2100):");
int year;
while(scanf("%d",&year)==0 || year<1900 || year>2100){
printf("输入错误,请重新输入:");
fflush(stdin);
}
return year;
}
//获取用户输入的月份(1-12),如果用户输入不正确,则提示重新输入
int getUserInputMonth(void){
printf("请你输入一个月份(1-12):");
int yue;
while(scanf("%d",&yue)==0 || yue<1 || yue>12){
printf("输入错误,请重新输入:");
fflush(stdin);
}
return yue;
}
//判断一个年份是不是闰年
int isLeap(int year){
if((year%4==0&&year%100!=0) || year%400==0){
return 1; //是闰年
}
else{
return 0; //不是闰年
}
}
//得到某年的天数
int getDaysOfYear(int year){
int tianshu;
if(isLeap(year)==1){
tianshu=366;
}
else{
tianshu=365;
}
return tianshu;
}
//得到某年某月的天数
int getDaysOfMonth(int year, int month){
int day;
int a = month;
if(a==1|| a==3 || a==5 || a==7 || a==8 || a==10 || a==12){
day=31;
}
else if(a==2 && isLeap(year)==1){
day=29;
}
else if(a==2 && isLeap(year)!=1){
day=28;
}
else{
day=30;
}
return day;
}
//根据提供的年月日,得到这一天是这一年的第几天
int getDaysInYear(int year, int month, int day){
int sum=0;
for(int i=1;i<month;i++){
int num = getDaysOfMonth(year,i);
sum +=num;
}
return sum+day;
}
//根据提供的年月日,计算从1900-1-1号到这一天经过的天数
int getCrossDaysFrom1900(int year, int month, int day){
int Sum = 0;
for(int i=1900;i<year;i++){
Sum += getDaysOfYear(i);
}
Sum += getDaysInYear(year,month,day); //year当年的 这一天的天数
return Sum-1;
}
//计算某一天是星期几(已知1900-1-1号是星期一)
int getDayOfWeek(int year, int month, int day){
int W = getCrossDaysFrom1900(year,month,day)%7;
return W+1;
}
//在控制台中输出某个月的日历
void printCalendar(int year, int month){
printf("====================================================\n");
printf(" 一 \t 二 \t 三 \t 四 \t 五 \t 六 \t 日 \n");
for(int k=1;k<=(getDayOfWeek(year,month,1)-1);k++){ //前面空格显示;
printf("\t");
}
int a=getDaysOfMonth(year,month); //遍历输出天数;
for(int i=1;i<=a;i++){
printf(" %d\t",i);
if(getDayOfWeek(year,month,i)==7){ //换行;
printf("\n");
}
}
printf("\n");
printf("====================================================\n");
}
int main (void){
int a = getUserInputYear();
int b = getUserInputMonth();
printCalendar(a,b);
}