news 2026/6/3 23:59:34

C语言实现打印某年的历法日期(附带源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言实现打印某年的历法日期(附带源码)

一、项目背景详细介绍

在日常生活与计算机系统中,日期与时间处理是一个非常基础却极其重要的内容。无论是操作系统、数据库系统,还是各类应用程序,几乎都离不开对“日期”的计算与显示。

在 C 语言学习阶段,虽然标准库中提供了<time.h>,但在教学与算法训练中,手动实现历法日期的打印具有不可替代的价值:

  • 帮助理解闰年规则

  • 训练条件判断与循环结构

  • 强化数组的使用

  • 体验真实世界问题的建模过程

“打印某一年的历法日期(年历)”是一个非常经典的综合练习项目,常见于:

  • C 语言课程设计

  • 程序设计基础大作业

  • 笔试 / 面试算法题

  • 数据结构与算法入门练习

通过该项目,可以将零散的语法知识整合为一个完整、可运行、可展示的程序。


二、项目需求详细介绍

本项目的目标是:

使用 C 语言,输入某一年(如 2025),在终端中打印该年的完整历法日期


1️⃣ 输入要求

  • 一个整数year

  • 表示需要打印的年份(如 2024、2025 等)


2️⃣ 输出要求

  • 按月份依次打印1 月 ~ 12 月

  • 每个月显示:

    • 月份名称

    • 星期标题(周一 ~ 周日 或 周日 ~ 周六)

    • 每天对应正确的星期位置

  • 格式清晰、对齐整齐,便于阅读


3️⃣ 功能要求

  1. 判断输入年份是否为闰年

  2. 计算该年 1 月 1 日是星期几

  3. 根据月份天数逐月打印

  4. 正确处理闰年 2 月的天数变化


4️⃣ 约束说明

  • 不使用<time.h>等时间库

  • 仅使用基础语法完成

  • 适合教学与算法训练


三、相关技术详细介绍

1️⃣ 公历(格里高利历)基础知识

(1)平年与闰年

判断规则:

  • 能被 400 整除 → 闰年

  • 能被 4 整除但不能被 100 整除 → 闰年

  • 其他情况 → 平年

2000 → 闰年 1900 → 平年 2024 → 闰年 2025 → 平年


2️⃣ 每月天数规律

月份天数
131
228 / 29
331
430
531
630
731
831
930
1031
1130
1231

3️⃣ 星期的表示方式

通常用整数表示星期:

0 → 星期日 1 → 星期一 2 → 星期二 ... 6 → 星期六


4️⃣ 计算某天是星期几的思想

常见方法有:

  • 蔡勒公式(Zeller)

  • 基于“已知参考日”的累加法

本项目采用累加法

从一个已知日期开始,逐年、逐月累加天数,再对 7 取余


四、实现思路详细介绍

1️⃣ 总体实现流程

  1. 输入年份 year

  2. 判断是否为闰年

  3. 计算该年 1 月 1 日是星期几

  4. 定义月份天数数组

  5. 循环打印 12 个月的日历

  6. 控制格式,使日期对齐


2️⃣ 关键算法说明

(1)闰年判断

(year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)


(2)1 月 1 日星期计算思路

1900 年 1 月 1 日(星期一)作为参考:

  1. 从 1900 累加到目标年份前一年

  2. 累加每年的天数

  3. 总天数 % 7 → 星期偏移量


(3)打印单个月份

  1. 先打印月份标题

  2. 打印星期标题

  3. 打印空格对齐到起始星期

  4. 逐日打印日期

  5. 每周换行


五、完整实现代码

#include <stdio.h> /* =============================== 功能:判断是否为闰年 =============================== */ int isLeapYear(int year) { if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) return 1; return 0; } /* ========================================== 功能:计算某年 1 月 1 日是星期几 说明: 以 1900-01-01(星期一)为基准 返回值:0~6 表示 星期日~星期六 ========================================== */ int getFirstWeekday(int year) { int days = 0; int i; for (i = 1900; i < year; i++) { days += isLeapYear(i) ? 366 : 365; } /* 1900-01-01 是星期一 */ return (days + 1) % 7; } /* ========================================== 功能:打印某个月的日历 参数: year - 年份 month - 月份(1~12) firstWeekday - 本月第一天是星期几 返回: 下个月第一天的星期 ========================================== */ int printMonth(int year, int month, int firstWeekday) { int daysOfMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int days = daysOfMonth[month - 1]; int i; if (month == 2 && isLeapYear(year)) days = 29; printf("\n=========== %d 月 ===========\n", month); printf("日 一 二 三 四 五 六\n"); /* 打印前导空格 */ for (i = 0; i < firstWeekday; i++) printf(" "); /* 打印日期 */ for (i = 1; i <= days; i++) { printf("%2d ", i); if ((firstWeekday + i) % 7 == 0) printf("\n"); } printf("\n"); return (firstWeekday + days) % 7; } /* =============================== 主函数 =============================== */ int main() { int year; int month; int firstWeekday; printf("请输入年份:"); scanf("%d", &year); firstWeekday = getFirstWeekday(year); for (month = 1; month <= 12; month++) { firstWeekday = printMonth(year, month, firstWeekday); } return 0; }

六、代码详细解读

1️⃣isLeapYear

  • 判断指定年份是否为闰年

  • 是日期计算的基础函数


2️⃣getFirstWeekday

  • 计算某年 1 月 1 日是星期几

  • 通过累加历史天数实现


3️⃣printMonth

  • 打印指定月份的日历

  • 控制星期对齐与换行

  • 返回下个月的起始星期


4️⃣main

  • 接收用户输入

  • 控制全年 12 个月的打印流程


七、项目详细总结

通过本项目,可以系统性掌握:

✅ 闰年判断规则
✅ 日期与星期的计算方法
✅ 二维现实问题的程序建模能力
✅ C 语言中格式化输出技巧
✅ 多函数协作编程思想

这是一个非常适合课程设计与综合训练的经典项目


八、项目常见问题及解答

Q1:为什么不使用<time.h>

教学目的在于理解原理,而不是调用库函数。


Q2:星期顺序可以改吗?

可以,只需调整标题与起始偏移即可。


Q3:能打印成三个月一行的年历吗?

可以,但需要更复杂的布局控制,适合作为进阶练习。


九、扩展方向与性能优化

1️⃣ 打印“年历(三个月一行)”
2️⃣ 增加节假日标记
3️⃣ 支持指定月份打印
4️⃣ 使用结构体封装日期
5️⃣ 扩展为简易日历系统

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/2 0:01:42

如何利用资源管理器排查硬盘故障?

利用资源管理器&#xff08;File Explorer&#xff09;是排查硬盘故障的第一道、也是最直观的防线。虽然它无法进行专业的深度诊断&#xff0c;但能提供重要的初步线索&#xff0c;告诉你“这块硬盘可能有问题了”。 你可以将资源管理器看作一个“健康仪表盘”&#xff0c;它显…

作者头像 李华
网站建设 2026/6/3 9:11:02

48、PHP与C/C++编程工具指南

PHP与C/C++编程工具指南 PHP编程部分 PHP在网页处理和数据库操作方面有着强大的功能,下面将详细介绍PHP在正则表达式替换、HTML表单处理、数据库操作等方面的应用。 正则表达式替换 在PHP中,正则表达式是一种强大的文本处理工具。以下代码展示了如何使用正则表达式替换字…

作者头像 李华
网站建设 2026/6/2 13:28:12

KindEditor处理ppt幻灯片图文混排转存站群平台

《Word一键转存历险记&#xff1a;一个穷学生的CMS升级之路》 寻找解决方案的奇幻旅程 第一天&#xff1a;初探Word粘贴黑科技 作为一名福建某高校的计科大三狗&#xff08;啊不是&#xff0c;学生&#xff09;&#xff0c;我正在给我的CMS新闻管理系统做升级。需求很简单&a…

作者头像 李华
网站建设 2026/6/3 13:44:52

LLVM架构和V8引擎的详细工作阶段

计划用两个对比明显的表格分别展示LLVM和V8的工作流程&#xff0c;让用户清晰地看到LLVM作为"静态编译基础设施"与V8作为"动态执行引擎"的本质区别。然后在表格后详细解释每个阶段的核心机制和设计原理。 为了让你清晰地理解&#xff0c;这里把LLVM&#x…

作者头像 李华
网站建设 2026/5/31 22:42:27

KindEditor导入pdf文件识别图表生成代码片段

当Word一键粘贴遇上680元预算&#xff1a;一个前端程序员的奇幻漂流 各位同行好&#xff0c;我是北京某不知名前端码农老王&#xff08;头发比Vue2升Vue3的迁移成本还高的那种&#xff09;。最近接了个CMS企业官网项目&#xff0c;客户要求在KindEditor里实现Office全家桶导入…

作者头像 李华
网站建设 2026/5/30 14:59:31

vue和springboot框架开发的二手旧物回收商城系统的设计与实现_h4v63f89

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 vuespringboot_h4v63f89 框架开发的二手旧物回收商…

作者头像 李华