首页 > 编程语言 >关于台历程序的逆向编程与改进

关于台历程序的逆向编程与改进

时间:2024-03-03 17:34:18浏览次数:32  
标签:逆向 timeinfo int 31 编程 month tm 台历 year

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.总结
被逆向的软件可能具有复杂的结构和逻辑,特别是对于大型或密集优化的程序。理解这些复杂性可能需要大量的时间和精力。
同时我们需要注意用户可能存在的需求,以此为目标改进软件

标签:逆向,timeinfo,int,31,编程,month,tm,台历,year
From: https://www.cnblogs.com/nkbooks/p/18050335

相关文章

  • java - 流式编程
    1.获取流的方法://1.从集合转化List<Integer>list=newArrayList<>();Stream<Integer>stream=list.stream();//转化为流stream.Collect(Collectors.toList());//转换为流,流再转回为集合。//2.自定义初始化Stream<Integer>stream=Stream.of(1,5,6,4,8,3,1,9); 2......
  • 新电脑装编程配置(jdk、MySQL、navicat、idea、Maven、gitee、环境配置)
    一、JDK(java运行环境,不安装不能在自己电脑上运行java语言)1.打开安装包     2.选择安装目录(建议选择非系统盘)      3.安装JRE(最好和JDK分开文件夹、建议选择非系统盘)     4.提示安装成功     配置环境变量:JAVA......
  • 并发编程之协程理论
    引言本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态。cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务......
  • 并发编程之asyncio模块
    引言Python中的协程:协程是一种轻量级的用户级线程,它在单线程内执行,不会阻塞主线程,可以在多个任务间轻松地切换,因此可以用于实现异步I/O操作。协程的实现方式与生成器非常相似,通过使用yield语句来暂停和恢复执行。协程可以与asyncio库配合使用,来实现异步I/O操作。这种方式可以......
  • 并发编程之Gevent模块
    Gevent的介绍greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库,那就是gevent。gevent内部封装的greenlet,其原理是当一个greenlet遇到IO操作时,,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回......
  • 并发编程之IO模型
    引言Python的I/O模型分为同步(sync)和异步(async)两种:同步I/O模型是指,当一个线程在等待I/O操作完成时,它不能执行其他任务,需要一直等待I/O操作完成,直到接收到I/O操作的完成通知后才继续执行。异步I/O模型是指,当一个线程发起一个I/O操作后,不会等待I/O操作完成,而是直接执行其他任......
  • 并发编程补充:基于多线程实现并发的套接字通信
    服务端:fromsocketimport*fromthreadingimportThreaddefcommunicate(conn):whileTrue:try:data=conn.recv(1024)ifnotdata:breakconn.send(data.upper())exceptConnectionResetError:......
  • 并发编程补充:基于多进程实现并发的套接字通信
    服务端:frommultiprocessingimportProcessfromsocketimport*deftalk(conn):whileTrue:try:data=conn.recv(1024)ifnotdata:breakconn.send(data.upper())exceptConnectionResetError:......
  • 并发编程之定时器
    定时器定时器,指定n秒后执行某操作简易版:fromthreadingimportTimerdeftask(name):print('hello%s'%name)t=Timer(5,task,args=('xiao',))t.start()#helloxiao应用版:##验证码定时器fromthreadingimportTimerimportrandomclassCode:......
  • 并发编程之条件Condition
    条件Condition(了解)使得线程等待,只有满足某条件时,才释放n个线程importthreadingdefrun(n):con.acquire()con.wait()print("runthethread:%s"%n)con.release()if__name__=='__main__':con=threading.Condition()foriinra......