自行实现linux命令之——cal日历命令

linux cal日历命令

效果图

9IO2lj.png

思路是已知2000年1月1日的星期,然后当前日期减去它算出相差天数,计算出查询月的首天是星期几,最后将三个月份装入3个数组显示出来。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Day[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
void print_head(int month)
{
    printf("        %d月                   %d月                   %d月\n\
一 二 三 四 五 六 日    一 二 三 四 五 六 日   一 二 三 四 五 六 日\n",month-1, month,month+1);

}
//找到本月第一天是星期几
int first_day(int nowYear, int month)
{
    int sum = 0;
    int i = 0;
    int j = 0;
    //从2000至本年
    for (i = 2000; i < nowYear; i++) {
        //是闰年
        if (is_leap_year(i)) {
            sum += 1;
        }
        for (j = 1; j <= 12; j++) {
            sum += Day[j];
        }
    }
    //本年的天数
    for (i = 1; i < month; i++) {
        if (i == 2) {
            if (is_leap_year(nowYear)) {
                sum += 1;
            }
        }
        sum += Day[i];
    }

    return (sum-2) % 7;

}
int is_leap_year(int year)
{
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
//将月份填进一个数组块里
void fill_day(int arr1[][7], int nowYear, int month)
{
    int startDay = 0, i = 0, j = 0, flag = 0;
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 7; j++) {
            if (j == first_day(nowYear, month) && i == 0) {
                flag = 1;
            }

            if (flag == 1) {
                startDay += 1;
            }
            arr1[i][j] = startDay;
            //达到月数截止日期,停止计数
            if (arr1[i][j] > Day[month]) {
                startDay = 0;
                flag = 0;
                if (!is_leap_year(nowYear)) {
                    arr1[i][j] = 0;
                }
            }
        }
    }
}
int main()
{
    int month = 3;
    printf("请输入需要查询月份:");
    scanf("%d", &month);
    int nowYear = 2018;
    int fday = first_day(nowYear, month);
    //printf("%d\n", fday);
    int arr1[6][7] = { 0 };
    int arr2[6][7] = { 0 };
    int arr3[6][7] = { 0 };
    print_head(month);
    fill_day(arr1, nowYear, month-1);
    fill_day(arr2, nowYear, month);
    fill_day(arr3, nowYear, month+1);
    int i = 0, j = 0;
    //逐行打印
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 7; j++) {
            if (arr1[i][j]==0)
                printf("   ");
            else
                printf("%2d ", arr1[i][j]);
        }
        printf("  ");
        for (j = 0; j < 7; j++) {
            if (!arr2[i][j])
                printf("   ");
            else
                printf("%2d ", arr2[i][j]);
        }
        printf("  ");
        for (j = 0; j < 7; j++) {
            if (!arr3[i][j])
                printf("   ");
            else
                printf("%2d ", arr3[i][j]);
        }
        printf("\n");
    }
    system("pause");
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值