wxy 发表于 2017-2-3 18:40:16

关于单步调试

本帖最后由 wxy 于 2017-2-3 21:17 编辑

第二张图是代码运行结果和手动运算的对比,发现第一个年份和从第一个闰年开始每四年会出现一次运算错误,不知道哪出了问题。图一是codeblocks的watch窗口,请问它的作用是不是监视调试时的参数变化,然后就是在我的代码中k=1,30 这里面k=-2是不是说明有问题,第一次做单步调试,还不太会Module typedef
Type tdd
    Integer :: stat = 0
    Real :: tmax, tmin, total, average
End Type tdd
End Module typedef

Integer Function daysinyear(year, mon, day)
Integer :: year, mon, day
Integer :: daysinmonth(12) = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]
If (((mod(year,4)==0) .And. (mod(year,100)/=0)) .Or. (mod(year,400)==0)) Then
    daysinmonth(2) = 29
Else
    daysinmonth(2) = 28
End If
daysinyear = sum(daysinmonth(:mon-1)) + day
End Function daysinyear

Program main
Use typedef
Implicit None
Real :: rain
Type (tdd), Allocatable :: t(:) ! 保存气温值
Type (tdd) :: total !日均温累加
Integer i, m, dy, start, end, year, mon, day, daysinyear, k
Character (Len=20) :: line, filename = 'CN174653 (12)'

Open (8, File='result.txt')


!初始日期转换为一年的第几天
Write (*, *) 'mon:'
Read (*, *) mon
Write (*, *) 'day:'
Read (*, *) day
Print *, daysinyear(year, mon, day)
start = daysinyear(year, mon, day)
!结束日期转化为一年的第几天

Write (*, *) 'mon:'
Read (*, *) mon
Write (*, *) 'day:'
Read (*, *) day

Print *, daysinyear(year, mon, day)
end = daysinyear(year, mon, day)
!年份与文件年份对应
year = 1979
!批量处理
Do k = 1, 30
    year=year+1
!内部文件读写, 将 filename 第 8-11 字符换为相应年份
    Write (filename(11:12), '(i2)') k
    Open (7, File=filename)
!获取行数
    i = 0
    Do
      Read (7, *, End=100) line
      i = i + 1
    End Do
    100 m = i - 1 !//跳过第一行
    Rewind (7)

    Allocate (t(m))
    Read (7, *)
!积温计算
    Do i = 1, m
      Read (7, *) dy, t(i)%tmax, t(i)%tmin, rain !读入数据
      t(i)%average = (t(i)%tmax+t(i)%tmin)/2 !日均温
    End Do
    total%average = 0

!
    Do i = start, end
      total%average = total%average + t(i)%average !日均温累加=积温
    End Do
    Write (8, *) year,total%average ! 结果写入另一个文件

    Deallocate (t)
    Close (7)

End Do
Close (8)
End Program main


wxy 发表于 2017-2-4 16:47:55

已经弄好了:-loveliness:
页: [1]
查看完整版本: 关于单步调试