重新启动do循环

时间:2014-04-01 09:43:52

标签: for-loop fortran fortran90 restart

我有一个从1到n的do循环,它包含一个if语句。 如果满足要求,则某些参数(包括n)已更改。 所以我想再次从i = 1开始整个do循环,直到i = n,直到不再满足要求并且我达到n。 但我不知道如何在fortran中编程。 因为在当前情况下,在if语句之后do循环继续,如果if语句满足另一个i,它将覆盖先前的数据。如果每次满足要求时do-loop都会重新启动,则不再是这种情况。 有人知道如何在fortran 90中编程吗?

所以有一个数组包含一列数字。如果满足if语句,我想在列中插入一个额外的数字。因此,在该点之前的所有数字应保持在原位,此额外点之后的所有点应向下移动一个,然后在创建的自由点中,额外的点出现。一切正常。 但是,如果if语句满足两次,则必须添加两个点,但是在必须添加第二个点时,它将覆盖添加第一个点的数据。因此,如果可以从第一次从结果开始从头开始完全重启if-loop,包括额外的点,它将起作用。 所以它应该从i = 1开始然后继续运行直到满足if语句,执行if语句,再次从i = 1开始,然后重复这个直到i = n(每次点数增加时增加加) 我不知道代码是如何相关的,但特别适合你: prevnumbers是起始数字,它遵循一些导致数字的步骤。如果那么数字不符合if语句,则必须更改原始数字(prevnumbers),然后再次执行步骤。

do i = 1,n
    if (numbers(i,1) >= x) then
    !this part will transfer the previous numbers to the new numbers until the new point
        do j=1,i
            numbers(j,1)=prevnumbers(j,1)
        end do
        !This part will move the numbers after the new number one ahead so a free spot is created
        do j=n,i,-1
            numbers(j+1,1)=prevnumbers(j,1)
        end do
        !this part adds the new number and increases n by 1.
        numbers(i+1,1)=(prevnumbers(i,1)+prevnumbers(i+1,1))/2
        n=n+1
    end if
end do

2 个答案:

答案 0 :(得分:2)

如果您事先不知道确切的迭代次数,那么您可能不应该首先使用带索引的do循环。未经测试。

i = 0
do
   i = i + 1
   if (i>n) exit

    if (numbers(i,1) >= x) then
    !this part will transfer the previous numbers to the new numbers until the new point
        do j=1,i
            numbers(j,1)=prevnumbers(j,1)
        end do
        !This part will move the numbers after the new number one ahead so a free spot is created
        do j=n,i,-1
            numbers(j+1,1)=prevnumbers(j,1)
        end do
        !this part adds the new number and increases n by 1.
        numbers(i+1,1)=(prevnumbers(i,1)+prevnumbers(i+1,1))/2
        n=n+1
    end if
end do

答案 1 :(得分:1)

for循环不适合您的问题,请使用do-while循环。

i=1
do while(i<=n)
  ! if the condition is met
  ! do all the stuff
  ! set the new value of n
  ! set i to 1 to restart the loop
end do

确保你不会永远循环,这意味着在某些时候我从1变为n而没有满足条件。