有趣的小程序,在我看來有幾個 問題
的PERFORM
動詞來在幾個不同的口味(基本,次,直到和不同)。 的PERFORM UNTIIL
味道,你要使用的一個,具有以下 「鐵軌」的語法:
__________________________________________________________________________________________________
| |
| >>__PERFORM__ _procedure-name-1__ _______________________________ __| phrase 1 |_ ____________>< |
| | |_ _THROUGH_ __procedure-name-2_| | |
| | |_THRU____| | |
| |_| phrase 1 |__ ________________________ __ END-PERFORM___________| |
| |_imperative-statement-1_| |
| |
| phrase 1: |
| |__ ____________________________ __UNTIL__condition-1__________________________________________| |
| |_ ______ __TEST__ _BEFORE_ _| |
| |_WITH_| |_AFTER__| |
| |
|__________________________________________________________________________________________________|
注意,只是PERFORM
動詞後,你可以編寫要麼procedure-name-1
或phrase-1
用任意數目其次 imperative-statement-1
。這些是相互排斥的選項(即圖中沒有 路徑允許你'回送',一旦你通過其中一個選項,其他的 不再可用,但是,你的代碼同時做到了這兩個!因爲代碼中固有的 含糊不清(我試着編譯你的程序,幸好我的編譯器發出了一個錯誤)。
我看到的另一個問題是使用INPUT
作爲變量名。 INPUT
是一個大的 一套COBOL保留字 所以不能用這種方式(再次我會期待編譯器發出一個錯誤)。簡單的修復就是給 添加一些東西名稱(例如。 WS-)來消除歧義。
喬指出,典型的COBOL方式做什麼,我認爲你正試圖爲:
PERFORM PARAGRAPH1
PERFORM UNTIL FUNCTION LOWER-CASE (WS-INPUT) = 'no'
PERFORM PARAGRAPH2
PERFORM PARAGRAPH3
PERFORM PARAGRAPH1
END-PERFORM
我認爲PARAGRAPH1
負責設置循環控制變量WS-INPUT
。
或(假設PARAGRAPH2
和PARAGRAPH3
不引用WS-INPUT
並且它們至少被執行一次 )
PERFORM WITH TEST AFTER UNTIL FUNCTION LOWER-CASE (WS-INPUT) = 'no'
PERFORM PARAGRAPH2
PERFORM PARAGRAPH3
PERFORM PARAGRAPH1
END-PERFORM
的基本區別在於,第一個例子是一種典型的DO-WHILE構建體(前 進入測試循環體),第二個是典型的DO-UNTIL構造(總是在循環體中執行1遍 並在隨後的遍歷之前測試)。
的第三種方式,過時的方法,將是:
PERFORM PARAGRAPH1
PERFORM PARAGRAPHS UNTIL LOWER-CASE (WS-INPUT) = 'no'
PARAGRAPHS.
PERFORM PARAGRAPH2
PERFORM PARAGRAPH3
PERFORM PARAGRAPH1
.
這等效於上面的第一個例子。 我不推薦這種編碼風格 - 它可以追溯到事情完成的方式或更多年前。
我不知道任何COBOL,但「AFTER直到」看起來真的很可疑... –
從我一直在閱讀,TEST AFTER緊跟其後UNTIL使它像Java和C++語言中的do-while循環 – CaffeinatedCM
It用WITH TEST AFTER和UNTIL INPUT =「no」表示它將在每個循環後執行測試,並且條件爲INPUT =「no」。我認爲'INPUT'是工作存儲? –