基于MATLAB的万年历计算
测绘工程专业2004级9班
摘要:运用MATLAB编程实现1936—2032年农历与公历间的相互转换,并求当日是星期几。
关键词:万年历 公历转化为农历 农历转化为公历 求当天是星期几
1. 概述:知道公历年月日求农历日期,知道农历年月日求公历日期,并求当日是星期几。
2. 相关知识及原理:
公历:公历是现在国际通用的历法,又称格列历,通称阳历。公历将一年分为十二个月,其中一、三、五、七、八、十、十二月有31天,俗称“大月”;四、六、九、十一月有30天;平年二月有28天,闰年二月有29天,这样公历闰年一年有366天,平年有365天。
公历闰年:若一年年数不能被4整除,或能被100整除但不能被400整除,则称这一年为平年,否则为闰年。
农历:农历是基于对地球公转和月相变化的观测的。我国现采用的农历结合了阳历与阴历(伊斯兰历)的记年方法:一年有十二个月,其中6个大月(30天),6个小月(29天),一个农历年有354天。
农历闰月:为了平衡公里年与农历年的天数差别,农历采用在适当时候设立闰月的方法,一般三年左右设一闰月,闰月可以是大月,也可以是小月。具体设置原则由节气而定,方法较为复杂。
公历与农历间的转换:公历是纯数学的记年法,而农历是基于观测结果之上的。两者见的转换比较复杂,无法用简单的数学公式表示。因此,这里采用的方法是首先查得1936年至2032年相关的资料,包括:该年农历大年初一到公历元旦的天数、该年农历各月的天数、该年农历有无闰月以及在何处闰月。这样在公历化为农历时,只需算得改日距该年农历大年初一的天数,对应该年农历各月的天数,即可得到农历的月份,及该日在该农历月是第几天;在农历化为公历时,同样,需算得该日距该年元旦的天数,通过类似转化,即可求得公历日期。
求星期数:已知公历求星期数时,计算出改日距一特定日期的天数,则该日星期数=特定日期星期数+距离天数除以7的余数;已知农历时,只需将农历转换为公历,再由公历日期求星期数即可。
如果让一个人反复做一件相同或相似的事情,他会感到厌烦与疲倦,还容易出错。计算机天然具备替代人类做重复工作的优势。Matlab 与其他程序语言一样,主要采用两种方式实现循环操作。
写一个求 1 至给定的整数 n 的和的例子来说明 for 循环的用法。
在这段代码中,先从用户那里获得 n 的值,然后从 1 至 n 逐个取值加到 sum 上。最终得到的 sum 值就是我们要求的值。
for 后面紧跟着一个表达式i = 1:n. 前面说过 : 的用法,显然
= 右边的值是一个 1 到 n 的矩阵。
for 语句后面紧跟着一个缩进了的语句,这个语句部分,我们常把它称为循环体。这里面循环体只有一个语句,事实上,循环体可以有多个语句。
整个的 for 循环语句以end结束。
以n = 10为例,这个循环过程就是从矩阵[1,2,3,4,5,6,7,8,9,10]中依次取值赋给变量i, 然后按顺序执行循环体中的语句,在这个例子中,就是执行sum = sum + i. 执行到矩阵中的最后一个值,for 循环就结束。
一点编程经验经验都没有的同学可能理解这些程序稍有点困难,可以拿张纸,将程序每一步的执行结果都写出来。
这里 i 值不必须要用在循环体中,也可以作为计数,用来重复循环体中语句特定次数。比如下面的例子:
for 循环还可以使用 break 结束循环,也可以使用continue 结束当前循环,进入下一次循环。取 n = 10,把刚才那个程序改一下:
在这个程序里,用 if 语句判断 i 的值是不是 3 ,如果是 3 则跳过循环体中后面的语句,进入下一次循环,也就是取 i 为4,并继续执行循环体中的语句。
如果 i 的值是 7 ,则退出循环。
请注意,这里跳出当前循环体中的语句,进入下一次循环,用的是 continue. 而退出整个的循环过程,用的是break. 这也是continue与break的区别。
while 循环是说当满足一个条件就一直执行某些动作。我们把上面的例子用 while 循环改写一下。
在这段代码里面,i 的初始值是 1,只要 i 的值小于等于 n 的值,就一直执行 sum = sum + i的动作。为了保证 i 值的同步变化,需要在做完sum = sum + i动作后,让 i 的值也同步增加1。
其他的与 for 循环类似,不再赘述。
欢迎阅读 实验二 MATLAB程序设计 一、 实验目的 掌握利用 if 语句实现选择结构的方法。 掌握利用 switch 语句实现多分支选择结构的方法。 掌握利用 for 语句实现循环结构的方法。 掌握利用 while 语句实现循环结构的方法。 掌握 MATLAB函数的编写及调试方法。 二、 实验的设备及条件 计算机一台(带有 MATLAB7.0以上的软件环境)。 文件的编写: 启动 的根的函数(这个方程不一定为一元二次方程,因 a、b、c 的 不同取值而定) ,这里应根据 a、b、c 的不同取值分别处理, 有输入参数提示, 当 a 0,b 0,c ~ 0 时应提示“为恒不等式 ! ”。并输入几组典型值加以检验。 (提示:提示输入使用 input 函数) 输入一个百分制成绩,要求输出成绩等级 A+、 A、 B、 C、D、E。其中 100 分为 A+,90 分~ 99 分为 A, 80 分~ 89 分为 B,70 分~ 79 分为 C,60 分~ 69 分为 D,60 分以下为 E。 要求:( 1)用 switch 语句实现。 (2)输入百分制成绩后要判断该成绩的合理性,对不合理的成绩应输出出错信息。(提示:注意单元矩阵的用法) 3. 数论中一个有趣的题目:任意一个正整数,若为偶数,则用 2 除之,若为奇数,则与 3 相乘再加上 1000、 10000 时,结果 2 2 2 3 2 n 2 6 1 是多少? 思考题: 有一分数序列: 编写一段程序,求前 16 项的和。 四、实验报告要求(包含预习报告要求和最终报告要求) 实验名称 实验目的 3. 实验设备及条件 预习报告 要求 4. 实验内容及要求 最终报告 5. 实验程序设计 要求 指程序代码。 实验结果及结果分析 实验结果要求必须客观 , 有数据的可以记录数据,没有数据的简单描述实验现象。结果分析是 对实验结果的理论评判。 实验中出现的问题及解决方法 思考题的回答 四、 实验报告的提交方式 Word 文档,命名方式 :实验号 _你的学号 _姓名 !!! 例如本次实验:实验一 __张三 .doc (信息 101 提交报告邮箱 ): E_mail: (网络工程 101 提交作业邮箱 ):E_mail: M(注意网络班的 M 是大写的 ) 下一次课前提交 ,过期不收 ! 五、 参考文献 参考教材和 Matlab 帮助文件。 实验名称 MATLAB程序设计 欢迎阅读 欢迎阅读 实验目的 掌握利用 if 语句实现选择结构的方法。 掌握利用 switch 语句实现多分支选择结构的方法。 掌握利用 for 语句实现循环结构的方法。 掌握利用 while 语句实现循环结构的方法。 掌握 MATLAB函数的编写及调试方法。 实验设备及条件 计算机一台(带有 MATLAB7.0以上的软件环境)。 实验内