1.来源https://zhuanlan.zhihu.com/p/396390324
2.运行环境
VSCODE c语言
运行结果:
3.主要问题:
用户不可以自定义显示自己想要查看的年份月份
不同国家的用户兼容性缺失
代码不够模块化,扩展性不足
改进:
添加了用户输入功能,用户可以输入特定的年份和月份来显示指定月份的日历。
使用了国际化支持,使用了 setlocale 函数来设置地区为当前环境的默认地区,以确保能够正确显示本地化的日期和时间格式。
将日期数组替换为函数调用,使得代码更加清晰和易于维护。
程序在打印日历时,通过 getDaysInMonth() 和 getFirstWeekday() 函数来获取每个月的天数和第一天是星期几,使得代码更加模块化和可扩展。
美化了日历输出,星期和日期格式更加整齐明了。
4.改进代码展示:
include <stdio.h>
include <stdlib.h>
include <time.h>
include <locale.h>
const char* week_days[] = {"日", "一", "二", "三", "四", "五", "六"};
int getDaysInMonth(int year, int month);
int getFirstWeekday(int year, int month);
void printCalendar(int year, int month);
int main(void) {
setlocale(LC_ALL, "");
time_t rawtime;
struct tm* timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
int year = timeinfo->tm_year + 1900;
int month = timeinfo->tm_mon + 1;
printf("请输入年份和月份(yyyy mm):");
scanf("%d %d", &year, &month);
printCalendar(year, month);
return 0;
}
int getDaysInMonth(int year, int month) {
const int days_per_month[] = {31, 28 + (year % 4 == 0 && year % 100 != 0 || year % 400 == 0), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
return days_per_month[month - 1];
}
int getFirstWeekday(int year, int month) {
struct tm timeinfo = {.tm_year = year - 1900, .tm_mon = month - 1, .tm_mday = 1};
mktime(&timeinfo);
return timeinfo.tm_wday;
}
void printCalendar(int year, int month) {
printf("\n %d年%d月\n", year, month);
int days_in_month = getDaysInMonth(year, month);
int first_weekday = getFirstWeekday(year, month);
// 打印星期
printf("日 一 二 三 四 五 六\n");
// 打印前面的空格
for (int i = 0; i < first_weekday; ++i) {
printf(" ");
}
// 打印日期
for (int day = 1; day <= days_in_month; ++day) {
printf("%2d ", day);
if ((first_weekday + day) % 7 == 0 || day == days_in_month) {
printf("\n");
}
}
}
5.重构测试截图
6.总结
被逆向的软件可能具有复杂的结构和逻辑,特别是对于大型或密集优化的程序。理解这些复杂性可能需要大量的时间和精力。
同时我们需要注意用户可能存在的需求,以此为目标改进软件