在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中的显示,还原度还是可以的。