编写万年历程序时的一些意外收获

article/2025/10/21 13:36:08

前些天在CSDN每日一练上做到了万年历程序的一道题,觉得很有意思,于是便尝试自己写写看,结果遇到了“公元1年1月1日是星期几”这个问题。拿着手机翻华为日历翻了半天,找到了这一天是星期六:

然而我发现,根据这一结果写出的程序在公元1年的运行结果正确,但在2000多年的运行结果出现了错误:

我检查了代码一段时间,自认为判断闰年的部分没有出错,判断星期几的部分也没有出错,于是怀疑1月1日究竟是否是星期六。我从当前日期向前推算,发现若按当前日期,公元1年1月1日应该是星期一,这与我在手机上查到的结果相矛盾。

之后,我突然想起之前看过的一篇文章,介绍说历史上有一段日期是没有记载的,查了一下,果然发现手机日历上1582年10月4日之后紧跟的是15日而不是5日,这一年10月5日到14日没有在日历上出现:

缺这10天的原因是变更了历法,由儒略历改为格里高里历来消除之前历法产生的误差。然而,算进去这10天之后结果还是不对,减去这10天之后公元1年应该是星期四(星期一往后推10天)。

在翻日历的过程中,我偶然发现日历上100年、200年、300年等的2月都是29天,这和现在的闰年判断规则(四年一闰;百年不闰,四百年再闰)相悖。我推测这是因为制定儒略历的时期人们对于地球公转的测量尚有误差,只是规定4年一闰,没有规定百年不闰,四百年再闰。但实际上地球公转的周期要比365天6时短,若4年一闰,会发现几百年后闰下来多算了天数,所以后来采用了格里高里历,规定百年不闰,四百年再闰。

后来查了以下日历,发现果然从100年、200年、300年...直到1500年这15个整百年都是闰年,但更改历法之后的1700年、1800年、1900年则不是闰年。

根据以上两个发现,我调整了程序,现输出结果如下:

现在的结果应该和日历上保持一致了。 

代码如下(写的很烂,大家见谅):

