命令行万年历程序

在linux终端里看不了日历,我不答应!代码仓库地址

一、命令行运行的效果图

在这里插入图片描述

如果输入的年份是目前所在年,会标注当天的日期

二、代码实现

1. 判断闰年
bool judge_leap_year(int year) {
    return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
2. 判断两个年份之间有多少个闰年
int judge_total_leap_years(int start_year, int end_year) {
    int count = 0;
    for (int i = start_year; i < end_year; i++) {
        if (judge_leap_year(i)) {
            count++;
        }
    }
    return count;
}
3. 求一个日期到基准日期的天数
int find_gap_from_year(int base_year, int year, int month, int day) {
    int months[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    // 先以365天乘以间隔的年数、以及日的天数
    int total_days = (year - base_year) * 365 + day;
    // 再加上间隔年之间的n个闰年的n天
    total_days += judge_total_leap_years(base_year, year);
    // 加上所有月份的天数
    for(int i = 1; i < month; i++) {
        if (i == 2 && judge_leap_year(year)) {
            total_days++;
        }
        total_days += months[i];
    }
    return total_days;
}
4. 求两个日期的间隔
int find_date_gap (char *start_day, char *end_day) {
    int year1, month1, day1, year2, month2, day2;
    sscanf(start_day, "%d-%d-%d", &year1, &month1, &day1);
    sscanf(end_day, "%d-%d-%d", &year2, &month2, &day2);
    // 设置一个基准年
    int base_year = year1;
    int total_start_days = find_gap_from_year(base_year, year1, month1, day1);
    int total_end_days = find_gap_from_year(base_year, year2, month2, day2);
    return total_end_days - total_start_days;
}
5. 判断输入的日期是星期几
int judge_week_day(char *now_day) {
    int year, month, day;
    sscanf(now_day, "%d-%d-%d", &year, &month, &day);
    // 已知1900年1月1日是星期一
    int total_days = find_date_gap("1900-1-1", now_day); 
    total_days += 1; // 每个月第一天是周日,加一天对齐
    int week_day = total_days % 7;
    return week_day;
}
6. 打印日历的功能
void printf_calendar (int year, int *months, int *first_day_of_months) {
    // 获取当前时间
    time_t current_time;
    struct tm *time_info;
    time(&current_time);
    time_info = localtime(&current_time);
    int current_year = time_info->tm_year + 1900;
    int current_mon = time_info->tm_mon + 1;
    int current_mday = time_info->tm_mday;
    bool is_current_year = (current_year == year);
    // 打印日历
    int left_count, right_count; // 左、右月日历计数
    int left_days, right_days; // 左、右月日历的总天数
    int left_first_day, right_first_day; // 左、右月日历的第一天的星期数(日~六:0~6)
    int left_blanks, right_blanks; // 左、右月日历第一排打印空格数
    printf("|=====================\033[1;37mThe Calendar of Year %4d\033[0m====================|\n", year);
    for (int i = 1; i <= 6; i++) {
        printf(": \033[1;37m%2d\033[0m  \033[0;32mSUN MON TUE WED THU FRI SAT\033[0m  \033[1;37m%2d\033[0m  \033[0;32mSUN MON TUE WED THU FRI SAT\033[0m :\n", i, i + 6);
        left_count = right_count = 0;
        left_days = months[i];
        right_days = months[i+6];
        left_blanks = left_first_day = first_day_of_months[i];
        right_blanks = right_first_day = first_day_of_months[i+6];
        // 循环转行打印日历
        while (left_count < left_days || right_count < right_days) {
            printf(":     ");
            for(int j = 0; j <= 6; j++) {
                if (left_blanks > 0 || left_count >= left_days) {
                    printf("    ");
                    left_blanks--;
                }else {
                    left_count++;
                    if (is_current_year && current_mon == i && current_mday == left_count) {
                        printf("\033[1;31m%3d \033[0m", left_count);
                    }else {
                        printf("%3d ", left_count);
                    }
                }
            }
            printf("     ");
            for(int j = 0; j <= 6; j++) {
                if (right_blanks > 0 || right_count >= right_days) {
                    printf("    ");
                    right_blanks--;
                }else {
                    right_count++;
                    if (is_current_year && current_mon == (i+6) && current_mday == right_count) {
                        printf("\033[1;31m[%2d]\033[0m", right_count);
                    }else {
                        printf("%3d ", right_count);
                    }
                }
            }
            printf(":\n");
        }
    }   
    printf("|==================================================================|\n");
}
7. 输出输入的年份的日历
void output_calendar (int year) {
    // 设置每个月的第一天是星期几(星期日~星期六用0~6表示)
    int first_day_of_months[13] = {-1};
    char date_str[20];
    for (int i = 1; i <= 12; i++) {
        sprintf(date_str, "%d-%d-1", year, i);
        first_day_of_months[i] = judge_week_day(date_str);
    }
    // 设置查询年每个月的天数
    int months[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (judge_leap_year(year)) {
        months[2] = 29;
    }
    printf_calendar(year, months, first_day_of_months);
}
8. 主函数
int main(void) {
    int year;
    printf("输入你要查询的年份日历(仅支持1900之后):");
    scanf("%d", &year);
    output_calendar(year);
    return 0;
}

三、配置命令运行

1. 在linux上编译C代码
gcc -o my_calendar my_calendar.c
2. 移动可执行代码到系统 PATH
mv my_calendar /usr/local/bin
3. 在任何位置使用自定义命令calendar执行

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/282144.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

听GPT 讲Rust源代码--src/tools(37)

File: rust/src/tools/clippy/clippy_lints/src/explicit_write.rs 在Rust源代码中&#xff0c;explicit_write.rs这个文件是Clippy的一个lint插件&#xff0c;其作用是检查代码中的write!、writeln!宏使用时的不当或繁琐的情况&#xff0c;并给出相关的警告或建议。 具体来说&…

浅谈冯诺依曼体系和操作系统

&#x1f30e;冯诺依曼体系结构 文章目录 冯诺依曼体系结构 认识冯诺依曼体系结构       硬件分类       各个硬件的简单认识         输入输出设备         中央处理器         存储器 关于内存 对冯诺依曼体系的理解 操作系统 操作系统…

关键字:try-catch关键字

在 Java 中&#xff0c;try-catch关键字用于异常处理。它们允许编写代码来捕获和处理异常&#xff0c;以确保程序能够在出现问题时合理地处理它们而不会崩溃。 以下是try-catch关键字的基本语法&#xff1a; 在try块中编写可能会抛出异常的代码。如果在try块中的任何代码抛出…

2024年【安全员-B证】考试报名及安全员-B证新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-B证考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新安全员-B证新版试题题目及答案&#xff01;多做几遍&#xff0c;其实通过安全员-B证考试试题很简单。 1、【多选题】《中华人民共和国消防法…

单字符检测模型charnet使用方法,极简

Git链接 安装按照上面的说明&#xff0c;说下使用。 把tools下面的test做了一点修改&#xff0c;可以读取一张图片&#xff0c;把里面的单个字符都检测和识别出来。 然后绘制到屏幕上。 import torch from charnet.modeling.model import CharNet import cv2, os import num…

搭建maven私服

maven maven简介 什么是maven&#xff1f; Maven这个单词来自于意第绪语&#xff08;犹太语&#xff09;&#xff0c;意为知识的积累。 Maven项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具软件。 Maven 除了以…

20231228在Firefly的AIO-3399J开发板的Android11使用Firefly的DTS配置单前后摄像头ov13850

20231228在Firefly的AIO-3399J开发板的Android11使用Firefly的DTS配置单前后摄像头ov13850 2023/12/28 19:20 缘起&#xff0c;突然发现只能打开前置的ov13850&#xff0c;或者后置的ov13850。 但是不能切换&#xff01; 【SDK&#xff1a;rk3399-android-11-r20211216.tar.xz】…

[Angular] 笔记 25:指令

组件指令 (chatgpt 回答) 在 Angular 中&#xff0c;组件本身可以被视为指令&#xff0c;这种指令被称为组件指令。组件是 Angular 应用的构建块之一&#xff0c;它封装了一段具有特定功能和特性的用户界面&#xff0c;并且可以在应用中重复使用。 组件指令具有以下特征&…

docker小白第十天

redis集群主从容错切换案例 3主3从的redis集群&#xff0c;某个主机宕机了&#xff0c;需要对应的从机补位。 docker exec -it redis-node-1 /bin/bash # 进入容器1的命令行 redis-cli -p 6381 # 进入节点1的命令行 cluster nodes # 查看集群信息可以看到1号和6号对应是主从关…

【PXIE301-208】基于PXIE总线架构的Serial RapidIO总线通讯协议仿真卡

板卡概述 PXIE301-208是一款基于3U PXIE总线架构的Serial RapidIO总线通讯协议仿真卡。该板卡采用Xilinx的高性能Kintex系列FPGA作为主处理器&#xff0c;实现各个接口之间的数据互联、处理以及实时信号处理。板卡支持4路SFP光纤接口&#xff0c;支持一个PCIe x8主机接口&…

Pearson correlation coefficient (Pearson’s r) 皮尔森相关系数

此图用的是箱状图&#xff0c;的纵轴是“Pearson’s r”&#xff0c;是实际观测值与机器学习模型预测值之间的相关性 Pearsons f得分&#xff0c;它是一个统计量&#xff0c;用来衡量两个变量之间线性相关性的强度。这个得分可能是用来衡量实际观测值与机器学习模型预测值之间的…

App Inventor 2 接入短信服务,实现短信验证码功能

发送短信验证码功能一般都是基于短信平台提供的sdk进行调用&#xff0c;这里是基于阿里云短信平台进行的开发&#xff0c;阿里云短信平台接入步骤请点此参考。 App Inventor 2拓展提供的函数如下&#xff1a; 主要提供2个函数&#xff0c;生成随机位数的数字随机码 和 发送短信…

ctfshow 新手必刷菜狗杯 谜之栅栏题解记录

知识点&#xff1a;图片比较 拿到之后&#xff0c;有两个图片&#xff0c;直观看不出什么&#xff0c;尝试用工具比较。 用010editor打开其中一个&#xff0c;010editor的工具里面就有比较文件选项&#xff0c;比较两个文件&#xff0c;发现有一处不同。题目说栅栏&#xff0c…

《QDebug 2023年12月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.Q_REVISION 标记的信号槽或者 REVISION 标记的属性&#xff0c;在子类中访问 Q_REVISION 是 Qt 用来做版本控制的一个宏。以 QQuickWindow 为例&#xff0c;继承后去访问 REVISION 标记的 opacity 属性或者 Q_REVISION…

keil5修改默认配色方案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. 找到Keil_5\UV4路径下的两个文件2. 修改global.prop文件中的内容第一种 配色方案第二种 配色方案第三种 配色方案第四种 配色方案 最后 前言 提示&#xff…

GPT3.5 改用 GPT4 价格翻了30倍 如何破局? GPT 对话成本推演

场景介绍 假设你搭建了一个平台&#xff0c;提供 ChatGPT 3.5 的聊天服务。目前已经有一批用户的使用数据&#xff0c;想要测算一下如果更换 GPT 4.0 服务需要多少成本&#xff1f; 方案阐述 如果是全切&#xff0c;最简单粗暴的方案就是根据提供 ChatGPT 3.5 消费的金额乘…

【FileZilla】FileZilla的使用及主动模式与被动模式----图文并茂详细讲解

目录 一 FileZilla的简介 1.1 是什么 1.2 应用场景 二 FileZilla的安装及准备工作 2.1 下载安装 2.2 主机连接VMware 三 FileZilla使用 3.1 内部连接文件管理 3.1.1 添加组 3.1.2 添加用户 3.1.3 添加用户密码 3.1.4 添加用户权限 3.1.5 连接测试 3.2 外部连接文…

Solidworks学习笔记

本内容为solidworks的学习笔记&#xff0c;根据自己的理解进行记录&#xff0c;部分可能不正确&#xff0c;请自行判断。 学习视频参考&#xff1a;【SolidWorks2018视频教程 SW2018中文版软件基础教学知识 SolidWorks自学教程软件操作教程 sw视频教程 零基础教程 视频教程】 h…

游戏软件缺少d3dcompiler.dll文件的多种修复方法分享

在操作系统中&#xff0c;d3dcompiler.dll是一个非常重要的组件&#xff0c;主要负责DirectX图形技术的编译和解析。许多用户在安装或使用某些软件时&#xff0c;提示“缺少d3dcompiler.dll”。这个错误通常出现在游戏或应用程序运行时&#xff0c;它会导致程序无法正常启动或运…

【linux】tail的基本使用

在linux可以用find查找一个文件&#xff0c;可以用grep查找符合要求的文件内容&#xff0c;但是有的时候希望查看文件的前几行或者后几行&#xff08;其实这种场景经常可以遇到&#xff0c;比如接触到日志分析的时候&#xff09;&#xff0c;那就应该使用head和tail这两个工具了…