#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);
	
} 
原文:http://www.cnblogs.com/wc789/p/6160981.html