循环结构2

例题1  循环输入一周日最高气温,判断最高气温,并计算一周平均最高气温。求出这几天的哪一天的气温最高?2014年3月23日-29日南京日最高气温如下:16.0 17.0 17.0 18.0 16.0 22.0 24.0 (单位:℃)

program main 
integer i,j,ri
real t,tmax,tave,sum
real::wendu(7)
tmax=0.0
sum=0.0
do i=1,7
   read *,wendu(i)
   sum=sum+wendu(i)
   if(wendu(i)>=tmax) then
   tmax=wendu(i)
   j=i
   end if
end do
tave=sum/7.0
ri=23+j-1
print*,'tmax=',tmax
print*,'tave=',tave
write(*,200) '最高气温是第', j,''
write(*,200) '最高气温是3月', ri,''
200 format(A17,I2,A5)
100 format(A20,I2,A6)
end

分析:上述j只能保留最后一次i的值,不能保留所有i的值,所以要想完成拓展例一,就要对程序进行改进。

拓展例一:例题1  循环输入一周日最高气温,判断最高气温,并计算一周平均最高气温。求出这几天的哪一天的气温最高?如果一周有多天温度一样,都是最高,那应该怎么办?2014年3月23日-29日南京日最高气温如下:23.0 31.0 25.0 31.0 24.0 31.0 27.0 (单位:℃)

 

方法一:
program main integer i,j real jishu,ri real t,tmax,tave,sum real::wendu(
7) tmax=0.0 sum=0.0 m=1 do i=1,7 read *,wendu(i) sum=sum+wendu(i) if(wendu(i)>=tmax) then tmax=wendu(i) end if end do do i=1,7 if(tmax==wendu(i)) then jishu(m)=i m=m+1 end if end do do j=1,m-1 ri(j)=23+jishu(j)-1 end do print *,'tmax=',tmax print *,'tave=',tave write(*,*) '最高气温是:' do j=1,m-1 write(*,100) '',jishu(j),'' end do write(*,*) '最高气温的日期是:' do j=1,m-1 write(*,200) '3月',ri(j),'' end do 100 format(A10,I3,A5) 200 format(A20,I3,A6) end
(代码有误,记得修改)

 

方法二:
program ex0309
real t(7),tmax,sum,tave
integer i,m
tmax=0.0;sum=0.0;m=1
do i=1,7
 read *,t(i)
 sum=t(i)+sum
 if(t(i)>=tmax) then
 tmax=t(i)
 m=i
 end if
 end do
 tave=sum/7.0
 print*,'tmax=',tmax
 print*,'气温最高日有:'
 do i=1,7
 if(t(i)==tmax) write(*,"(1X,'3月',I2,'日')") i+22
 end do
 print*,'tave=',tave
 end

例2 求同一条经线上,相同格点的距离

PROGRAM MAIN

IMPLICIT NONE

INTEGER ::i

REAL ::r=6371,delta,dy,pi

PARAMETER(pi=3.14159)

delta=pi/180

DO i=0,180  !i代表经度

dy=r*1*delta

PRINT*,i,dy,'km'

END DO

END

 

例4 根据所给 5 个气象标准站的纬度、经度数据,利用顺序结构设计、循环结 构设计和选择结构设计的知识,编写程序判断其是否位于江淮地区(109˚E 以东, 28˚~34˚N)的站点。要求如下:

(1)站号需说明为 8 位字符型,因为在 GrADS 软件绘图中站点数据有一定的 书写规则;

(2)表控输入气象标准站站号及其纬度、经度数据;

(3)在屏幕上输出站点号和是否位于江淮地区的判断信息。

我的程序源码:

PROGRAM main

IMPLICIT NONE

INTEGER I

REAL N,E

CHARACTER(LEN=8) str

PRINT*,'请输入经度 纬度'

DO I=1,5

READ*,N,E

IF(I==1) str='57865'

IF(I==2) str='58626'

IF(I==3) str='57328'

IF(I==4) str='58251'

IF(I==5) str='54714'

IF(E>109)THEN

SELECT CASE(INT(N))

CASE(28:34)

PRINT*,str,'属于江淮地区'

CASE DEFAULT

PRINT*,str,'不属于江淮地区'

END SELECT

ELSE

PRINT*,str,'不属于江淮地区'

END IF

END DO

END

我的运行截图:

标准答案:

program main
integer,parameter::ist=5
real lat,lon
character*8 id
integer i
do i=1,ist
write(*,"('输入站点的站号、纬度和经度:',\)")
read(*,*)id,lat,lon
if(lon>109.0)then
if(lat>=28.0.and.lat<=34.0)then
write(*,*)id,'站位于江淮地区' else
write(*,*)id,'站不位于江淮地区' endif
else
write(*,*)id,'站不位于江淮地区' endif
enddo
End

标准运行截图:

 

posted @ 2020-04-21 22:17  李欣玲  阅读(413)  评论(0编辑  收藏  举报