Ну что же, продолжим наше знакомство дальше, в первой статье мы узнали, из чего состоит COBOL программа, какие правила существуют по ее написанию и запустили нашу первую программу. Пора двигаться дальше, в этот раз мы начнем работать с переменными и совершать первые осмысленные действия с ними.
Итак, вернемся назад к нашей программе.
Добавим в DATA DIVISION. новые строчки, а именно секцию WORKING-STORAGE SECTION. и парочку переменных WS-A и WS-B.
Выглядеть это будет так:
В PROCEDURE DIVISION. соответственно будут следующие строки:
Уже традиционно сохраняем это в файл с расширением .cob и запускаем компилятор. (Мы ведь не забыли добавить недостающие части программы правда? ;-) )
Запускаем удачно собранный исполняемый файл и видим, например:
300 и 100 ввел я, остальное вывела программа. Результаты говорят сами за себя, а теперь рассмотрим новые строчки кода, которые мы ввели повнимательней.
Начнем с новинок в DATA DIVISION.
С точки зрения смысловой нагрузки эти три строчки идентичны, они определяют три переменных с уровнем 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 мы указываем переменную в которую запишется ОСТАТОК от деления.
Итак, вернемся назад к нашей программе.
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 мы указываем переменную в которую запишется ОСТАТОК от деления.