C 打印日历

1.题目

给出指定的年和月 打出所对应的日历

2.程序代码

已知一个基准天,2000.1.1是星期六,总体思路,要先求出所求年份的1.1是星期几,再求出所求月份的1号是星期几,之后再考虑闰年和平年的问题,还有每个月天数的问题,所以创建一个全局的二维数组,分别存放闰年和平年的每个月所对应的天数,为了让1月能与数组中的months[][1]对应起来,所以再前面加上一个元素0;打印日历时,应注意前面空出的位置,若为星期几,就在前面空出几个位置,每当此时的日期为星期六时,还要换行;在每次给ret求模的时候,容易忘了加上基准的星期,所以我在初始化的时候直接把基准星期赋给了ret
详细代码如下:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <Windows.h>

int months[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };
//定义一个二维数组,里面分别存放平年和闰年每个月对应的天数

is_leap(int year)//判断传进来的年份是否为闰年,是就返回1,否则返回0
{
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 1 : 0;
}

int first_day_of_year(int year)//求出所输入年份的第一天是星期几
{
    int base_year = 2000;//先定义一个基准的年份
    int base_day = 6;//定义基准年份的第一天是星期几
    int i;
    int ret = base_day;//把第一天的星期数赋给ret

    for (i = base_year; i < year; i++)
    {
        ret += 365 + is_leap(i);//给ret加上365再加上 判断是否为闰年函数的返回值
    }

    return ret % 7;//把ret%7就得到了星期数
}

int first_day_of_month(int year, int month, int base_day)
//求出所输入的月份的第一天是星期几
{
    int i;
    int ret = base_day;//把星期数赋给ret

    for (i = 1; i < month; i++)
    {
        ret += months[is_leap(year)][i];//给ret加上前面月份的天数
    }

    return ret % 7;//把ret%7就得到了星期数
}

void print_calendar(int year, int month, int base_day)//打印日历
{

    printf("\n%d/%d\n", year, month);
    printf("Sun Mon Tue Wed Thr Fri Sta\n");
    printf("---------------------------\n");

    int i;
    int week = base_day;//存放此时的星期数,作为换行的条件

    for (i = 0; i < base_day; i++)
    {
        printf("    ");
    }//该月份的第一天是星期几就在前面空出几个位置

    for (i = 1; i <= months[is_leap(year)][month]; i++)
    {
        week++;
        printf(" %2d ", i);

        if (week % 7 == 0)
        {
            printf("\n");
        }
    }

    printf("\n\n");
}

int main()
{
    int year, month;
    printf("year/month:");
    scanf("%d %d", &year, &month);

    int year_first = first_day_of_year(year);
    int month_first = first_day_of_month(year, month, year_first);
    print_calendar(year, month, month_first);

    system("pause");
    return 0;
}

3.执行结果

以2018.5为例, 执行结果如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/k_a_irving/article/details/80413931