【两日一练】学习记录

题目

  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;
}


//输入日期,返回当月的1日是周几,1~7对应周一至周日
int weekdays(int y1,int m1)
{
    int d1=1,y2=2018,m2=2,d2=18,a,b,c=0,i,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;
    }
    if(flag==0)
    {
        flag=7;
    }
    return flag;
}


//输入year和month打印横向两月日历
void month_print(int y,int m)
{
    int h,i=1,j=1,k1,k2,flag=0,flag1=1;//flag用于记录是否为闰年
    //i,j分别记录横向相邻两月的日期,h为用于计数的变量
    //flag用于处理闰年,flag1用于让右侧1日前打印空格的语句只运行一次
    int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    printf("| %d  MON TUS WED THU FRI SAT SUN %3d  MON TUS WED THU FRI SAT SUN |\n",m,m+6);
    k1=weekdays(y,m);k2=weekdays(y,m+6);//k1,k2用于记录月份的第一天是周几
    if(m==2)
    {
        flag=(y%4==0 && y%100!=0 || y%400==0);
    }//处理闰年
    printf("|  ");
    //打印左侧月份1日前面可能存在的空格
    for(h=k1-1;h>0;h--)
    {
        printf("    ");
    }
    while(i<a[m] || j<=a[m+6])//打印主体开始
    {
        if(i!=1)
        {
            printf("|  ");
        }
        for(;;i++,k1++)
        {
            if(i<=a[m]+flag)
            {
                printf("%4d",i);
            }else{
                printf("    ");
            }
            if(k1%7==0)
            {
                k1++;i++;
                break;
            }
        }//左侧月份打印完一行
        printf("    ");//打印间隔
        if(flag1)
        {
            //打印右侧月份1日前可能存在的空格
            for(h=k2-1;h>0;h--)
            {
                printf("    ");
            }
            flag1=0;
        }
        for(;;j++,k2++)
        {
            if(j<=a[m+6])
            {
                printf("%4d",j);
            }else{
                printf("    ");
            }
            if(k2%7==0)
            {
                k2++;j++;
                printf("   |\n");
                break;
            }
        }//右侧月份打完一行
    }
}

int main()
{
    int year,mon;
    printf("please input the year whose calendar you want to know:");
    while(fflush(stdin),scanf("%d",&year)!=EOF)
    {
        mon=1;
        printf("|--------------------The Calendar of Year %d--------------------|\n",year);
        while(mon<=6)
        {
            month_print(year,mon);
            mon++;
        }
        printf("|-----------------------------------------------------------------|\n");
        printf("please input the year whose calendar you want to know:");
    }
    system("pause");
}

运行结果
图片说明
图片说明

全部评论

相关推荐

头像
昨天 20:13
中南大学 Java
序言大家好呀。我是希晨er,一个初入职场的程序猿小登最近上班摸鱼刷到了一篇文章:10年深漂,放弃高薪,回长沙一年有感,还有聊聊30岁大龄程序员过往的心路历程,突然就有点感慨。我如今也做出了和大明哥一样的抉择,只是更早。此外我22年的人生,好像从来没好好记录过。正好现在工作不太忙,就想把这些经历写下来,也希望能得到社区里各位前辈的指点个人背景我是03年出生的西安娃,父母都是普通打工人。刚从中南大学软件工程专业毕业半年,现在在老家的央企过着躺平摆烂的日子成长轨迹从农村到城市的童年我家并不是西安的,只是爸妈在西安上班,从小学之后就把我接到了西安。后来老家房子拆了,爷爷奶奶也搬了过来。农村的生活,我觉...
Yki_:看哭了,恋爱那一段你女朋友说你不够关心她,可你毕竟也愿意遇到矛盾写几千字来和她慢慢分析;说不愿意给她花钱,我感觉可能只是消费观不一样;如果她想留在长沙,也应该提前跟你说开。不过她也许会心疼你放弃大厂offer转向数字马力?我也因为同样的原因有过一段幸福而充满遗憾的感情,不过跟爱情相比确实前途更重要一点。至于offer的选择,换我我也会这么选。把这些旧事记录下来以后,接下来就好好向前看吧,加油兄弟
🍊晨光随笔
点赞 评论 收藏
分享
09-22 22:22
中山大学 Java
乌鱼子萨奇:羡慕你啊,直接转正了,都不用经历秋招的炼狱,但是你少经历了很多痛苦的事情啊
点赞 评论 收藏
分享
Java面试先知:我也是和你一样的情况,hr 说等开奖就行了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务