к алгоритмизации   алгоритмы, струкутуры данных и программирование   СУБД   ЯиМП   3GL   4GL   5GL   технологии прогр.

Алгоритмический язык программирования COBOL

Кобол (COBOL, COmmon Business Oriented Language) — один из старейших языков программирования (первая версия в 1959), предназначенный, в первую очередь, для разработки бизнес-приложений.

В свежий стандарт языка 2002 года в Кобол добавлены средства объектно-ориентированного программирования и другие современные языковые конструкции. В этом году язык COBOL и его верные программисты отметили юбилей. 50 лет назад, комитет, состоявший из представителей шести крупнейших, на то время, производителей компьютеров и трёх правительственных агентств, выбрал для нового языка имя — COBOL, от Common Business-Oriented Language.

Язык пережил многих своих создателей, и даже сейчас используется очень широко. К счастью, или к сожалению, в России он почти неизвестен, но в США, судя по статистике от Datamonitor до сих пор пишется до 5 миллионов строчек кода на Коболе ежегодно. Основная сфера применения — банковская сфера, телефонные операторы, правительственные агентства.

История

Грейс Хоппер (бабушка Кобола)

Руководителем проекта по созданию Кобола была женщина — Грейс Хоппер (бабушка Кобола). Практически с самого своего рождения Кобол является ANSI-стандартизованным языком программирования.

Год 1959: совещание в Пентагоне даёт начало компьютерному языку, который позднее станет известен как “Кобол” (COBOL) и будет основным средством бизнес-вычислений в последующие 40 лет.

“Кобол”, сокращённо от Common Business-Oriented Language (Общий бизнес-ориентированный язык программирования), был одним из первых компьютерных языков. И, наряду с “Фортраном”, он был одним из первых языков программирования, основанных на английской лексике.

“Кобол” обязан своим существованием Грейс Хоппер, одной из первых компьютерных программистов. Грейс делала свои первые программерские шаги в резерве ВМС США, набирая машинный код для компьютера Harvard Mark I в течение Второй Мировой Войны. В конце 1950-х она пришла к мысли, что языки ЭВМ можно было бы сделать похожими на человеческий язык, и тем самым более понятными, чем используемые тогда ассемблер и машинный код.

Масштабы использования

Кобол обычно критикуется за многословность и громоздкость, поскольку одной из целей создателей языка было максимально приблизить конструкции к английскому языку. (До сих пор Кобол считается языком программирования, на котором было написано больше всего строк кода). Так широко известно высказывание Дейкстры “Использование Кобола калечит ум. Его преподавание, следовательно, должно рассматриваться как уголовное преступление”.

В то же время, Кобол имел прекрасные для своего времени средства для работы со структурами данных и файлами, он стал первым языком, в котором появился тип данных “запись”.[4] Это обеспечило ему долгую жизнь в бизнес-приложениях, по крайней мере, в США.

Dr. Dobb’s Journal (со ссылкой на The Gartner Group, Computerworld, Ovum и Micro Focus International) приводит следующие факты. К 1997 году активно использовалось около 240 миллиардов строк кода на Коболе. Около 90 % финансовых транзакций в мире обрабатывается кодом на Коболе, и 75 % коммерческой обработки данных написано на Коболе. Общая стоимость используемого в настоящее время коболовского кода оценивается в 2 триллиона долларов США. До сих пор ежегодно пишутся миллиарды новых строк кода на Коболе.

Hello world

IDENTIFICATION DIVISION.

PROGRAM-ID. HELLO-WORLD.

*

ENVIRONMENT DIVISION.

*

DATA DIVISION.

*

PROCEDURE DIVISION.

PARA-1.

DISPLAY "Hello, world.".

*

EXIT PROGRAM.

END PROGRAM HELLO-WORLD.

Вам стоит выучить COBOL

Начинающие программисты (а вполне возможно, что и их коллеги с опытом), должно быть, часто спрашивают себя, нужно ли им учить JAVA, или знания JavaScript, Python или Ruby будет вполне достаточно в современном мире. Учитывая спрос на программистов в нынешней экономике, многие находят достойную работу еще учась в университетах, и зачем тогда, спрашивается, представителю этой профессии заглядывать в такое далекое прошлое, как COBOL?

