Pull to refresh

Знакомимся с COBOL – ч.3

Reading time5 min
Views9K
К сожалению забыл указать в предыдущей статье несколько важных ключевых слов:

для DIVIDE.

DIVIDE WS-B BY WS-A GIVING WS-RESULT REMAINDER <переменная>.

Используя REMAINDER мы указываем переменную в которую запишется ОСТАТОК от деления.

Для любых математических операций:

Также, добавляя ROUNDED после операции мы достигаем того, что результат будет округляться, а не просто “отбрасываться” лишний хвост.
ADD WS-A TO WS-B GIVING WS-RESULT ROUNDED.

А теперь продолжим познавать новое. Исполняя обещание развеять удивление о странном выводе значений переменных мы разберем в этот раз PICTURE IS (он же PIC) и форматы переменных.


И снова мы возвращаемся в DATA DIVISION.
Рассмотрим еще разок строчку с описанием переменной:
01 – уровень переменной;
WS-B – имя переменной;
PIC – ключевое слово, указывающее, что далее идет описание формата переменной, старой формой является PICTURE IS.
9(3) – тип символов в переменной “9” и их количество “3”.

УРОВЕНЬ ПЕРЕМЕННОЙ.
Пользователю для обычных переменных доступны уровни с 01 по 49 включительно и 77. Уровень переменной описывает ее иерархию в группе переменных, чем выше номер, тем ниже переменная в “лестнице”. Например
01 CUSTOMER-RECORD.
05 CUSTOMER-NAME PIC X(10).
05 CUSTOMER-ADDRESS PIC X(30).

Уровень 77 объявляет переменную, как ЭЛЕМЕНТАРНУЮ, то есть у нее не может быть под-переменных.
Уровень 88 объявляет переменную, как conditional, причем в достаточно изощренной и богатой функционально форме, о них подробнее в следующий раз.
Есть и некоторые другие уровни, которые введены либо производителями компиляторов, либо сейчас нам не нужны.

ИМЯ ПЕРЕМЕННОЙ.
Имя переменной может состоять из цифр, букв и “-”, но не должно с “-” начинаться.
Имя переменной должно содержать не больше 30 символов.

ОПИСАНИЕ ФОРМАТА ПЕРЕМЕННОЙ.
Рассмотрим какие описательные символы существуют для переменных в COBOL.
Они делятся на две группы: “обычные” и “редактирующие”.

В обычные входят
9 – одна цифра;

V – знак, отделяющий целую часть от десятичной (может применяться только ОДИН раз в каждой переменной).

S – знак “±”, должен быть самым первым символом в формате переменной (может применяться только ОДИН раз в каждой переменной).

X – один буквенно-цифровой знак, т.е. цифра, буква, пробел, спец. символы.

A – один буквенный знак или пробел.

Редактирующие символы – благодаря им описываются переменные, которые не будут участвовать в расчетах, но позволяют тонко настроить вид, в котором переменная будет выведена на экран/печать:

Z – заменяет 9'ки с той разницей, что все начальные нули убираются.

$ — “валютный знак”, указанный для компилятора, по умолчанию, в основном знак доллара, используется ТОЛЬКО как ПЕРВЫЙ символ в описании. Может использоваться только один раз. Его значение устанавливается в ENVIRONMENT DIVISION. с помощью

* — аналог Z, но начальные нули заменяются на *.

— (минус) – может указываться как первым, так и самым последним символом, но только один раз. Если число отрицательное, то будет выведен минус, иначе пустое место.

+ (плюс) – аналог “-” (минуса), НО в случае с положительным числом будет выведен “+”, а в случае с отрицательным выводится “-”.

. (точка) – знак “десятичной точки”. На ее месте будет выведена именно “точка”.

, (запятая) – знак “запятой”. Может быть несколько в переменной.

/ (слэш) – знак “слэш”. Может быть несколько. Выводит “слэш”, популярен в датах.

0 (ноль) — “ноль”. Просто на этом месте будет выведен 0.

B (от blank, пустой) — “пробел”.

Но главное, как вы можете понять все эти символы комбинируются и позволяют получать очень гибкие формы и виды. Правило здесь фактически только одно – числовые переменные не должны превышать 18 символов, буквенно-цифровые – 160 символов. Но тут опять же многое зависит от компилятора и его параметров.

ВКУСНЫЕ ДОПОЛНЕНИЯ или ЕСТЬ ЖИЗНЬ ПОСЛЕ PIC'а!
Помимо этого, при описании переменной после ее формата могут быть добавлены дополнительные “опции”:

BLANK WHEN ZERO – если переменная равно 0, то вместо нее будет выведено пустое место, а не нули.
VALUE “значение” — сразу присваивает переменной определенное значение.

