今天的作业是通过输入一个日期,判断该日期是此年的第几天。看到这个题目,我第一时间就想到了C#的DayOfYear方法和JAVA的Getdayofyear方法。
C#实现:是不是特别简单。
DateTime tt="2020-04-17";
int days=tt.DayOfYear;
可是Fortran没有这个方法,要判断天数还是有点难度,那我们应该如何实现呢?
首先,定义一个一维数组,包含每个月的天数(先按平年处理二月天数)。
integer::dayofmonth(12)=[31,28,31,30,31,30,31,31,30,31,30,31]
Fortran中数组的下标是从1开始,这一点与C#、JAVA从0开始的不一样。
第二步,需要判断输入的年份是否为闰年。
判断闰年的方法是能被4整除同时不能被100整除。或者能被400整除。即“四年一闰,百年不闰,四百又闰”。当判断是闰年时将数组中2月的天数改为29。
dayofmonth(2)=29 !下标是2
第三步,通过输入的月份将数组中前几个月的天数汇总,再加上输入的日子。
比如:输入的是“20200417”,先判断2020是否闰年,结果是闰年,则将数组中2月份天数改为29。输入的是04月,则将1月、2月、3月天数汇总得到91,再加上输入的日子17,最后结果是108,即得到结果:输入日期是该年的108天。
完整代码如下:
program test25 implicit none character(len=8)::rq integer::yy,mm,dd integer::days=0 integer::dayofmonth(12)=[31,28,31,30,31,30,31,31,30,31,30,31] !定义每月天数的数组 write(*,*)"输入一个日期(YYYYMMDD):" read(*,*)rq ! 取输入年,月,日 read(rq(1:4),*)yy read(rq(5:6),*)mm read(rq(7:8),*)dd if(((MOD(yy,4)==0).and.(MOD(yy,100)/=0)).or.(mod(yy,400)==0)) then !判断是否为闰年 dayofmonth(2)=29 write(*,*)"此年是闰年!" else dayofmonth(2)=28 write(*,*)"此年是平年!" end if ! 输入日期的前几个月日数加本月日期 days=sum(dayofmonth(1:mm-1))+dd !数组的前几个月天数加上本月天数 write(*,100)days100 format("此日期是当年的:",I3,"天") pause stopend program test25
运行代码,结果如下图。
Fortran语言还是挺好玩的,虽然不是面向对象,可理解起来还是很容易。虽然很小众,但速度和效率还是很强大。尤其是对数值计算的功能较强,值得学生和科研人员好好学习。
Fortran我也是初学,好久不写代码了,欢迎朋友们指正。