在fortran计算一年的朱利安日

时间:2016-01-15 13:15:51

标签: fortran

我想计算一年的朱利安日(不是从公元前4713年开始!)。例如,如果它是3月3日,那么它将给出数字62如果2月有28天,如果它有29则给出63.到现在为止,我在Fortran 95中编写了以下代码,遗憾的是它给出了错误的结果。你能帮我调试吗?

program task
    !============================    
    !filename: task.f95

    implicit none  

    integer day, sum_month, i, month(12), jd, year, mon  

    month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]    

    write(6,*) "Give day"    
    read(5,*) day    
    write(6,*) "Give mon"    
    read(5,*) mon    
    write(6,*) "Give year"    
    read(5,*) year 

    sum_month = 0  

    if (mod(year,4)==0 .and. mod(year,100)/=0) then     
        do i = month(1), mon-1    
            sum_month = sum_month + month(1) + day + 1    
        end do    
    else    
        do i = month(1), mon-1    
            sum_month = sum_month + month(1) + day    
        end do    
    end if  

    write(6,*) sum_month   

end program task

1 个答案:

答案 0 :(得分:3)

此循环

do i = month(1), mon-1    
    sum_month = sum_month + month(1) + day + 1    
end do    

和另一个喜欢它的人严重受伤。每次调用它时month(1)==31mon可能介于112之间(包括在内)。因此,程序将尝试执行(例如)mon==12

do i = 31,12

根据Fortran的规则,此循环将执行0次。我几乎可以肯定你应该写:

do i = 1, mon-1
   sum_month = sum_month + month(i) ...

修复此问题,整理其余代码,您可能会在没有进一步帮助的情况下修复它。

编辑:

你的代码越来越糟!好吧,在VladimirF回滚你的最新变化之前,情况正在恶化。按他和我的建议去做。问一个关于你当前问题的新问题。

您对变量mon(用于保存用户输入的月份数)和month(即数组)之间的差异不够谨慎你用来保存一年中每个月的天数。)

这些陈述

write(6,*) "Give mon"    
read(5,*) month(i)    

将读取属于mon的值并将其放入month(i)。或者更确切地说,这是它尝试做的事情,但在代码i中的那个地方没有任何价值,并且代码试图将其写入计算机中的某个任意位置'内存 - 这就是分段错误,这是生成分段错误的好方法。别这么做!

当您的代码到达

时,您以后也会遇到问题
do i = 1, month(i)-1

回到我的答案的顶部并问自己执行此行代码时 month(i) 有什么价值?