我寫了一個程式來檢查一個數是否為素數。
這是代碼:
program prime
integer n,i
print *, 'enter a number'
read *,n
do 10,i=2,n-1
if(mod(n,i).eq.0.0) then
print*, 'it is not prime'
read*
stop
end if
continue
if(n.eq.i)print *, 'it is prime'
read *
stop
end do
end program
但是,出現了問題。我有一個錯誤:
Error: Statement label in ENDDO doesn't match DO label
錯誤本身是可以理解的,最終 do 與 do 回圈無關。但是,我無法連接它,因為程式不允許我這樣做。為什么是這樣?
uj5u.com熱心網友回復:
隨著宣告
do 10,i=2,n-1
您正在引入一個帶標簽的 DO 結構。一個帶標簽的 DO 結構需要一個合適的終止陳述句,帶有匹配的標簽。在當前的 Fortran 中,匹配的標記 DO 構造以
10 end do
或者
10 continue
標記的 DO 構造在當前的 Fortran 中已過時,因此問題的整個 DO 構造可以寫為
do i=2,n-1
...
end do
在這個問題中,有非常令人困惑的縮進。該continue陳述句可能旨在作為回圈的終止,但這不是因為它沒有標記為10。continue只是一個普通的、什么都不做的陳述句,只有通過它的標簽才具有作為回圈終止的意義。相反,編譯器會看到由 終止的回圈end do,而不考慮縮進,然后抱怨,因為它缺少適當的標簽。
回圈的邏輯與縮進一致:continue陳述句應該是回圈的結尾。有三個選項
10為陳述句添加標簽- 更改
continue為10 end do 10從 DO 陳述句中洗掉并更改continue為end do
對于每個選項,還要洗掉第二個end do.
最后,與
if(n.eq.i) ...
在回圈之后,該條件是多余的:如果達到,i將始終具有價值n。
uj5u.com熱心網友回復:
program prime
integer n,i
print *, 'enter a number'
read *,n
do i=2,n-1
if (mod(n,i)==0.0) then
print*, 'it is not prime'
read*
stop
end if
end do
if (n==i) then
print *, 'it is prime'
read*
endif
end program prime
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/377722.html
上一篇:計算回圈中的迭代次數
