|
发表于 2022-5-4 11:41:45
|
显示全部楼层
回帖奖励 +10 鱼币
其实不难,只是用 C 语言打印比较麻烦,C 语言不太适合用来打印这种格式输出,用 Python 相对简单多。
代码:- #include <stdio.h>
- #define endl printf("\n");
- #define space printf(" ");
- #define _3dot printf("***");
- int isLeapYear(int year) { return (!(year % 4) && (year % 100)) || !(year % 400); }
- int firstDay(int year) {
- int days = 0;
- for (int y = 1900; y < year; y++) {
- days += isLeapYear(y) ? 366 : 365;
- }
- return days + 1;
- }
- void line1(int year) {
- char* str = "*************";
- printf("%*s%d年日历%s%s%d年日历%s\n\n", 31, str, year, str, str, year, str);
- }
- void line2() { for (int i = 0; i < 32; ++i) printf("*"); }
- void line3(int year, int month) { printf("%*s%d年%d月%*s", 12, "", year, month, month > 9 ? 13 : 14, ""); }
- void line4() { printf("%s%6s%6s%6s%6s%6s%6s", "一", "二", "三", "四", "五", "六", "日"); }
- void line5(int max, int w, int line) {
- int l = 0, r = 6, i = 0;
- w = w ? w : 7;
- char str[6][33];
- for (int block = 1, day = 1; block <= 42; ++block) {
- if (block < w) {
- if (!l) { snprintf(str[i], 3, "%5s", ""); l += 2; }
- else { snprintf(str[i] + l, r, "%5s", ""); l += (r - 1); }
- }
- else if (day <= max) {
- if (!l) { snprintf(str[i] + l, 3, "%2d", day++); l += 2; }
- else { snprintf(str[i] + l, r, "%5d", day++); l += (r - 1); }
- if (!(block % 7)) {
- str[i++][32] = '\0';
- l = 0;
- }
- }
- else {
- if (!l) { snprintf(str[i] + l, 3, "%2s", ""); l += 2; }
- else { snprintf(str[i] + l, r, "%5s", ""); l += (r - 1); }
- if (!(block % 7)) {
- str[i++][32] = '\0';
- l = 0;
- }
- }
- }
- printf("%s", str[line]);
- }
- void calendar(int year) {
- int days[12] = { 31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- int week[12], sum = 0;
- for (int m = 0; m < 12; ++m) {
- week[m] = (firstDay(year) + sum) % 7;
- sum += days[m];
- }
- line1(year);
- endl
- for (int m = 1; m <= 12; m += 3) {
- if (!((m - 1) % 3)) {
- _3dot
- for (int i = 0; i < 3; ++i) {
- line2();
- space
- }
- endl
- }
- space
- line3(year, m); line3(year, m + 1); line3(year, m + 2);
- endl
- space
- line4(); _3dot
- line4(); _3dot
- line4();
- endl
- for (int i = 0; i < 6; ++i) {
- space
- line5(days[m - 1], week[m - 1], i); space
- line5(days[m], week[m], i); space
- line5(days[m + 1], week[m + 1], i); space
- endl
- }
- }
- }
- int main(void) {
- int year = 2022;
- calendar(year);
- return 0;
- }
复制代码 |
|