Согласно исследованию Gartner от 2001 года (в случае с данным конкретным языком это вполне можно назвать “недавно”), 85% мирового объема бизнес-информации обрабатывалось на языке COBOL, а к текущему моменту объем кода, написанный этим языком программирования, начинает снова увеличиваться. Компания Micro Focus, занимающаяся разработкой и продажей инструментов модернизации COBOL, заявляет, что 70% мирового бизнеса до сих пор активно использует этот язык.

И хотя очевидно, что многие из приложений, изначально написанных на COBOL будут переписаны, в Micro Focus уверены, что большая часть оригинального кода все-равно останется в ходу, а приложения будут использоваться еще долгие годы. Они безопасны, стабильны, а компании использующие их, не готовы от них просто так отказаться. Программный менеджер Micro Focus по имени Арунн Рамадосс (Arunn Ramadoss) говорит: “Ни один другой язык неспособен представлять бизнес-данные так точно, как это делает COBOL”.

И даже в дни запоздалого выхода на пенсию, инженеров, способных работать с этим языком, становится все меньше и меньше. Кто-то перестает работать, другие уходят на позиции связанные с менеджментом, а не разработкой.

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

По-правде говоря, такие вакансии уже начинают появляться, и чаще всего с пометкой “срочно требуется”.

“Дни, когда вы могли быть „исключительно Java-программистом“ или „только C-программистом“ ушли” — говорит Арунн: “Сегодня необходимо знать несколько языков и технологий, а так же то, как они могут быть интегрированы”.

Интеграция — это, пожалуй, самая важная мелочь для человека, решившегося взяться за COBOL. Природа языка, и природа систем его использующих очень плотно завязана на бизнес-логике и процессах. Поэтому наибольшим испытанием для разработчика и программиста будет не изучение самого языка, но понимание того, как он может быть использован в современной корпоративной среде.

В качестве примера Рамадосс говорит о бизнес-процессе перевода средств с одного банковского счета, на другой — эта процедура нисколько не изменилась с момента ее создания. Но то, как люди взаимодействуют со своими банковскими счетами и транзакциями, претерпела значительные, если не кардинальные, изменения. Сегодня все хотят получить доступ к счету с помощью ПК или мобильного телефона.

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

Так с чего же начать человеку, который заинтересовался в изучении этого старейшего языка программирования? Лучшим стартом будет веб-сайт cobol.com, где можно найти множество информации о том, как подступиться к этой технологии. Что касается литературы, то общепризнанным эталоном считается книга “The 21st Century COBOL Programmer” от авторов Нэнси Штэрн (Nancy Stern), Роберта Штэрна (Robert A. Stern) и Джеймса Лея (James P. Ley).

Знакомство с COBOL

Этой статьей я планирую начать целый цикл, который может быть со временем соберется в книгу. Информация про COBOL на русском представлена фактически статьей в Википедии и двумя советскими ГОСТами. Вы можете спросить меня зачем я начинаю “раскапывать труп” и прочие аналогичные вопросы. Ответ прост – а просто так. Потому что я люблю COBOL, потому что он вовсе не мертвый, потому что он интересный, потому что это часть важной истории и он продолжит оставаться частью будущего. Потому что COBOL – это событие. И пусть его ругает Дейкстра и другие, это ничуть не умаляет его объемов и его влияния на ИТ в бизнес.

Хватит введения, перейдем к самому изучаемому. COBOL – один из старейших языков программирования, расшифровывается его название как COmmon Business-Oriented Language, появившийся в 1959 году, благодаря “бабушке” Грейс Хоппер, и в основном применявшийся в различных финансовых и административных системах. Более подробно можно узнать его историю в ближайшем интернет-поисковике или (ну прям для совсем ленивых) — notes.sochi.org.ru/1333/ (рус. яз.) или en.wikipedia.org/wiki/COBOL (eng.).

