题目要求

设计程序,输入若干日最高气温,判断最高气温及其对应日期,计算一周平均最高气温。

给出的数据组如下:

日期

3月23日

3月24日

3月25日

3月26日

3月27日

3月28日

3月29日

最高气温

16.0℃

17.0℃

17.0℃

18.0℃

16.0℃

22.0℃

24.0℃

题设分析

首先观察题目,发现需要判断“最高”,则需要判断类代码块;需要计算“平均”,则需要循环类代码块。

由课上所学知识,我们可以很轻易地写出判断最高温度与计算周平均最高气温的有关代码,我们把主要的代码块先写出来:

real tempsum,tempmax,temp
integer i
tempmax=0
tempsum=0

!input the data, count the sum, and find the max data.
do i=1,7,1
	read *,temp
	if (temp.ge.tempmax) tempmax=temp		!使用逻辑判断语句进行判断,以减少代码量,在这里没有用>=的原因是我环境内的Fortran不支持这些比较符号,只可以用'.le.'、'.gt.'、'.or.'、'.ne.'等判断词来进行逻辑代码的写作。
	tempsum=tempsum+temp					!求和常用操作,A=A+a
end do										!fortran的语言格式有些许类似visual basic语言,需要有一个标志循环/判断结束的标识符🤔,不像C一样,以大括号{}来标志循环体结构或者判断结构

print *,'The max tempreture is ',tempmax,'℃. The average tempreture is ',tempsum/(i-1),'℃.'

利用循环输入,及变量的有关特性让我们不用定义过多变量即可解决相关问题。唯一麻烦的地方是需要重复手动输入,这个问题可以在日后学习文件相关知识的过程中得到较好的解决。

接下来的问题就是如何在查找最大值的过程中同时查找最大值所处的定位。这里我们需要确定两种情况:第一种是该组数据中只有一个最大值;第二种是该组数据中存在至少两个最大值。

如果是第一种的情况,仅存在一个最大值,那么我们可以直接利用循环变量进行输出。而如果存在多个最大值,我们则需要对最大值所处的位置(即出现最大值的日期)进行存储,之后依次输出。

对于第一种情况,我们可以将课上的代码进行如下的修改:

do i=1,7,1
	read *,temp
		if (temp.ge.tempmax) then
		tempmax=temp
		d=i						!声明过d为整型变量之后,记录最大值出现的位置,输出时再加上半条语句就好。
	end if
	tempsum=tempsum+temp
end do

此时,我们的变量 SVD气象 python_SVD气象 python 为第 SVD气象 python_SVD气象 python

而对于第二种情况,我们需要在第一次遍历的基础上再进行一次遍历,我们大可以通过再次输入数据的方式进行天数的查找。于是我们写出了下面一段代码:

do i=1,7,1
	read *,temp
		if (temp.ge.tempmax) then
		tempmax=temp
	end if
	tempsum=tempsum+temp
end do

do i=1,7
	read *,temp
	if (temp=tempmax) print *,i+22
end do

通过这样的循环我们可以解决找到最大值之后再进行天数的查找。但是我们在这里输入了两次数据,这样我们的工作量double!而且如果后续出现了我们需要利用某一天的数据进行处理的情况,我们必须找到原始数据后输入,之后再进行下一步的处理,这样是非常影响工作量的。所以我们是否可以找到一种方法,可以通过只输入一次数据就可以处理多次需求呢?

这就说明我们需要对输入的数据进行存储,存储后的数据将存放在内存中,随时供我们调用。

通过前面的学习,我们可以知道变量可以存储数据。因此可以通过创建一系列变量对输入的数据进行存储,或者我们可以通过创建数组的方式来进行数据的存储。

下面进行数组的定义与数据的存储:

integer parameter row=2
integer parameter col=7

real d(col,row)						!与C定义数组的方式非常之类似
integer i,j

print *,'请先输入日期(格式:3.27),再输入气温数据:'

do j=1,2
	do i=1,7
		read *,d(i,j)
	end do
end do
!读入数据

然后根据上课所初步写出的程序,我们可以知道接下来是最大值的寻找以及平均值的计算,此时将行固定为第二行(即存放数据为气温的行),即查找时我们只需要写一层循环:

do i=1,7
	if (d(i,2).ge.tempmax) tempmax=d(i,2)
	tempsum=tempsum+d(i,2)
end do
tempave=tempsum/7

通过这一段代码,我们可以实现找到最大值,并求出所有气温的平均值。在找到最大值之后我们对数据进行二次遍历,找到最高值所处的位置,即与最高气温相同列的第一行的值,于是我们的代码可以这样书写:

print *,'发生最高气温对应日期为:'

do i=1,7
	if (d(i,2).eq.tempmax)
	print *,d(i,1)
end do

至此,与题设相关的代码已经完成了全部书写,从数据的输入、存储、比较、查找再到输出,整个过程看起来 非(guo) 常(yu) 简(can) 单(bao)。实在没有想到其他方法可以输出最大值的位置的方法了。

对代码进行简单整理与编译运行,得到下面的结果:

SVD气象 python_SVD气象 python_03


注意在代码书写的过程中,d(i,j)指的是存放在第 SVD气象 python_数组_04 列第 SVD气象 python_fortran_05 行的数据,而并非像C一样是先行后列的存储方式。如果使用C来进行书写,则应该是d(j,i)

代码书写的过程仅供参考,如有其他写法,可以后台留言或者评论。

感谢各路大佬🙇