fortran读到的声明没有停止

时间:2017-07-04 11:38:29

标签: arrays fortran

程序不停止阅读" 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

2 个答案:

答案 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命令。

所以这是我更新的答案:

  1. 这不是家庭作业服务,我们不会为您解决问题。然后,你没有要求,所以没关系。

  2. 您的问题不是read*, ar命令。只需在其下方添加print*, ar即可轻松测试,它将打印出来。

  3. 你的问题是你的代码中有一个无限循环(实际上有几个),有些是因为你使用DO WHILE循环,其中条件永远不会在迭代中发生变化,有些因为你跳出来一个循环到另一个循环的开头,重置初始条件。

  4. 以下是您锻炼的一些提示:

    1. 为您当前正在查看的数组的索引创建单个变量。

    2. 创建两个循环,一个用于增加此索引,只要数组中的下一个值较大,一个循环,只要下一个值较小。检查您是否未将索引增加到数组范围之外。

    3. 不要从任何循环内部跳转

    4. 不要跳到任何循环中间。

    5. 在任一循环结束时,考虑一下你从阵列中学到了什么,然后从那里跳过。

    6. 确保您知道该算法最终会停止。

    7. 最后,在调试过程中使用大量print*语句对于让您了解程序实际执行的操作没有任何害处。