C语言——日历显示

c

在Linux中cal命令显示系统月历与日历。

使用C语言复复刻“cal”命令的显示。

main.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 获取指定日期是星期几
int getWeekday(int year, int month, int day) {
    if (month < 3) {
        month += 12;
        year--;
    }
    int c = year / 100;
    year %= 100;
    int w = (c / 4 - 2 * c + year + year / 4 + 13 * (month + 1) / 5 + day - 1) % 7;
    return (w + 7) % 7;
}

// 显示每个月的一行的日历
int show_month_line(int year, int month, int day) {
    int week = getWeekday(year, month, day);
    int count = 7;
    // 判断闰年
    int isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
    int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (isLeapYear) {
        months[1] = 29;
    }
    for (int i = 0; i < week; i++) {
        printf("   ");
        count--;
    }
    for (int i = 0; i < count; i++) {
        if (day <= months[month - 1]) {
            printf("%3d", day);
            day++;
        } else {
            printf("   ");
        }
    }
    return day;
}

// 显示每三个月一组的日历
void show_three_months(int year, int start_month) {
    char *month_names[] = {"January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December"};
    for (int i = start_month; i < start_month + 3; i++) {
        printf("%10s %d%7s", month_names[i - 1], year," ");
    }   
    printf("\n");
    for (int i = start_month; i < start_month + 3; i++) {
        printf(" Su Mo Tu We Th Fr Sa ");
    }
    printf("\n");
    int day[3] = {1, 1, 1};
    for (int i = 0; i < 6; i++) {
        for (int j = start_month; j < start_month + 3; j++) {
            day[j - start_month] = show_month_line(year, j, day[j - start_month]);
            printf(" ");
        }
        printf("\n");
    }
    printf("\n");
}

// 显示全年的日历
void show_year(int year) {
    for (int i = 1; i <= 12; i += 3) {
        show_three_months(year, i);
    }
}

int main() {
    system("color 0A");
    show_year(2025);
    return 0;
}

结果对比

在main函数中调用show_year函数,参数为所要查询的月份,即可在终端显示。

对比Linux中的显示,还原度还是可以的。

相关文章

【数据结构】——哈夫曼树

速通回忆 这里是完整的代码和运行结果,可以直接选择看下面代码的思路去快速回忆哈夫曼树,或从下面理论部分开始学习 ``` #include "stdio.h" #include "stdlib.h" /* 哈夫曼树结点的结构体 */ typedef struct { int weight; /* 权重 */ int parent; /* 父母结点下标 */ int l...

c

强化C【C语言笔记】——位运算

位运算符C语言提供了六种位运算符 - &:按位与 - !:按位或 - ^:异或 - ~:取反 - <<:左移 - \>>:右移 按位与运算 **其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0** 按位与运算通常用来对某些位清0 按位或运算 **其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就...

c

C语言中规中矩的大树

**没事干,写个树玩玩,真正的“撸树”** 在Ubuntu终端、VScode终端显示 代码 ``` #include "stdio.h" int main(){ int high = 5; //层高 int count = 5; //层数 int start; //每层开始*数 int...

c