Существуют и другие, но упоминать о них сейчас было бы бесполезно.
Итак, теперь давайте просто пощупаем все их в разных видах.

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. VARIABLES-TEST.
000300 AUTHOR. ME.
000400 ENVIRONMENT DIVISION.
000500 DATA DIVISION.
000600 WORKING-STORAGE SECTION.
000700 01 HUMAN-CONTAINER.
000800             05 HUMAN-NAME 	PIC A(30).
000900             05 HUMAN-ADDRESS 	PIC X(160).
001000 77 SQUARE-METERS   		PIC 9(18).
001100 77 SQUARE-PRICE        		PIC 9(15)V9(2).
001150 77 FLAT-PRICE			PIC 9(15)V9(2).
001200 77 TAX-PERCENT          		PIC 9(2).
001300 77 TAX-SUMM               		PIC 9(15)V9(2).
001350 77 NEGATIVE-VALUE		PIC S9(10)V9(6).
001400* --- OOOOMG! ---
001500 77 SQUARE-METERS-OUT    	PIC Z(17)9.
001600 77 SQUARE-PRICE-OUT		PIC Z(14)9.Z(2).
001650 77 FLAT-PRICE-OUT-1		PIC Z(3),Z(3),Z(3),Z(3).9(2).
001660 77 FLAT-PRICE-OUT-2		PIC Z(3)BZ(3)BZ(3)BZ(3).9(2).
001700 77 TAX-PERCENT-OUT		PIC Z(2).
001800 77 TAX-SUMM-OUT		PIC Z(14)9.9(2).
001900 77 NEGATIVE-VALUE-OUT-1	PIC +Z(10).9(6).
002000 77 NEGATIVE-VALUE-OUT-2      PIC -Z(10).*(6).
002100* --------------------------------
002200 PROCEDURE DIVISION.
002300 BEGIN.
002400	DISPLAY "Please enter Name: ".
002500 	ACCEPT HUMAN-NAME.
002550	DISPLAY "Please enter Address: ".
002600	ACCEPT HUMAN-ADDRESS.
002700	DISPLAY "Please enter square meters of flat: ".
002800	ACCEPT SQUARE-METERS.
002900	DISPLAY "Please enter square meter's price: ".
003000	ACCEPT SQUARE-PRICE.
003100	DISPLAY "Please enter percent of tax: ".
003200	ACCEPT TAX-PERCENT.
003300	DISPLAY "Enter any really big NEGATIVE value: ".
003400	ACCEPT NEGATIVE-VALUE.
003500	DISPLAY "---------------------------------------".
003600	DISPLAY " ".
003700	DISPLAY HUMAN-NAME.
003800	DISPLAY HUMAN-ADDRESS.
003900	DISPLAY "SQUARE-METERS: ", SQUARE-METERS.
004000	MOVE SQUARE-METERS TO SQUARE-METERS-OUT.
004100	DISPLAY "SQUARE-METERS-OUT: ", SQUARE-METERS-OUT.
004200	DISPLAY "SQUARE-PRICE: ", SQUARE-PRICE.
004300	MOVE SQUARE-PRICE TO SQUARE-PRICE-OUT.
004400	DISPLAY "SQUARE-PRICE-OUT: ", SQUARE-PRICE-OUT.
004500 	MULTIPLY SQUARE-METERS BY SQUARE-PRICE GIVING FLAT-PRICE.
004600	DISPLAY "FLAT-PRICE: ", FLAT-PRICE.
004700	MOVE FLAT-PRICE TO FLAT-PRICE-OUT-1 FLAT-PRICE-OUT-2.
004800	DISPLAY "FLAT-PRICE-OUT-1: ", FLAT-PRICE-OUT-1.
004850	DISPLAY "FLAT-PRICE-OUT-2: ", FLAT-PRICE-OUT-2.
004900	DISPLAY "TAX-PERCENT: ", TAX-PERCENT.
005000	MOVE TAX-PERCENT TO TAX-PERCENT-OUT.
005100	DISPLAY "TAX-PERCENT-OUT: ", TAX-PERCENT-OUT.
005200	DISPLAY "TAX-SUMM: ", TAX-SUMM.
005300	MOVE TAX-SUMM TO TAX-SUMM-OUT.
005400	DISPLAY "TAX-SUMM-OUT: ", TAX-SUMM-OUT.
005500	DISPLAY "NEGATIVE-VALUE: ", NEGATIVE-VALUE.
005600	MOVE NEGATIVE-VALUE TO NEGATIVE-VALUE-OUT-1 NEGATIVE-VALUE-OUT-2.
005700	DISPLAY "NEGATIVE-VALUE-OUT-1: ", NEGATIVE-VALUE-OUT-1.
005800	DISPLAY "NEGATIVE-VALUE-OUT-2: ", NEGATIVE-VALUE-OUT-2.
005900	STOP RUN.


И что же мы получаем в итоге.

Please enter Name: 
Slava
Please enter Address: 
Moscow 15
Please enter square meters of flat: 
44
Please enter square meter's price: 
1234123
Please enter percent of tax: 
20
Enter any really big NEGATIVE value: 
-123123213213
---------------------------------------
 
Slava                         
Moscow 15                                                                                                                                                       
SQUARE-METERS: 000000000000000044
SQUARE-METERS-OUT:                 44
SQUARE-PRICE: 000000001234123.00
SQUARE-PRICE-OUT:         1234123.00
FLAT-PRICE: 000000054301412.00
FLAT-PRICE-OUT-1:      54,301,412.00
FLAT-PRICE-OUT-2:      54 301 412.00
TAX-PERCENT: 20
TAX-PERCENT-OUT: 20
TAX-SUMM: 000000000000000.00
TAX-SUMM-OUT:               0.00
NEGATIVE-VALUE: -3123213213.000000
NEGATIVE-VALUE-OUT-1: -3123213213.000000
NEGATIVE-VALUE-OUT-2: -3123213213.000000


Как видите вывод переменных “форматированных” и сырых отличается и настраивается.

Естесственно это не просто ваше право, а обязанность поиграться с переменными, посмотреть как они будут себя вести.

А между прочим, если вы внимательно смотрели вывод своей программы, то могли заметить очень неприятную “мелочь” — значения, которые не влезли в переменную, если у вас этого не произошло, то попробуйте поэкспериментировать.

До следующей Встречи! Впереди будет еще много интересного)

Воронцов “nerfur” Вячеслав. 2011.
Tags:
Hubs:
Total votes 8: ↑6 and ↓2+4
Comments6

Articles