题目:
打印万年历
以下程序以2004年1月为基准年
因为我不知道公元元年一月一日是星期几,所以我以2004年1月1日为基准日 朝后朝前推算的,因为没有万年历,我只能验证2004年没有错,也许程序中存在 逻辑错误,如果有谁知道万年历的或发现错误的请指出。
#include <stdio.h> #define NOW_YEAR 2004 void main() { int year,d_year,month,n=0,i,t,m[12]={31,28,31,30,31,30,31,31,30,31,30,31}; long c_day=0; printf("请输入年份:"); scanf("%d",&year); printf("请输入月份:"); scanf("%d",&month); if(year>=NOW_YEAR) { d_year=year-NOW_YEAR; n=d_year/4+1; if(d_year>=96){t=(d_year+4)/100;n-=t;} if(d_year>=396){t=(d_year+4)/400;n+=t;} if((year%4==0&&year%100!=0||year%400==0)&&month<=2)n--; for(i=0;i<month-1;i++)c_day+=m[i]; c_day+=d_year*365+n; t=(c_day+4)%7; } else { d_year=NOW_YEAR-year; n=d_year/4; if(d_year>=4){t=(d_year+96)/100;n-=t;} if(d_year>=4){t=(d_year+396)/400;n+=t;} if((year%4==0&&year%100!=0||year%400==0)&&month>2)n--; for(i=11;i>=month-1;i--)c_day+=m[i]; c_day+=(d_year-1)*365+n; t=7-(c_day-4)%7; } printf(" 日 一 二 三 四 五 六 \n"); for(i=0;i<t;i++)printf(" "); for(i=1;i<=m[month-1];i++) { printf("%4d",i); if(++t==7){t=0;printf("\n");} } if(month==2&&(year%100!=0&&year%4==0||year%400==0))printf("%4d",i); }
以下程序是从上面程序推出的公元0年1月的日历为基准的,如果上面程序错了,那下面的也不会准。
不过因为没有向前推导,所以程序比较短
void main() { int year,d_year,month,n=0,i,t,m[12]={31,28,31,30,31,30,31,31,30,31,30,31}; long c_day=0; do { printf("请输入年份:"); scanf("%d",&year); }while(year<0); do { printf("请输入月份:"); scanf("%d",&month); }while(month<1||month>12); if(year>=NOW_YEAR) { d_year=year-NOW_YEAR; n=d_year/4+1; if(d_year>=96){t=(d_year+4)/100;n-=t;} if(d_year>=396){t=(d_year+4)/400;n+=t;} if((year%4==0&&year%100!=0||year%400==0)&&month<=2)n--; for(i=0;i<month-1;i++)c_day+=m[i]; c_day+=d_year*365+n; t=(c_day+6)%7; } printf(" 日 一 二 三 四 五 六 \n"); for(i=0;i<t;i++)printf(" "); for(i=1;i<=m[month-1];i++) { printf("%4d",i); if(++t==7){t=0;printf("\n");} } if(month==2&&(year%100!=0&&year%4==0||year%400==0))printf("%4d",i); }
谢谢你版主......能不能帮我看看以下的程序有没错......
#include int week(int year,int month,int day,int n); void monthout(int year,int month); main() { int n,s,year,month,day,i;printf(" =========================================================\n === 日期查询程序 ===\n
========================================================="); do { printf("\n->>> 请选择要进行的操作\n [1]查询某天 [2]查询某月 [3]查询某年 [0]退出\n"); scanf("%d",&s); switch(s) { case 1:printf("请输入 year month day:\n "); scanf("%d%d%d",&year,&month,&day); if (month<0||month>12) { printf("\n !!-->>there's some thing wrong with month\n");break;}
}