Для того, чтобы приступить к практическому изучению языка нам необходимо две вещи – редактор текстовый (1 шт.) и компилятор (1 шт.)

Если с редакторами все просто, тут подойдет даже Notepad и vi, emacs, nano и т.д. и т.п. Главное требование “классическое” это должен быть текстовые редактор, а не тексовый процессор (не помню что еще писали в достаточно старых книгах на эту тему ;-) ).

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

www.opencobol.org/ - OpenCOBOL (open-source, моя личная рекомендация, мультиплатформенный)

http://tiny-cobol.sourceforge.net/ - TinyCobol (open-source, по сообщению автора 1 января 2011 года – прекратил развитие, да и до этого был не особо активен)

http://sourceforge.net/projects/cobolforgcc/ - Cobol for GCC (open-source, преальфа, последние обновления 2009г.)

http://homepages.paradise.net.nz/jsoeberg/ - COBOL 12 (freeware, 16-битный компилятор под DOS / Windows)

http://cev.cemotel.cz/cobol/cb_en/mx_all.htm - Cevela MX COBOL (freeware, Windows)

www.microfocus.com/promotions/wwemvctd0510/default.aspx?page=form - Micro Focus Visual COBOL R2 (trial, windows)

www.thekompany.com/products/kobol/ - KOBOL (trial, linux, windows)

Также есть богатый выбор древних компиляторов под DOS.

Лично я использую OpenCOBOL, что в какой то мере единственный реальный вариант, на данный момент.

Теперь, когда вы все установили и готовы ринуться в бой – начнем. Естесственно, с Hello World.

Наберем в редакторе следующий код:

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.

Благополучно сохраняем это в файл с расширением .cob (или .cbl) – это самые популярные, исторические и логические расширения.

Далее в терминале или командной строке набираем cobc -x <файл> и получаем исполняемый файл. Запускаем его и оооооп!

Hello World!

Теперь давайте разберем этот код.

Начнем с внешнего вида. Это “классический” код. Со всеми требованиями, что были и 50 лет назад. Почему его использую я:

1. Код в таком формате подойдет любому компилятору.

2. Это “олдскулл”, “крутатенюшка” и просто мне нравится.

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

Строка COBOL программы состоит из 80 символов.

Символ 1-6: номер строки (необязателен)

Символ 7: “индикатор”

* — строка комментарий,

— — строка “продолжение”,

D- строка debug.

Символ 8 – 11: Зона А. В ней должны начинаться DIVISION'ы, SECTION'ы, имена и заголовки параграфов, а также индикаторы и номера “уровней” (это все рассмотрим позже).

Символ 12-72: Зона Б. Собственно здесь должны начинаться сами по себе выражения “кода”.

Символ 73-80: Зона комментария. Не обрабатывается компилятором и полностью предоставлена програмисту.

С горизонтальной плоскостью разобрались, перейдем к вертикали.

Каждая COBOL программа содержит 4 раздела – DIVISION, идут они в строгом порядке и содержат определенные элементы.

DIVISION ПЕРВЫЙ. Вдохновляющий

IDENTIFICATION DIVISION. — описывает программу и содержит такие параграфы, как

PROGRAM-ID. Helloworld.

AUTHOR. Beginner.

INSTALLATION. MyLocalCobolComputer.

DATE-WRITTEN. 19/03/2011.

DATE-COMPILED. 19/03/2011.

SECURITY. Iwillnottellanybodythiscode.

Содержимое этих параграфов представляет собой обычный комментарий и в принципе записать туда можно хоть “2011 год от Рождества Христова”.

DIVISION ВТОРОЙ. Мистический.

ENVIRONMENT DIVISION. — Описывает ту среду, как и следует из названия, в которой пишется программа. Состоит из двух секций.

CONFIGURATION SECTION. Которая включает в себя параграфы SOURCE-COMPUTER. и OBJECT-COMPUTER. и SPECIAL-NAMES. Первые два несут сугубо комментирующую функцию и описывают на каком компьютере, для какого компьютера программа написана.

