现在有1960到2008年每一天的温度数据,要求求出每个月的平均温度,用Fortran写出这段代码
时间: 2024-03-14 20:47:28 浏览: 72
下面是Fortran的代码示例,可以读取每天的温度数据,并计算每个月的平均温度:
```
program calculate_monthly_average_temperature
implicit none
integer :: i, year, month, day, ndays_in_month, month_start_index, month_end_index
real :: temperature, monthly_average
! 数据文件名
character(len=100) :: filename = "temperature_data.txt"
! 打开数据文件
open(10, file=filename, status='old', action='read')
! 循环读取每一行数据
do i=1, 14245
read(10, *) year, month, day, temperature
! 计算当前月份的天数
call days_in_month(month, year, ndays_in_month)
! 计算当前月份的起始和结束位置
month_start_index = (month - 1) * ndays_in_month + 1
month_end_index = month_start_index + ndays_in_month - 1
! 累加当前月份的温度值
monthly_average = 0.0
if (i >= month_start_index .and. i <= month_end_index) then
monthly_average = monthly_average + temperature
endif
! 如果已经到达当前月份的最后一天,则计算当前月份的平均温度
if (i == month_end_index) then
monthly_average = monthly_average / ndays_in_month
write(*, '(A,I2,A,I4,A,F6.2)') "Month ", month, ", ", year, ": average temperature = ", monthly_average
endif
enddo
! 关闭数据文件
close(10)
contains
! 计算指定年份和月份的天数
subroutine days_in_month(month, year, ndays)
implicit none
integer, intent(in) :: month, year
integer, intent(out) :: ndays
ndays = 31
if (month == 2) then
if (mod(year, 4) == 0 .and. (mod(year, 100) /= 0 .or. mod(year, 400) == 0)) then
ndays = 29
else
ndays = 28
endif
else if (month == 4 .or. month == 6 .or. month == 9 .or. month == 11) then
ndays = 30
endif
end subroutine days_in_month
end program calculate_monthly_average_temperature
```
假设数据文件中的每一行数据格式为:年份 月份 日份 温度值,共计14245行数据。程序中使用了一个子程序`days_in_month`,用于计算指定年份和月份的天数,从而确定每个月份的起始和结束位置。程序依次读取每一行数据,并根据当前月份的起始和结束位置,累加当前月份的温度值。如果已经到达当前月份的最后一天,则计算当前月份的平均温度,并输出结果。
阅读全文