2011-10-23 91 views
2

我是COBOL的新手,只是想知道我正在做的一些奇怪的事情。我想創建一個循環,並執行3段,直到用戶在第一段中提供的輸入爲「否」。如何根據輸入控制循環? (爲什麼這個循環會永遠持續下去?)

有什麼辦法可以使用這個輸入嗎?還是我必須改變一切,以便在執行第一段之前給出輸入?現在我的循環看起來像:

PERFORM PARAGRAPH1 WITH TEST AFTER UNTIL INPUT = "no" 
    PERFORM PARAGRAPH2 
    PERFORM PARAGRAPH3 
END-PERFORM. 

目前它只是不斷循環和永遠不會結束,這是你能猜到是一個問題。我想我可能還不完全理解COBOL的範圍,這是我第一次在COBOL上進行實際嘗試。

任何幫助真的很感謝:)

+1

我不知道任何COBOL,但「AFTER直到」看起來真的很可疑... –

+0

從我一直在閱讀,TEST AFTER緊跟其後UNTIL使它像Java和C++語言中的do-while循環 – CaffeinatedCM

+0

It用WITH TEST AFTER和UNTIL INPUT =「no」表示它將在每個循環後執行測試,並且條件爲INPUT =「no」。我認爲'INPUT'是工作存儲? –

回答

3

有趣的小程序,在我看來有幾個 問題

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-1phrase-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

或(假設PARAGRAPH2PARAGRAPH3不引用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 
     . 

這等效於上面的第一個例子。 我不推薦這種編碼風格 - 它可以追溯到事情完成的方式或更多年前。

+0

非常感謝!這非常有幫助。我的計算機科學不斷告訴我學習COBOL是毫無意義的,但我有一些樂趣! – CaffeinatedCM

3

你正在混合內聯執行與段落執行。很奇怪。我懷疑這只是因爲你將Cobol-74終止符(期間)與Cobol-85終止符(End-Perform)混合而編譯的。如果您的編譯器支持End- *作用域結束符,則除了段落結束之外,不應使用句點,否則可能會創建一些非常扭曲和混亂的執行路徑。

您還需要在輸入上管理案例摺疊。

的「具有測試是一個特殊的獸後,/這是做的相當的,而在其他語言,但它總是可以用吸閱讀並把測試先寫。

試着這麼做這樣的:

你有沒有
Perform Paragraph1 
Perform until function lower-case(INPUT) = "no" 
    Perform Paragraph2 
    Perform Paragraph3 
    Perform Paragraph1 
End-Perform 
+0

謝謝!我把支票交給尼爾,因爲他深入了一點,但我很感謝你向我解釋終結者的問題! – CaffeinatedCM