SPECIAL-NAMES. представляет собой достаточно глубинную штуку, которая будет рассмотрена позже (или можете поискать пока на эту тему сами информацию).

INPUT-OUTPUT SECTION. Описывает, как следует из названия ввод-вывод, очень нужно, очень важно и очень скоро мы с этим уже встретимся. Включает в себя параграфы FILE-CONTROL. и I-O-CONTROL.

DIVISION ТРЕТИЙ. Законодательный.

DATA DIVISION. — Содержит описания всех переменных. Включает в себя 4 секции:

FILE SECTION. — описывает структуру файлов.

WORKING-STORAGE SECTION. — описывает переменные.

LOCAL-STORAGE SECTION. — описывает переменные, которые создаются и инициализируются каждый раз при выполнении (поподробней в следующие разы).

LINKAGE SECTION. — описывает данные, которые мы получаем при вызове других программ.

DIVISION ЧЕТВЕРТЫЙ. Рабочий.

PROCEDURE DIVISION. — Содержит “саму” программу, которая делится на пользовательские секции, параграфы, которые и содержат выражения. В нашем случае

BEGIN. — пользовательский параграф.

DISPLAY “Hello World!”.

STOP RUN. Собственно сами выражения.

И напоследок. Каждое выражение должно заканчиваться “точкой”.

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

В. Воронцов, 2011.

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

Ну что же, продолжим наше знакомство дальше, в первой статье мы узнали, из чего состоит 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.

В. Воронцов, 2011.

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

В предышущей лекции мы не указали несколько важных ключевых слов для 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

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

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

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

В. Воронцов, 2011.

4. COBOL – IF и его друзья

В этот раз мы познакомимся с вкусностями условий (а также получим дополнительный маленький подарок для знаний в конце).

Итак, я думаю все, кто хоть немного интересовался программированием помнят, что есть наверное во всех практически ЯП – такой оператор как IF (Если), есть он конечно же и в COBOL.

Как записывается?

IF <условие>

<действие1>

(по желанию ELSE )

END-IF.

ВНИМАНИЕ. Это Важно:

Каждое выражение в COBOL заканчивается знаком “.” (точка), это вы уже знаете, НО IF рассматривается как одно выражение, поэтому точка здесь ставится ТОЛЬКО после END-IF.

Будьте внимательны!

Возможные варианты условий:

1. Проверка на тип данных в переменной:

числовая (IS NUMERIC) — проверяется, что в переменной содержится число.

Буквенная (IS ALPHABETIC) – проверяется, что в переменной содержатся ТОЛЬКО буквы и пробелы.

Буквенная (заглавные буквы) и буквенная (прописные буквы) (IS ALPHABETIC-UPPER и ALPHABETIC-LOWER) – проверяется соответственно, что содержатся только заглавные или только прописные буквы и пробелы.

Применялось и применяется для проверки на правильность введенных данных и соответствующей обработки выявленных ошибок.

Например,

IF WS-A IS NUMERIC

MOVE WS-A TO WS-B

ELSE

DISPLAY “Error!”

END-IF.

2. Сравнение:

Оператор (полная форма записи), Сокращенная форма записи, Смысл

IS GREATER THAN IS > Больше, чем

IS NOT GREATER THAN IS NOT > Не больше, чем

IS LESS THAN IS < Меньше, чем

IS NOT LESS THAN IS NOT < Не меньше, чем

IS EQUAL TO IS = Равно

IS NOT EQUAL TO IS NOT = Не равно

IS GREATER THAN OR EQUAL TO IS >= Больше или равно, чем

IS LESS THAN OR EQUAL TO IS <= Меньше или равно, чем

И если со сравнением чисел все понятно, то сравнение буквенных переменных следует уточнить. COBOL подгоняет сравниваемые значения под один размер с помощью пробелов, добавляемых к правому концу. После чего начинается посимвольное сравнение с крайнего левого символа в соответствии с ASCII, EBCDIC (на мэйнфреймах) или другой указанной компилятору кодировкой.

