我正在编写这个小程序,它将成绩存储在数组中,然后取平均值。该计划应该接受多达10个等级,并停止,只接受成绩为>0和
program Average
implicit none
character(len = 50) f_name, l_name
integer i, j, amtOfGrades
real grade, arraySum, avg
Real, Dimension(10)::a
do i = 1, 10
if(.not. (j .LE. 100 .AND. j .GE. 0)) then
write(*,*)'Enter grade: '
read(*,*)a(i)
j = a(i)
arraySum = sum(a)
avg = arraySum/10
else
avg = arraySum/(i-1)
end if
end do
我遇到的问题是嵌套循环部分。我不能得到我需要一起工作的两个条件,这两个条件只有10个等级(DO的目的)和只接受0-100范围内的等级(DO WHILE的目的)。
您需要在输入最多10个等级之前发出exit
语句退出循环:
program Console1
use, intrinsic :: iso_fortran_env
implicit none
! Variables
integer, parameter :: maxcount = 10
real :: a(maxcount), ave
integer :: i, count
count = 0
do i = 1, maxcount
write(*,*) 'Enter grade: '
read(*,*) a(i)
if( a(i)<=0.0 .or. a(i)>=100.0) then
exit
end if
count = count + 1
end do
ave = sum(a)/count
write(*,*) 'The average is: ', ave
end program Console1
如果你查看帮助,你会看到
EXIT语句导致DO循环或命名构造的执行终止。
如何做到这一点将取决于如果输入等级不是0 <= grade <= 100
,您想要做什么。这样的输入是否计入10个等级的限制?
如果一个错误的输入确实被计入限制,那么你只需要从用户那里获得10次read
,但你最终可能会得到少于10个等级的总数。因此,你需要跟踪已经输入了多少年级。
这个的代码可能看起来像:
program average
implicit none
integer :: i, amtOfGrades
real :: grade, arraySum, avg
real, dimension(10) :: a
amtOfGrades = 0
do i=1,10
write(*,*) 'Enter grade: '
read(*,*) grade
if (0<=grade .and. grade<=100) then
amtOfGrades = amtOfGrades + 1
array(amtOfGrades) = grade
endif
end do
arraySum = sum(a(:amtOfGrades))
avg = arraySum/amtOfGrades
end program
如果错误的输入不计入限制,那么您将始终以10个等级结束,但是您可能必须从用户那里获得无限次read
。
这个的代码可能看起来像:
program average
implicit none
integer :: i
real :: grade, arraySum, avg
real, dimension(10) :: a
do i=1,10
do
write(*,*) 'Enter grade: '
read(*,*) grade
if (0<=grade .and. grade<=100) then
array(i) = grade
exit
endif
enddo
end do
arraySum = sum(a)
avg = arraySum/10
end program