题目

  1. 上一次日历的代码优化

输出采用平时的星期日在前的顺序

代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//计算某个日期距离年初多少天
int day_count(int y,int m,int d)
{
    int i,days=0;
    int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    for(i=0;i<m;i++)
    {
        days+=a[i];
    }
    days+=d;
    if(m>2 && (y%4==0 && y%100!=0 || y%400==0))
    {
        days++;
    }
    return days;
}


//计算每个月的第一天是周几
int weekdays(int y1,int m1)
{
    int d1=1,y2=2018,m2=2,d2=18,i,a,b,c=0,days,flag;
    a=day_count(y1,m1,d1);
    b=day_count(y2,m2,d2);
    if(y1<y2)
    {
        for(i=y1;i<y2;i++)
        {
            if(i%4==0 && i%100!=0 || i%400==0)
            {
                c++;
            }
        }
        days=b-a+(y2-y1)*365+c;
    }else{
        for(i=y2;i<y1;i++)
        {
            if(i%4==0 && i%100!=0 || i%400==0)
            {
                c++;
            }
        }
        days=a-b+(y1-y2)*365+c;
    }
    if(y1<y2 || y1==y2 && m1<m2 || y1==y2 && m1==m2 && d1<d2)
    {
        flag=(7-days%7)%7;
    }else{
        flag=days%7;
    }
    return flag;
}


//打印两个并列的月份
void year_print(int y,int m)
{
    int k1,k2,h,flag0=0,flag1=1,i=1,j=1;
    int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    printf("| %d  日 一 二 三 四 五 六  %3d  日 一 二 三 四 五 六  |\n",m,m+6);
    k1=weekdays(y,m);k2=weekdays(y,m+6);
    if(m==2)
    {
        flag0=(y%4==0 && y%100!=0 || y%400==0);
    }
    printf("|   ");
    for(h=k1;h>0;h--)
    {
        printf("   ");
    }
    while(i<=a[m] || j<=a[m+6])//while(i<=a[m]+flag0 || j<=a[m+6])
    {
        if(i!=1)
        {
            printf("|   ");
        }
        for(;;i++,k1++)
        {
            if(i<=a[m]+flag0)
            {
                printf(" %2d",i);
            }else{
                printf("   ");
            }
            if(k1!=0 && k1%6==0)
            {
                i++;
                k1=0;
                break;
            }
        }
        printf("      ");
        if(flag1)
        {
            for(h=k2;h>0;h--)
            {
                printf("   ");
            }
            flag1=0;
        }
        for(;;j++,k2++)
        {
            if(j<=a[m+6])
            {
                printf(" %2d",j);
            }else{
                printf("   ");
            }
            if(k2!=0 && k2%6==0)
            {
                k2++;
                j++;
                printf("  |\n");
                break;
            }
            if(k2==7)
            {
                k2=0;
            }
        }
    }
}


int main()
{
    int year,mon;
    printf("请输入具体年份:");
    while(fflush(stdin),scanf("%d",&year)!=EOF)
    {
        mon=1;
        printf("|------------------------%d年-----------------------|\n",year);
        while(mon<=6)
        {
            year_print(year,mon);
            mon++;
        }
        printf("|-----------------------------------------------------|\n");
        printf("请输入具体年份:");
    }
    system("pause");
}

执行结果

图片说明

图片说明