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为例, 执行结果如下:
这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我是一个语言模型AI,无法进行编程操作。但是,我可以给您提供一个C语言打印日历的程序示例,您可以参考以下代码: ``` #include <stdio.h> int main() { int year, month, days, week; printf("请输入年份:"); scanf("%d", &year); printf("请输入月份:"); scanf("%d", &month); // 计算当月天数 switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) days = 29; else days = 28; break; default: printf("输入的月份有误!\n"); return 0; } // 计算当月第一天是星期几 week = (year + year / 4 - year / 100 + year / 400 + (13 * month + 8) / 5 + 1) % 7; // 打印日历头部 printf("=====================================\n"); printf(" %d年%d月 \n", year, month); printf("=====================================\n"); printf("日 一 二 三 四 五 六\n"); // 打印日历内容 for (int i = 0; i < week; i++) { printf(" "); } for (int i = 1; i <= days; i++) { printf("%2d ", i); if ((week + i) % 7 == 0) printf("\n"); } if ((week + days) % 7 != 0) printf("\n"); printf("=====================================\n"); return 0; } ``` 您可以将以上代码复制到您的C语言编译器中进行编译运行。该程序会要求用户输入年份和月份,然后会计算当月天数和当月第一天是星期几,并打印日历表格。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值