c:万年历

万年历

要求:

  • 从1900年起
  • 输入年份和月份,输出当月的日历

代码:

#include<stdio.h>

#define DATE_HEADER "   Sun   Mon   Tues  Wed   Thur  Fri   Sat"

int y,m,d;
int monthd[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int is_leap_year(int y);//判断平闰年
int get_yearday(int y);//判断从1900年算起这一年的第一天是第几天
int get_weekday(int y,int m,int);//判断这个月的第一天是星期几
int get_monthdays(int y,int m);//判断这个月有多少天
int get_day(int y,int m,int);//判断这个月的第一天是从1900年算起的第几天
void print(int y,int m);//输出某年某月的日历

int main()
{
    printf("请输入年份和月份,以逗号隔开");
    scanf("%d,%d",&y,&m);
    print(y,m);
    return 0;
}

int is_leap_year(int y)
{
    if(y%400==0 || (y%4==0 && y%100!=0)){
        return 1;
    }else{
        return 0;
    }
}

int get_yearday(int y)
{
    int y1=y-1900;
    int d1,d2,d3;
    int dd;
    if(is_leap_year(y)){
        d1=(y1/4-1);
        d2=d1*366;
        d3=(y1-d1)*365;
        dd=d1+d2+d3-1;
    }else{
        d1=(y1/4)*366;
        d2=(y1-(y1/4))*365;
        dd=d1+d2;
    }
    return (dd);
}

int get_monthdays(int y,int m)
{
    if(is_leap_year(y) && m==2){
        return 29;
    }else {
        return monthd[m];
    }
}

int get_day(int y,int m,int d)
{
    int yd=get_yearday(y);
    int md=0;
    int i;
    if(is_leap_year(y)){
        monthd[2]=29;
        if(m>2){
            for(i=0;i<m;i++){
            md=md+monthd[i];
        }
        md=md+1;
        }else if(m==2){
            md=monthd[1]+1;
        }else if(m==1){
            md=1;
        }
    }else {
        for(i=0;i<m;i++){
            md=md+monthd[i];
        }
        md=md+1;
    } 
    return (md+yd);
}

int get_weekday(int y,int m,int d)
{
    int weekd=get_day(y,m,1)%7;
    int weekday1[7]={0,1,2,3,4,5,6};
    return weekday1[weekd];
}

void print(int y,int m)
{
    printf("%s\n", DATE_HEADER);
    int first=get_weekday(y,m,1);
    int days=get_monthdays(y,m);
    int i,j;
    for(i = 0; i < first; i++) {
        printf("      ");
    }
    printf("%6d", 1); 
    if(first == 6)
        printf("\n");
     
    for(i = 1; i < days; i++)
    {
        printf("%6d", i + 1);
        if((first + i) % 7 == 6 || i + 1 == days){
            printf("\n");
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include int main (void) { int year,month,j,i,day1,day2,one1,one2,w; printf("enter a year:"); scanf("%d",&year); printf("\n\n"); printf("---------------------%d---------------------\n\n",year); one1=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7; for(month=1;month<=12;month+=2) { printf(" ",month,year); printf(" \n",month+1,year); printf("-------------------- --------------------\n"); printf("日 一 二 三 四 五 六 日 一 二 三 四 五 六\n"); switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: day1=31;break; case 4: case 6: case 9: case 11:day1=30;break; default:if(!(year%4)&&(year0)||!(year%400)) day1=29; else day1=28; } for(j=1;j<=one1;j++) { if(one1==7) break; else printf(" "); } for(i=1;i<=7-one1;i++) printf("%2d ",i); printf(" "); switch(month+1) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: day2=31;break; case 4: case 6: case 9: case 11:day2=30;break; default:if(!(year%4)&&(year0)||!(year%400)) day2=29; else day2=28; } one2=(one1+day1)%7; for(j=1;j<=one2;j++) { if(one2==7) break; if(j!=7) printf(" "); } for(i=1;i<=7-one2;i++) printf("%2d ",i); printf("\n"); for(i=8-one1;i<=14-one1;i++) printf("%2d ",i); printf(" "); for(i=8-one2;i<=14-one2;i++) printf("%2d ",i); printf("\n"); for(i=15-one1;i<=21-one1;i++) printf("%2d ",i); printf(" "); for(i=15-one2;i<=21-one2;i++) printf("%2d ",i); printf("\n"); for(i=22-one1;i<=28-one1;i++) printf("%2d ",i); printf(" "); for(i=22-one2;i<=28-one2;i++) printf("%2d ",i); printf("\n"); for(i=29-one1;i<=35-one1&&i<=day1;i++) printf("%2d ",i); printf(" "); for(w=1;w<=35-day1-one1;w++) printf(" "); for(i=29-one2;i<=35-one2&&i<=day2;i++) printf("%2d ",i); printf("\n"); for(i=36-one1;i<=day1;i++) printf("%2d ",i); for(w=1;w<=35-day1-one1;w++) printf(" "); if(day1==31&&(one1==4||one1==3||one1==2||one1==1||one1==7)) printf(" "); if(day1==30&&(one1==4||one1==3||one1==2||one1==1||one1==7)) printf(" "); for(i=36-one2;i<=day2;i++) printf("%2d ",i); printf("\n-------------------- --------------------\n\n"); printf("\n"); one1=(one2+day2)%7; } printf("---------------------%d---------------------\n",year); getchar(); printf("按任意键退出"); getchar(); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值