2014-02-13 114 views
0

如果這個問題已經得到解答,我很抱歉,我試圖在這個網站上搜索,我找不到任何東西。在COBOL中聲明變量

我創建了一個計算器,它從Mainframe回答中接收值和選項,然後執行算術運算。

我的主要問題是,如果我宣佈一個PIC 9(3)和值是2,它會顯示這樣:的 200,而不是2

我怎麼可能爲了避免這種格式化這個問題?

謝謝!

+0

嘗試使用'PIC X(3)'作爲輸入變量,然後查看答案[如何將右側的空格替換爲左側的cobol中的零](http://stackoverflow.com/questions/ 21687073 /如何更換的-空間,在最右爲3/0,在最左的-COBOL)。這應該讓你走上正軌。 – NealB

+0

我們假設您正在使用ACCEPT作爲您遇到問題的值。你能確認嗎? –

回答

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!