IF TEXT-INPUT IS > “Orange”

DISPLAY “Orange”

DISPLAY TEXT-INPUT

ELSE

DISPLAY TEXT-INPUT

DISPLAY “Orange”

END-IF.

 

Если вы введете Apple то оно будет “меньше”, чем Orange, а вот apple, будет “больше”.

3. Проверка на знак числа:

IS POSITIVE – число положительное;

IS NEGATIVE – число отрицательное;

IS ZERO – число равно нулю;

IS NOT POSITIVE – число НЕ положительное (0 или отрицательное);

IS NOT NEGATIVE – число НЕ отрицательное (0 или положительное);

IS NOT ZERO – число НЕ равно нулю.

Например:

MOVE 100 TO WS-RESULT.

DISPLAY “WS-RESULT IS ”, WS-RESULT.

IF WS-RESULT IS NOT ZERO

DISPLAY “WS-RESULT IS NOT ZERO!”

END-IF.

IF WS-RESULT IS ZERO

DISPLAY “WS-RESULT IS ZERO!”

END-IF.

IF WS-RESULT IS NOT POSITIVE

DISPLAY “WS-RESULT IS NOT POSITIVE!”

END-IF.

IF WS-RESULT IS NOT NEGATIVE

DISPLAY “WS-RESULT IS NOT NEGATIVE!”

END-IF.

IF WS-RESULT IS POSITIVE

DISPLAY “WS-RESULT IS POSITIVE!”

END-IF.

IF WS-RESULT IS NEGATIVE

DISPLAY “WS-RESULT IS NOT ZERO!”

END-IF.

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

WS-RESULT IS 000100

WS-RESULT IS NOT ZERO!

WS-RESULT IS NOT NEGATIVE!

WS-RESULT IS POSITIVE!

4. Использование переменной с условиями:

В одном из предыдущих уроков мы упоминали уровень переменной 88. Теперь пришло время разобраться с ней поближе. Переменная такого типа не имеет описания, она инициализируется сразу при объявлении и может быть только подуровнем другой переменной. Используется она как некий аналог CASE из других языков программирования и хранит в себе значение с которым будет сверяться IF. Например:

Описываем и инициализируем в DATA DIVISION.

01 NUMBER-CHECK PIC S9.

88 NC-ONE VALUE 1.

88 NC-ZERO VALUE 0.

88 NC-MINUS VALUE -1.

Используем в PROCEDURE DIVISION.

ACCEPT NUMBER-CHECK.

IF NC-ONE

DISPLAY “NUMBER-CHECK IS ONE”

END-IF.

IF NC-MINUS

DISPLAY “NUMBER-CHECK IS MINUS”

END-IF.

IF NC-ZERO

DISPLAY “NUMBER-CHECK IS ZERO”

END-IF.

Как это работает:

NC-ONE, NC-MINUS и NC-ZERO – переменные закрепленные за NUMBER-CHECK, когда мы используем IF NC-ONE, то фактически компилятор “подставляет”

IF NUMBER-CHECK = 1.

Помимо VALUE может использоваться VALUES <значение-от> THRU <значение-до>, в таком случае при 88 NC-ONE VALUES 1 THRU 10, будет проверяться попадание значения хранящегося в NUMBER-CHECK в диапазон от 1 до 10.

Помимо перечисленного IF поддерживает NOT, AND и OR, например, IF NOT WS-A = WS-B или IF ((WS-A = WS-B) AND (WS-A = WS-RESULT)) OR (WS-RESULT = WS-B).

В. Воронцов, 2011.

к алгоритмизации   алгоритмы, струкутуры данных и программирование   СУБД   ЯиМП   3GL   4GL   5GL   технологии прогр.

Знаете ли Вы, что конструкторы - это операции, которые используют в качестве аргументов объекты соответствующего им типа и создают другие объекты такого же типа. Например, операция сложения матриц создает новую матрицу.

Bourabai Research Institution home page

Bourabai Research - Технологии XXI века Bourabai Research Institution