- 积分
- 695
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2024-1-26
- 最后登录
- 1970-1-1
|
发表于 2025-6-10 21:22:59
|
显示全部楼层
期末复习Fortran,翻到这篇帖子,正好拿来练手。放在这里请大家指导。
!有这样一个数据,从1979年01月01日到2011年12月31日的资料,
!输出其中某个月份的极大值和极小值,并输出这个极值所在位置(即年,月,日)。
!大致思路是:1.需要判断这一年是否是闰年;2.先找出x年每一个月最大值和最小值;3.对每一年的月份作比较
program z1
implicit none
integer,parameter :: syr = 1979, eyr = 2011, nyr = 33
integer :: i,j,k,y_min,y_max,yr_flag
real :: X(syr:eyr,12,31), X_min(syr:eyr,12), X_max(syr:eyr,12), min, max
open(10,file = "E:\FORTRANLAB\zizuo\test_data.txt",form = 'formatted')
open(20,file = "E:\FORTRANLAB\zizuo\output_data.txt",form = 'formatted')
!数据读入
do i = syr,eyr
call leap_normal(i,yr_flag)
do j = 1,12
if (j==1 .or. j==3 .or. j==5 .or. j==7 .or. j==8 .or. j==10 .or. j==12) then
read(10,*)(X(i,j,k),k = 1,31)
X_min(i,j) = minval(X(i,j,:))
X_max(i,j) = maxval(X(i,j,:))
elseif (j==4 .or. j==6 .or. j==9 .or. j==11) then
read(10,*)(X(i,j,k),k = 1,30)
X_min(i,j) = minval(X(i,j,1:30))
X_max(i,j) = maxval(X(i,j,1:30))
else
if (yr_flag == 1) then
read(10,*)(X(i,j,k),k = 1,29)
X_min(i,j) = minval(X(i,j,1:29))
X_max(i,j) = maxval(X(i,j,1:29))
else
read(10,*)(X(i,j,k),k = 1,28)
X_min(i,j) = minval(X(i,j,1:28))
X_max(i,j) = maxval(X(i,j,1:28))
end if
end if
end do
end do
close(10)
!选取极值
!do i = 1,12
! write(20,'(I2,A10,F5.2)')i,'月最大值为',maxval(X(:,i,:))
! write(20,'(I2,A10,F5.2)')i,'月最小值为',minval(X_min(:,i))
!end do
!close(20)
!!遍历寻找极值
do i = 1,12
min = 999
max = 0
do j = syr,eyr
if (min > X_min(j,i)) then
min = X_min(j,i)
y_min = j
end if
if (max < X_max(j,i)) then
max = X_max(j,i)
y_max = j
end if
end do
write(20,'(I1,A10,f5.2,A3,I4,A2)')i,'月最小值为',min,',在',y_min,'年'
write(20,'(I1,A10,f5.2,A3,I4,A2)')i,'月最大值为',max,',在',y_max,'年'
end do
close(20)
end
!判断是否是闰年,是,则让flag=1
subroutine leap_normal(a,a_flag)
implicit none
integer :: a,a_flag
if ((mod(a,4)==0 .and. mod(a,100)/=0) .or. (mod(a,400)==0)) then
a_flag = 1
else
a_flag = 0
end if
end
|
|