2017-08-24 223 views
1

NUM和ARRAY都是雙精度變量,不知道if塊將如何執行。什麼時候會停止?它究竟在做什麼?如果我們到8,那麼我們是否退出do循環?Fortran 77 Do Loop塊說明

感謝

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

這看起來像現代語言,例如C? – LionsFan

+0

DO循環來自1-3行。當你在第四行時,你離開DO循環。 – gbdcool

+0

如果我從第2行到第4行怎麼辦?當條件滿足時?那麼我走出了循環?稱這是'休息'聲明是否安全? – LionsFan

回答

1

如前所述,循環中的條件是arithmetic if statement

我們知道(而這明確在此以前的答案說明),如果num小於array(i)標籤8選擇,否則標籤7選擇。在另外一個答案中也指出,這些都有退出循環或循環的效果。準確地說,我會繼續。

DO結構有一個範圍。像問題中那樣的非塊DO構造具有包括do語句和DO終止語句(在這種情況下爲7 continue)之間的語句的範圍。 DO終止聲明是構造範圍內跳轉的有效目標。

當跳轉到DO終止語句時,執行仍在構造的範圍內。該終止語句被執行(在這種情況下,continue,什麼都不做)並且循環迭代條件再次被測試。也就是說,循環循環。

在DO構造中,跳轉到構造範圍之外的語句會終止構造的執行:如出口。

這個例子,那麼,具有使用IF構造等價形式(與go to秒 - 包涵)

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更大,或最早元素的值如果沒有。

+0

這就是我無法編輯標籤的原因。我相信我投票結束時會有重複(有幾個),但是如果我失去了錘子特權,它將不會在審查隊列中獲得足夠的選票,而且選票將會消失。我們需要更多擁有金色標籤徽章的人。 –

+0

對於重複的目標,你有一個好的建議嗎?我沒有看到一個(顯然),但我仍然對這個問題有近距離投票。 – francescalus

+0

這一個https://stackoverflow.com/questions/11124855/fortran-if-statement-with-numbers-labels-rather-than-another-statement已經是其他兩個目標。我現在也有投票權,他們在無效時得到退款。 –

1

這就是所謂的算術,如果:if(a) 1,2,3。它的意思是:如果a<0它變爲1,如果(a==0)它去2,並且如果它(a>0)如果(NUM-陣列(ⅰ)< 0)它進入8變爲3.

在代碼(退出循環並跳過另一行),否則它將轉到7(循環)。

+0

謝謝你的回答。 – LionsFan