程序不停止阅读" ar"。请帮忙。即使在分配之后它也有一定数量的元素。可能是什么原因?有什么可能错过的吗?
program summer_a39
implicit none
integer:: n, i, l, k
integer, allocatable, dimension(:)::ar
print*, 'Enter size of array:'
read*, n
allocate (ar(n))
print*, 'Enter values:'
read*, ar
l=1
3 do i=l,n-1
if (l==n) then
goto 4
end if
if (ar(i)<=ar(i+1)) then
goto 1
else
goto 2
end if
end do
1 do i=l,n-1
do while (ar(i)<=ar(i+1))
k=k+1
end do
l=k
end do
print*, 'Increases to', l
goto 3
2 do i=l,n
do while (ar(i)>=ar(i+1))
k=k+1
end do
l=k
end do
print*, 'Decreases to', l
goto 3
4 print*, 'The End'
deallocate(ar)
end program
答案 0 :(得分:0)
该代码完全没有意义。
我不想这么说,但你仍然需要做很多的学习和理解。
首先:停止使用GOTO 。它打破了代码流并让它变得一团糟。 1)
其次:即使没有检查,我也确信read
声明并不是你的程序挂起的原因。它挂在各种循环之间。
即使没有goto
语句,单独使用此代码段也是让程序挂起的可靠方法:
do while (ar(i)>=ar(i+1))
k=k+1
end do
只要ar(i)
大于或等于ar(i+1)
,此循环就会不断重复 - 但在循环体中,两个值都不会更改(仅k
,而是{{ 1}}不是条件的一部分)。因此,如果条件为真一次,它将保持永远,并且循环永远不会终止。
然后你继续跳回到循环的开头。每次执行此操作时,循环将从头开始。再说一遍,你永远不会得出结论。
我打算展示如何使用子程序来做我认为你想做的事情,但我认为它更好。您需要更多时间来了解正在发生的事情,我建议您找一些教授编程的专用资源。 它不一定是特定于Fortran的,任何过程语言的任何教程都将帮助您理解程序流程,这是分析这个混乱所需要的。
1)一个优秀的程序员可能知道何时使用k
。你还不是一个优秀的程序员。
答案 1 :(得分:0)
在您对我之前的回答发表评论后,我对您的情况有了更好的了解。
这是我到目前为止所理解的:
您可以参加Fortran培训/课程等等。
练习是创建一个程序,将任意长度的数组作为输入,然后打印出该数组中每个单调序列的最终值。例如,如果输入为4 3 7 2 1 4 6 3 5 10
,则输出应为:
Starts with 4
Decreases to 3
Increases to 7
Decreases to 1
Increases to 6
Decreases to 3
Increases to 10
The end
部分练习是您应该使用GOTO
命令。
所以这是我更新的答案:
这不是家庭作业服务,我们不会为您解决问题。然后,你没有要求,所以没关系。
您的问题不是read*, ar
命令。只需在其下方添加print*, ar
即可轻松测试,它将打印出来。
你的问题是你的代码中有一个无限循环(实际上有几个),有些是因为你使用DO WHILE
循环,其中条件永远不会在迭代中发生变化,有些因为你跳出来一个循环到另一个循环的开头,重置初始条件。
以下是您锻炼的一些提示:
为您当前正在查看的数组的索引创建单个变量。
创建两个循环,一个用于增加此索引,只要数组中的下一个值较大,一个循环,只要下一个值较小。检查您是否未将索引增加到数组范围之外。
不要从任何循环内部跳转
不要跳到任何循环中间。
在任一循环结束时,考虑一下你从阵列中学到了什么,然后从那里跳过。
确保您知道该算法最终会停止。
最后,在调试过程中使用大量print*
语句对于让您了解程序实际执行的操作没有任何害处。