COBOL проблема - проблема от новичка, пожалуйста, руководство - PullRequest
0 голосов
/ 15 ноября 2011

Я хочу достичь ниже

строка из pic X (5) содержит A1992 и увеличивается до A9999, после достижения A9999 A следует заменить на B, а остальные символы следует повторно инициализировать до 0000, т. Е. B0000, это должно происходить до Z9999, пока это возможно как-то?

или если бы вы могли показать мне, как увеличить A до Z, этого было бы достаточно

Ответы [ 4 ]

2 голосов
/ 15 ноября 2011

Я бы, вероятно, сделал это с помощью вложенного цикла выполнения.

Хранение:

01  ws-counter-def
    03  ws-counter-def-alpha-list      pic x(27) value 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
    03  ws-counter-def-num             pic 9(4) comp-3.

01  ws-counter redefines ws-counter-def
    03  ws-counter-alpha occurs 27 times indexed by counter-idx   pic x.
    03  ws-counter-num                 pic 9(4) comp-3.      

01  ws-variable                        
    03  ws-variable-alpha              pic X
    03  ws-variable-num                pic X(4).                     

Процедура:

Initialize counter-idx.
Move 1992 to ws-counter-num.

Perform varying counter-idx from 1 by 1 until counter-idx > 26
  move ws-counter-alpha(counter-idx) to ws-variable-alpha
  perform until ws-counter-num = 9999
        add 1 to ws-counter-
        move ws-counter-num to ws-variable-num.
        *do whatever it is you need to do to the pic X(5) value in ws-variable*
  end-perform
  move zeros to ws-counter-num
end-perform.
2 голосов
/ 15 ноября 2011

Вам нужно будет сделать некоторые ручные манипуляции с персонажами на этом.Есть несколько частей, во-первых, вам нужно обработать простое добавление числовой части, затем вам нужно обработать ролловер этого для увеличения альфа-части.

Структуры данных, подобные этой, могут быть полезны:

01 Some-Work-Area.
  02 Odometer-Char-Vals      pic x(27) value 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
  02 Odometer-Char occurs 27 pic x.
  02 Odo-Char-Ndx            pic s9(8) binary.

01 My-Odometer.
    88 End-Odometer-Value    value 'Z9999'.
  02 My-Odometer-X           pic X.
  02 My-Odometer-9           pic 9999.
    88 Carry-Is-True         value 9999.

Это будет использоваться с простым циклом выполнения, например:

Move 0 to My-Odometer-9
Move 1 to Odo-Char-Ndx
Move Odometer-Char-Vals (Odo-Char-Ndx) to My-Odometer-X

Perform until End-Odometer-Value
   Add 1 to My-Odometer-9
   Display My-Odometer
   If Carry-Is-True
      Move 0 to My-Odometer-9
      Add 1 to Odo-Char-Ndx
      Move Odometer-Char-Vals (Odo-Char-Ndx) to My-Odometer-X
   End-If
End-Perform

Это один из способов сделать это.

Обратите внимание, что в приведенном выше коде потребовалось несколько сочетаний клавиш (например, хакерских взломов) - например, добавление ячейки пэда в массив Odometer-Char, поэтому мне не нужно проверять диапазон.Вы не хотели бы использовать это ни для чего, кроме примеров и идей.

1 голос
/ 15 ноября 2011

Просто не могу с собой поделать ... Как насчет этого ...

   IDENTIFICATION DIVISION.                                         
   PROGRAM-ID. EXAMPLE.                                             
   DATA DIVISION.                                                   
   WORKING-STORAGE SECTION.                                         
   01.                                                              
       02 ALL-LETTERS  PIC X(26) VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
       02 LETTERS REDEFINES ALL-LETTERS.                            
          03 LETTER    PIC X OCCURS 26 INDEXED BY I. 
   01  START-NUMBER    PIC 9(4).              
   01  COUNTER.                                                     
       02 COUNTER-LETTER    PIC X.                                  
       02 COUNTER-NUMBER    PIC 9(4).                                
   PROCEDURE DIVISION.
       MOVE 1992 TO START-NUMBER                                              
       PERFORM VARYING I FROM 1 BY 1 UNTIL I > LENGTH OF ALL-LETTERS                   
           MOVE LETTER (I) TO COUNTER-LETTER                        
           PERFORM TEST AFTER VARYING COUNTER-NUMBER FROM START-NUMBER BY 1 
                                UNTIL COUNTER-NUMBER = 9999         
              DISPLAY COUNTER - or whatever else you need to do with the counter...             
           END-PERFORM
           MOVE ZERO TO START-NUMBER                                              
       END-PERFORM                                                  
       GOBACK                  
       .                       

Это напечатает все "числа", начиная с A1992 до Z9999.

В основном украл код Marcus_33 и немного его изменил.Если вы чувствуете себя таким склонным, пожалуйста, подпишите его ответ, а не мой

0 голосов
/ 17 ноября 2011

Для любителей запутанного COBOL вот самая короткая (переносимая) версия, о которой я могу подумать (при условии, что компилятор имеет встроенные функции):

IDENTIFICATION DIVISION.
PROGRAM-ID. so.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 ws-counter value "A00".
   03 ws-alpha   pic x.
   03 ws-number  pic 99.
PROCEDURE DIVISION.
1.
     Perform with test after until ws-counter > "Z99"
       Display ws-counter, " " with no advancing
       Add 1 To ws-number
          On size error
             Move zero to ws-number
             perform with test after until ws-alpha is alphabetic-upper or > "Z"
                 Move Function Char (Function Ord( ws-alpha ) + 1) to ws-alpha
             end-perform 
       End-add
    End-perform.
END PROGRAM so.

Проверено на OpenVMS / COBOL. Я сокращаю значение до X (3), так как смотреть скучно. Непереносимая версия (если вам известно о Endianness вашей платформы) заключается в переопределении префикса как S9(4) COMP и прямом увеличении младших битов. Но это решение не будет короче ...

...