Pull to refresh

Знакомимся с COBOL — ч.2

Reading time 4 min
Views 12K
Ну что же, продолжим наше знакомство дальше, в первой статье мы узнали, из чего состоит COBOL программа, какие правила существуют по ее написанию и запустили нашу первую программу. Пора двигаться дальше, в этот раз мы начнем работать с переменными и совершать первые осмысленные действия с ними.


Итак, вернемся назад к нашей программе.

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. HELLOWORLD.
000300* --- Это пустая строчка. ---
000400 ENVIRONMENT DIVISION.
000500 DATA DIVISION.
000600 PROCEDURE DIVISION.
000700 BEGIN.
000800 DISPLAY “Hello World!”.
000900 STOP RUN.


Добавим в DATA DIVISION. новые строчки, а именно секцию WORKING-STORAGE SECTION. и парочку переменных WS-A и WS-B.

Выглядеть это будет так:

000500 DATA DIVISION.
000510 WORKING-STORAGE SECTION.
000520 01 WS-A	     PIC 999.
000530 01 WS-B        PIC 9(3).
000540 01 WS-RESULT   PIC9(6).


В PROCEDURE DIVISION. соответственно будут следующие строки:

000700 BEGIN.
000800    DISPLAY “Hello I'm your new calculator!”.
000900    DISPLAY “Please Enter first number from 0 to 999”.
001000    ACCEPT WS-A.
001100    DISPLAY “Please Enter second number from 0 to 999”.
001200    ACCEPT WS-B.
001300    DISPLAY “------------------------------------”.
001400    DISPLAY “ “.
001500    DISPLAY “Your results are:”.
001600    ADD WS-A TO WS-B GIVING WS-RESULT.
001700    DISPLAY “Summ is: ”, WS-RESULT.
001800    SUBTRACT WS-A FROM WS-B GIVING WS-RESULT.
001900    DISPLAY “Subtract is: ”, WS-RESULT.
002000    MULTIPLY WS-A BY WS-B GIVING WS-RESULT.
002100    DISPLAY “Multiplication is: ”, WS-RESULT.
002200    DIVIDE WS-A BY WS-B GIVING WS-RESULT.
002300    DISPLAY “Divide is: ”, WS-RESULT.
002400    STOP RUN.


Уже традиционно сохраняем это в файл с расширением .cob и запускаем компилятор. (Мы ведь не забыли добавить недостающие части программы правда? ;-) )

Запускаем удачно собранный исполняемый файл и видим, например:

Hello I'm your new calculator!

Please Enter first number from 0 to 999

300

Please Enter second number from 0 to 999

100

------------------------------------

 

Your results are:

Summ is: 000400

Subtract is: 000200

Multiplication is: 030000

Divide is: 000003



300 и 100 ввел я, остальное вывела программа. Результаты говорят сами за себя, а теперь рассмотрим новые строчки кода, которые мы ввели повнимательней.

Начнем с новинок в DATA DIVISION.

000510 WORKING-STORAGE SECTION. - сообщает компилятору о начале секции, описывающей обычные переменные.

000520 01 WS-A	     PIC 999.
000530 01 WS-B        PIC 9(3).
000540 01 WS-RESULT   PIC 9(6).


С точки зрения смысловой нагрузки эти три строчки идентичны, они определяют три переменных с уровнем 01, следом идет имя переменной (WS-A, WS-B и WS-RESULT), далее идет оператор PIC (который также можно записывать в его более старой форме как PICTURE IS), который устанавливает формат и размер переменной. И вот тут начинается главный сюрприз для тех, кто знаком с другими языками. Размер и формат указывается не количеством выделяемых бит, а количеством максимальных символов.
В нашем случае мы описали две переменных, которые будут содержать 3-х ЗНАЧНОЕ число и одну переменную, которая будет содержать 6-ти ЗНАЧНОЕ число.

Поподробней об описании формата. 9 – говорит компилятору, что переменная будет числовая, количество символов указывает на количество разрядов, естесственно, что для больших чисел неудобно писать и считать что-нибудь а ля 999999999999999 и была сделана форма записи 9(15), то есть в скобках указывается количество раз, которые повторяется символ перед скобками.

Перейдем к PROCEDURE DIVISION.
DISPLAY — как можно понять из программы и ее вывода занимается одной из самых полезных функций в мире. Выводит указанную переменную или текст на экран. Пользовательский текст должен быть заключен в двойные кавычки “”. Можно выводить несколько переменных или текстов, как видно в случае с

001700 DISPLAY “Summ is: ”, WS-RESULT.

главное не забыть запятую между ними.

Также в программе отметились 4 математических функции:
Сложение ADD WS-A TO WS-B GIVING WS-RESULT.
Вычитание SUBTRACT WS-A FROM WS-B GIVING WS-RESULT.
Умножение MULTIPLY WS-A BY WS-B GIVING WS-RESULT.
Деление DIVIDE WS-B BY WS-A GIVING WS-RESULT.

Построены они по одному принципу.

<оператор> значение1 TO/FROM/BY значение2 GIVING переменная.

В качестве значений могут выступать как переменные, так и числа напрямую, например,

ADD 10 TO 20 GIVING WS-RESULT.

Прибавят 10 к 20 и запишут результат (30) в WS-RESULT.

В случае, если GIVING и последующее имя переменной опускается, то результат запишется в переменную идущую ПОСЛЕ TO, FROM, BY – в нашем случае это будет WS-B (но WS-A в случае с DIVIDE).

Маленькое, но важное примечание, есть и немного другие формы записи, например:

ADD 1 2 3 TO WS-B – соответственно вначале сложит 1+2+3, а потом приплюсует это к значению WS-B и запишет результат в WS-B.
Можно опустить и TO – ADD 1 WS-A 2 WS-B сложит все эти значения и запишет результат в WS-B. Несколько переменных можно указать и после TO (к каждой из переменных после TO будут прибавлены значения до TO и результат записан в соответствующую переменную) и после GIVING, тогда в каждую из них будет записан результат. Аналогично можно оперировать и с SUBTRACT.

НО в случае с MULTIPLY и DIVIDE указание нескольких переменных возможно только после GIVING (и то это нужно уточнять для каждого компилятора отдельно).

Помимо этого у DIVIDE есть и вторая форма записи.
DIVIDE WS-A INTO WS-B GIVING WS-C со сменой BY на INTO меняется и порядок переменных, какую именно форму использовать остается выбор за пользователем. Укажу лишь, что:
DIVIDE WS-A INTO WS-B это WS-B / WS-A = WS-B

DIVIDE WS-B BY WS-A GIVING WS-RESULT
это WS-B / WS-A = WS-RESULT

ЭТО ВАЖНО! Вариант с BY НЕ БУДЕТ работать без GIVING. Программа просто не скомпилируется из-за ошибки.

Ну и напоследок маленький “подарок” — наверняка читатель уже задался вопросом “а как же присвоить значение переменной?”. С помощью MOVE

MOVE 10 TO WS-A
или MOVE WS-A TO WS-B
или даже MOVE 10 TO WS-A WS-B

ЭТО ВАЖНО! MOVE принимает несколько переменных только на “выходе”, т.е. после TO.

P.S. И наверняка вас удивляют цифры, которые мы получили на выводе и количество нулей в них? Это мы рассмотрим в следующей статье.


Воронцов “nerfur” Вячеслав. 2011.

ВАЖНЫЙ UPDATE! К сожалению забыл указать одно важное ключевое слово для DIVIDE.
DIVIDE WS-B BY WS-A GIVING WS-RESULT REMINDER <переменная>

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

Articles