Отображение нулей в COBOL

Я новичок в COBOL, и наша последняя учебная деятельность заключается в том, что мы постараемся получить выходные данные из трех пунктов, например:

  1. 0000/2013
  2. 00012345
  3. 12345 **

Я попытался с моим кодом ниже, но он явно не дает мне вывод, который я хочу. Он не отображает нули.

IDENTIFICATION DIVISION.

PROGRAM-ID. ACTIVITY4.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 NUM1 PIC z(4)9(4) VALUE 2013.
01 NUM2 PIC Z(3)9(5) VALUE 12345.
01 NUM3 PIC 9(5) VALUE 12345.
01 E-NUM1 PIC *(2)9 VALUE 0.

PROCEDURE DIVISION.

DISPLAY-VALUES.

DISPLAY-ZEROES.

MOVE E-NUM1 TO NUM3.

 DISPLAY "1) "NUM1.

 DISPLAY "2) "NUM2.

 DISPLAY "3) "NUM3.

 STOP RUN.

3 ответа

Мне кажется, что задание 4 посвящено форматированию данных для вывода. Вам необходимо произвести:

0000/2013
00012345
12345**

Первый требует вставки косой черты. COBOL имеет символ вставки косой черты, '/'. Второе - не допускать подавления нуля, что является поведением, когда выводится поле PIC 9(n), поэтому на самом деле ничего не нужно делать, кроме как правильно задать длину. Третий, по-видимому, привлекает вас к полю редактирования замены "*", что, как я полагаю, является целью вопроса, но символ редактирования * заменяет только начальные нули.

Один простой способ получить конечные звездочки - использовать определение данных. Определите элемент группы, который вы будете отображать. Подчинитесь этому, определите свой номер (PIC 9(5)) и сразу же следуйте за ним с ЗАПОЛНИТЕЛЕМ (названным полем, если хотите) PIC XX, который имеет ЗНАЧЕНИЕ "**" (или ВСЕ "*", немного экстрим для двухбайтового поля, хотя).

IDENTIFICATION DIVISION.

PROGRAM-ID. ACTIVITY4.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 NUM1 PIC 9(4)/9(4).
01 NUM2 PIC 9(8).
01 NUM3-OUT. 
    05  NUM3 PIC 9(5). 
    05  FILLER PIC XX VALUE "**".

ПРОЦЕДУРА ОТДЕЛА.

DISPLAY-VALUES.

DISPLAY-ZEROES.
 MOVE 1234 TO NUM1

 DISPLAY "1) " 
             ">"
             NUM1
             "<"
 MOVE 12345 TO NUM2

 DISPLAY "2) "
             ">"
             NUM2
             "<"
 MOVE 12345 TO NUM3
 DISPLAY "3) "
             ">"
             NUM3-OUT
             "<"

 STOP RUN
 .

Я никогда не ставил VALUE на редактируемое поле. Редактирование выполняется, когда поле является целью глагола COBOL. В COBOL, которые я использую, это не повлияет на редактирование, оно просто будет иметь это буквальное значение. Я не знаю о GNU OpenCOBOL (ранее OpenCOBOL).

Учитывая 12345** проблема: если ничего не работает, вы можете объединить число со звездочками с помощью STRING как это:

WORKING-STORAGE SECTION.

01 NUM3 PIC X(7).
01 NUM3-NUMBERS PIC 9(5) VALUE 12345.

PROCEDURE DIVISION.

STRING NUM3-NUMBERS "**" DELIMITED BY SIZE INTO NUM3.
DISPLAY "3) "NUM3.

Этот код добавляет 2 звездочки в конце вашего номера. (но ваш NUM3 теперь является буквенно-цифровым изображением, а не числовым).

Еще одна вещь, которую я только что нашел в старой книге о коболах, это * Проверьте защитный символ. Я никогда не пробовал, но здесь говорится, что это должно быть использовано следующим образом:

01 NUM3 PIC 9(5)*(2).

Попробуйте!

Опустите Z при объявлении чисел.

Z подавляет ведущие нули в числе в COBOL.

Просто изменив объявления переменных на:

01 NUM1 PIC 9(8) VALUE 00002013.
01 NUM2 PIC 9(8) VALUE 00012345.

(Вам на самом деле не нужны предыдущие нули в числе, они просто там, чтобы показать вам весь PIC.)

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

Сначала я не уловил другую проблему, однако другая переменная, которую вы создали, должна быть

01 E-NUM1 PIC 9(2) VALUE 0.
Другие вопросы по тегам