2017-07-04 58 views
0

程序不停止讀取「ar」。請幫助。即使在分配它有確定數量的元素之後。可能是什麼原因?有沒有可能錯過的東西?fortran讀取語句不停止

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 
+3

任何使用'goto'的人都應該像這裏所描繪的那樣值得痛苦的世界。 –

回答

0

呃... ...哇...嗯...

該代碼是沒有意義的。

我討厭這麼說,但你仍然有很多的學習和理解。

首先:停止使用GOTO。它打破了代碼流,讓它看起來一團糟。其次:即使沒有檢查,我相信read聲明不是你的程序掛起的原因。它掛在各個循環之間。

即使沒有goto語句,獨此片段是一個正確的方式來獲取程序掛起:

do while (ar(i)>=ar(i+1)) 
    k=k+1 
end do 

這個循環不斷重複,只要ar(i)大於或等於ar(i+1) - 但在循環的主體,兩個值都沒有變化(只有k,但k不是條件的一部分)。所以如果條件是真的一旦,它會永遠保持永遠,並且循環將永遠不會終止。

然後你繼續跳回到循環的開始。每當你這樣做時,循環從頭開始。再次,你永遠不會得出結論。

我打算展示如何使用子例程來做我認爲你想做的事情,但我認爲它更好。您需要更多時間來了解正在發生的事情,並且我建議您找一些教授編程的專用資源。 它不一定是Fortran特有的,任何過程語言的教程都會幫助你理解程序流程,這就是你需要分析這個混亂的過程。

1)好的程序員可能知道何時使用goto。你還不是一個好的程序員。

+0

任務本身需要使用GOTO –

+0

你的意思是'任務本身需要使用GOTO'嗎?沒有什麼東西需要GOTO,而且GOTO在替代方面有所改進的情況很少。 – chw21

+0

您需要查找單調序列的任務。所以在解決這個問題時,任務簿中的任務需要使用GOTO。 –

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. 這不是一門功課的服務,我們不會解決這個問題爲您服務。再一次,你沒有要求那樣,所以沒關係。你的問題不是read*, ar命令。您可以通過在其正下方添加一個print*, ar來輕鬆測試它,它將打印。

  2. 你的問題是你的代碼中有一個無限循環(實際上有幾個),有些是因爲你使用了DO WHILE循環,其中的條件從未在迭代中改變,有些是因爲你跳出一個循環到另一個的開始,它重置初始條件。

這裏是你的鍛鍊一些提示:

  1. 爲您目前正在觀察該數組的索引創建一個變量。

  2. 創建兩個循環,一個用於增加此索引,只要數組中的下一個值較大,一個只要下一個值較小即可。檢查你是否增加超出數組範圍的索引。

  3. 不要從內部的任何環

  4. 跳,不要跳到中間任何環路。

  5. 在任一循環結束時,想想你學到了什麼數組,並從那裏跳到那裏。

  6. 確保您知道算法最終會停止。

  7. 最後,在調試過程中使用大量的print*語句並沒有什麼壞處,可以讓您瞭解程序實際在做什麼。