如果這個問題已經得到解答,我很抱歉,我試圖在這個網站上搜索,我找不到任何東西。在COBOL中聲明變量
我創建了一個計算器,它從Mainframe回答中接收值和選項,然後執行算術運算。
我的主要問題是,如果我宣佈一個PIC 9(3)和值是2,它會顯示這樣:的 200,而不是2
我怎麼可能爲了避免這種格式化這個問題?
謝謝!
如果這個問題已經得到解答,我很抱歉,我試圖在這個網站上搜索,我找不到任何東西。在COBOL中聲明變量
我創建了一個計算器,它從Mainframe回答中接收值和選項,然後執行算術運算。
我的主要問題是,如果我宣佈一個PIC 9(3)和值是2,它會顯示這樣:的 200,而不是2
我怎麼可能爲了避免這種格式化這個問題?
謝謝!
由於以下幾個原因,我提出了一些沿着這些方向的東西,而不是已經建議的東西:您的輸入字段很短,所以在處理三個字段的單個名稱時沒有真正的問題。您需要在計算之前驗證輸入;它會給你一些COBOL字段定義的練習;這是我爲這種情況做的方式(簡單的格式,數據,需要驗證)。
程序代碼很簡單,並且可以通過多種方式進行結構化。
您的數據可能包括:4+個字符(無效),零個字符(無效),三個字符,兩個字符,一個字符,並且必須是數字(您未提及它是十六進制計算器)三,否則無效。
使程序代碼反映。
爲了簡單起見,首先處理主要的無效數據(太長,太短),並且不要讓它接近剩餘的處理。
在那些方面,很容易識別一個字符(兩個尾隨空格)的輸入,然後兩個字符(現在是剩下的唯一可能性,當空間位於第三個位置時),那麼剩下的必須是三個字符。
已經爲每個字段指定了一個單獨的名稱,他們可以在他們自己的一段代碼中進行NUMERIC測試(我喜歡使用PERFORM將IF/EVALUATE解擾,但許多不這樣做),並簡單地移動到PIC 999/9(3)字段,如果有效。
PIC 999/9(3)字段可以定義爲COMP-3/PACKED-DECIMAL。字母數字(PIC X ...)字段可以直接移至該字段。你可能想要這樣做的原因是因爲我們知道它正在進行計算,這意味着編譯器不得不將它轉換爲壓縮十進制,所以你可以預先考慮轉換。如果計算中的所有其他字段都是二進制的,則可以在第一個MOVE之後,再次移動到COMP/COMP-4/BINARY/COMP-5字段(不能將PIC X ...直接移動到二進制文件領域)。
01 INPUT-LINE.
05 INPUT-VALUE.
88 IV-NO-VALUE VALUE SPACE.
10 IV-THREE-DIGITS.
15 IV-TWO-DIGITS.
20 IV-ONE-DIGIT PIC X.
20 FILLER PIC X.
15 FILLER PIC X.
88 IV-ONE-TRAILING-BLANK
VALUE SPACE.
05 FILLER REDEFINES INPUT-VALUE.
10 FILLER PIC X.
10 FILLER PIC XX.
88 IV-TWO-TRAILING-BLANKS
VALUE SPACE.
05 FILLER PIC X(77).
88 IV-NO-EXTRA-DATA VALUE SPACE.
01 INPUT-VALUE-FOR-CALCULATION PIC 9(3).
PERFORM VALIDATE-INPUT
VALIDATE-INPUT.
IF IV-NO-EXTRA-DATA
EVALUATE TRUE
WHEN IV-NO-VALUE
set some unique error
WHEN IV-TWO-TRAILING-BLANKS
PERFORM ONE-INPUT-CHARACTER
WHEN IV-ONE-TRAILING-BLANK
PERFORM TWO-INPUT-CHARACTERS
WHEN OTHER
PERFORM THREE-INPUT-CHARACTERS
END-EVALUATE
ELSE
set some unique error
END-IF
ONE-INPUT-CHARACTER.
IF IV-ONE-DIGIT NUMERIC
MOVE IV-ONE-DIGITS TO INPUT-VALUE-FOR-CALCULATION
ELSE
set some unique error
END-IF
TWO-INPUT-CHARACTERS.
IF IV-TWO-DIGITS NUMERIC
MOVE IV-TWO-DIGITS TO INPUT-VALUE-FOR-CALCULATION
ELSE
set some unique error
END-IF
THREE-INPUT-CHARACTERS.
IF IV-THREE-DIGITS NUMERIC
MOVE IV-THREE-DIGITS TO INPUT-VALUE-FOR-CALCULATION
ELSE
set some unique error
END-IF
你是一個初學者,那麼爲什麼你結束了與200
接受,大型機上已不完全知道,沒有做數字排列,由於受實際上是採取一切可用的數據,將其打包到您的字段中,並截斷任何多餘的數據。
因此,這會得到你2
(這是兩個尾隨空白)。你的字段是PIC 999/9(3),所以它是無符號的。因爲它是無符號的,編譯器將確保它在被用作VERB的源時是如此。這將給你2 0
,因爲第三個字節的左邊部分(在大型機上)將從4設置爲F.X'40'是原來的空間。 X'F0'爲零,這是當4變爲F時得到的結果。
中間仍然有空間。但是,當您使用該字段進行計算時,每個字節的所有左側部分(除了最後一個字符的符號)將被剝離出來以「裝箱」該字段,並將結果放回PIC 999/9(3)Fs將作爲「解壓縮」的一部分插入。呃,你的兩個跟着兩個空格現在是200!
嘗試使用'PIC X(3)'作爲輸入變量,然後查看答案[如何將右側的空格替換爲左側的cobol中的零](http://stackoverflow.com/questions/ 21687073 /如何更換的-空間,在最右爲3/0,在最左的-COBOL)。這應該讓你走上正軌。 – NealB
我們假設您正在使用ACCEPT作爲您遇到問題的值。你能確認嗎? –