/*** @file demo.c* @author ZchenG202 (zhuchenguang202@mails.ucas.ac.cn)* @brief This program print calendar for a given month after January of AC 1.*        The program considered the change of calendar in October of 1582.* @version 2.0* @date 2022-07-22* * @copyright Copyright (c) 2022* */#include <stdio.h>/*** @brief return the number of days of a year* * @param y * @return int */
int year(int y)
{if (y == 1582)   //10 days were missing in 1582return 355;else if ((y % 4 == 0 && y < 1582) || (y % 4 == 0 && y % 100 != 0 && y > 1582) || (y % 400 == 0 && y > 1582))return 366;elsereturn 365;
}int main()
{char c;do{int y, month;printf("enter month and year (month-year): ");scanf("%d-%d", &month, &y);getchar();int sum = 0;int i;for (i = 1; i < y; i++) {sum += year(i);}int dayofmonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if (year(y) == 366)dayofmonth[1] = 29;for (i = 1; i < month; i++)sum += dayofmonth[i - 1];int weekofday1 = (sum + 6) % 7;   // January 1st of AC 1 is Saturday.printf("month %d of year %d:\n", month, y);printf("SUN MON TUE WED THU FRI SAT\n");printf("===========================\n");int week = weekofday1;   // week implements what day is ith dayfor (i = 0; i < weekofday1; i++)printf("    ");if (month == 10 && y == 1582) {   //days from 5th to 14th were missing in this monthfor (i = 1; i < 5; i++) {week++;printf("%3d ", i);}for (i = 15; i <= 31; i++) {if (week == 6) {week = 0;printf("%3d\n", i);}else {week++;printf("%3d ", i);}}}else {for (i = 1; i <= dayofmonth[month - 1]; i++) {if (week == 6) {week = 0;printf("%3d\n", i);}else {week++;printf("%3d ", i);}}}if (week == 0)printf("\n");elseprintf("\n\n");printf("type 0 to exit, or type 1 to continue:");c = getchar();} while (c == '1');return 0;
}


http://chatgpt.dhexx.cn/article/ZLlg7cJL.shtml

相关文章

C语言编写小程序——万年历

一、杂谈 大一学了C之后一直困惑&#xff0c;C到底怎么用&#xff1f;它不像HTML那么直观&#xff0c;也没有SQL那么常用&#xff0c;更没有Java那么功能强大&#xff0c;那他为何还存在&#xff0c;并依然火热呢&#xff1f; 答案很简单&#xff1a;编程语言是一家&#xff0c…

前端:运用js制作一个万年历程序

前端&#xff1a;运用js制作一个万年历程序 1.HTML代码 首先&#xff0c;依旧是一个套路&#xff0c;先写HTML代码&#xff0c;就好比如建一座楼先建地基和楼的结构一样。 外部这个class属性值为time的div标签是为了让整个内容处于居中地位。 class属性值为head1的div标签是…

用Java写一个万年历程序

从控制台输入指定年份&#xff08;在1900年至2099年之内&#xff09;和月份&#xff0c;输出当月的日历。要求效果如下图所示 思路分析如下&#xff1a; 假设输出2020年5月份的日历。那么要求得1900年1月1日到2020年5月1日前一天的天数总和 再求总天数余7的值&#xff0c;结果…

C++编写万年历,公元后日历程序,考虑了1582年前后以及该年的特殊情况。

目录 一&#xff0c;万年历的基本要求前言&#xff1a;万年历的创建思路1.公元天数与日期1.日期输入问题2.闰年与平年的数目 3.日历的输出问题1.日数转化为星期2.日历月份开头 二&#xff0c;万年历正确性的额外补丁1.1582年闰年定义的变更解决2.1582年消失的十天 三&#xff0…

C语言 万年历 三种版本

C语言 万年历 万年历 一、第1版&#xff1a; 制作一个万年历&#xff08;阳历版&#xff09;。程序从键盘读入年份和月份&#xff0c;然后输出该年该月的月历。 【实现提示】&#xff1a; 本问题的关键是确定所求月份的第一天是星期几。如我们想确定2009年12月1日是星期几&a…

编制万年历的历程

初入编程之道的学子大都试编过万年历。万年历有二种&#xff1a;一为只有西历的月历&#xff0c;另一为有农历对照的月历或日历。编写万年历程序可以练练手&#xff0c;加深对编程语言的理解。记得我初入此道是在1994年&#xff0c;我那时刚买了486电脑&#xff0c;也刚开始有视…

显示万年历的程序(汇编语言实现,附源代码)

运行环境&#xff1a;Masm for Windows 集成实验环境 2015 一、课题内容和要求 课题内容&#xff1a; 用汇编语言编写一个有简单界面显示的日历&#xff0c;要求输入年月日后&#xff0c;将该月的完整日历显示出来&#xff0c;包括星期几&#xff0c;且每月的星期六&#xff…

c语言编写万年历程序

这个程序最核心的地方在于计算当前日期是周几&#xff0c;然后才好显示万年历&#xff0c;因为输入只知道月&#xff0c;所以默认是1号。 通过这个日期我们就可以计算总天数&#xff0c;通过总天数进行%7运算&#xff0c;就能得到周几。 通过这个周几&#xff0c;在结合这个月有…

C语言实现万年历程序

C语言实现万年历程序 #include <stdio.h>int year(int y) {if ((y%40) && (y%100!0) || y%4000)return 366;elsereturn 365; }int main() {int y;int i,j,sum0; int begin,week;int days[12]{31,28,31,30,31,30,31,31,30,31,30,31};scanf("%d",&y)…

C语言实现万年历(附代码) 小白完成的第一个C语言程序,希望大家多多关注,点赞

C语言实现万年历 前言&#xff1a;本文章向大家介绍如何使用C语言代码实现万年历使用实例&#xff0c;讲解编写万年历的方法&#xff0c;教你轻松学会写出万年历。这个小程序算是我自己写的第一个比较完整的小程序&#xff0c;算是对大一上学期学习的C语言程序设计基础的一个总…

万年日历(C语言)

C Language 万年历程序----&#xff08;1840~2110&#xff09;年 ##声明&#xff1a;此程序并非本人全原创&#xff0c;已修改其中少数内容&#xff0c;仅供小白参考&#xff0c;大佬者若言论&#xff0c;来吧&#xff0c;用点力——后续本人将更新此万年历添加更有丰富的内容…

C语言万年历程序

刚复习了C语言&#xff0c;写一个万年历程序&#xff0c;比较初级&#xff0c;见笑了。 /*Name : calendar.cAuthor : 飞翔de猪油Version : v1.0Description : 万年历程序*/#include <stdio.h> #include <stdlib.h> #include <string.h> #in…

面向对象程序设计实训——万年历

设计内容&#xff1a; 1.运用程序设计基础基本知识&#xff0c;使用C、Java或Python等面向对象程序设计语言&#xff0c;按以下要求编程实现万年历的功能&#xff1a; (1)输入任一年&#xff0c;判断该年是否为闰年&#xff1b; (2)输入年月日计算该日为星期几&#xff0c;…

Qt项目简单贪吃蛇代码

目录 第一个界面 第二个界面 第一个界面 在.pro文件里添加sql QT core gui sql 点击.ui文件添加组件 类和对象如图所示&#xff0c;右键MianWindow->改变样式表&#xff0c;在编辑样式表里添加代码改变按钮样式 QPushButton{border:2px solid #7b7b7b; //按钮…

贪吃蛇php代码下载,C语言贪吃蛇代码

C语言编写贪吃蛇源代码&#xff0c;简单易懂&#xff0c;文件为VC源代码&#xff0c;附txt代码和源代码程序。 相关软件软件大小版本说明下载地址 c语言编写贪吃蛇源代码&#xff0c;简单易懂&#xff0c;文件为VC源代码。如果你正在学习c语言&#xff0c;就来下载吧。很经典的…

Html/Javascript snake game 贪吃蛇游戏(附全部代码)

以前用pyhton 做了贪吃蛇游戏&#xff0c; 这里发表的是html/javascript 版本。难度差不多&#xff0c; 区别是python 主要用class, 而javascript 主要用function &#xff0c; 他们的功能很相似&#xff0c; 写法稍微有些不同。内容大致是&#xff1a; 1. 蛇由蛇头&#xff0…

实验二.贪吃蛇的设计

目录 一.实验内容&#xff1a; 二.贪吃蛇的代码实现 &#xff08;1&#xff09;类的声明 &#xff08;2&#xff09;初始化界面 &#xff08;3&#xff09;游戏界面 &#xff08;4&#xff09;蛇的位置 &#xff08;5&#xff09;键盘监听 &#xff08;6&#xff09;更…

Python贪吃蛇 (完整代码+详细注释+粘贴即食)

文章目录 代码运行截图笔记补充参考博客&#xff08;阿里嘎多&#xff01;&#xff09; 代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # author&#xff1a;Wangdali time:2021年1月20日16:08:44 #python实现&#xff1a;贪吃蛇游戏玩法&#xff1a;回车开始游戏&am…

k-means聚类算法及matlab实现(简单实现)

k-means简介 k-means算法也称k均值算法&#xff0c;是一种常用的聚类算法。聚类算法是研究最多、应用最广的一种无监督学习算法。   聚类试图将数据集中的样本划分为若干个通常是不相交的子集&#xff0c;每个子集称为一个“簇”。通过这样的划分&#xff0c;每个簇里的样本可…

matlab 层次聚类

MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法&#xff1a; 1.层次聚类 hierarchical clustering 2.k-means聚类 这里用最简单的实例说明以下层次聚类原理和应用发法。 层次聚类是基于距离的聚类方法&#xff0c;MATLAB中通过pdist、linkage、dendrogram、…