- /*****************************************************************
- *Description:万年历
- *Compile Environment:ubuntu10.10+gcc
- *****************************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- int getYear(); //获取输入的年份
- int isLeapYear(int year); //判断是否为润年 1是 0否
- int getWeekDay(int year); //获取元旦星期几
- int getMonthFirstDay(int year,int month); //获取每月第一天星期几
- int getMonthDays(int year,int month); //获取每月的天数
- void printBlank(int n); //第一周1号星期几空几格
- void printYear(int year); //打印日历
- void printMonth(int year,int month); //按月打印
- int main(int argc,char **argv)
- {
- printYear(getYear());
- return 0;
- }
- int getYear()
- {
- int year;
- printf("请输入年份:");
- scanf("%d",&year);
- getchar();
- if(year<1||year>3000)
- {
- printf("input error!\\n");
- exit(0);
- }
- else
- return year;
- }
- /*****************************************************
- *函数名:isLeapYear
- *功能:判断是否为瑞年
- ****************************************************/
- int isLeapYear(int year)
- {
- return (year%4==0&&year%100!=0)||year%400==0;
- }
- /*****************************************************
- *函数名:getWeekDay
- *功能:确定当该年的元旦为星期几
- ****************************************************/
- int getWeekDay(int year)//1900-1-1 周1
- {
- int n=year-1900;
- n=n+(n-1)/4+1;
- n=n%7;
- return n;
- }
- /*****************************************************
- *函数名:getMonthDays
- *功能:获取该年该月的天数
- ****************************************************/
- int getMonthDays(int year,int month)
- {
- switch(month)
- {
- case 4:case 6:case 9:case 11:
- return 30;
- case 2:
- if(isLeapYear(year))
- return 29;
- else
- return 28;
- default:
- return 31;
- }
- }
- /*****************************************************
- *函数名:getMonthFirstDay
- *功能:确定该年该月1号为星期几
- ****************************************************/
- int getMonthFirstDay(int year,int month)
- {
- int i;
- int weekday=getWeekDay(year);
- for(i=1;i<month;i++)
- {
- weekday=(weekday+getMonthDays(year,i))%7;
- }
- return weekday;
- }
- /*****************************************************
- *函数名:printYear
- *功能:输出日历
- ****************************************************/
- void printYear(int year)
- {
- int month;
- for(month=1;month<13;month++)
- {
- printMonth(year,month);
- printf("\\n");
- printf("按回车键查看下月\\n");
- getchar();
- }
- }
- /*****************************************************
- *函数名:printBlank
- *功能:输出1号前的空格
- ****************************************************/
- void printBlank(int n)
- {
- int i;
- for(i=0;i<n;i++)
- printf(" ");
- }
- /*****************************************************
- *函数名:printMonth
- *功能:输出该月的日历
- ****************************************************/
- void printMonth(int year,int month)
- {
- int weekday,ndays,day;
- printf("\\t%d月份\\n",month);
- printf(" Su Mo Tu We Th Fr Sa\\n");
- ndays=getMonthDays(year,month); //获得每月的天数
- weekday=getMonthFirstDay(year,month); //确定该month月1号周几
- printBlank(weekday); //1号开始位置的空格
- for(day=1;day<=ndays;day++)
- {
- printf("%3d",day);
- if(weekday==6)//到周六换行
- printf("\\n");
- weekday=(weekday+1)%7;
- }
- printf("\\n");
- }
- //该片段来自于http://www.codesnippet.cn/detail/200520133457.html
来源: http://www.codesnippet.cn/detail/200520133457.html