命令行万年历程序

在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执行

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

List集合格式转换

最近遇到一个任务&#xff1a; 需要把A集合数据转成 B集合的形式&#xff1a; A集合&#xff1a; B集合&#xff1a; 代码&#xff1a; package com.example.juc.test;import com.example.juc.entity.Ld; import com.example.juc.entity.Student;import java.lang.reflect.F…

双指针刷题(二)

所有算法文章链接&#xff08;最底部&#xff09; http://t.csdnimg.cn/IbllR 目录 1.快乐数 分析题意 解题思路 代码实现 2.盛最多水的容器 分析题意 解题思路 代码实现 1.快乐数 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 分析题意…

有了向量数据库,我们还需 SQL 数据库吗?

“除了向量数据库外&#xff0c;我是否还需要一个普通的 SQL 数据库&#xff1f;” 这是我们经常被问到的一个问题。如果除了向量数据以外&#xff0c;用户还有其他标量数据信息&#xff0c;那么其业务可能需要在进行语义相似性搜索前先根据某种条件过滤数据&#xff0c;例如&a…

初始Web服务器

一、web服务器 1、什么是web服务器&#xff1f; web服务器就是web项目的容器&#xff0c;我们将开发好的web项目部署到web容器中&#xff0c;才能使用网络中的用户通过浏览器进行访问。 一张图带你了解web服务器有啥作用&#xff1a; 在我的电脑上有一个已经做好的项目&#…

【Java基础系列】body参数前后端不一致

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

计算机毕业设计 基于SpringBoot的高校竞赛管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Generalized Focal Loss V1论文解读

摘要 单级检测器基本上将物体检测表述为密集分类和定位&#xff08;即边界框回归&#xff09;。分类通常通过Focal Loss进行优化&#xff0c;而边界框的定位通常根据Dirac delta分布进行学习。单级检测器的最新趋势是引入一个单独的预测分支来估计定位质量&#xff0c;预测质量…

万字长文谈自动驾驶occupancy感知

文章目录 prologuepaper listVision-based occupancy :1. [MonoScene: Monocular 3D Semantic Scene Completion [CVPR 2022]](https://arxiv.org/pdf/2112.00726.pdf)2. [Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction [CVPR 2023]](https://arxiv…

小信跳房子的题解

原题描述&#xff1a; 时间&#xff1a;1s 空间&#xff1a;256M 题目描述&#xff1a; 小信在玩跳房子游戏&#xff0c;已知跳房子游戏的图表现为一颗完美的具有个节点的二叉树。从根节点依次编号为。节点的左子节点编号为&#xff0c;右子节点编号为。 小信从从节点出发&…

立体匹配算法(Stereo correspondence)SGM

SGM(Semi-Global Matching)原理&#xff1a; SGM的原理在wiki百科和matlab官网上有比较详细的解释&#xff1a; wiki matlab 如果想完全了解原理还是建议看原论文 paper&#xff08;我就不看了&#xff0c;懒癌犯了。&#xff09; 优质论文解读和代码实现 一位大神自己用c实现…

【算法】数论---约数

约数里面的一个重要性质&#xff1a;一个数的约数都是成对存在的(以sqrt(x)为分界线) 一、求一个数的所有约数---试除法 int x; cin>>x; int yue[10000]{0},idx0; for(int i1;i<x/i;i) {if(x%i0){yue[idx]i;cout<<i<<" ";} }for(int iidx-1;i&…

Java 8 中的 Stream 轻松遍历树形结构!

可能平常会遇到一些需求&#xff0c;比如构建菜单&#xff0c;构建树形结构&#xff0c;数据库一般就使用父id来表示&#xff0c;为了降低数据库的查询压力&#xff0c;我们可以使用Java8中的Stream流一次性把数据查出来&#xff0c;然后通过流式处理&#xff0c;我们一起来看看…