【问题标题】:Fortran 77 Do Loop block clarificationFortran 77 Do Loop 块说明
【发布时间】:2018-02-02 12:17:07
【问题描述】:

NUM 和 ARRAY 双精度变量,不确定 if 块将如何执行。什么时候停止?它实际上在做什么?,如果我们转到 8,那么我们是否正在退出 do 循环?

谢谢

DO 7 I = 1,28                                                   
IF (NUM - ARRAY(I)) 8,7,7                                    
7 CONTINUE                                                         
I=29                                                             
8 NUM = ARRAY(I) 
....
....
....
....

【问题讨论】:

  • 这在现代语言(例如 C)中会是什么样子?
  • DO 循环来自 1-3 行。当您在第 4 行时,您已脱离 DO 循环。
  • 如果我从第2行到第4行怎么办?什么时候满足条件?那么我不在循环中了吗?将其称为“中断”语句是否安全?

标签: fortran fortran77


【解决方案1】:

如前所述,循环中的条件是arithmetic if statement

我们知道(这在前面的答案中明确说明)如果num 小于array(i),则选择标签8,否则选择标签7。在其他答案中还指出,这些具有退出循环或循环它的效果。准确地说,我会继续。

DO 结构有一个范围。像问题中的那样的非块 DO 结构的范围包括 do 语句和 DO 终止语句(在本例中为 7 continue)之间的语句。 DO 终止语句是从构造范围内跳转的有效目标。

当跳转到 DO 终止语句时,执行仍然在构造的范围内。该终止语句被执行(在这种情况下,continue,什么都不做)并再次测试循环迭代条件。也就是说,循环循环。

从 DO 构造中,跳转到构造范围之外的语句会终止构造的执行:就像退出一样。

因此,此示例具有使用 IF 构造的等效形式(带有go tos - 请耐心等待)

DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
  GO TO 8
ELSE
  GO TO 7
END IF
7 CONTINUE
I=29
8 NUM = ARRAY(I)

现在,因为标记为7 的语句是continue 语句,我们可以这样写

DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
  GO TO 8
ELSE
  CYCLE
END IF
7 CONTINUE
I=29
8 NUM = ARRAY(I)

这仍然很丑陋(不仅仅是因为所有的大写字母)。幸运的是,我们可以让这个更漂亮。 i=29 语句将仅在循环终止且没有跳转到标记为8 的语句时执行。现在,循环索引i 具有控制I = 1,28,因此当循环自然终止时,索引已经has the value29。该分配没有任何作用(在现代 Fortran 中),因此我们可以将其删除。这给我们留下了

DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
  GO TO 8
ELSE
  CYCLE
END IF
7 CONTINUE
8 NUM = ARRAY(I)

当我们还注意到 IF 构造紧跟在循环结束之后(因此我们不需要显式循环)时,我们有

DO 7 I = 1,28
IF (NUM < ARRAY(I)) EXIT
7 CONTINUE
NUM = ARRAY(I)

或者(更好)

DO I = 1,28
  IF (NUM < ARRAY(I)) EXIT
END DO
NUM = ARRAY(I)

这个例子所做的就是找到array(1:28)中最早的元素的值,它大于num,如果没有,则为array(29)

【讨论】:

  • 这就是我无法编辑标签的原因。我确定我投票关闭为重复(有几个),但如果我失去了锤子特权,它将无法在审核队列中获得足够的选票,并且选票将消失。我们需要更多拥有金标签徽章的人。
  • 您对重复目标有什么好的建议吗?我没有看到(显然),但我仍然可以在这个问题上投票。
  • 这个stackoverflow.com/questions/11124855/… 已经是另外两个人的目标了。我现在也有一个投票,他们在无效时会得到退款。
  • 同意第二个是可能的候选人,但不是第一个。在我看来,与 do 范围的交互是重要的部分。 (我什至链接到关于定义算术 if 的问题。)其次,我认为这实际上是更好的问题,因为它明确询问了循环。
【解决方案2】:

如果:if(a) 1,2,3,则称为算术。它的意思是:如果a&lt;0 变为1,如果(a==0) 变为2,如果(a&gt;0) 变为3。

在您的代码中 if( num-array(i)

【讨论】:

    猜你喜欢
    • 2013-06-27
    • 2022-01-12
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2015-09-20
    • 2023-03-27
    • 2016-02-17
    • 2012-05-04
    相关资源
    最近更新 更多