КулЛиб - Классная библиотека! Скачать книги бесплатно 

Программирование на Free Pascal и Lazarus [Евгений Ростиславович Алексеев] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
Е.Р. Алексеев
О,В. Чеснокова Т.В. Кучер

Программирование
на Free Pascal и
Lazarus

ИНТУИТ
НАЦИОНАЛЬНЫЙ ОТКРЫТЫЙ УНИВЕРСИТЕТ

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование
Lazarus

на

2-е издание, исправленное

Алексеев Е.Р.
Чеснокова О.В.
Кучер Т.В.

Национальный Открытый Университет "ИНТУИТ"

2016

2

Free

Pascal

и

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Программирование на Free Pascal и Lazarus/ Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер М.: Национальный Открытый Университет "ИНТУИТ", 2016
Free Pascal — свободная реализация языка Паскаль, совместимая с Borland Pascal и
Object Pascal — Delphi, но при этом обладающая и некоторыми дополнительными
возможностями.
Свободный компилятор Free Pascal — кросплатформенный продукт, реализованный, в
частности, доя операционных систем Linux и Windows. Данный курс представляет
собой учебник по алгоритмизации и программированию на основе языка Free Pascal.
Кроме того, читатель познакомится с принципами создания визуальных приложений в
среде Lazarus. К каждой теме прилагаются 25 вариантов задач для самостоятельного
решения, что позволит использовать книгу не только начинающим самостоятельно
изучать программирование, но и преподавателям в учебном процессе.
(с) ООО "ИНТУИТ.РУ", 2015-2016
(с) Алексеев Е.Р., Чеснокова О.В., Кучер Т.В., 2015-2016

з

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Введение. Средства разработки программ на языке Free
Pascal
В этой главе мы начинаем знакомство с программированием на языке
Free Pascal. Язык программирования Free Pascal ведёт своё начало от
классического языка Pascal, который был разработан в конце 60-х годов
XX века Никлаусом Виртом. Н. Вирт разрабатывал этот язык как
учебный язык для своих студентов. С тех пор Pascal, сохранив простоту
и структуру языка, разработанного Н. Виртом, превратился в мощное
средство программирования. С помощью современного языка Pascal
можно производить простые расчёты, разрабатывать программы для
проведения сложных инженерных и экономических вычислений.

О
свободном
образования

программном

обеспечении

для

Эта книга — не просто учебник по программированию на давно уже
ставшем традиционным для преподавания языке Паскаль. Это первое
издание на русском языке, посвященное свободной реализации этого
языка — Free Pascal и свободной же интегрированной среде разработки
Lazarus. Как и любые свободные програм-мы, компилятор Free Pascal
compiler и среда Lazarus могут быть установлены на любое количество
компьютеров бесплатно (без лицензионных отчислений), мо-гут
использоваться без ограничений, их исходные тексты полностью
доступны для изучения и модификации. А это означает, что они
идеально подходят для задач и условий обучения программированию, не
накладывая на учащих и уча-щихся дополнительных расходов и давая
им возможность максимально полно разобраться в предмете (вплоть до
анализа исходных текстов компилятора).
Преимущества свободного программного обеспечения для образования
были признаны в России на самом высоком уровне, и осенью 2007 года
состоялся пер-вый открытый конкурс на разработку и поставку пакета
свободного программ-ного обеспечения. Его победителем стала группа
"Армада". Соисполнителем по этому конкурсу стала компания ALT Linux,
работающая с 2001 года и являюща-яся российским лидером в
разработке свободного ПО и дистрибутивов на базе Linux.
4

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

В рамках проекта сотрудниками ALT Linux был разработан и
протестирован ссылка: пакет свободного программного обеспечения
(ПСПО) - httpУ/linux.armd.ru, который был внедрен бо-лее чем в 1000
школ трех пилотных регионов России — Республики Татарстан,
Пермского края и Томской области. В этих регионах была отработана не
только технология внедрения, но и технология организации
техподдержки, что очень важно для успеха проекта. Несмотря на то что
пилотных регионов только три, любая школа России могла добровольно
присоединиться к проекту и бесплатно получить комплект ПСПО. Для
популяризации этой возможности и проекта в целом был проведен ряд
семинаров в разных уголках страны. По итогам 2008 года, в проекте
внедрения участвует 2151 школа.
В 2010 году компания ALT Linux выпустила новый комплект
образователь-ных дистрибутивов, ссылка: Альт Линукс 5.0 Школьный http://www.altlinux.ru/products/5th-platfornyschool-box/, который является
авторским развитием пакета свободного программного обеспечения
(ПСПО) 2007— 2008 го-дов.
Комплект включает в себя дистрибутивы операционной системы ALT
Linux, содержащие все необходимые программы для подготовки уроков и
обучения ин-форматике, значительный набор программ по математике,
физике, черчению, астрономии и другим предметам, обучающие и
развивающие игры, стандартный набор офисных программ.
Альт Линукс Школьный может быть установлен практически на любой
ком-пьютер, так как включает в себя версии, адаптированные под
различные систем-ные требования аппаратного обеспечения.

Дистрибутивы комплекта Альт Линукс 5.0 Школьный включают
Free Pascal и Lazarus и идеально подходят для освоения материала
книги и организации преподавания на основе языка Free Pascal.
5

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Введение
Авторы книги давно хотели написать учебник по программированию,
который был бы полезен пользователям различных операционных
систем. Благодаря компании ALT Linux, мы попытались это сделать. В
качестве языка программирования был выбран язык Free Pascal, который
представляется нам ясным, логичным и гибким языком и приучает к
хорошему стилю программирования. Свободно распространяемые
компиляторы языка Free Pascal реализованы во многих дистрибутивах
Linux, есть свободные компиляторы и для ОС Windows. Кроме того, в
этой книге мы попытались познакомить читателя с принципами
создания визуальных приложений в среде Lazarus.
В настоящее время существует множество подходов к изучению
программирования.
По
мнению
авторов,
нельзя
изучать
программирование на каком-либо языке, не изучив методы разработки
алгоритмов. Одним из наиболее наглядных методов составления
алгоритмов является язык блок-схем. Об этом свидетельствует и
многолетний опыт авторов преподавания программирования. Мы
попытались
написать
учебник
по
алгоритмизации
и
программированию, насколько нам это удалось — судить читателю.
Авторы надеются, что читатель имеет первоначальные навыки работы
на персональном компьютере под управлением ОС Linux или Windows и
знаком со школьным курсом математики.
Книга состоит из десяти глав.
В первой главе читатель узнает о средствах разработки программ на
Free Pascal, напишет свои первые программы.
Во второй главе изложены основные элементы языка (переменные,
выражения, операторы) Free Pascal. Описаны простейшие операторы
языка: присваивания и ввода-вывода, приведена структура программы,
приведены примеры простейших программ линейной структуры.
Третья
глава
является
одной
из
ключевых
в
изучении
программирования. В ней изложена методика составления алгоритмов с
помощью блок-схем. Приведено большое количество примеров блок6

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

схем алгоритмов и программ различной сложности. Авторы
рекомендуют внимательно разобрать все примеры и выполнить
упражнения этой главы, и только после этого приступать к изучению
последующих глав книги.
В четвёртой главе читатель на большом количестве примеров
познакомится с подпрограммами. Описан механизм передачи
параметров между подпрограммами. Один из параграфов посвящён
рекурсивным подпрограммам. В завершении главы рассмотрен вопрос
создания личных модулей.
Пятая и шестая главы посвящены изучению алгоритмов обработки
массивов и матриц. Здесь же читатель познакомится и с реализацией
этих алгоритмов на языке Free Pascal Именно эти главы совместно с
третьей являются ключом к пониманию принципов программирования.
Седьмая глава знакомит читателя с обработкой файлов на языке Free
Pascal под управлением ОС Linux и Windows. На практических примерах
изложен механизм прямого и последовательного доступа к файлам и
обработки ошибок ввода-вывода. Описана работа с бестиповыми и
текстовыми файлами.
Восьмая глава посвящена обработке строк и записей. Приведённые
примеры позволят читателю разобраться с принципами обработки
таблиц в языке Free PascaL
В
девятой
главе
авторы
описали
принципы
объектноориентированного программирования и их реализацию в языке Free
Pascal.
В десятой главе рассмотрены графические возможности Lazarus,
изложено подробное описание алгоритма построения графиков
непрерывных функций на экране дисплея. Приведены тексты программ
изображения графиков функций с подробными комментариями.
К каждой теме прилагаются 25 вариантов задач для самостоятельного
решения, что позволит использовать книгу не только начинающим
самостоятельно изучать программирование, но и преподавателям в
учебном процессе.
7

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

С рабочими материалами книги можно познакомиться на сайте Евгения
Ростиславовича Алексеева — ссылка: http://www.teacher.dn-ua.corn.
Авторы благодарят компанию ALT Linux и лично Кирилла Маслинского
за возможность издать эту книгу.
Авторы выражают
понимание.

благодарность

своим

родным

за

помощь

и

Алексеев Е. Р., Чеснокова О. В., Кучер Т. В.
Донецк, январь 2009 г.

Средства разработки программ на языке Free Pascal
В этой главе мы начинаем знакомство с программированием на языке
Free Pascal. Язык программирования Free Pascal ведёт своё начало от
классического языка Pascal, который был разработан в конце 60-х годов
XX века Никлаусом Виртом. Н. Вирт разрабатывал этот язык как
учебный язык для своих студентов. С тех пор Pascal, сохранив простоту
и структуру языка, разработанного Н. Виртом, превратился в мощное
средство программирования. С помощью современного языка Pascal
можно производить простые расчёты, разрабатывать программы для
проведения сложных инженерных и экономических вычислений.

1.1 Процесс разработки программы
Разработку программы можно разбить на следующие этапы:
1. Составление алгоритма решения задачи. Алгоритм — это
описание последовательности действий, которые необходимо
выполнить для решения поставленной задачи.
2. Написание текста программы. Текст программы пишут на какомлибо языке программирования (например на Free Pascal) и вводят
его в компьютер с помощью текстового редактора.
3. Отладка программы. Отладка программы — это процесс
устранения ошибок из текста программы. Все ошибки делятся на
синтаксические и логические. При наличии синтаксических
8

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

ошибок (ошибок в написании операторов) программа не
запускается. Подобные ошибки исправляются проще всего.
Логические ошибки — это ошибки, при которых программа
работает, но неправильно. В этом случае программа выдаёт не те
результаты, которые ожидает разработчик или пользователь.
Логические ошибки исправить сложнее, чем синтаксические,
иногда для этого придётся переписывать отдельные участки
программы, а иногда и перерабатывать весь алгоритм.
4. Тестирование программы. Тестирование программы — процесс
выявления ошибок в работе программы.
Процессы отладки и тестирования сопровождаются неоднократным
запуском программы на выполнение. Процесс запуска программы
может быть осуществлён только после того, как введённая в компьютер
программа на алгоритмическом языке P a s c a l будет переведена в
двоичный машинный код и создан исполняемый файл. Процесс
перевода текста программы в машинный код называют трансляцией.
Все трансляторы делятся на два класса:
• интерпретаторы — трансляторы, которые переводят каждый
оператор программы в машинный код, и по мере перевода
операторы выполняются процессором;
• компиляторы переводят всю программу целиком, и если перевод
всей программы прошёл без ошибок, то полученный двоичный
код можно запускать на выполнение.
Если в качестве транслятора выступает компилятор, то процесс
перевода текста программы в машинный код называют компиляцией.
При переводе программы с языка Pascal в машинный код используются
именно компиляторы^.
Рассмотрим основные этапы обработки компилятором программы на
языке Pascal
1. Компилятор анализирует, какие внешние библиотеки^ нужно
подключить, разбирает текст программы на составляющие
элементы, проверяет синтаксические ошибки и в случае их
отсутствия формирует объектный код (в Windows — файл с
9

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

расширением .obj, в Linux — файл с расширением.о). Получаемый
на этом этапе двоичный файл (объектный код) не включает в себя
объектные коды подключаемых библиотек.
2. На втором этапе компоновщик подключает к объектному коду
программы объектные коды библиотек и генерирует исполняемый
код программы. Этот этап называется компоновкой или сборкой
программы. Полученный на этом этапе исполняемый код
программы можно запускать на выполнение.
На сегодняшний день существует множество компиляторов языка Pascal,
среди которых можно выделить Borland Pascal, Delphi, а также свободно
распространяемый кроссплатформенный компилятор языка Free Pascal и
среду визуального программирования Lazarus.

1.2 Среда программирования Free Pascal
Рассмотрим процесс установки компилятора Free Pascal в ОС Linux. Для
установки программ в операционной системе Linux служит менеджер
пакетов. В разных дистрибутивах Linux используются различные
менеджеры пакетов, например, в ALT Linux можно воспользоваться
программой Synaptic. Окно Synaptic представлено на рис. 1.1. В
школьной линейке дистрибутивов ALT Linux Free Pascal и Lazarus
присутствуют сразу после установки операционной системы.

ю

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер
Дайн Правка Пакет

6

Обновить

настройки

Программирование на Free Pascal и Lazarus

Справка

Ш

Отметить для обновления

Найти

Рис. 1.1. Менеджер пакетов Synaptic
Обратите

внимание,

что

для

установки

программ

необходимо

установить список источников программ (список репозиториев^).
Для установки Free Pascal в окне Synaptic (см. рис. 1.1) необходимо
щёлкнуть по кнопке Найти и в открывшемся окне ввести fpc (см. рис.
1.2). Менеджер программ находит программу FreePascal, после чего в
окне Synaptic необходимо отметить программы fpc (Free Pascal Compiler
Meta Package) для установки (с помощью контекстного меню или с
помощью кнопки Отметить для обновления) и начать установку,
щёлкнув по кнопке Применить. После этого начнётся процесс загрузки
пакетов из Интернета и их установки.
В состав метапакета fpc входит компилятор языка Free Pascal fpc и среда
разработки fp-ide. Для запуска среды разработки в Linux необходимо
просто в терминале набрать f p . На рис. 1.3 представлено окно среды
разработки программ на языке Free Pascal в ОС Linux.
п

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Найти:
З агляд ы вать в:

Описание и название

ОО тм енить

Найти

Рис. 1.2. Окно поиска компилятора Free Pascal в Synaptic

Рис. 1.3. Среда программирования Free Pascal в ОС Linux
Для установки Free Pascal в ОС Windows необходимо запустить
скачанный
со
страницы
ссылка:
загрузки
http://www.freepascal.org/down/i386/var инсталяционный файл. Первое
диалоговое окно сообщит о начале процесса установки Free Pascal на
компьютер. Для продолжения установки во всех следующих окнах
нужно выбирать кнопку Next, для возврата к предыдущему шагу —
кнопку Back, а для прерывания процесса установки — кнопку CanceL В
следующем окне нужно определить путь для установки Free PascaL По
умолчанию установка происходит в корневой каталог диска С. Для
12

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

выбора другого пути установки можно воспользоваться кнопкой
Browse... Кроме того, в этом окне выводится информация о количестве
свободного места на диске. В следующих четырёх окнах пользователь
сможет выбрать из списка тип установки: Full Installation (полная),
Minimum Installation
(минимальная),
Custom
Installation
(выбор
компонентов), указать название устанавливаемого приложения в
главном меню, выбрать типы файлов, поддерживаемых средой, и начать
процесс установки Free Pascal, нажав кнопку Install. Контролировать
процесс установки можно с помощью линейного индикатора.

Рис. 1.4. Окно компилятора Free Pascal
Запуск среды программирования Free Pascal в Windows можно
осуществить из главного меню: Пуск — Программы — Free Pascal —
Free Pascal. На экране появится окно, представленное на рис. 1.4.
Установив пакет Free Pascal, мы получили
программирования.

компилятор и среду

Компилятор Free Pascal работает в командной строке. Для того чтобы
создать исполняемый файл из текста программы, написанного на языке
13

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Pascal, необходимо выполнить команду
fpc

name.pas

Здесь fpc — имя исполняемого файла компилятора командной строки
Free Pascal, name.pas — имя файла с текстом программы. В результате в L
innx будет создан исполняемый файл с именем name (в Windows имя
исполняемого файла — name.exe).
При использовании компилятора fpc после компиляции автоматически
происходит компоновка программы (запуск компоновщика make).
Технология работы с компилятором Free Pascal может быть такой:
набираем текст программы в стандартном текстовом редакторе, затем в
терминале запускаем компилятор, после исправления синтаксических
ошибок запускаем исполняемый файл. При такой технологии работы с
компилятором, необходимо не забывать сохранять текст программы,
иначе при запуске компилятора будет компилироваться старая версия
текста программы.
Однако среда программирования позволяет значительно упростить
процесс разработки программ. В состав среды программирования Free
Pascal входит текстовый редактор, транслятор и отладчик. Рассмотрим
их работу подробнее.
1.2.1 Работа в текстовом редакторе Free Pascal
С помощью редактора Free Pascal можно создавать и редактировать
тексты программ. После открытия пустого окна (File — New) или
загрузки текста программы (File — Open) мы находимся в режиме
редактирования, что подтверждается наличием в окне курсора
(небольшого мигающего прямоугольника). Для перехода из режима
редактирования к главному меню нужно нажать клавишу F10, обратно
— Esc. Кроме того, этот переход можно осуществить щелчком мыши
либо по строке главного меню, либо по полю редактора.
Редактор Free Pascal обладает возможностями, характерными для
большинства текстовых редакторов. Остановимся на некоторых
особенностях.
14

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Работа с фрагментами текста (блоками) в редакторе Free Pascal может
осуществляться с помощью главного меню и функциональных клавиш.
Выделить фрагмент текста можно с помощью клавиши Shift и клавиш
перемещения курсора (стрелок).
В главном меню для работы с фрагментами текста предназначены
команды пункта редактирования Edit:







Copy (Ctrl+C) — копировать фрагмент в буфер;
Cut (Ctrl+X) — вырезать фрагмент в буфер;
Paste (Ctrl+V) — вставить фрагмент из буфера;
Clear (Ctrl+Del) — очистить буфер;
Select All— выделить весь текст в окне;
Unselect— отменить выделение.

Команды Сору и Cut применяют только к выделенным фрагментам
текста. Кроме того, пункт меню Edit содержит команды Undo и Redo, с
помощью которых можно отменять и возвращать выполненные
действия.
Комбинации клавиш, предназначенные для работы с блоком, таковы:











Ctrl+K+B — пометить начало блока;
Ctrl+K+K — пометить конец блока;
Ctrl+K+T — пометить в качестве блока слово слева от курсора;
Ctrl+K+Y — стереть блок;
Ctrl+K+C — копировать блок в позицию, где находится курсор;
Ctrl+K+V — переместить блок в позицию, где находится курсор;
Ctrl+K+W — записать блок в файл;
Ctrl+K+R — прочитать блок из файла;
Ctrl+K+P — напечатать блок;
Ctrl+K+H — снять пометку блока; повторное использование
Ctrl+K+H

вновь выделит блок.
Работа с файлами в среде Free Pascal осуществляется с помощью команд
File главного меню и функциональных клавиш:
15

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер







Программирование на Free Pascal и Lazarus

New — открыть окно для создания новой программы;
Open (F3) — открыть ранее созданный файл;
Save (F2) — сохранить созданный файл;
Save As — сохранить файл под другим именем;
Exit (Alt+X) — выйти из среды программирования.

Е1ри создании новой программы ей по умолчанию присваивается
стандартное имя NONAMEOO . PAS (NO NAME — нет имени).
Е1ри первом сохранении файла пользователю будет предложено ввести
его имя. При повторном сохранении файл сохраняется под тем же
именем. Команда Save As аналогична первому сохранению. Если файл
не был сохранён, то при попытке завершить работу со средой, появится
запрос о необходимости сохранить изменения в файле. При открытии
ранее созданного файла его имя выбирают из списка существующих
файлов.
В редакторе Free Pascal допускается работа с несколькими окнами.
Переключаться между окнами можно двумя способами:
• для переключения в окно с номером от первого до девятого
нажать комбинацию клавиш Alt+i, где i — номер окна (например
Alt+5 — вызов пятого окна);
• для вывода списка окон на экран нажать комбинацию клавиш
Alt+O, появится список активных окон, в котором будет
необходимо выбрать нужное и нажать Enter.
1.2.2 Запуск программы в среде Free Pascal и просмотр результатов
После того как текст программы набран, его следует перевести в
машинный код. Для этого необходимо вызвать транслятор с помощью
команды Compile — Compile (комбинация клавиш Alt+F9). На первом
этапе транслятор проверяет наличие синтаксических ошибок. Если в
программе нет синтаксических ошибок, то на экране сообщается о
количестве строк транслированной программы и объёме доступной
оперативной памяти.
Если на каком-либо этапе транслятор обнаружит ошибку, то в окне
16

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

редактора курсор укажет ту строку программы, в которой ошибка была
обнаружена. При этом в верхней строке редактора появится краткое
диагностическое сообщение о причине ошибки.
Для запуска транслированной программы необходимо выполнить
команду Run — Run (комбинация клавиш Ctrl+F9), после чего на экране
появляется окно командной строки, в котором пользователь и
осуществляет диалог с программой. После завершения работы
программы вновь появляется экран среды Free Pascal.
Для просмотра результатов работы программы в ОС Windows
необходимо нажать комбинацию клавиш Alt+F5. Для возврата в
оболочку следует нажать любую клавишу.

17

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер
Файл

Еедактировать



.

С оздать

поиск

И

Документ

Eroject

0

о тк ры ть

Теги Documents

Вид

Программирование на Free Pascal и Lazarus

Построить

Tools

IS

Сохранить

Помощь

и

восстановить

Закрыть

собрать

Еы -элни-с

ft

цвет

Безымянный

1 □{

Тегов не найдено.

2

Безынянный .pas

С

C o p y rig h t 2СОЗ evgem y

;

б

T h is program i s fr e e s o ft w a r e you can r e d is t r ib u t e i t an d /or modify
i t under the t e r r a of the GMJ G eneral P u b lic L ic e n s e as p u b lis h e d by
the F ree S oftw are Foun d atio n; e it h e r v e rs io n 2 o f the L ic e n s e , or
(at your o p tio n ) any l a t e r v e rs io n .

7
8
9
10
И
12
13

T h is program i s d is t r ib u t e d i n the hope t h a t i t w i l l be u s e fu l,
but WITHOUT ANY WARRANTY; w ith o u t even the im p lie d w a rranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the
GNU G e ne ral P u b lic L ic e n s e f o r more d e t a i l s .

Н
15
16

You sho uld have re c e iv e d a copy of the GNU G eneral P u b lic L ice n se
a lo ng w ith t h i s program; i f n o t , w r it e t o the F re e Softw are
Fo u n d a tio n , I n c . , 51 F r a n k lin S t r e e t , F i f t h F lo o r , Boston,
MA 02110-1301, USA.

17
19
19
20
21
22
23
24
25
26
27
28
29

L>

program безынянный ;
fises c r t ;
var i
byte;

:

BEGIN

END.

•1

1

U v/U r.
Сетевое
окружение

lazaruT"

~ zl

^Icompilertest
Й COPYING
@] COPYING.GPL
В COPYING.LGPL
§ COPYING.modifiedLGPL
Igf) editoroptions
‘J.5!erwironmentoptions
'jF] indudelinks
inputhistory
$£lazarus
^Lazarus Forums
§£]Lazarus Home Page
^[Lazarus Wiki Help

Sllazarus.dci
j^lazbuild
H I localize
@1localize,sh
S i Makefile
S i Makefile.fpc
1^1miscellaneousoptions
® primer
£5 primer
£5 project 1
£5 project 1
protocol
ID README

Q

$

^tstartlazarus
3 uninsOOO
J§luninsOCO
1-1unitl
JjJ unitl
Sunitl.lrs
frj Primer_l|

Ш

____ Ш

Имя Файла:

(Unitl

1ип Файла:

fAII File Types(’.“)

3
3

Сохранить
Отмена


Рис. 1.30. Окно сохранения модуля в Windows

48

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

v_______________________________________________________________
Рис. 1.31. Окно сохранения модуля в Linux

49

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 1.32. Окно сохранения проекта в Windows

50

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 1.33. Окно сохранения проекта в Linux

51

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 1.34. Файлы проекта в Windows

Рис. 1.35. Файлы проекта в Linux
52

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

На самом деле все наши манипуляции привели к сохранению более чем
двух файлов. Теперь в каталоге P r i m e r _ l Гр и с . 1.34— 1.35) хранится
файл с текстом программы u n i t l . p a s , файл unitl.lfm ^ со сведениями
о форме Forml, а также файлы p r o j e c t 1 . l p n и p r o j e c t l . l p i ,
содержащие настройки системы программирования и параметры
конфигурации проекта.
Итак, проект сохранён. Все дальнейшие изменения будем сохранять
командой Проект — Сохранить проект.
Теперь можно приступить к визуальному программированию. У нас
есть один объект — форма Forml. Изменим некоторые его свойства с
помощью инспектора объектов.
Перейдём в окно инспектора объектов и найдем в нём свойство
C a p t i o n (Заголовок). Свойство формы C a p t i o n отвечает за текст,
выводимый в заголовке формы. По умолчанию оно имеет значение
F o r m l . Изменим его на слово ПРИМЕР 1 Гр и с . 1.36). Это изменение
сразу же отразится на форме — в поле заголовка появится надпись
"ПРИМЕР 1" (р и с . 1.38). Аналогично можно изменить размеры формы,
присвоив новые значения свойствам H e i g h t (Высота) и W i d t h
(Ширина), ещё проще это сделать, изменив положение границы формы
с помощью кнопки мыши, как это делается со всеми стандартными
окнами.

53

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 1.36. Изменение свойства формы Caption
|;:jr Инспектор объектов

Свойства

^ jn j^

События | Избранное |

PixelsPerlnch

96

3

PopupMenu
Position


SessionProperties
ShowHint

ShowInTaskBar
.........................
Tag
TextHeight

poDesigned
poDesktopCenter
poMainFormCenter
poOwneiForm Cent

Top

poScreenCenter
149

UseDockManager

False

EVertScrollBar

I

poDefault
poDelaultPosUnly
poDefaultSizeOnly



(TControlScrollBar.:

Visible

False

Wirll-h

?sn



_

Рис. 1.37. Изменение свойства формы Position

Рис. 1.38. Изменение заголовка формы

54

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 1.39. Размещение кнопки на форме
Изменим ещё одно свойство формы — P o s i t i o n (положение формы
на экране). Значения этого свойства не вводятся вручную, а выбираются
из списка (р и с . 1.37). Если выбрать свойство p o S c r e e n C e n t e r , то
форма всегда будет появляться в центре экрана.
Напомним, что мы пишем программу про кнопку. Пришло время
поместить её на форму Для этого обратимся к панели компонентов
Гр и с . 1.261 и найдём там компонент Tbutton. Чтобы разместить
компонент на форме, нужно сделать два щелчка мышью: первый — по
компоненту, второй — по окну формы. В результате форма примет вид,
представленный на рис. 1.39.
Теперь у нас два объекта: форма Forml и кнопка Buttonl. Напомним, что
изменения значений свойств в окне инспектора объектов относятся к
выделенно му объекту. Поэтому выделим объект Buttonl и изменим его
заголовок Caption и размеры Height (высота формы), Width (Ширина
формы). В заголовке напишем фразу "Щёлкни мышкой!!!", установим
ширину 135 пикселей, а высоту — 25 пикселей. Сохраним проект
(Проект — Сохранить проект).


в -

&

&

а

е

» 1 DD

п

в

а

и*

Запуск |~~

Рис. 1.40. Кнопка Запуск на панели инструментов Lazarus

55

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 1.41. Результат работы программы
Для того чтобы посмотреть, как работает наша программа, её
необходимо запустить на выполнение. Сделать это можно командой
Запуск — Запуск, функциональной клавишей F9 или кнопкой Запуск на
панели инструментов (рис. 1.40). Созданное окно с кнопкой должно
выглядеть, как на рис. 1.41.
Теперь щёлкнем по кнопке и убедимся, что ничего не произойдет. В
этом нет ничего удивительного, ведь мы ещё не написали ни одной
строчки программного кода. Можно сказать, что мы разработали только
внешнюю часть программы, но не позаботились о функциональной.
Несмотря на это, в окне редактора появился текст программы:

unit Unitl;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls,
Graphics, Dialogs, StdCtrls;
type
{ TForml }
TForml = class (TForm)
Buttonl :TButton;
private
{ private declarations }
public
{ public declarations }
end;
var
Forml : TForml;
56

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

implementation
initialization
{$1 unitl.lrs}

end;
О назначении всех перечисленных в листинге команд мы поговорим
позже. Вернёмся к программе и подумаем, что же мы хотим от нашей
кнопки. Скорее всего, это должна быть реакция на какое то событие,
например на щелчок мыши. После запуска программы на экране
появилось окно, на котором расположена кнопка с надписью 'Щёлкни
мышкой!!!". Предположим, что если мы щёлкнем по ней, она
"обрадуется" и сообщит: "УРА! ЗАРАБОТАЛО!".
Для воплощения этой идеи завершим работу программы, закрыв окно с
кнопкой обычным способом (щелчком по крестику в правом верхнем
углу) и перейдём в режим редактирования. Перейдём к инспектору
объектов, выделим кнопку Buttonl и обратимся к вкладке События
инспектора объектов. Напомним, что здесь расположены описания
событий. Выберем событие OnClick — обработка щелчка мыши и
дважды щёлкнем в поле справа от названия Гр и с . 1.42).
^.'Инспектор объектов

jnjxj

Н ^F o rm ii TForrol
uttonl: TButton
1
Свойства

События

Избранное ]

Ж.

OnChangeBounds
OnClick

||Button1 Click

▼ I ... j—

OriDragDrop
OnDragOver

1.1

1

r-ii-IPik



Рис. 1.42. Выбор события OnClick
В результате описанных
следующий текст:

действий

57

в

окне

редактора

появится

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

procedure TForml. ButtonlClick ( Sender : TO bject);
begin
end;
На данном этапе изложения материала данный текст — это фрагмент
программного кода, именуемый подпрограммой. О назначении этой
подпрограммы
можно
догадаться
по
её
имени
T F o r m l . B u t t o n l C l i c k : на форме Forml для объекта кнопка Buttonl
обрабатывается событие "щелчок мыши" C l i c k . Все команды,
написанные между словами b e g i n и e n d , будут выполняться при
наступлении указанного события (щелчка мыши).
Теперь установим курсор между словами b e g i n и e n d созданной
подпрограммы и напишем:

Buttonl. Caption:= ’УРА! ЗАРАБОТАЛО!
Эта запись означает изменение свойства кнопки. Только теперь мы
выполнили его не с помощью инспектора объектов, а записав оператор
языка программирования. Прочитать его можно так: присвоить (:=)
свойству C a p t i o n объекта Buttonl значение ' УРА ! ЗАРАБОТАЛО ! ' .
Поскольку присваиваемое значение — строка, оно заключено в
одинарные кавычки.
Теперь текст подпрограммы в окне редактора имеет вид:

procedure TForml. ButtonlClick ( Sender : TO bject);
begin
Buttonl. Caption := ’УРА! ЗАРАБОТАЛО!
end;
Сохраним созданную программу, запустим её на выполнение и
убедимся, что кнопка реагирует на щелчок мыши Гр и с . 1.43). Закрыть
проект можно командой Проект — Закрыть проект.

58

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 1.43. Окончательный результат работы программы
1.4.10 Полезная программа
Итак, первая программа написана. Она не несёт особой смысловой
нагрузки. Главная ее задача — показать, что же такое визуальное
программирование. Следующая программа также будет несложной, но
полезной. Мы автоматизируем процесс перевода старой русской меры
веса в современную. Эта задача формулируется так: выполнить перевод
пудов и фунтов в килограммы, если известно, что 1 пуд = 40 фунтам =
16.38 кг.
Итак, наша программа должна позволить пользователю ввести два
числа (пуды и фунты) и после щелчка по кнопке сообщить, каково
значение в килограммах.
Создадим новый проект, выполнив команду Проект — Создать
проект..., и сохраним его в папке P r i m e r _ 2 командой Проект —
Сохранить проект как...
Воспользуемся вкладкой Standard панели компонентов и разместим на
форме следующие компоненты: четыре объекта типа надпись Label (этот
компонент используется для размещения в окне не очень длинных
однострочных надписей); два поля ввода Edit (это редактируемое
текстовое поле, предназначенное для ввода, отображения или
редактирования одной текстовой стоки); одну кнопку Button (этот
компонент обычно используют для реализации некоторой команды).
Компоненты должны располагаться на форме примерно так, как
показано на рис. 1.44.

59

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 1.44. Конструирование формы

Рис. 1.45. Изменение свойств формы и ее компонентов
В первой надписи будет храниться текст 'Меры веса". Две надписи
Label2 и Label3 нужны для пояснения того, какие именно данные
должны вводиться, надпись Label4 понадобится для вывода результата.
В поля ввода Editl и Edit2 будут введены конкретные значения: вес в
60

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

пудах и фунтах. Вычисление веса в килограммах произойдёт при щелчке
по кнопке Buttonl и будет выведено в Label4. Изменим свойства формы
и размещённых на ней компонентов в соответствии с табл. 1.1. табл.
1 .2 , табл. 1.3, табл. 1.4. После всех изменений форма будет иметь вид,
представленный на рис. 1.45.
Таблица 1.1. Значение свойств формы
Свойство

Описание
свойства

Значение

C aption

Перевод из старой русской меры веса в
современную

Заголовок
формы

H eight

230

Высота формы

Width

400

Ширина
формы

F o n t . Name Arial

Название
шрифта

F o n t . S i z e 10

Размер шрифта

Таблица 1.2. Свойства компонентов типа надпись
Свойство

Label2 LabeB LabeW

Labell

C a p t i o n Меры веса пуды фунты В кг:

Описание свойства
Заголовок компонента

H eight

15

15

15

15

Высота компонента

Width

60

30

35

85

Ширина компонента

Top

20

50

105

25

Координата верхнего края

Left

25

115

115

200

Координата левого края

Таблица 1.3. Свойства компонентов поле ввода
Свойство Editl

Edit2

Описание свойства

Text

пробел пробел Текст в поле ввода

H eight

25

25

Высота компонента

Width

135

135

Ширина компонента

Top

40

95

Координата верхнего края

Left

175

175

Координата левого края

Таблица 1.4. Свойства компонента кнопка
Свойство

Значение

Описание свойства
61

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

C a p t i o n ВЫЧИСЛИТЬ Текст на кнопке
H eight

25

Высота компонента

Left

200

Ширина компонента

*Тор!Ш

150

Координата верхнего кра

Width

80

Координата левого края

Интерфейс программы готов. Займёмся вычислительной частью задачи.
Для этого создадим для кнопки Buttonl обработчик событий O n C l i c k ,
для чего дважды щёлкнем по объекту Buttonl левой кнопкой мыши.
Между словами b e g i n и e n d созданной подпрограммы запишем
несколько команд, чтобы получился следующий программный код:

procedure TForml. ButtonlClick ( Sender : TO bject);
var
pud, funt: integer;
k g : real;
begin
pud:= StrToInt ( Editl. Text);
funt := StrToInt ( Edit2. Text);
kg:=pud * 16.38+ funt * 16.38 / 40;
Label4. Caption := ’В килограммах : ’+FloatToStr ( k g );
end;
Рассмотрим программный код построчно.
Строка 1. Заголовок подпрограммы. Он состоит из ключевого слова
procedure и имени подпрограммы T F o r m l . B u t t o n l C l i c k , а в
скобках обычно указывают список параметров подпрограммы, если
таковые имеются.
Строка 2. Открывает блок описания
v a r i a b l e , переменная).

переменных

(var



от

Строка 3. Описывает переменные p u d и f u n t . Компьютер понимает
эту запись как команду выделить в памяти место для хранения двух
целых ч и с е л ^ .
62

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Строка 4. Описывает одну вещественную переменную kg.
Строка 5. Начинает программный блок ( b e g i n — начало ).
Строка 6. Команда, выполняющая следующие действия. Из свойства
Text поля ввода Editl считывает введённую туда информацию. Эта
информация воспринимается компьютером как строка текста
(например, "360" — это строка из трёх символов), а поскольку нам для
вычислений нужны числовые значения, то функция S t r T o I n t
преобразовывает её в целое число. Результат этих преобразований
записывается в память компьютера под именем p u d . Символы
обозначают оператор присваивания. Например, запись а : = 3 . 1 4
читается так: переменной а присвоить значение 3 . 1 4 . Выражение
3 . 1 4 : =а не имеет смысла.
Строка 7. Информация из поля ввода Edit2 преобразовывается в целое
число и записывается в переменную f u n t . Фактически команды,
записанные в шестой и седьмой строках, осуществляют ввод исходных
данных.
Строка 8. Вычисляется значение выражения, результат которого
присваивается переменной kg. Обратите внимание, что умножение
здесь обозначается звездочкой, деление — наклонной чертой, сложение
— знаком "+". Записывая математическое выражение на языке
программирования, нужно чётко указывать все операции. Нельзя,
например, опустить знак умножения, как это принято в математике.

63

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

' Р е д а к то р исходного к о д а Lazarus
Unit1

procedure TForwl.ButtonlClick(Sender: TObject)
var
pud, funt:

31

integer;

kg: r e a l;
begin
pud:=StrToInt(Edit 1.Text) ;
funt:=StrToInt(Edit2.Text) ;



k g = p u d * 1 6 .3 8 + fu n t * 1 6 .3 8 / 4 0 | ;

Labe14.Caption: = 1В килограннах: '+FloatToStr(kg)
end;

J_J
43: 31

В CT

C: \lazarus\Primer_2\unit1. pas

Л

*1

Сообщения

Unitl .pas(43,7) Warning: Local variable "kg" does not seern to be initialized
1nitl,pas(43,31) Error; Illegal expression
Unitl,pas(52) Fatal; There were 1 errors compiling module, stopping

Л

111

Рис. 1.46. Сообщение об ошибке в программе
Строка 9. Изменяет свойство C a p t i o n объекта Label4. В него будет
помещён текст, состоящий из двух строк. Первая —
' В
к и л о г р а м м а х : ' , вторая — значение переменной kg. Знак "+" в
этом выражении применяют для конкатенации (слияния) строк. Кроме
того, поскольку значение переменной kg — вещественное число, оно
преобразовывается в строку функцией F l o a t T o S t r . Фактически в
этой строке был выполнен вывод результатов.
Строка 10. Конец программного блока (end — конец ).
Теперь наша программа может быть откомпилирована и запущена на
выполнение. Процесс компиляции представляет собой перевод
программы с языка программирования в машинный код. Для
компиляции нужно выполнить команду Запуск — Быстрая компиляция.
Во время компиляции проверяется наличие синтаксических ошибок, и в
случае их обнаружения процесс компиляции прерывается. Мы
специально допустили ошибку в восьмой строке программного кода
(пропустили двоеточие в операторе присваивания). Результат
64

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

компиляции программы с синтаксической ошибкой показан на рис. 1.46.
Строка с ошибкой выделена красным цветом, а под окном редактора
появилось окно С ообщ ение^, в котором описана допущенная ошибка.
Ошибку нужно исправить, а программу ещё раз откомпилировать.
После успешной компиляции всех файлов, входящих в проект,
необходимо
собрать
(скомпоновать)
проект
из
объектных
(откомпилированных) файлов (с расширением . о — для L i n u x , . o b j
— для Windows). Для этого следует выполнить команду Запуск —
Собрать или воспользоваться комбинацией клавиш Ctrl+F9. В результате
компоновки будет сгенерирован исполняемый файл, имя которого
совпадает с именем проекта.

Рис. 1.47. Результат работы программы
Вообще говоря, если команду Запуск— Быстрая компиляция опустить, а
сразу выполнить команду Запуск — Собрать, то произойдёт и
компиляция всех файлов проекта и его компоновка.
После успешной компиляции и сборки программу нужно сохранить
(Проект — Сохранить) и запустить. Запуск осуществляется из среды
разработки (Запуск — Запуск) или выполнением файла: в Linux
— . / p r o j e c t l , в Windows — p r o j e c l . e x e . На рис. 1.47 показан
результат работы нашей программы.
65

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Обратите внимание, что ошибки могут возникать и после запуска
программы. Например, в нашем примере исходные данные — целые
числа. Если ввести дробь, появится аварийное сообщение. В подобной
ситуации следует прервать выполнение программы командой Запуск —
Останов (Ctrl+F2).
Вернуться к созданному проекту,
например
с целью
его
усовершенствования, не сложно. Нужно выполнить команду Проект —
Открыть проект... (Ctrl+Fll), перейти к папке с проектом и выбрать из
списка файл с именем p r o j e c t l . l p i .
1.4.11 Консольное приложение среды Lazarus
В Lazaais можно создавать не только визуальные приложения с
графическим интерфейсом, но и писать программы на Free Pascal в
текстовом режиме. Для этого существует консольное приложение.
Чтобы создать новое консольное приложение, нужно выполнить
команду Проект — Создать проект..., в появившемся диалоговом окне
Гр и с . 1.28— 1.29) выбрать фразу Программа пользователя и нажать
кнопку Создать. На экране появится окно редактора программного кода
Гр и с . 1.481. в котором уже представлена общаяструктура программы на
языке Free Pascal.

66

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 1.48. Окно редактора в консольном приложении
В общем виде программа на языке Free Pascal состоит из заголовка
программы, раздела описаний и непосредственно тела программы.
Заголовок программы состоит из ключевого слова p r o g r a m и имени
программы. В нашем случае (рис. 1.481 это P r o j e c t l . Имя было
присвоено программе автоматически. При желании его можно
изменить.
Раздел описаний обычно включает в себя описание констант, типов,
переменных, процедур и функций. На рис. 1.48 видно, что раздел
описаний начинается со слова uses. Это раздел подключения модулей.
Модуль — это специальная программа, которая расширяет возможности
языка программирования. В нашем случае происходит подключение
модуля S y s U t i l s , который позволяет работать с файлами и
каталогами, и модуля C l a s s e s , который работает с компонентами.
За разделом описаний следует исполняемая часть программы, или тело
программы. Оно начинается со служебного слова b e g i n
и
заканчивается служебным словом e n d и точкой. Тело программы
содержит операторы языка, предназначенные для реализации
поставленной задачи.
Кроме того, в тексте программы могут встречаться комментарии.
Комментарий — это текст, заключённый в фигурные скобки или
начинающийся с двух наклонных черт. Этот текст не является
программным кодом, а носит информационный характер. Например, в
нашем случае текст, заключённый в фигурные скобки сразу после
описания модулей, сообщает пользователю о том, что остальные
элементы языка он может добавить самостоятельно.
Рассмотрим пример. Пусть нужно решить задачу перевода градусной
меры угла в радианную. Эта задача известна из школьного курса и
формулируется так: чтобы найти радианную меру какогонибудь угла по
данной градусной мере, нужно умножить число градусов на л/180,
число минут на л/(180 * 60) и найденные произведения сложить.
Текст программы для решения поставленной задачи в консольном
приложении будет иметь вид:
67

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal

Lazarus

program Project!.;
{$mode objfpc}{$H+}
uses
Classes, SysUtils
{ you can add units after dais };
var
gradus, minuta : integer;
radian: real;
begin
write ( ’ gradus= ’ );
readln ( gradus);
write ( ’ minuta= ’ );
readln ( minuta);
radian := gradus * p i/180+minuta * p i/ ( 180 * 60 );
writeln ( ’ radian= ’, radian);
end.
Сохранить, открыть, откомпилировать, скомпоновать и запустить на
выполнение программу в консольном приложении можно так же, как и
в визуальном проекте. Результаты работы нашей программы будет иметь
вид:

gradus=165
minuta=30
radian=2.8885199120506E+000
Нетрудно заметить, что к тексту, созданному автоматически, мы
добавили описание переменных (все используемые в программе
переменные должны быть описаны).

var
gradus, minuta : integer; //Описаны две целочисленные переменные,
radian : real; //Описана вещественная переменная.
и тело программы

68

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

begin //Начало тела программы.
write ( ’ gradus= ’ ); //Вывод на экран символов gradus=.
readln ( gradus ); //Ввод переменной gradus.
write ( ’ minuta= ’ ); //Вывод на экран символов minuta=.
readln ( minuta ); //Ввод переменной minuta.
radian := gradus * pi/180+minuta * pi / ( 180 * 60 ); //Вычисление,
writeln ( ’ radian= ’, radian); //Вывод результата вычислений,
end. //Конец тела программы.
Так как в этой программе графический интерфейс отсутствует, мы
разработали
элементарный
текстовый диалог "компьютер —
пользователь". Для этого были использованы операторы ввода ( r e a d )
и вывода (write) данных.
1.4.12 Операторы ввода — вывода данных
Ввод информации с клавиатуры осуществляется с помощью оператора
r e a d . Он может иметь один из следующих форматов:
read ( xl, х2,..., хп );
или
readln ( xl, х2,..., х п );
где x l , х 2 , . . . , хп — список вводимых переменных. При вводе
вещественных значений целую и дробную часть числа следует
разделять точкой.
Когда в программе встречается оператор r e a d , её действие
приостанавливается до тех пор, пока не будут введены исходные
данные. При вводе числовых значений два числа считаются
разделёнными, если между ними есть хотя бы один пробел, символ
табуляции или конца строки (Enter). После ввода последнего значения
следует нажать Enter.
Оператор r e a d l n аналогичен оператору r e a d , разница заключается в
том, что после считывания последнего в списке значения для одного
оператора r e a d l n данные для следующего оператора r e a d l n будут
69

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

считываться с начала новой строки. Но следует помнить, что Enter
переведёт курсор на новую строку независимо от того, как именно
происходит считывание данных.
Для вывода информации на экран служат операторы
w r i t e I n . В общем случае эти операторы имеют вид:

w rite

и

write ( xl, х2,..., хп );
или
writeln ( xl, х2,..., хп );
где x l ,
х2, . .
хп представляют собой список выводимых
переменных, констант, выражений. Если элемент списка — текстовая
информация, её необходимо взять в кавычки.
Операторы w r i t e и w r i t e l n
последовательно выводят все
переменные. Если используется оператор w r i t e l n , то после вывода
информации курсор перемещается в новую строку.
Итак, в нашем примере оператор w r i t e ( ' g r a d u s = ' ) ; выводит на
экран символы g r a d u s = , которые подсказывают пользователю, что он
должен
ввести
значение переменной
gradus,
а оператор
r e a d l n ( g r a d u s ) ; предназначен для ввода значения переменной
g r a d u s . Оператор w r i t e l n ( ' r a d i a n = ' , r a d i a n ) ; выводит на
экран два значения: строку r a d i a n = и значение переменной r a d i a n .
Как правило, вещественные данные выводятся в формате с плавающей
точкой:
# •# # # # # # # # # # # £ ± # # # ,
где # — любая десятичная цифра от 0 до 9. Для того чтобы перейти к
формату с фиксированной точкой, нужно число, расположенное до
символа t l (мантиссу числа), умножить на 10, возведённое в степень,
значение которой указано после числа t l (порядок числа). Например,

0.35469000000Я- 01 = 0.35469000000* 10"1 = 0.035469,
- 5.43286710000Е+02 = -5.43286710000* 102 = -543.28671.
70

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Чтобы выводить числа в формате с фиксированной точкой, необходимо
использовать форматированный вывод. Для этого оператор w r i t e или
w r i t e I n нужно задать следующим образом:
write (идентификатор : ширина_поля_вывода : дробиая_часть );
где и д е н т и ф и к а т о р — это имя переменной, которая будет выводится
на экран; ш и р и н а _ п о л я _ в ы в о д а — количество позиций (целая
часть, точка, дробная часть), которое будет занимать значение
переменной при выводе; д р о б н а я _ ч а с т ь — количество позиций,
необходимых для дробной части числа.
Например, пусть результат работы нашей программы имеет вид

gradus=165
minuta=30
radian=2.8885199120506E+000
Понятно, что оператор
writeln ( ’ radian= ’, radian );
вывел на экран значение переменной r a d i a n в формате с плавающей
точкой.
Если воспользоваться оператором
writeln ( ’ radian= ’, radian : 5 : 3 );
то результат работы программы будет таким:

gradus=165
minuta=30
radian=2.889
где значение переменной r a d i a n представлено в формате с
фиксированной точкой (всё число занимает пять позиций и три из них
после запятой).
71

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

^ Как и на любом другом языке.
2)
Вместо термина "компилятор" в литературе иногда используют
термин "транслятор компилирующего типа".
3) В библиотеках языка Pascal хранится объектный (двоичный) код
стандартных (таких, как s i n ( x ) t C O s ( x ) и др.) функций и процедур
языка.
4) Список репозиториев — список официальных сайтов, с которых
можно устанавливать программы.
5)
Существует версия Geany и для Windows (ссылка:
http Л www.geany.org/Download/Releases)
61 Это субъективный совет авторов.
7) Интерфейс — диалог, обмен информацией.
81 Не исключено, что вызов Lazarus в других дистрибутивах Linux может
осуществляться и с помощью другой команды главного меню.
91 По умолчанию ярлык создаётся в меню Пуск— Программы.
10)
С помощью щелчка мыши установить маркер в поле рядом с
командой Создать значок на рабочем столе.
п)
Комментарий — фрагмент программного кода, который
игнорируется компилятором. Обычно комментарии используют для
пояснений к программе или для временного исключения фрагментов
текста при отладке.
12) Отдельная программа в Lazarus называется проектом.
13)
Компонент — это готовый программный код, который можно
использовать при написании программы. Пункт меню Компоненты
предназначен для расширения стандартного набора за счёт добавления
компонентов других разработчиков.
141 Команды пункта меню Окружение описаны в параграфе 1.4.6
15)
Координатная сетка отображается только на этапе создания
программы при включённом флажке "Показать сетку" (см. рис. 1.17).
16)
Включить (выключить) Панель компонентов можно, установив
(убрав) маркер рядом с командой Показать палитру компонентов меню
Просмотр.
17) Можно задать и имена файлов, отличные от стандартных Unitl.
181
Свойства Тор и Left определяют расположение компонента
относительно верхнего левого угла формы.
191 О переменных и их типах подробнее рассказывается в следующей
главе.
72

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

2°) Если окно Сообщение отсутствует, его можно вывести на экран
командой Просмотр — Сообщения.

73

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Общие сведения о языке программирования Free Pascal
В этой главе читатель познакомится со структурой проекта в среде
Lazarus и основными элементами языка программирования Free Pascal:
переменными, константами, их типами, основными операциями и
функциями языка.

2.1 Структура проекта Lazarus
Любой проект в Lazarus — это совокупность файлов, из которых
создаётся единый выполняемый файл. В простейшем случае список
файлов проекта имеет вид:






файл описания проекта (. l p i ) ;
файл проекта (. 1р г);
файл ресурсов (. 1 г s);
модуль формы (. 1 f ш);
программный модуль (. p a s ) ;

После компиляции программы из всех файлов проекта создаётся
единый выполняемый файл с расширением.ехе, имя этого файла
совпадает с именем проекта.
Программный модуль, или просто модуль — это отдельно
компилируемая программная единица, которая представляет собой
набор типов данных, констант, переменных, процедур и функций.
Любой модуль имеет следующую структуру:

unit имя_модуля; //Заголовок модуля,
interface
//Раздел описаний,
implementation
//Раздел реализаций,
end. //Конец модуля.
Заголовок модуля — это зарезервированное слово u n i t , за которым
следует имя модуля и точка с запятой. В разделе описаний, который
74

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

открывается
служебным
словом
interface,
описывают
программные элементы — типы, классы, процедуры и функции:

interface
uses список_модулей;
type список_типов;
const список_констант;
var список_переменных;
procedure имя_процедуры;
function имя_функции;

Раздел implementation содержит программный код, реализующий
механизм работы описанных программных элементов (тексты процедур
обработки событий, процедуры и функции, созданные программистом).
Процедуры и функции в Lazarus также построены по модульному
принципу^.
Наряду с визуальными приложениями, Lazarus позволяет разрабатывать
и обычные консольные приложения, которые также могут быть созданы
в оболочке Free Pascal и в текстовом редакторе Geany. Авторы
настоятельно рекомендуют начинать изучение программирования
именно с создания консольных приложений. Поэтому рассмотрим
подробно структуру консольного приложения.

2.2 Структура консольного приложения
Структура консольного приложения имеет вид:
заголовок программы;
uses moduli, modul2,..., moduln;
раздел описаний;
тело программы.

75

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Заголовок программы состоит из служебного слова program, имени
программы,
образованного
по
правилам
использования
идентификаторов (см. п. 2.3), и точки с запятой, например:

program my_prog001;
Предложение
uses
m oduli,
modul2, . . . ,
moduln
предназначено для подключения модулей. В модулях находятся функции
и процедуры языка. Для использования функций и процедур,
находящихся в модуле, необходимо в тексте программы подключить их с
помощью предложения u s e s .
Раздел описаний включает следующие подразделы:





раздел
раздел
раздел
раздел

описания
описания
описания
описания

констант;
типов;
переменных;
процедур и функций.

В языке Free Pascal должны быть описаны все переменные, типы,
константы, которые будут использоваться программой. В стандартном
языке Pascal поря-док следования разделов в программе жёстко
установлен, во Free Pascal такого строгого требования нет. В программе
может быть несколько разделов описания констант, переменных и т. д.
Более подробно структуру консольной программы на языке Free Pascal
можно представить следующим образом:

program имя_программы;
uses moduli, modul2,..., moduln;
const описания_констант;
type описания_типов;
var описания_переменных;
begin
операторы_языка;
end.
Тело программы начинается со слова begin, затем следуют операторы
76

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

языка Pascal, реализующие алгоритм решаемой задачи. Операторы в
языке Pascal отделяются друг от друга точкой с запятой и могут
располагаться в одну строчку или начинаться с новой строки (в этом
случае их также необходимо разделять точкой с запятой). Особо отметим
символ
— он служит для отделения одного оператора от другого.
Можно сказать, что
ставится между операторами. Тело программы
заканчивается служебным словом end; Несмотря на то что операторы
могут располагаться в строке как угодно, рекомендуется размещать их по
одному в строке, а в случае сложных операторов отводить для каждого
несколько строк.
Рассмотрим более подробно структуру программы:

program имя_программы;
uses moduli, modul2,..., moduln;
const описания_констант;
type описания_типов;
var описания_переменных;
begin
оператор_1;
оператор_2;
оператор_п
end.
Приведём пример текста программы на Free Pascal:

program one;
const
a =7;
var
b, c : real;
begin
c :=a +2; b:=c-a * sin ( a )
end.

2.3 Элементы языка
77

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программа на языке Free Pascal может содержать следующие символы:
• латинские буквы А, В, С,..., х, у, z;
• цифры 0, 1, 2,..., 9;
• специальные символы +, /, =, , [, ],., (,
л.

$, #,

@, ‘,

Из символов алфавита формируют ключевые слова и идентификаторы.
Ключевые слова — это служебные слова языка, которые имеют
специальное значение для компилятора и используются только в том
смысле, в котором они определены (операторы языка, типы данных и т.
п.). Идентификатор — совокупность букв, цифр и символа
подчёркивания. Идентификатор начинается с буквы или символа
подчёркивания. Идентификаторы служат для именования различных
объектов (констант, переменных, меток, типов данных, процедур,
функций, модулей, классов) языка. Идентификатор не может содержать
пробел. Прописные и строчные буквы в именах не различаются,
например ABC,
abc,
АЬс — одно и то же имя. Каждое имя
(идентификатор) должно быть уникальным и не совпадать с ключевыми
словами.
В тексте программы можно использовать комментарии. Если текст
начинается с двух символов "косая черта" // и заканчивается символом
перехода на новую строку, заключён в фигурные скобки {} или
располагается между парами символов (* и *), то компилятор его
игнорирует. Например:

{Комментарий может выглядеть так!}
( * Или так. * )
//А если вы используете такой способ,
//то каждая строка должна начинаться
//с двух символов "косая черта".
Комментарии удобно использовать как для пояснений к программе, так
и для временного исключения фрагментов программы при отладке.

2.4 Данные в языке Free Pascal
78

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Для решения задачи в любой программе выполняется обработка какихлибо данных. Данные хранятся в памяти компьютера и могут быть
самых различных типов: целые и вещественные числа, символы,
строки, массивы. Типы данных определяют способ хранения чисел или
символов в памяти компьютера. Они задают размер ячейки, в которую
будет записано то или иное значение, определяя тем самым его
максимальную величину или точность задания. Участок памяти
(ячейка), в котором хранится значение определённого типа, называется
переменной. У переменной есть имя (идентификатор ), тип и значение.
Имя служит для обращения к области памяти, в которой хранится
значение. Во время выполнения программы значение переменной
можно изменить. Перед использованием любая переменная должна
быть описана. Описание переменной на языке Free Pascal
осуществляется с помощью служебного слова v a r :
var имя_переменной : тип_переменной;
Если объявляется несколько переменных одного типа, то описание
выглядит следующим образом:
var переменная_1, переменная_2.....переменная_1Ч: тип_переменных;
Например:

var
ha : integer; //Объявлена целочисленная переменная,
hb, с : real; //Объявлены две вещественные переменные.
Константа — это величина, которая не изменяет своего значения в
процессе выполнения программы. Описание константы имеет вид:
const имя_константы = значение;
Например:

const
h=3; //Целочисленная константа.
bk= -7.521; //Вещественная константа.
79

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

с= ’ abcde

//Символьная константа.

2.4.1 Символьный тип данных
Данные символьного типа в памяти компьютера всегда занимают один
байт. Это связано с тем, что обычно под величину символьного типа
отводят столько памяти, сколько необходимо для хранения любого из
256 символов клавиатуры.
Описывают символьный тип с помощью служебного слова char.
Например:
var с : char;
В тексте программы значения переменных и константы символьного
типа должны быть заключены в апострофы: ' а ' , ' b ' , ' + ' .

2.4.2 Целочисленный тип данных
Целочисленные типы данных могут занимать в памяти компьютера
один, два, четыре или восемь байтов. Диапазоны значений данных
целочисленного типа представлены в табл. 2.1.
Таблица 2.1. Целочисленные типы данных
Тип

Диапазон

Размер, байт

Byte

0... 255

1

Wo r d

0... 65535

2

L o n g W o r d 0... 4294967295

4

S h o r t I n t -128... 127

1

integer

-2147483648... 2147483647 4

Longlnt

-2147483648... 2147483647 4

S m a l l i n t -32768... 32767
I n t 64

_263

2

2 63

8

C a r d i n a l 0... 4294967295

4
80

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Описание целочисленных переменных в программе может быть таким:

var
b : byte; i, j : integer; W: word; L _l, L_2 : longint;

2.4.3 Вещественный тип данных
Внутреннее представление вещественного числа в памяти компьютера
отличается от представления целого числа. Оно представлено в
экспоненциальной форме m b i p , где щ

— мантисса (целое или

дробное число с десятичной точкой), Р — порядок (целое число)^.
Чтобы
перейти
от
экспоненциальной
формы
к обычному
представлению числа^, необходимо мантиссу умножить на десять в
степени порядок. Например:
-36.142Ь + 2 = -36.142 * 102 = 3614.2:7.25b' - 5 = 7.25 * 10~&= 0.0000725.
Вещественное число в Pascal может занимать от четырёх до десяти
байтов. Диапазоны значений вещественного типа представлены в табл.
2.2.
Таблица 2.2. Вещественные типы данных
Тип

Кол-во знач-х Размер,
цифр
байт

Диапазон

Single

1.5E45... 3.4E + 38

7— 8

4

Real

2.9E- 39... 1.7E + 38

15— 16

8

Double

5.0E- 324... 1.7E + 308

15— 16

8

19— 20

10

19— 20

8

19— 20

8

E x t e n d e d 3.4E - 4932... 3.4E + 4932

2 63

Comp

_263

Currency

-922337203685477.5808...
922337203685477.5807

Примеры описания вещественных переменных:

81

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

var
rl, r2 : real; D: double;

2.4.4 Тип дата-время
Тип данных дата-время T D a t e T i m e предназначен для одновременного
хранения даты и времени. В памяти компьютера он занимает восемь
байтов и фактически представляет собой вещественное число, где в
целой части хранится дата, а в дробной — время.

2.4.5 Логический тип данных
Данные логического типа могут принимать только два значения: истина
( t r u e ) или ложь ( f a l s e ) . В стандартном языке Pascal был определён
лишь один логический тип данных — b o o l e a n . Логические типы
данных, определённые в языке Free Pascal, представлены в табл. 2.3.
Таблица 2.3. Логические
типы данных
Тип
Boolean

Размер, байт
1

ByteBool 1
WordBool 2
LongBool 4
Пример объявления логической переменной:
var F L : boolean;

2.4.6 Создание новых типов данных
Несмотря на достаточно мощную структуру встроенных типов данных,
в среде Lazarus предусмотрен механизм создания новых типов. Для
82

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

этого используют служебное слово t y p e :
type новый_тип_данных = определение_типа;
Когда новый тип данных создан, можно объявлять соответствующие
ему переменные:
var список_переменных: новый_тип_данных;
Применение этого механизма мы рассмотрим в следующих параграфах.

2.4.7 Перечислимый тип данных
Перечислимый тип задаётся непосредственным
значений, которые он может принимать:

перечислением

var имя_переменной: (значение_1, значение_2,..., значение_1Ч);
Такой тип может быть полезен, если необходимо описать данное,
которое принимает ограниченное число значений. Например:

var
animal: ( fox, rabbit);
color : ( yellow, blue, green );
Применение перечислимых типов делает программу нагляднее:
type //Создание нового типа данны х— времена года.
year_seasons = ( winter, spring, summer, autumn);
v a r//Описание соответствующей переменной,
y t : year_seasons;

2.4.8 Интервальный тип
Интервальный тип задаётся границами своих значений внутри базового
типа:
83

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

var
имя_переменной: минимальное_значение.. максимальное_значение;
Обратите внимание, что в данной записи два символа точки
рассматриваются как один, поэтому пробел между ними не допускается.
Кроме того, левая граница диапазона не должна превышать правую.
Например:
var
date : 1.. 3 1;
symb : ’ а
’h
Применим механизм создания нового типа данных:
type
//Создание перечислимого типа данных — дни недели.
Week_days = (Mo, Tu, We, Th, Fr, Sa, S u );
//Создание интервального типа данны х— рабочие дни.
Working_days = Mo.. Fr;
var //Описание соответствующей переменной days — рабочие дни.
days : Working_days;

2.4.9 Структурированные типы
Структурированный тип данных характеризуется множественностью
образующих его элементов. В языке Free Pascal это массивы, строки,
записи, множества и файлы.
Массив — совокупность данных одного и того же типа^. Число
элементов массива фиксируется при описании типа и в процессе
выполнения программы не изменяется.
Для описания массива используют ключевые слова a r r a y . . . o f :
имя_массива : array [ список_индексов ] of тип_данных;
где:
84

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

• имя_массива — любой допустимый идентификатор;
• тип_данны х— любой тип языка.
• список_индексов — перечисление диапазонов изменения
номеров элементов массива; количество диапазонов совпадает с
количеством измерений массива; диапазоны отделяются друг от
друга запятой, а границы диапазона, представляющие собой
интервальный тип данных, отделяют друг от друга двумя
символами точки: [ индекс1_нач.. индекс1_кон, индекс2_нач..
индекс2_кон,... ]
Например:
var
//Одномерный массив из 10 целых чисел,
а : array [ 1.. 10 ] of byte;
//Двумерный массив вещественных чисел (3 строки, 3 столбца),
b : array [ 1.. 3, 1.. 3 ] of real;
Ещё один способ описать массив — создать новый тип данных.
Например, так:
type
//Объявляется новый тип данных — трёхмерный массив целых чисел.
massiv=array [ 0.. 4, 1.. 2, 3.. 5 ] of word;
var //Описывается переменная соответствующего типа.
М: massiv;
Для доступа к элементу массива достаточно указать его порядковый
номер, а если массив многомерный (например таблица), то несколько
номеров:
имя_массива[номер_элемента]
Например: а [ 5 ] ,

b[2,

1],

М[ 3 ,

2,

4].

Строка — последовательность символов. В Lazarus строка трактуется
как массив символов, то есть каждый символ строки пронумерован,
начиная с единицы.
При использовании в выражениях строка заключается в апострофы.
85

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Описывают переменные строкового типа так:
имя_переменной : string;
или:
имя_переменной : string [ длина_строки ];
Например:
const S= ’СТРОКА
var
Strl : string;
Str2 : string [ 255 ];
Stroka : string [ 100 ];
Если при описании строковой переменной длина строки не
указывается, это означает, что она составляет 255 символов. В
приведённом примере строки Strl и Str2 одинаковой длины.
Запись — это структура данных, состоящая из фиксированного
количества компонентов, называемых полями записи. В отличие от
массива поля записи могут быть разного типа. При объявлении типа
записи используют ключевые слова r e c o r d . . e n d :
имя_записи = record список_полей end;
здесь
имя_записи

любой
допустимый
идентификатор,
с п и с о к _ п о л е й — описания полей записи. Например:
//Описана структура записи.
//Каждая запись содержит информацию о студенте и
//состоит из двух полей — имя и возраст.
type
student = record
name : string;
age : byte;
end;
var
//Объявлены соответствующие переменные — три объекта типа запись
86

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

а, Ь, с : student;
Доступ к полям записи осуществляется с помощью составного имени:
имя_записи.имя_поля
Например:
a. name:= ’ Ivanov Ivan
a. age := 18;
b. name:=a.name;
Оператор присоединения with имя_записи do упрощает доступ к полям
записи:
with a do
begin
name:= ’ Petrov Petr ’;
age := 19;
end;
Множество — это набор логически связанных друг с другом объектов.
Количество элементов множества может изменяться от 0 до 255.
Множество, не содержащее элементов, называется пустым. Для
описания множества используют ключевые слова s e t o f :
имя_множества = set of базовый_тип_данных;
Например:
type
TwoNumbers = set of 0.. 1;
var
Numl, Num2, Num3 : TwoNumbers;
Файл — это именованная область внешней памяти компьютера. Файл
содержит компоненты одного типа (любого типа, кроме файлов). Длина
созданного файла не оговаривается при его объявлении и
ограничивается только ёмкостью диска, на котором он хранится. В
Lazarus можно объявить типизированный файл:
87

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

имя_файловой_переменой = file of тип_данных;
нетипизированный файл:
имя_файловой_переменой = file;
и текстовый файл:
имя_файловой_переменой = TextFile;
Например:
var
fl : file of byte;
f2 : file;
f3 : TextFile;

2.4.10 Указатели
Как правило, при обработке оператора объявления переменной
имя_переменной:тип_переменной
компилятор автоматически выделяет память под переменную
и м я _ п е р е м е н н о й в соответствии с указанным типом. Доступ к
объявленной переменной осуществляется по её имени. При этом все
обращения к переменной заменяются адресом ячейки памяти, в которой
хранится её значение. При завершении подпрограммы, в которой была
описана переменная, память автоматически освобождается.
Доступ к значению переменной можно получить иным способом —
определить собственные переменные для хранения адресов памяти. Т
акие переменные называют указателями.
Указатель — это переменная, значением которой является адрес памяти,
где хранится объект определённого типа (другая переменная). Как и
любая переменная, указатель должен быть объявлен. При объявлении
указателей всегда указывается тип объекта, который будет храниться по
данному адресу:
88

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

var имя_переменной : Лтип;
Такие указатели называют типизированными. Например:
var р : Л integer;
//По адресу, записанному в переменной р,
//будет храниться переменная типа int,
//или, другими словами, р указывает
//на тип данных integer.
В языке Free Pascal можно объявить указатель, не связанный с каким
либо конкретным типом данных. Для этого применяют служебное
слово p o i n t e r :
var имя_переменной : pointer;
Например:
var х, у : pointer;
Подобные указатели называют нетипизированными и используют для
обработки данных, структура и тип которых меняются в процессе
выполнения программы, то есть динамически.

2.5 Операции и выражения
Выражение задаёт порядок выполнения действий над данными и
состоит из операндов (констант, переменных, обращений к функциям),
круглых скобок и знаков операций, например a + b * s i n ( c o s (х) ) . В
табл. 2.4 представлены основные операции языка программирования
Free Pascal.
Таблица 2.4. Основные операции языка Free Pascal
Операция

Действие

Тип операндов

Тип результата

+

сложение

целый/
вещественный

целый/
вещественный

+

сцепление строк

строковый

строковый

целый/

целый/

89

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

вещественный

вещественный

*

умножение

целый/
вещественный

целый/
вещественный

/

деление

целый/
вещественный

вещественный

d iv

целочисленное деление

целый

целый

mod

остаток от деления

целый

целый

not

арифметическое/
логическое

отрицание

целый/
логический
целый/
логический

and

арифметическое/
логическое И

целый/логический

целый/
логический

or

арифметическое/
логическое ИЛИ

целый/логический

целый/
логический

xor

арифметическое/
логическое исключающее целый/логический
ИЛИ

целый/
логический

shl

сдвиг влево

целый

целый

shr

сдвиг вправо

целый

целый

in

вхождение в множество

множество

логический

<

меньше

не
логический
структурированный

>

больше

не
логический
структурированный

=

больше или равно

не
логический
структурированный

=

равно

не
логический
структурированный



не равно

не
логический
структурированный
90

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

В сложных выражениях порядок, в котором выполняются операции,
соответствует приоритету операций. В языке Free Pascal приняты
следующие приоритеты:
1.
2.
3.
4.

not.
*, / , d i v , m od,
+, - , o r , x o r .
=,,>,=,
1

1

0 0

т

0

13
not 13=-14

Рис. 2.3. Пример арифметического отрицания not А
Сдвиг влево (М s h l
L). Двоичное представление числа J l f
сдвигается влево на £, позиций. Рассмотрим операцию 15 s h l 3.
Число 15 в двоичной системе имеет вид 1111. При сдвиге его на 3
позиции влево получим 1111000. В десятичной системе это двоичное
число равно 120. Итак, 15 s h l 3 = 1 2 0 (рис. 2.4'!.
Заметим, что сдвиг на один разряд влево соответствует умножению на
93

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

два, на два разряда — умножению на четыре, на три — умножению на
восемь. Таким образом, операция М s h l L эквивалентна умножению
числа М на 2 в степени £ .
Сдвиг вправо (М s h r L). В этом случае двоичное представление
числа Л / сдвигается вправо на £ позиций, что эквивалентно
целочисленному делению числа М на 2 в степени
. Например, 15
s h r 1 = 7 Гр и с . 2.5Т 15 s h r 3 = 2.

0 00 00 0 00 0 0 0 0 1 1 11
щ

15

Сдвиг на три позиции

0 00 00 0 00 0 11 1 10 0 0

15 shl 3=120

Рис. 2.4. Сдвиг влево 15 shl 3

0 0 0 0 0 0 0 0 0 0 0 0 11 1 1

15

Сдвиг на одну позицию

0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1

15 shr 1=7

Рис. 2.5. Сдвиг вправо 15 shr 1

2.5.2 Операции отношения
Операции отношения применяются к двум операндам и возвращают в
качестве результата логическое значение. Таких операций семь: > , > = ,
=, 4 — истина. Результат операции х < у зависит от
конкретных значений х и У . Поясним, как работает операция i n .
Первым операндом этой операции должно быть любое выражение,
вторым — множество, состоящее из элементов того же типа. Результат
94

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

операции t r u e (истина), если левый операнд принадлежит множеству,
указанному справа.

2.5.3 Логические операции
В языке Free Pascal определены следующие логические операции o r ,
and,
xor,
n o t . Логические операции выполняются над
логическими значениями t r u e (истина) и f a l s e (ложь). В табл. 2.5
приведены результаты логических операций.
Таблица 2.5. Логические
операции
А В Not A A and В A or В A xor В
t t f

t

t

f

t f f

f

t

t

f t t

f

t

t

f f t

f

f

f

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

2.5.4 Операции над указателями
При работе с указателями используют операции получения адреса и
разадресации.
Операция получения адреса @ возвращает адрес своего операнда.
Например:
var
а : real; //Объявлена вещественная переменная а
adr_a :л real; //Объявлен указатель на тип real
adr_a:=@a; //Оператор записывает в переменную adr_a
//адрес переменной а
95

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Операция разадресации Л возвращает значение переменной, хранящееся
по заданному адресу:
var
а : real; //Объявлена вещественная переменная а
adr_a :Л real; //Объявлен указатель на тип real
a:=adr_a Л; //Оператор записывает в переменную а
//значение, хранящееся по адресу adr_a.

2.6 Стандартные функции
В языке Free Pascal определены стандартные
арифметическими операндами (табл. 2.6Т

функции

Таблица 2.6. Некоторые арифметические функции
Обозначение

Тип результата

Тип
аргументов

Действие

a b s (х)

целый/
целый/
модуль числа
вещественный вещественный

s i n (х)

вещественный вещественный синус

c o s (х)

вещественный вещественный косинус

a r c ta n (х)

вещественный вещественный арктангенс

Pi

без аргумента вещественный число л

e x p (х)

вещественный вещественный экспонента ех

I n (X)

вещественный вещественный

s q r (х)

вещественный вещественный квадрат числа

s q r t (х)

вещественный вещественный корень квадратный

i n t (х )

вещественный вещественный целая часть числа

f г а с (х)

вещественный вещественный дробная часть числа

r o u n d (х)

вещественный целый

округление числа

t r u n c (х)

вещественный целый

отсекание дробной
части числа

96

натуральный
логарифм

над

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

r a n d o m (п)

целый

целый

случайное число от 0
ДО п

Функции, определённые в программном модуле Math^
a r c o s (х)

вещественный вещественный арккосинус

a r c s i n (х)

вещественный вещественный арксинус

a r c c o t (х)

вещественный вещественный арккотангенс

a r c t a n 2 ( у , х ) вещественный вещественный арктангенс у / х
c o s e c a n t (х)

вещественный вещественный косеканс

s e c (х)

вещественный вещественный секанс

c o t (х)

вещественный вещественный котангенс

t a n (х)

вещественный вещественный тангенс

l n X P l (х)

вещественный вещественный

l o g l O (х)

вещественный вещественный десятичный логарифм

1 о д 2 (х )

вещественный вещественный

логарифм по
основанию два

logN (п,х)

вещественный вещественный

Логарифм от х по
основанию п

логарифм
натуральный от х

1

Определённую проблему представляет возведение х в степень п ■
Если значение степени п — целое положительное число, то можно п
раз перемножить х (что даёт более точный результат и при целом п
предпочтительней) или воспользоваться формулой^
IV

= е пЛп^ \

[х п =

- е пЛп^\,

х

> О,

х

< О,

которая программируется с помощью стандартных функций языка:
• е х р ( п * 1 п ( х ) ) — для положительного х
• - е х р ( п* I n ( a b s ( х ) ) ) — для отрицательного х ■
Данную же формулу можно использовать для возведения х в дробную
97

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

степень п , где п — обыкновенная правильная дробь вида k f l , а
знаменатель I — нечётный. Если знаменатель I — чётный, это
означает извлечение корня чётной степени, следовательно, есть
ограничения на выполнение операции (х > 0).
При возведении числа х в отрицательную степень следует помнить,
что

хп
Таким образом, для программирования выражения, содержащего
возведение в степень, надо внимательно проанализировать значения,
которые могут принимать х и п , так как в некоторых случаях
возведение х в степень п невыполнимо.
Некоторые функции, предназначенные
представлены в табл. 2.7.

для

работы

со

строками,

Таблица 2.7. Функции обработки строк
Обозначение

Тип
аргументов

Тип
результата

Действие

Работа со строками
l e n g t h (S )

c o n c a t ( S 1,

строка

S2, . . . )

строки

целое

строка

текущая длин
строки S
объединение
строк S 1 ,
S2, . . .

copy(S,

n,

d e l e t e ( S,

строка, целое,
строка
целое

m)

n,

m)

строка, целое,
строка
целое
98

копирование
символов
строки S
начиная с m-t
позиции
удаление п
символов из
строки S
начиная с m-t

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

позиции

insert(S,

pos (S I,

n,

т)

S2)

строка, целое,
строка
целое

вставка п
символов в
строку S
начиная с m-t
позиции

строки

целое

номер позиц!
с которой
начинается
вхождение SI
S1

c h r (х )

целое

символ

возвращает
символ с коде
X

o r d (с )

символ

целое

возвращает кс
символа с

Преобразование строк в другие типы

StrToDateTame(S)

S t r T o F l o a t (S)

StrToInt(S)

строка

преобразует
символы из
дата и время
строки s в да
и время

строка

преобразует
символы из
вещественное строки s в
вещественно!
число

строка

преобразует
символы из
строки s в
вещественно!
число

целое

преобразует
строку
символов S в
внутреннее
99

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

V a l ( S , X , Kod)

представленг
целой или
вещественно)'
переменной ;
если
преобразован
прошло
успешно,
Kod=0

строка

Обратное преобразование
D a t a T i m e T o S t r (V)

дата и время строка

преобразует
дату и время
строку.

F l o a t T o S t г (V)

вещественное строка

преобразует
вещественно)
число в строг

целое

строка

преобразует
целочисленн!
число в строг

F l o a t T o S t r F ( V , F , P , D ) вещественное строка

преобразует
вещественно)
число V в
строку
символов с
учётом форме
F и параметр
Р, D

IntToStr(V)

Поясним назначение функции F l o a t T o S t r F (V, F, Р, D) . Обычно её
используют для форматированного вывода вещественного числа.
Значения параметра F представлены в табл. 2.8. Р — количество
символов в формируемой из числа строке, D — количество символов в
дробной части числа.
Таблица 2.8. Параметры функции F l o a t T o S t r F
Формат

Назначение
ю о

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

f f E x p o n e n t Экспоненциальная форма представления числа, р —
мантисса, £ ) — порядок: 1.2345Е + 10.
f fFixed

Число в формате с фиксированной точкой, р — общее
количество цифр в представлении числа, £ ) —
количество цифр в дробной части: 12.345.

f fG tneral

Универсальный формат, использует наиболее удобную
форму представления числа.

f fNumber

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

f fCurency

Денежный формат, соответствует f f N u m b e r , но в
конце ставит символ денежной единицы.

Примером работы
программы:

функции

FloatToStrF

служит

фрагмент

var
n : integer;
m: real;
S t : string;
begin
n : = 5;
m: = 4. 8;
St := ’Иванов A. ’;
//Выражение chr(13) — символ окончания строки.
//Для вывода вещественного числа ш отводится 4 позиции
//вместе с точкой, две позиции после точки.
Labell. Caption := ’Студент ’+St+ ’ сдал ’+IntToStr ( n)+
’ экзаменов. ’+ chr (13)+ ’Средний балл составил ’+
FloatToStrF (m, ffFixed, 4, 2 );
end;
Его результатом будет фраза:
С т у д е н т И в а н о в А.

сдал

Средний балл с о с т а в и л

5 экзаменов.
4.80.

В табл. 2.9 приведены функции, предназначенные для работы с датой и
101

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

временем.
Если в процессе работы над программой возникает необходимость в
создании переменной, размер которой неизвестен заранее, используют
динамическую п ам я ть^ . В языке Free Pascal операции распределения
памяти осуществляются по средством представленными в табл. 2.10.
Таблица 2.9. Функции для работы с датой и временем
Тип
аргументов

Обозначение

Тип
результата

Действие

date

без аргумента дата-время

возвращает текущую дату

now

без аргумента дата-время

возвращает текущую дату и
время

tim e

без аргумента дата-время

возвращает текущее время

Таблица 2.10. Функции для работы с памятью
Обозначение

Действие

a d r (х)

Возвращает адрес аргумента х.

d i s p o s e (р)

Возвращает фрагмент динамической памяти,
который ранее был зарезервирован за
типизированным указателем р.

Возвращает фрагмент динамической памяти,
F r e e m e n ( р , s i z e ) который ранее был зарезервирован за
нетипизированным указателем р.
GetMem( р , s i z e )

Резервирует за нетипизированным указателем р
фрагмент динамической памяти размера s i z e .

N e w (р)

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

S i z e O f (х)

Возвращает длину в байтах внутреннего
представления указанного объекта х.

102

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Рис. 2.6. Иллюстрация к задаче 2.1
С подробным описанием приведённых в этой главе функций и
множеством других функций можно ознакомиться в справочной
системе Lazarus.
Рассмотрим решение задачи с использованием стандартных функций.
ЗАДАЧА 2.1. Известны длины сторон треугольника а , 6 и с .
Вычислить площадь S > периметр р и величины углов а, р и у
треугольника Гр и с . 2.61.
Прежде чем приступить к написанию программы, вспомним
математические формулы, необходимые для решения задачи. Для
вычисления площади треугольника применим теорему Герона:
S = у ' г(г - а )(г - Ь ) ( г - с ) ,
где
г — (а -I b + с ) / 2
полупериметр; один из углов найдём по теореме косинусов:

103



Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Рис. 2.7. Проект формы к задаче 2.1
Таблица 2.11. Заголовки компонентов
формы, представленной на рис. 2.7
Компонент

Свойство Caption

Forml

Параметры т р е у г о л ь н и к а

Label1
Label2

В в е д и т е длины с т о р о н

Label3
Label4
Label5
Label 6
Label7

а=
Ь=
с=
Величины у г л о в
a lf а=

Label 8
Label 9

beta =
gamma=
П е р и м е т р Р=

L a b e l10
Buttonl

Пл о ща д ь S=
ВЫЧИСЛИТЬ

cos(ot) = ( Ь2 -4- ( Г — а 2) / ( 2 • b • с ); второй по теореме синусов:

sin(/3)

= b / a • уш(а); третий по формуле: 7 = % —

(а + ,3) •

Решение задачи можно разбить на следующие этапы:

1 . Определение значений а , Ь и с (ввод величин а, Ь и с в
память компьютера).
2. Расчёт значений S, Р, а, Р и у и 7 по приведённым выше
формулам.
3. Вывод значений S, Р, а, р и у и 7 .
Процесс разработки несложного программного интерфейса описан в
главе 1. Попытайтесь самостоятельно разработать внешний вид данной
программы. Разместите на форме десять меток, три поля ввода и одну
кнопку. Измените заголовки формы и меток (свойство C a p t i o n ) в
соответствии с табл. 2.11. В качестве свойства T e x t компонентов Editl,
Edit2, Edit3 установите пробел. В результате форма должна выглядеть
104

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

так, как показано на рис.

2 .1 .

Итак, проект формы готов. В окне программного кода среды Lazarus
автоматически сформировал структуру модуля, перечислив названия
основных разделов. Двойной щелчок по кнопке Вычислить приведёт к
созданию
процедуры
TForml . B u t t o n l C l i c k
в
разделе
im plem entation:
procedure TForml. ButtonlClick ( Sender :T O bject);
begin
end;
и её описанию в разделе i n t e r f a c e . Понятно, что созданная
процедура не содержит ни одной команды. Задача программиста —
заполнить шаблон описаниями и операторами. Все команды, указанные
в процедуре между словами begin и end, будут выполнены при щелчке
по
кнопке
Выполнить.
В
нашем
случае
процедура
T F o r m l . B u t t o n l C l i c k будет иметь вид:
procedure TForml. ButtonlClick ( Sender :T O bject);
//Описание переменных:
// a, b, с - стороны треугольника;
// alfa, beta, gamma - утлы треугольника;
// S - площадь треугольника;
И х - полупериметр треугольника
//Все переменные вещественного типа,
var а, Ь, с, alfa, beta, gamma, S, г : real;
begin
//Из полей ввода Editl, Edit2, Edit3 считываются введенные строки,
//с помощью функции StrToFloat(x) преобразовываются
//в вещественные числа и записываются в переменные а, Ь, с.
а:= StrToFloat ( Editl. Text);
b:= StrToFloat ( Edit2. Text);
c := StrToFloat ( Edit3. Text);
//Вычисление значения полупериметра.
г :=( a+b+c ) / 2;
//Вычисление значения площади,
//для вычисления применяется функция:
// sqrt(x) - корень квадратный из х.
105

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

S:= sqrt ( r * ( r - a ) * ( r - b ) * ( r - c ) ) ;
//Вычисление значения угла alfa в радианах.
//Для вычисления применяем функции:
// acos(x) - арккосинус х;
// sqr(x) - возведение х в квадрат.
alfa := arccos ( ( sqr ( b)+ sqr ( c)-sqr ( a ) ) / 2 / b / c ) ;
//Вычисление значения угла beta в радианах.
//Для вычисления применяем функции:
// asin(x) - арксинус х;
beta := arcsin ( b/a * sin ( а 1f а ));
//Вычисление значения угла gamma в радианах.
//Математическая постоянная определена функцией без аргумента pi.
gamma:= pi -( alfa+beta );
//Перевод из радиан в градусы,
alfa := alfa * 180/ р i;
beta := beta * 180/ p i;
gamma:=gamma * 180/ p i;
//Для вывода результатов вычислений используем
//операцию слияния строк "+" и функцию FloatToStrF(x),
//которая преобразовывает вещественную переменную х в строку
//и выводит ее в указанном формате, в нашем случае
//под переменную отводится три позиции, включая точку
//и ноль позиций после точки.
//Величины углов в градусах выводятся на форму
//в соответствующие объекты типа надпись.
Label6. Caption := ’ alfa= ’+FloatToStrF ( alfa, ffFixed, 3, 0 );
Label7. Caption := ’ beta= ’+FloatToStrF ( beta, ffFixed, 3, 0 );
Label8. Caption := ’gamma= ’+FloatToStrF (gamma, ffFixed, 3, 0 );
//Используем функцию FloatToStrF(x) для форматированного
//вывода, в нашем случае под все число отводится пять позиции,
//включая точку, и две позиций после точки.
//Значения площади и периметра выводятся на форму.
Label9. Caption := ’Периметр Р= ’+FloatToStrF (2 * г, ffFixed, 5, 2 );
LabellO. Caption := ’Площадь S= ’+FloatToStrF ( S, ffFixed, 5, 2 );
end;
Обратите внимание, что были написаны всего десять команд,
предназначенных для решения поставленной задачи. Остальной текст в
окне редактора создаётся автоматически. В результате весь
106

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

программный код (без комментариев) имеет вид:
unit Unitl;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics,
Dialogs, StdCtrls, Math;
type
{ TForml }
TForml = class (TForm)
Buttonl : TButton;
Editl : TEdit;
Edit2 : TEdit;
Edit3 : TEdit;
Labell : TLabel;
LabellO : TLabel;
Label2 : TLabel;
LabeB : TLabel;
Label4 : TLabel;
LabeB : TLabel;
LabeB : TLabel;
LabeB : TLabel;
Label8 : TLabel;
LabeB : TLabel;
procedure ButtonlClick ( Sender : TO bject);
private
{ private declarations }
public
{ public declarations }
end;
var
Forml : TForml;
implementation
{ TForml }
procedure TForml. ButtonlClick ( Sender : TO bject);
var a, b, c, alfa, beta, gamma, S, r : real;
begin
a:= StrToFloat ( Editl. Text);
107

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

b:= StrToFloat ( Edil2. Text);
с := StrToFloat ( Edit3. Text);
r :=( a+b+c ) / 2;
S:= sqrt ( r * ( r - a ) * ( r - b ) * ( r - c ) ) ;
alfa := arccos ( ( sqr ( b)+ sqr ( c)-sqr ( a ) ) / 2 / b / c ) ;
beta := arcsin ( b/a * sin ( alfa ));
gamma:= pi -( alfa+beta );
alfa := alfa * 180/ p i;
beta := beta * 180/ p i;
gamma:=gamma * 180/ p i;
Label6. Caption := ’ a 1f a= ’+FloatToStrF ( alfa, ffFixed, 3, 0 );
Label7. Caption := ’ beta= ’+FloatToStrF ( beta, ffFixed, 3, 0 );
Label8. Caption := ’gamma= ’+FloatToStrF (gamma, ffFixed, 3, 0 );
Label9. Caption := ’Периметр P= ’+
FloatToStrF (2 * r, ffFixed, 5, 2 );
LabellO. Caption := ’Площадь S= ’+FloatToStrF ( S, ffFixed, 5, 2 );
end;
initialization
{$1 unitl.lrs}
end.

108

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Рис. 2.8. Результат работы программы к задаче 2.1
На рис. 2.8 представлено диалоговое окно, которое появится, если
запустить эту программу, щёлкнув по кнопке Вычислить.
Теперь напишем консольное приложение для решения этой задачи. Для
этого запустим текстовый редактор Geany. Выполним команду Файл —
New with Template — Pascal Source File. В открывшемся окне реактора
введём следующий текст программы.
program ргЗ;
//Подключение модуля для работы с математическими функциями,
//см. табл. 2.6.
uses math;
//Описание всех используемых переменных.
var а, Ь, с, г, s, alfa, beta, gamma : real;
begin
//Ввод сторон трегольника.
writeln ( ’Введите стороны треугольника ’ );
readln ( a, b, с );
//Вычисление значения полупериметра.
R:=( a+b+c ) / 2;
//Вычисление значения площади,
//для вычисления применяется функция:
// sqrt(x) — корень квадратный из х.
S:= sqrt ( r * ( r - a ) * ( r - b ) * ( r - c ) ) ;
//Вычисление значения угла alfa в радианах.
//Для вычисления применяем функции:
// acos(x) - арккосинус х;
// sqr(x) — возведение х в квадрат.
alfa := arccos ( ( sqr ( b)+ sqr ( c) - sqr ( a ) ) / 2 / b / c ) ;
//Вычисление значения угла beta в радианах.
//Для вычисления применяем функции:
// asin(x) - арксинус х;
beta := arcsin ( b/a * sin ( alfa ));
//Вычисление значения угла gamma в радианах.
//Математическая постоянная определена
//функцией без аргумента pi.
gamma:= pi - ( alfa+beta );
109

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

//Перевод из радиан в градусы,
alfa := alfa * 180/ р i;
beta := beta * 180/ p i;
gamma:=gamma * 180/ p i;
//Вывод площади и сторон треугольника.
writeln ( ’Площадь треугольника = ’, S : 6 : 2 );
writeln ( ’ alf= alfa : 6 : 2, ’ bet= beta : 6 : 2, ’ gam= gamma : 6 : 2 );
end.
Для компиляции программы в Geany необходимо выполнить команду
Построить — Собрать (F8), для запуска — Построить — Выполнить
(F5). На рис. 2.9 представлены результаты работы программы.
Введите стороны треугольника
345
Площадь треугольника = 6.00
alf= 36.87 bet= 53.13 gam= 90.00

Рис. 2.9. Результаты работы консольного приложения решения задачи
2.1

^ Подробно о процедурах и функциях см. в главе 4.
2)
Действия над числами, представленными в экспоненциальной
форме, называют арифметикой с плавающей точкой, так как положение
десятичной точки меняется в зависимости от порядка числа.
3)
Число в обычном его представлении называют числом с
фиксированной точкой.
4) Подробно о массивах см. в главе 5
5) Конъюнкция.
п о

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

6) Дизъюнкция.
7) Побитная инверсия — замена в двоичном представлении числа
нулей единицами, единиц — нулями.
8) Эти функции будут работать только в том случае, если в тексте
основной программой после ключевого слова U n i t указать имя M a th .
9)
Формула формируется следующим образом: логарифмируем
выражение х п , получается n l n ( x ) , затем экспоненцируем последнее.
10) Динамическая память — это область памяти, которая в процессе
компиляции отводится для хранения временных данных.

i n

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Операторы управления
В этой главе изложена методика составления алгоритмов с помощью
блок-схем и описаны основные операторы языка: условный оператор if,
оператор выбора case, операторы цикла while..do, repeat..until, for..do.
Приводится большое количество примеров составления программ
различной сложности.

3.1 Основные конструкции алгоритма
Как правило,
созданию
программы
предшествует разработка
алгоритма^. Алгоритм — это чёткое описание последовательности
действий, которые необходимо выполнить для того, чтобы при
соответствующих исходных данных получить требуемый результат.
Одним из способов представления алгоритма является блок-схема. При
составлении блок-схемы все этапы решения задачи изображаются с
помощью различных геометрических фигур. Эти фигуры называют
блоками и, как правило, сопровождают текстом. Последовательность
выполнения этапов указывают при помощи стрелок, соединяющих эти
блоки. Типичные этапы решения задачи изображаются следующими
геометрическими фигурами:
• блок начала (конца ) (рис. З.Г). Текст внутри блока: "начало"
("конец");

Рис. 3.1. Блок начала (конца) алгоритма
• блок ввода (вывода ) данных (рис. 3.21. Текст внутри блока: "ввод"
("вывод" или "печать") и список вводимых (выводимых)
переменных;

Рис. 3.2. Блок ввода (вывода)
112

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

• блок решения, или арифметический (рис. З.ЗУ Внутри блока
записывается действие, вычислительная операция или группа
операций;

Рис. 3.3. Арифметический блок
• условный блок Гр и с . 3.4~). Логическое условие записывается
внутри блока. В результате проверки условия осуществляется
выбор одного из возможных путей (ветвей) вычислительного
процесса.

Рис. 3.4. Условный блок
Рассмотренные блоки позволяют описать три основные конструкции
алгоритма : линейный процесс, разветвляющийся процесс и
циклический процесс.
Линейный процесс — это конструкция, представляющая
последовательное выполнение двух или более блоков Гр и с . 3.5У

собой

Разветвляющийся процесс задаёт выполнение одного или другого
оператора в зависимости от выполнения условия (рис. 3.6).
Циклический процесс задаёт многократное выполнение оператора или
группы операторов (рис. 3.7~).

из

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 3.5. Линейный процесс

Рис. 3.6. Разветвляющийся процесс

Рис. 3.7. Циклический процесс
114

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Нетрудно заметить, что каждая из основных конструкций алгоритма
имеет один вход и один выход. Это позволяет вкладывать конструкции
друг в друга произвольным образом и составлять алгоритмы для
решения задач любой сложности.
Рассмотрим операторы
языка программирования
реализующие основные конструкции алгоритма.

Free

Pascal,

3.2 Оператор присваивания
Оператор присваивания в языке Free Pascal состоит из двух символов:
двоеточия и знака равенства. Символы := всегда пишут слитно.
Пробелы допускаются перед символом двоеточия и после символа
равенства.
В общем случае оператор присваивания имеет вид:
имя_переменной := значение;
где з н а ч е н и е — это выражение, переменная, константа или функция.
Выполняется оператор так. Сначала вычисляется значение выражения,
указанного в правой части оператора, а затем его результат
записывается в область памяти (переменную), имя которой указано
слева. Например, запись а : =Ь означает, что переменной а
присваивается значение выражения Ь.
Типы переменной а и выражения b должны совпадать или быть
совместимыми для присваивания, то есть тип, к которому принадлежит
Ь, должен находиться в границах типа переменной а.
Оператор присваивания, как и любой другой оператор в языке Free
Pascal, отделяется от других точкой с запятой.

3.3 Составной оператор
Составной оператор — группа операторов, отделённых друг от друга
точкой с запятой, начинающихся со служебного слова b e g i n и
заканчивающихся служебным словом e n d :
115

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

begin
оператор_1;
оператор_п
end;
Транслятор воспринимает составной оператор как один оператор.

3.4 Условные операторы
В языке Free Pascal одна из основных конструкций алгоритма,
разветвляющийся процесс, реализована двумя условными операторами:
i f и c a s e . Рассмотрим каждый из них.

3.4.1 Условный оператор if..then..else
При решении большинства задач порядок вычислений зависит от
определённых условий, например от исходных данных или от
промежуточных результатов, полученных на предыдущих шагах
программы. Для организации вычислений в зависимости от какоголибо условия в языке Free Pascal используется условный оператор
i f . . t h e n . . e l s e , который в общем виде записывается так:

п б

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 3.8. Алгоритм условного оператора if..then..else
if условие then оператор_1 else оператор_2;
где i f . . t h e n . . e l s e

— зарезервированные слова, у с л о в и е —

выражение логического типа^, о п е р а т о р _ 1
любые операторы языка Free Pascal.

и оператор_2



Работа условного оператора организована следующим образом. Сначала
вычисляется выражение, записанное в у с л о в и и . Если оно имеет
значение истина ( T r u e ) , то выполняется о п е р а т о р _ 1 . В противном
случае, когда выражение имеет значение ложь ( F a l s e ) , о п е р а т о р _ 1
игнорируется и управление передаётся о п е р а т о р у _ 2 .
Алгоритм,
который
реализован
в
i f . . t h e n , . e l s e , представлен на рис. 3.8.

условном

Например, чтобы сравнить значения переменных х
создать следующий программный код:
write ( ’ х= ’ ); readln ( х );
write ( ’ у= ’ ); readln ( у );
П7

операторе

и У , нужно

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

if х=у then
writeln ( ’значение х равно значению у ’ )
else writeln ( ’значение х не равно значению у ’ );
Если в задаче требуется, чтобы в зависимости от значения условия
выполнялся не один оператор, а несколько, необходимо использовать
составной оператор:
if условие then
begin
оператор_1;
оператор_2;
оператор_п;
end
else
begin
оператор_1;
оператор_2;
оператор_п;
end;
Альтернативная ветвь
else
в условном
отсутствовать, если в ней нет необходимости:

операторе

может

if условие then оператор;
или
if условие then
begin
оператор_1;
оператор_2;
оператор_п;
end;
В таком "усечённом" виде условный оператор работает так: оператор
(группа операторов) либо выполняется, либо пропускается в
зависимости от значения выражения, представляющего условие.
Алгоритм этого условного процесса представлен на рис. 3.9.
118

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Пример применения условного оператора, без альтернативной ветви
else может быть таким:
write ( ’ х= ’ ); readln ( х );
write ( ’ у= ’ ); readln ( у );
с : = 0;
{Значение переменной с изменяется только при условии,}
{что х не равно у.}
if ( ху) then с :=х+у;
{Вывод на экран значения переменной с}
{выполняется в любом случае.}
writeln ( ’Значение переменной с= ’, с );
Условные операторы могут быть вложены друг в друга. При вложениях
условных операторов всегда действует правило: альтернатива e l s e
считается принадлежащей ближайшему i f , имеющему ветвь e l s e .
Например, в записи он принадлежит оператору i f с у с л о в и е м _ 1 .

Рис. 3.9. Алгоритм условного оператора if без альтернативной ветви
else
ifycnoBHe_l then
119

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

if условие_2 then
оператор_А
else оператор_Б;
о п е р а т о р _ Б относится к у с л о в и ю _ 2 , а в конструкции
ifycnoBHe_l then
begin
йусловие_2 then
оператор_А;
end
else оператор_Б;
Для сравнения переменных в условных выражениях применяют
операции отношения : = ,
о ,
,
=. Условные
выражения составляют с использованием логических операций and, or
и not. В языке Free Pascal приоритет операций отношения меньше, чем у
логических операций, поэтому составные части сложного логического
выражения заключают в скобки.
Допустим, нужно проверить, принадлежит ли переменная х интервалу
[о, 6]. Условный оператор будет иметь вид:
if ( х>=а ) and ( x=а and x=(а and x)1.

Составим словесный алгоритм решения этой задачи:
1. Начало алгоритма.
2. Ввод числа х (аргумент функции).
3. Если значение х меньше либо равно -2, то переход к п. 4, иначе
переход к п. 5.
121

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

4. Вычисление значения функции: у = 4, переход к п. 8.
5. Если значение х больше либо равно 1, то переход к п. 6, иначе
переход к п. 7.
6. Вычисление значения функции: у — 1, переход к п. 8.
7. Вычисление значения функции: у = х 2 ■
8. Вывод значений аргумента х и функции У .
9. Конец алгоритма.
Блок-схема, соответствующая описанному алгоритму, представлена на
рисунке 3.11. Как видно, блок-схема нагляднее и проще для восприятия,
чем словесное описание алгоритма. В дальнейшем для описания
алгоритма мы часто будем использовать именно блок-схемы.

Рис. 3.11. Блок-схема алгоритма решения задачи 3.1
122

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Текст программы на языке Free Pascal будет иметь вид:
var
х, у : real;
begin
write ( ’ х= ’ );
readln ( х );
if х=l theny:=l
else y:= sqr ( x );
writeln ( ’ x= x : 5 : 2, ’ y=
end.

у : 5 : 2 );

Эту программу можно ввести в текстовом редакторе Geany (или в
текстовом редакторе Free Pascal) и запустить на выполнение.
ЗАДАЧА 3.2. Даны

вещественные числа

х

и

У .

Определить,

принадлежит ли точка с координатами (Д::г/) заштрихованной части
плоскости (рис. 3.12).
Как

х



показано

—1, х =

(а:; у )

на

рис.

3, у = —2

3.12.

и у =

4.

область

ограничена

линиями

Значит, точка с координатами

будет принадлежать этой области, если будут выполняться

>

следующие условия: х
—1, х
лежит за пределами области.
Блок-схема, описывающая
представлена на рис. 3.13.

< 3, у > —2

алгоритм

123

и у

решения

< 4. Иначе
данной

точка

задачи,

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus


X
-2

Рис. 3.12. Графическое представление задачи 3.2

124

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 3.13. Алгоритм решения задачи 3.2
Текст программы к задаче 3.2:
var х, у : real;
begin
write ( ’ х= ’ ); readln ( х );
write ( ’ у= ’ ); readln ( у );
if ( х>= -1) and ( х= -2) and ( y0

1

2

D 0 и у 2 > 0 (блок 8), то вычисляются четыре корня по

формулам =Ь
гЬ-у/уз (блок 9) и выводятся значения корней
(блок 10 ).
6. Если условия 4) и 5) не выполняются, то необходимо проверить
знак У \ . Если гд > 0 (блок 11), то вычисляются два корня по
формуле

(блок 12 ), иначе (если у 2 > 0 ) вычисляются два

корня по формуле i y ' y T (блок 13).
7. Вывод вычисленных значений корней (блок 14).

137

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 3.17. Алгоритм решения биквадратного уравнения
Текст программы на языке Free Pascal с комментариями:
//Описание переменных:
//а,Ь,с - коэффициенты биквадратного уравнения,
138

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

//d - дискриминант,
//х1,х2,хЗ,х4 - корни биквадратного уравнения,
//у 1 ,у2 - корни квадратного уравнения ауЛ2 +Ьу+с=0.
var
а, Ь, с, d, xl, х2, хЗ, х4, yl, у2 : real;
begin
//Ввод коэффициентов уравнения.
writeln ( ’Введите коэффициенты биквадратного уравнения ’ );
readln ( а, b, с );
//Вычисление дискриминанта.
d:=b * b-4*a*c;
//Если он отрицателен,
if d = О,
else
begin
//вычисление корней квадратного уравнения.
yl:=(-b+sqrt ( d ) ) / 2 /a ;
y2 :=(-b-sqrt ( d ) ) / ( 2 * a ) ;
//Если оба корня квадратного уравнения < О,
if ( yl < 0) and ( у2 = О,
else if ( yl> = 0) and ( у2 >= 0) then
begin
//вычисление четырех корней биквадратного уравнения.
xl:= sqrt ( y l );
x2 :=-xl;
хЗ:= sqrt ( у2 );
x4:=-sqrt ( у2 );
//Вывод корней биквадратного уравнения на экран,
writeln ( ’Х1= ’, xl : 6 : 3, ’ Х2= ’, х2 : 6 :3 );
writeln ( ’Х3= ’, хЗ : 6 : 3, ’ Х4= ’, х4 : 6 :3 );
end
//Если не выполнились оба условия
//1 . у!=0,
//то проверяем условие у 1>=0
else if ( yl> = 0) then
//Если оно истинно
begin
xl:= sqrt ( y l );
х2 :=-х1 ;
writeln ( ’Х1= ’, х1 : 6 : 3, ’ Х2= х2 : 6 : 3 );
end
else
//Если условие у1>=0 ложно, то
begin
xl:= sqrt ( у2 );
х2 :=-х1 ;
writeln ( ’Х1= х1 : 6 :3, ’ Х2= х2 : 6 : 3 );
end
end
end.

3.4.2 Оператор варианта case
Оператор варианта case необходим в тех случаях, когда в зависимости от
значений какой-либо переменной надо выполнить те или иные
операторы.
case выражение of
значение _1 : оператор_ 1 ;
значение _2 : оператор_ 2 ;
значение_1Ч : оператор_1М
else
альтернативный_оператор
end;
Здесь в ы р а ж е н и е — переменная перечислимого типа (включая c h a r
и boolean), значение_1,
значение_2, . . .,
значение_Ы
— это конкретное значение управляющей переменной или выражение,
при котором необходимо выполнить соответствующий оператор,
140

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

игнорируя остальные варианты. Значения в каждом наборе должны
быть уникальны, то есть они могут появляться только в одном варианте.
Пересечение наборов значений для разных вариантов является
ошибкой.
Оператор работает следующим образом. Вычисляется значение
выражения.
Затем
выполняется
оператор,
помеченный
з н а ч е н и е м , совпадающим со значением в ы р а ж е н и я . То есть, если
выражение
принимает
значение_1,
то
выполняется
о п е р а т о р _ 1 . Если выражение принимает з н а ч е н и е _ 2 , то
выполняется о п е р а т о р _ 2 и так далее. Если в ы р а ж е н и е не
принимает
ни
одно
из
значений,
то
выполняется
а л ь т е р н а т и в н ы й _ о п е р а т о р , расположенный после ключевого
слова e l s e .
Альтернативная ветвь e l s e может отсутствовать, тогда оператор имеет
вид:
case выражение of
значение _1 : оператор_ 1 ;
значение _2 : оператор_ 2 ;
значениеДЧ :оператор_1М;
end;
Кроме того, в операторе case допустимо использование составного
оператора. Например:
case выражение of
значение_1 : begin оператор_А; оператор_В; end;
значение_2 : begin оператор_С; onepaTop_D; оператор_Е; end;
значениеДЧ :оператор_1М;
end;
Рассмотрим применение оператора варианта на следующих примерах.
ЗАДАЧА 3.7. Вывести на печать название дня недели, соответствующее
заданному числу D, при условии, что в месяце 31 день и первое число
141

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

— понедельник.
Для решения задачи воспользуемся операцией mod, позволяющей
вычислить остаток от деления двух чисел, и условием, что первое число
— понедельник. Если в результате остаток от деления (обозначим его R )
заданного числа D на семь будет равен единице, то это понедельник,
двойке — вторник, тройке — среда и так далее. Следовательно, при
построении алгоритма необходимо использовать семь условных
операторов, как показано на рис. 3.18.
Решение задачи станет значительно проще, если при написании
программы воспользоваться оператором варианта:
var d : byte;
begin
write ( ’Введите число D= ’ );
readln (D);
case D mod 7 of {Вычисляется остаток от деления D на 7.}
{В зависимости от полученного значения}
{на печать выводится название дня недели}
1 : writeln ( ’ПОНЕДЕЛЬНИК ’ );
2 : writeln ( ’ВТОРНИК ’ );
3 : writeln ( ’СРЕДА ’ );
4 : writeln ( ’ЧЕТВЕРГ ’ );
5 : writeln ( ’ПЯТНИЦА ’ );
6 : writeln ( ’СУББОТА ’ );
О : writeln ( ’ВОСКРЕСЕНЬЕ ’ );
end;
end.

142

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 3.18. Алгоритм решения задачи 3.7
В предложенной записи оператора варианта отсутствует ветвь e l s e .
Это объясняется тем, что переменная R может принимать только одно
из указанных значений, т. е. 1, 2, 3, 4, 5, 6 или 0.
ЗАДАЧА 3.8. По заданному номеру месяца m вывести на печать
название времени года.
143

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Для решения данной задачи необходимо проверить выполнение
четырёх условий. Если заданное число m равно 12, 1 или 2, то это зима,
если m попадает в диапазон от 3 до 5, то весна; лето определяется
принадлежностью числа m диапазону от 6 до 8, и, соответственно, при
равенстве переменной ш 9, 10 или 11 это осень. Понятно, что область
возможных значений переменной ш находится в диапазоне от 1 до 12 , и
если пользователь введет число, не входящее в этот интервал, то
появится сообщение об ошибке. Для этого в операторе case программы
предусмотрена альтернативная ветка e l s e .
var m: byte;
begin
write ( ’Введите номер месяца m= ’ ); readln (m);
//Проверка области допустимых значений переменной m.
case m of
//В зависимости от значения m на печать
//выводится название времени года.
1 2, 1, 2 : writeln ( ’ЗИМА ’ ); }
3.. 5 : writeln ( ’ВЕСНА ’ ); }
6.. 8 : writeln ( ’ЛЕТО ’ ); }
9.. 1 1 : writeln ( ’ОСЕНЬ ’ )}
//Если значение переменной m выходит за пределы области
//допустимых значений, то выдается сообщение об ошибке,
else writeln ( ’ОШИБКА ПРИ ВВОДЕ ! ! ! ’ );
end
end.

3.4.3 Обработка ошибок. Вывод сообщений в среде
Lazarus
Понятно, что чем меньше в программе ошибок, тем она лучше. В очень
хорошей программе ошибок нет вообще. А это значит, что программист
должен не только основательно продумать алгоритм поставленной
задачи, но и предугадать ошибки, которые может допустить
пользователь, работая с программой.
Если пользователь допустил ошибку, например, при вводе данных, его
144

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

необходимо
проинформировать
об
этом.
Для этого
можно
воспользоваться функцией M e s s a g e D l g , которая выводит сообщение
в отдельном окне. В общем виде функцию записывают так:
MessageDlg (сообщение, тип_сообщения, [ список_кнопок ], справка );
где
• с о о б щ е н и е — текст, который будет отображён в окне
сообщения;
• т и п _ с о о б щ е н и я — определяет внешний вид окна (табл. 3.2):
• с п и с о к _ к н о п о к — константы (перечисляются через запятую),
определяющие тип кнопок окна сообщения (табл. 3.3):
• с п р а в к а — номер окна справочной системы, которое будет
выведено на экран, если нажать F1; параметр равен нулю, если
использование справки не предусмотрено.
Таблица 3.2. Тип окна сообщения
Параметр

Тип окна сообщения

m tlnform ation

информационное

mtWarning

предупредительное

m tError

сообщение об ошибке

m t C o n f i r m a t i o n запрос на подтверждение
mtCustom

обычное

Таблица 3.3. Тип кнопки
в окне сообщения
Константа
mbYes

Кнопка

mbNo

Да
Нет

mbOk

Ок

mbCancel

Отмена

mbAbort

Прервать

mbRetry

Повторить

m b l g n o r e Пропустить
145

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

mbHelp

Программирование на Free Pascal и Lazarus

Помощь

Рис. 3.19. Конструирование формы для решения квадратного уравнения
Вернёмся к задаче решения квадратного уравнения (задача 3.3). Нами
был рассмотрен алгоритм решения этой задачи и написана программа
на языке программирования Free Pascal. Реализуем эту задачу в среде
Lazarus.
Создадим новый проект^(рис. 3.19).
Для организации ввода коэффициентов уравнения внедрим на форму
четыре объекта типа надпись ( L a b e l 1, L a b e l 2 ,
L a b e l 3,
L a b e l 4 ) и три поля ввода ( E d i t l ,
Edit2,
E d i t 3 ) . Корни
уравнения или сообщение об их отсутствии будем выводить в надпись
ЬаЬеБД Все действия по вычислению корней квадратного уравнения
будут выполняться при нажатии кнопки B u t t o n l .
При вводе данных в программе могут возникнуть следующие ошибки:
• в
поле
ввода
оказалась
преобразовать в число;

строка,

• значение коэффициента а равно нулю^.
146

которую

невозможно

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Для того чтобы не допустить подобные ошибки, необходимо
контролировать данные, вводимые пользователем. Применим для этой
цели
встроенную
процедуру
V a l ( S , X, K o d ) ,
которая
преобразовывает строку S в число. Тип этого числа (целое или
вещественное) зависит от типа переменной X. Если преобразование
прошло успешно, то параметр Kod принимает значение, равное нулю, а
результат преобразования записывается в переменную X. В противном
случае Kod содержит номер позиции в строке S, где произошла ошибка,
и содержимое переменной X не меняется. Далее приведён фрагмент
программы с подробными комментариями:
procedure TForml. ButtonlClick ( Sender : TO bject);
var
a, b, c, d, xl, x2 : real;
kodl, kod2, kod3 : integer;
begin
//Ввод значений коэффициентов квадратного уравнения.
//Из поля ввода Editl считывается строка символов и
//преобразовывается в вещественное число,
//если преобразование прошло успешно, то k o d l =0 и
//полученное число записывается в переменную а.
val ( Editl. Text, a, k o d l );
val ( Edit2. Text, b, kod2 );
val ( Edit3. Text, c, kod3 );
//Если преобразования прошли успешно, то
if ( kodl=0) and ( kod2=0) and ( kod3=0) then
//проверить чему равен первый коэффициент.
//Если значение первого коэффициента равно нулю, то
if а =0 then //выдать соответствующее сообщение.
MessageDlg ( ’Введите не нулевое значение а ’,
mtlnformation, [ mbOk], 0 )
else //иначе перейти к решению квадратного уравнения
begin
d:=b * b-4*a*c;
LabeB. Visible := true;
if d 0.
Соответственно, при нулевом значении подкоренного выражения и и
у обращаются в ноль.
6) Подробно о создании проекта см. в главе 1.
Н
На этапе конструирования формы сделаем метку L a b e 15
невидимой, для чего свойство V i s i b l e установим в f a l s e
(Label5.Visible:=false) .
8) При вычислении корней произойдёт деление на ноль.
9) Понятие итерации в математике и программировании несколько
отличаются. В математике под итерацией понимают повторение какойлибо математической операции, использующее результат предыдущей
аналогичной операции. В программировании итерация — это
организация обработки данных, при которой действия повторяются
многократно, не приводя при этом к вызовам самих себя (ссылка:
httpV/ru.wikipedia.org/wiki/Итерация ).
10) Если шаг изменения параметра цикла равен единице, его в блоксхемах можно не указавать.
Как говорил учитель программирования авторов книги Владимир
Андреевич Реуцкий: "Использование goto — признак дурного тона".
12) Алгоритм нахождения количества цифр в числе был рассмотрен в
предыдущей задаче.
13)
Для поиска наименьшего элемента последовательности
(минимума), предполагают, что первый элемент — наименьший,
записывают его в ячейку Min, а затем среди элементов
194

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

последовательности ищут число, значение которого будет меньше, чем
предполагаемый минимум
14)
Алгоритм поиска максимального (минимального) элементов
последовательности подробно описан в задаче 3.18.

195

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Подпрограммы
В практике программирования часто складываются ситуации, когда
одну и ту же группу операторов, реализующих определённую цель,
требуется повторить без изменений в нескольких местах программы.
Для избавления от столь нерациональной траты времени была
предложена концепция подпрограммы.
Подпрограмма — именованная, логически законченная группа
операторов языка, которую можно вызвать для выполнения любое
количество раз из различных мест программы. В языке Free Pascal
существуют два вида подпрограмм: процедуры и функции. Главное
отличие процедуры от функции заключается в том, что результатом
исполнения операторов, составляющих тело функции, всегда является
некоторое
значение,
поэтому
функцию
можно
использовать
непосредственно в выражениях, наряду с переменными и константами.

4.1 Общие сведения о подпрограммах. Локальные и
глобальные переменные
Итак, подпрограмма — это поименованный набор описаний и
операторов, выполняющих определенную
задачу. Информация,
передаваемая в подпрограмму для обработки, называется параметрами,
а результат вычислений — значениями. Обращение к подпрограмме
называют вызовом. Перед вызовом подпрограмма должна быть
обязательно описана в разделе описаний. Описание подпрограммы
состоит из заголовка и тела. В заголовке объявляется имя
подпрограммы, и в круглых скобках её параметры, если они есть. Для
функции необходимо сообщить тип возвращаемого ею результата. Тело
подпрограммы следует за заголовком и состоит из описаний и
исполняемых операторов.
Любая подпрограмма может содержать описание других подпрограмм.
Константы, переменные, типы данных могут быть объявлены как в
основной программе, так и в подпрограммах различной степени
вложенности. Переменные, константы и типы, объявленные в
основной программе до определения подпрограмм, называются
глобальными, они доступны всем функциям и процедурам.
196

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Переменные,
константы
и типы,
описанные
в
какой-либо
подпрограмме, доступны только в ней и называются локальными.
Для правильного определения области действия идентификаторов
(переменных) необходимо придерживаться следующих правил:
• каждая переменная, константа или тип должны быть описаны
перед использованием;
• областью действия переменной, константы или типа является та
подпрограмма, в которой они описаны;
• все имена в пределах подпрограммы, в которой они объявлены,
должны быть уникальными и не должны совпадать с именем
самой подпрограммы;
• одноимённые локальные и глобальные переменные — это разные
переменные, обращение к таким переменным в подпрограмме
трактуется как обращение к локальным переменным (глобальные
переменные недоступны);
• при обращении к подпрограмме доступны объекты, которые
объявлены в ней и до её описания.

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

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Передача параметров выполняется следующим образом. Вычисляются
выражения, стоящие на месте фактических параметров. В памяти
выделяется место под формальные параметры в соответствии с их
типами. Выполняется проверка типов, и при их несоответствии
выдается диагностическое сообщение. Если количество и типы
формальных и фактических параметров совпадают, то начинает
работать механизм передачи данных между фактическими и
формальными параметрами.
Формальные параметры процедуры можно разделить на два класса:
параметры-значения и параметры-переменные.
При передаче данных через параметры-значения в подпрограмму
передаются значения фактических параметров, и доступа к самим
фактическим параметрам из подпрограммы нет. При передаче данных
параметры-переменные заменяют^ формальные параметры, и,
следовательно, в подпрограмме есть доступ к значениям фактических
параметров.
Любое
изменение
параметров-переменных
в
подпрограмме приводит к изменению соответствующих им формальных
параметров. Следовательно, входные данные следует передавать через
параметры-значения, для передачи изменяемых в результате работы
подпрограммы данных следует использовать параметры-переменные.
От общетеоретических положений
использованию
подпрограмм
при
подпрограмм начнем с процедур.

перейдём
решении

к практическому
задач.
Изучение

4.3 Процедуры
Описание процедуры имеет вид:
procedure имя_процедуры(список_формальных_параметров);
label
список_меток;
const
список_констант;
type
список_типов;
var
198

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

список_переменных;
begin
//Тело процедуры.
end;
Описание начинается с заголовка процедуры, где p r o c e d u r e —
ключевое слово языка, и м я _ п р о ц е д у р ы — любой допустимый в
языке
Free
Pasacal
идентификатор,
список_формальных_параметров

имена
формальных
параметров и их типы, разделённые точкой с запятой. Рассмотрим
примеры заголовков процедур с параметрами-значениями:
procedure name_l( г : real; i : integer; с : char );
Однотипные параметры могут быть перечислены через запятую:
procedure name_2( a, b : real; i, j, k : integer );
Список формальных параметров необязателен и может отсутствовать:
procedure name_3;
Если в заголовке процедуры будут применяться параметры-переменные,
то перед ними необходимо указывать служебное слово v a r :
procedure name_4( х, у : real; var z : real);
//x, у - параметры-значения,
//z- параметр-переменная.
После заголовка идет тело процедуры, которое состоит из раздела
описаний^ (константы, типы, переменные, процедуры и функции,
используемые в процедуре) и операторов языка, реализующих алгоритм
процедуры.
Для обращения к процедуре необходимо использовать оператор вызова:
имя_процедуры(список_фактических_параметров);
Фактические параметры в списке оператора вызова отделяются друг от
199

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

друга запятой:
а : = 5. 3; к : = 2; s := ’ а ’;
name_l( а, к, s );
Если в описании процедуры формальные параметры отсутствовали, то
и при вызове их быть не должно:
name_3;
ЗАДАЧА 4.1. Найти действительные корни квадратного уравнения
од:" + Ьх -Ь с = ОАлгоритм решения этой задачи был подробно описан в задаче 3.3 (рис.
3.14). Однако там не была рассмотрена ситуация некорректного ввода
значений коэффициентов. Например, если пользователь введёт а = 0.
то уравнение из квадратного превратится в линейное. Алгоритм
решения линейного уравнения тривиален: х = —c f b , при условии,
что 6 = 0 . Чтобы не усложнять уже составленный алгоритм решения
квадратного уравнения, запишем его в виде подпрограммы-процедуры.
Далее приведён фрагмент программы с комментариями:
//Процедура для вычисления действительных
//корней квадратного уравнения.
procedure korni ( a, b, с : real; var xl, x2 : real; var pr : boolean);
//Входные параметры процедуры:
//a,b,c - коэффициенты квадратного уравнения;
//Выходные параметры процедуры:
//х1,х2 - корни квадратного уравнения,
//рг - логическая переменная,
//принимает значение "ложь", если в уравнении нет корней,
//и значение "истина" в противном случае.
var d : real;
begin
d:=b * b-4 * a * c;
if d0 do
begin
if i =1 then
begin //Предположим, что первая цифра является
max:=M mod 10; //наибольшей или
min:=M mod 10; //наименьшей.
i := i +1;
end;
//Поиск цифры больше max или меньше min.
if М mod 10 > max then max:=M mod 10;
if M mod 10 < min then min:=M mod 10;
M:=M div 10;
end;
end;
var X: longint; N, i,X_max, X_min : byte;
begin
//Количество элементов в последовательности,
write ( ’N= ’ ); readln (N);
for i :=1 to N do
begin
write ( ’X= ’ ); readln (X); //Элемент последовательности.
if X>0 then//Если элемент положительный, то
begin
max_min(X,X_max, X_min); //вызов процедуры.
202

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

//Печать результатов.
write In ( ’ max= ’,X_max, ’ min= ’,X_min);
end;
end;
end.

4.4 Функции
Описание функции также состоит из заголовка и тела:
function имя_функции(список_формальных_параметров ):
тип_результата;
label
список_меток;
const
список_констант;
type
список_типов;
var
список_переменных;
begin
//Тело функции.
end;
Заголовок функции содержит: служебное слово f u n c t i o n , любой
допустимый в языке Free Pascal идентификатор — и м я _ ф у н к ц и и ;
имена формальных параметров и их типы, разделённые точкой с
запятой

список_формал ь ных_параметров,
тип
возвращаемого функцией значения — т и п _ р е з у л ь т а т а (функции
могут возвращать скалярные значения целого, вещественного,
логического, символьного или ссылочного типов).
Примеры описания функций:
function fun_l ( х : real) : real;
function fun_2 ( a, b : integer ): real;
Тело функции состоит из раздела описаний^ (константы, типы,
переменные, процедуры и функции, используемые в процедуре) и
203

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

операторов языка, реализующих её алгоритм. В теле функции всегда
должен быть хотя бы один оператор, присваивающий значение имени
функции.
Например:
function fun_2 ( a, b : integer ): real;
begin
fun_2 :=( a+b ) / 2;
end;
Обращение к функции осуществляется по имени с указанием списка
фактических параметров:
имя_функции (список_фактических_параметров );
Например:
y:=fun_l ( 1 . 2 8 ) ;
z :=ftm_l (1.28)/2+ fun_2 ( 3, 8 );
ЗАДАЧА 4.3. Вводится последовательность из дг целых чисел, найти
среднее арифметическое совершенных чисел и среднее геометрическое
простых чисел последовательности.
Напомним, что целое число называется простым, если оно делится
нацело только на само себя и единицу. Подробно алгоритм определения
простого числа описан в задаче 3.14 (рис. 3.33). Кроме простых чисел, в
этой задаче фигурируют совершенные числа. Число называется
совершенным, если сумма всех делителей, меньших его самого, равна
этому числу. Алгоритм, с помощью которого можно определить
делители числа, подробно рассмотрен в задаче 3.13 (рис. 3.32).
Для решения поставленной задачи понадобятся две функции:
• p r o s t o e — определяет, является ли число простым, аргумент
функции — целое число N, функция возвращает t r u e (истина),
если число простое, и f a l s e (ложь) — в противном случае;
• s o v e r s h — определяет, является ли число совершенным;
входной параметр — целое число N, функция возвращает t r u e
204

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

(истина), если число простое, и f a l s e (ложь) — в противном
случае.
Фрагмент программы с комментариями:
//Функция, которая определяет простое число,
function prostoe (N : word ) : boolean;
var i : word;
begin
prostoe := true;
for i :=2 to N div 2 do
if N mod i = 0 then
begin
prostoe f false;
break;
end;
end;
//Функция, которая определяет совершенное число,
function soversh (N : word ) : boolean;
var i : word; S : word;
begin
soversh := false;
S : = 0;
for i :=1 to N div 2 do
if N mod i =0 dten S:=S+i;
if S=N then soversh := true;
end;
var X: word; K, kol_p, kol_s, i : byte; Sum, Pro : real;
begin //Начало основной программы.
//Ввод количества элементов в последовательности,
write ( ’К= ’ ); readln (К);
Stun: = 0; //Переменная для накапливания суммы.
Pro : = 1; //Переменная для вычисления произведения.
kol_p : = 0; //Счётчик простыхчисел.
kol_s : = 0; //Счётчик совершенных чисел.
for i :=1 to К do
begin
//Ввод элемента последовательности.
Writeln ( ’Х= ’ ); readln (X);
205

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

if prostoe (X) then //Если число простое,
begin
//выполнить операцию умножения,
Рго:=Рго *Х;
//увеличить счётчик простых чисел.
kol_p:=kol_p +1;
end;
if soversh (X) then//Если число совершенное,
begin
//выполнить операцию умножения,
Sum:=Sum+X;
//увеличить счётчик совершенных чисел.
kol_s := kol_s +1;
end;
end;
//Если были найдены совершенные числа,
if kol_s 0 then
begin
Sum:=Sum/ kol_s; //вычислить среднее арифметическое,
writeln ( ’Среднее арифметическое совершенных чисел ’,
Slim : 5 : 2 );
end
else //иначе вывести сообщение:
writeln ( ’Совершенных чисел в последовательности нет. ’ );
if kol_p0 then //Если были найдены простые числа,
begin
//вычислить среднее геометрическое.
Рго:= ехр (1/ kol_p _ In ( Pro ));
writeln ( ’Среднее геометрическое простых чисел ’, Pro : 5 : 2 );
end
else //иначе вывести сообщение:
writeln ( ’Простых чисел в последовательности нет ’ );
end;
ЗАДАЧА 4.4. Вводится последовательность целых чисел. О — конец
последовательности. Определить, содержит ли последовательность хотя
бы одно число-палиндром.
Палиндром — это число, симметричное относительно своей середины.
206

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Например, 123 454 321, 678 876 — палиндромы. Чтобы определить,
является ли число палиндромом, нужно сравнивать первую и
последнюю цифры, затем вторую и предпоследнюю и так далее. Если
хотя бы в одной паре цифры не совпадут, то число палиндромом не
является.
Для решения поставленной задачи понадобятся две функции:
• c i f r a _ k o l — определяет количество цифр в числе (подробно
алгоритм описан в задаче 3.16);
• p a l i n d r o m — возвращает значение "истина", если переданное в
неё число палиндромом.
Текст программы с комментариями:
//Функция для вычисления количества цифр в числе М.
function cifra_ kol (М: longint) : byte;
begin
cifra_ k o l: = 1;
while M div 10 > 0 do
begin
cifra_ kol := ciffa_ kol +1;
M:=M div 1 0;
end;
end;
//Функция возвращает значение "истина", если число М,
//состоящее из kol цифр, палиндром,
//и значение "ложь", в противном случае,
function palindrom (М: longint; k o l: byte ): boolean;
var i : byte; j : longint;
begin
j : = 1;
//Возведение числа 10 в степень kol-1 (разрядность числа),
for i :=1 to kol-1 do
j := j * 10;
palindrom := true; //Пусть число - палиндром.
for i :=1 to kol div 2 do
begin
//Выделение старшего разряда M div j (первая цифра).
207

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

//Выделение младшего разряда М mod 10 (последняя цифра).
//Если первая и последняя цифры не совпадают,
if М divj М mod 10 then
begin
palindrom := false; //то, число не палиндром,
break; //Досрочный выход из цикла.
end;
//Изменение числа
М:=М -(М div j ) * j; //Удаление первой цифры числа.
М:=М div 10; //Удаление последней цифры числа.
j := j div 100; //Уменьшение разрядности.
end;
end;
//Основная программа,
var X: longint; pr : boolean;
begin
write ( ’X= ’ ); readln (X); //Ввод элемента последовательности,
pr := false; //Пусть в последовательности нет палиндромов,
while Х0 do //Пока не ноль,
begin
if palindrom (X, cifra_ kol ( X) ) then
begin
pr := true; //Найдено число палиндром,
break; //досрочный выход из цикла,
end;
//Ввод следующего элемента последовательности,
write ( ’Х= ’ ); readln (X);
end;
if pr then writeln ( ’Последовательность ’,
’содержит число-палиндром. ’ )
else writeln ( ’Последовательность не содержит палиндромов. ’ );
end.

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

208

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

ЗАДАЧА 4.5. Создать программу, которая автоматизирует процесс
перевода градусной меры угла в радианную и наоборот, в зависимости
от выбора пользователя. То есть пользователь должен выбрать, как он
будет вводить угол: в радианах или в градусах. Если введёт в радианах,
ответ получит в градусах и, соответственно, введёт в градусах — ответ
получит в радианах.
С точки зрения математика задача не вызывает сложности:
• чтобы найти радианную меру какого-нибудь угла по данной
градусной мере, нужно помножить число градусов на тг/1 8 0 ,
число минут на тг/(1 SO • 60), число секунд на тг/ (180 • 60 • 60)
и найденные произведения сложить;
• чтобы найти градусную меру угла по заданной радианной, нужно
помножить число радиан на 1 8 0 /т г ; если из полученной дроби
выделить целую часть, то получим градусы; если из числа,
полученного умножением оставшейся дробной части 60,
выделить целую часть, получим минуты; секунды вычисляются
аналогично из дробной части минут.
Для перевода угла из градусной меры в радианную создадим функцию
function gradus_radian ( gradus, minuta, secunda : byte ) : real;
в которую будем передавать целочисленные значения градусов, минут и
секунд. Результат работы функции — вещественное число, величина
угла в радианах.
Задачу перевода из радианной меры в градусную решим, создав
процедуру
procedure radian_gradus ( radian : real;
var gradus, minuta, secunda : byte );
у которой один входной параметр — радианная мера угла и три
выходных— градусы, минуты и секунды.
Разработаем интерфейс будущей программы в среде Lazarus. Создадим
новый проект, установим свойства формы так, как показано в табл. 4.1.
209

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

и разместим на ней компоненты в соответствии с рис. 4.1.
С компонентами E d i t , L a b e l и B u t t o n мы уже хорошо знакомы.
Компонент R a d i o B u t t o n — это переключатель. Его используют для
выбора одного из нескольких взаимоисключающих решений. Обычно на
форму помещается, по меньшей мере, два таких компонента. Они могут
иметь только два состояния, определяемых свойством C h e c k e d . Если у
одного из компонентов это свойство истинно (true), то во всех
остальных ложно (false). В данной задаче используется два
компонента: R a d i o B u t t o n l
и R a d i o B u t t o n 2 , предоставляя
пользователю выбор: включён первый компонент — будет осуществлён
перевод из градусной меры в радианную, включен второй — наоборот.
Двойной щелчок по компоненту R a d i o B u t t o n l приведёт к созданию
процедуры T F o r m l .R a d i o B u t t o n l C l i c k
обработки события
щелчок мыши по кнопке переключателю. В тексте процедуры следует
указать команды, которые будут выполняться, если пользователь
включил или выключил компонент.
Таблица 4.1. Свойства формы
Свойство

Значение
угла

Описание
свойства
Заголовок формы

Caption

Величина

Height

26 5

Высота формы

Width

32 5

Ширина формы

B o r d e r l c o n s . B i M a x i m i z e false

Кнопка
развёртывания
окна недоступна

BorderStyle

bdDialog

Стиль рамки —
диалоговое окно,
не изменяет
размеры

Position

poScreenCenter

Окно появится в
центре экрана

210

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Рис. 4.1. Настройка формы к задаче 4.5
Нам уже известно, что свойства компонентов могут изменяться как в
окне конструирования формы, так и непосредственно в программе.
Если дважды щелкнуть по форме, вне размещённых на ней
компонентов, то будет создана процедура T F o r m l .F o r m C r e a t e
обработки события открытия формы. На вкладке С о б ы т и я инспектора
объектов это событие носит название O n C r e a t e . Процедура
O n C r e a t e выполняется в момент создания формы. Все действия,
включённые в неё, будут выполнены перед первым выводом формы на
экран. Здесь можно задать свойства всех компонентов на момент
открытия формы.
Кнопки, расположенные на форме, несут следующую функциональную
нагрузку:•
• Buttonl

установок
• Button3

состояние
• Button2

запускает процесс перевода в зависимости от
переключателей;
возвращает внешний вид формы в первоначальное
(до ввода и вывода данных);
— завершает процесс выполнения программы.
211

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Текст программы с необходимыми комментариями приведён ниже.
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
type
TForml = class (TForm)
Buttonl : TButton;
Labell : TLabel;
RadioButtonl : TRadioButton;
RadioButton2 : TRadioButton;
Editl :TEdit;
Button2 : TButton;
Label2 : TLabel;
Edit2 : TEdit;
Edit3 : TEdit;
LabeB : TLabel;
LabeW : TLabel;
LabeB : TLabel;
Edit4 : TEdit;
Button3 : TButton;
procedure ButtonlClick ( Sender : TO bject);
procedure RadioButtonl Click ( Sender : TO bject);
procedure RadioButton2Click ( Sender : TO bject);
procedure FormCreate ( Sender : TO bject);
procedure Button2Click ( Sender : TO bject);
procedure Button3Click ( Sender : TO bject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Forml : TForml;
implementation
{$R *.dfm}
//Щелчок по кнопке ВЫЧИСЛИТЬ.
212

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

procedure TForml. ButtonlClick ( Sender : TO bject);
//Функция перевода данных из градусов в радианы,
function gradus_radian ( gradus, minuta, secimda : byte ) : real;
begin
gradus_radian :=
gradus * p i/180+minuta * p i /180/60+ secimda * p i /180/60/60;
end;
//Процедура перевода из радиан в градусы,
procedure radian_gradus ( radian : real;
var gradus, minuta, secunda : byte );
begin
gradus := trimc ( radian * 180/ p i);
minuta := trimc ( ( radian * 180/ pi -gradus ) * 60 );
secunda := trimc ( ( ( radian * 180/ pi -gradus )*60 - minuta ) * 60 );
end;
var //Описание переменных.
grad, min, sec : byte; //Градусная мера угла.
rad : real; //Радианная мера угла.
kod_g, kod_m, kod_s, kod_r : integer; //Контроль ввода.
begin
if RadioButtonl. Checked then//Если первый переключатель вкл.
begin
Val ( Editl. Text, grad, kod_g); //Ввод градусов.
Val ( Edit2. Text, min, kod_m ); //Ввод минут.
Val ( Edit3. Text, sec, kod_s ); //Ввод секунд.
//Если ошибки при вводе не было, то
if ( kod_g=0) and (kod_m=0) and ( kod_s=0) then
begin
Label2. Visible := true; //сделать видимым компонент Label2
//и вывести туда результат вычислений.
//Вызов функции gradus_radian перевода из градусов в радианы.
Label2. Caption := ’Величина угла ’ +chr (1 3 )
+FloatToStrF ( gradus_radian ( grad, min, sec ), ffFixed, 8, 6 )
+ ’ радиан ’;
end
else //Иначе выдать сообщение об ошибке при вводе.
MessageDlg ( ’Ошибка_при_вводе_данных ! ’, MtWarning, [ mbOk ], i
end;
if RadioButton2. Checked then//Если второй переключатель вкл.
213

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

begin
Val ( Edit4. Text, rad, kod_r ); //Ввод радианной меры угла,
if ( kod_r=0) then //Если нет ошибок при вводе, то
begin
Label2. Visible := true; //сделать видимым компонент Label2
//и вывести туда результат вычислений.
//Вызов процедуры перевода из радиан в градусы.
radian_gradus ( rad, grad, min, sec );
Label2. Caption := ’Величина_утла ’ +chr ( 1 3 )
+IntToStr ( grad)+ ’ _r_ ’+IntToStr ( min )
+ ’ м ’+IntToStr ( sec )+ ’ c
end
else //Иначе выдать сообщение об ошибке при вводе.
MessageDlg ( ’Ошибка при вводе данных ! ’, MtWarning, [ mbOk ], О
end;
end;
//Щелчок по кнопке ВЫХОД.
procedure TForml. Button2Click ( Sender : TO bject);
begin
close;
end;
//Щелчок по кнопке ОЧИСТИТЬ.
procedure TForml. Button3Click ( Sender : TO bject);
begin
//Установка свойств компонентов в первоначальное состояние.
Editl. Text := ’ 00 ’;
Edit2. Text := ’ 00 ’;
Edit3. Text := ’ 00 ’;
Edit4. Text := ’ 00.000 ’;
Labell. Caption := ’Введите_значение ’;
Labell. Font. Size := 10;
Fabel3. Caption := ’Градусы ’;
Fabel4. Caption := ’Минуты ’;
ЕаЬеБ. Caption := ’Секунды ’;
Buttonl. Caption := ’ВЫЧИСЛИТЬ ’;
Button2. Caption := ’ВЫХОД ’;
Button3. Caption := ’ОЧИСТИТЬ ’;
Edit4. Enabled := false;
Label2. Visible := false;
214

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

RadioButtonl. Checked f true;
RadioButton2. Checked f false;
end;
//Обработка события открытие формы,
procedure TForml. FormCreate ( Sender : TO bject);
begin
//Установка свойств компонентов.
Editl. Text := ’ 00 ’;
Edit2. Text := ’ 00 ’;
Edit3. Text := ’ 00 ’;
Edit4. Text := ’ 00.000 ’;
Labell. Caption f ’Введите_значение ’;
Labell. Font. Size f 10;
LabeB. Caption f ’Градусы ’;
Label4. Caption f ’Минуты ’;
LabeB. Caption f ’Секунды ’;
Buttonl. Caption f ’ВЫЧИСЛИТЬ ’;
Button2. Caption f ’ВЫХОД ’;
Button3. Caption f ’ОЧИСТИТЬ ’;
Edit4. Enabled f false;
LabeB. Visible f false;
Radio Buttonl. Checked f true;
RadioButton2. Checked f false;
end;
//Обработка события щелчок по переключателю RadioButtonl.
procedure TForml. RadioButtonlClick ( Sender : TO bject);
begin
if RadioButtonl. Checked then
begin
Editl. Enabled f true;
Edit2. Enabled f true;
Edit3. Enabled f true;
LabeB. Enabled f true;
LabeB. Enabled f true;
Label4. Enabled f true;
Edit4. Enabled f false;
end;
end;
//Обработка события щелчок по переключателю RadioButton2.
215

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

procedure TForml. RadioButton2Click ( Sender : TO bject);
begin
if RadioButton2. Checked then
begin
Edit4. Enabled := true;
Buttonl. Enabled := true;
Editl. Enabled := false;
Edit2. Enabled := false;
Edit3. Enabled := false;
LabeB. Enabled := false;
Label4. Enabled := false;
LabeB. Enabled := false;
end;
end; end.
Результаты работы программы представлены на рис. 4.2 и рис. 4.3.

Рис. 4.2. Перевод значений из градусной меры в радианную

216

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Рис. 4.3. Перевод значений из радианной меры в градусную
ЗАДАЧА 4.6. Создать программу для решения уравнений:
• линейное а х ■+■ Ь = 0;
• квадратное а х 2 +- Ьх + с = 0;
• кубическое ахЛ3 + Ьхл2 + сх + d.
Решение линейного уравнения тривиально: х = — b j a ' , алгоритмы
решения квадратного и кубического уравнений подробно рассмотрены в
задачах 3.4 и 3.5.
Создадим новый проект. Свойства формы настроим по табл. 4.1. за
исключением свойства C a p t i o n , которому присвоим значение
Р е ш е н и е у р а в н е н и я . Компоненты на форме разместим так, как
показано на рис. 4.4.
Обратите внимание, что на форме появились не знакомые нам
компоненты. Это C h e c k B o x — флажок и R a d i o G r o u p — группа
переключателей.
Компонент

флажок

используется

CheckBox
217

для

того,

чтобы

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

пользователь могут указать свое решение: да или нет. Установлен
флажок или нет, определяет свойство C h e c k e d ( t r u e , f a l s e ) . В
составе диалогового окна может быть несколько таких компонентов,
причём состояние любого из них не зависит от состояния остальных.
Компонент группа переключателей R a d i o G r o u p объединяет в себе
несколько переключателей. Каждый размещённый в нём переключатель
помещается в специальный список I t e m s и доступен по номеру,
установленному в свойстве I t e m l n d e x . После размещения на форме
компонент пуст. Чтобы создать в нём хотя бы один переключатель,
нужно выделить его, обратиться к инспектору объектов и выбрать
свойство I t e m s — редактор списка. Строки, набранные в редакторе,
используются как поясняющие надписи справа от переключателей, а их
количество определяет количество переключателей в группе. В нашем
случае окно редактора списка будет иметь вид, как на рис. 4.5.

218

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Рис. 4.4. Процесс создания формы к задаче 4.6

Рис. 4.5. Окно редактора списка
После создания компонента группа переключателей, его свойство номер
переключателя I t e m l n d e x по умолчанию равно _1. Это означает, что
ни один компонент в группе не установлен. Чтобы в момент появления
компонента на экране один из переключателей был отмечен, нужно
либо на этапе конструирования формы, либо программно присвоить
свойству I t e m l n d e x номер одного из элементов списка, учитывая,
что нумерация начинается с нуля.
С остальными компонентами, размещёнными на форме, пользователь
уже знаком. На рис. 4.6. рис. 4.7. рис. 4.8 видно, как работает
программа. Пользователю предоставляется возможность выбрать вид
решаемого уравнения, ввести его коэффициенты и указать, какие
решения — действительные или комплексные (если это возможно) —
219

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

он хотел бы получить.
ж р

на знак max then max:=x л[ i ];
if x л[ i ] < min then min:=x л[ i ];
end;
writeln ( ’максимум= ’,max : 1 :4, ’ минимум= min : 1 :4 );
{Освобождаем память.}
freemem ( x, n * sizeof ( real));
end.
При работе с динамическими переменными необходимо соблюдать
следующий порядок работы:
1.
2.
3.
4.

О п и сать указатели.
Выделить память под массив (функции new или g etm em ).
Обработать динамический массив.
Освободить память (функции d i s p o s e или f r e e m e m ) .

5.12 Примеры программ
ЗАДАЧА 5.3. Дан массив А . состоящий из £ целых чисел. Записать
все отрицательные элементы массива А в массив В .
Решение
задачи
заключается в следующем.
Последовательно
перебираются элементы массива А. Если среди них находятся
отрицательные, то они записываются в массив В. На рисунке 5.32
видно, что первый отрицательный элемент хранится в массиве А под
296

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

номером три, второй и третий под номерами пять и шесть
соответственно, а четвёртый под номером восемь. В массиве В этим
элементам присваиваются номера один, два, три и четыре.
Поэтому для их формирования необходимо определить дополнительную
переменную. В блок-схеме, приведённой на рисунке 5.33 роль такой
переменной выполняет переменная ш. В процессе формирования
массива В в переменной m хранится номер сформированного элемента.
Вначале в массиве В нет ни одного элемента, и поэтому ш= 0 (блок 2). В
цикле (блок 5) последовательно перебираем все элементы А, если
очередной элемент массива А отрицателен, то переменная ш
увеличивается на единицу, а значение элемента массива А записывается
в массив В под номером m (блок 6). В блоке 7 проверяем, были ли в
массиве А отрицательные элементы и сформирован ли массив В. В
результате этого алгоритма будет сформирован массив В отрицательных
чисел, состоящий из m чисел.

Рис. 5.32.
Процесс формирование массива В из отрицательных
элементов массива А

297

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 5.33. Блок-схема формирования массива В из отрицательных
элементов массива А
Приведённая ниже программа реализует описанный алгоритм.
var a, b : array [ 1.. 200 ] of word;
k,m, i : byte;
begin
write ( ’введите размерность массива к= ’ );
readln ( k );
m: = 0;
for i :=1 to k do
begin
write ( ’A[ i, ’ ]= ’ );
readln (A[ i ]);
if A[ i]0 then
for i :=1 to m do
write (B[ i ], ’ ’ )
else
write ( ’В массиве нет отрицательных элементов ! ! ! ’ );
end.
ЗАДАЧА 5.4. Задан массив У из п целых чисел. Сформировать массив
Z таким образом, чтобы в начале шли отрицательные элементы
массива У , затем положительные и, наконец, нулевые.
Алгоритм решения этой задачи основывается на алгоритме перезаписи
элементов, удовлетворяющих какому-либо условию из одного массива,
в другой, который был подробно рассмотрен в предыдущей задаче.
Блок-схема решения задачи 5.4 представлена на рис. 5.34.
Текст программы с комментариями приведён ниже.
program mas_four;
var у, z : array [ 1.. 50 ] of integer;
i, k, n : integer;
begin
writeln ( ’Введите n0 then
begin
k:=k+l; z [ k ] : = у [ i]
end;
//Перезапись нулевых чисел из массива у в массив z.
for i :=1 to n do
if у [ i ]=0 then
begin
k:=k+l; z [ k ] : = у [ i ];
end;
//Вывод массива у.
writeln ( ’Массив у : ’ );
for i :=1 to n do
write ( у [ i ], ’ ’ ); writeln;
//Вывод массива z.
writeln ( ’Массив z : ’ );
for i :=1 to n do write ( z [ i ], ’ ’ ); writeln;
end.

300

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

301

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 5.34. Блок-схема решения задачи 5.4
ЗАДАЧА 5.5. Переписать элементы в массиве X

в обратном порядке.

Алгоритм решения задачи состоит в следующем: меняем местами 1 - й и
n - й элементы, затем 2 - й и n - 1 - й элементы, и так до середины
массива; элемент с номером i следует поменять с элементом n + 1 - i .
Блок-схема обмена элементов в массиве представлена на рис. 5.35.

b:=X[i]
X[i]: = X[N+l-i]
X[N+l-i]: =b
1

Рис. 5.35. Фрагмент блок-схемы к задаче 5.5
Ниже приведён текст консольного приложения задачи 5.5.
program mas_five;
type
massiv=array [ 1.. 100 ] of real;
var
x : massiv;
i, n : integer;
b : real;
begin
//Ввод размера массива.
writeln ( ’Введите размер массива ’ );
readln ( n );
//Ввод массива,
for i :=1 to n do
302

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

begin
write ( ’ х [ ’Д ’ ]= ’ );
readln ( х [ i ]);
end;
//Перебирается первая половина массива, и меняются местами
//элементы 1-й с n-м , 2-й с (п-1),... i-й с (n+l-i)-M.
for i :=1 to n div 2 do
begin
b:=x [ n+1 - i ];
x [ n+1 - i ] : = x [ i ];
x [ i] := b;
end;
//Вывод преобразованного массива.
writeln ( ’Преобразованный массив ’ );
for i :=1 to n do
write ( x [ i ] : 1 : 2, ’ - ’
end.
ЗАДАЧА 5.6. Удалить из массива X , состоящего из п
первые четыре нулевых элемента.

элементов,

Вначале количество нулевых элементов равно нулю
(к=0).
Последовательно перебираем все элементы массива. Если встречается
нулевой элемент, то количество нулевых элементов увеличиваем на 1
( k : = k + l ) . Если количество нулевых элементов меньше или равно 4,
то удаляем очередной нулевой элемент. Если встречаем пятый нулевой
элемент ( к > 4 ), то аварийно выходим из цикла (дальнейшая обработка
массива бесполезна).
Блок-схема представлена на рис. 5.36.
Текст программы с комментариями приведён ниже.
const п=20;
var X: array [ 1.. n ] of byte;
k, i, j : integer;
begin
for i :=1 to n do
readln (X[ i ]);
303

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

k : = 0; {Количество нулевых элементов.}
j : = 1; {Номер элемента в массиве X.}
while j4 then break
{Если k превышает 4, то выйти из цикла.}
Else {Иначе удаляем j-й элемент из массива.}
for i := j to n_k do
X[ i ] : =X[ i + 1 ];
End
{Если встретился ненулевой элемент, то просто переходим кследующе 1
else j := j +1; {Если элемент ненулевой.}
end;
{Вывод на печать измененного массива.}
for i :=1 to n-k do
write (X[i], ’ ’ );
end.

304

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

305

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 5.36. Алгоритм решения задачи 5.6
ЗАДАЧА 5.7. Найти сумму простых чисел целочисленного массива
С ( Л ') .

Идея алгоритма состоит в следующем. Вначале сумма равна 0.
Последовательно перебираем все элементы; если очередной элемент
простой, то добавляем его к сумме. Для проверки, является ли число
простым, напишем функцию prostoe. Блок-схема этой функции
представлена на рис. 5.37.

306

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

307

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 5.37. Блок-схема функции prostoe
Заголовок функции P r o s t o e имеет вид:
function Prostoe (N: i n t e g e r ) : b o o l e a n ;
Функция возвращает значение t r u e , если число N является простым. В
противном случае результатом функции является значение f a l s e .

308

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 5.38. Блок-схема решения задачи 5.7

309

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Блок-схема решения задачи 5.7 изображена на рис. 5.38.
Ниже приведён текст программы, реализующей этот алгоритм, с
комментариями.
program mas7;
function prostoe (N : integer ) : boolean;
var i : integer; pr : boolean;
begin
if N1, то
это означает, что серия знакочередующихся элементов оборвалась и
количество серий k o l надо увеличить на 1, и после обрыва серии
количество элементов в ней положить равным одному (к=1). После
выхода из цикла проверяем, не было ли в конце массива серии из
знакочередующихся элементов. Если такая серия была (к>1), то
количество серий ( k o l ) опять увеличиваем на 1. В завершении
выводим количество серий из знакочередующихся элементов —
переменную k o l . Блок-схема решения задачи 5.8 представлена на рис.
5.40.
Ниже приведён текст консольного приложения на языке Free Pascal.
var х : array [ 1.. 50 ] of real;
n, i, k, k o l: integer;
begin
write ( ’ n= ’ ); readln ( n );
for i :=1 to n do
read ( x [ i ]);
311

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

{Так как минимальная серия состоит из двух элементов,}
{к присвоим значение 1.}
к : = 1; {Длина серии.}
k o l : = 0; {Количество серий в массиве.}
for i :=1 to n-1 do
{Если при умножении двух соседних элементов результат - отрицатели
{число, то элементы имеют разный знак.}
i f x [ i ] * x [ i +l ] 1 then kol := kol +1;
{Подготовить показатель продолжения серии}
{к возможному появлению следующей серии.}
к : = 1; end;
{Проверка, не было ли серии в конце массива.}
if k> 1 then
{Если да, увеличить счетчик еще на единицу.}
kol := kol +1;
if kol >0 then
write ( ’Количество знакочередующихся серий= ’, kol)
else write ( ’Знакочередующихся серий нет ’ )
end.
Далее рассмотрим чуть более сложную задачу на серии.

312

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 5.40. Блок-схема решения задачи 5.8
ЗАДАЧА 5.9. В заданном массиве найти самую длинную серию
элементов, состоящую из единиц.
313

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Для максимальной серии будем хранить её длину (шах) и номер
последнего элемента ( k o n _ ma x ) .
Эта задача похожа на предыдущую, отличие заключается в том, что надо
фиксировать не только тот факт, что серия кончилась, но и саму серию.
Серия может характеризоваться двумя из трёх параметров: первый
элемент серии, последний элемент серии, длина серии. В связи с тем,
что мы фиксируем серию в момент её окончания, то в качестве
параметров серии будем использовать последний элемент серии ( коп)
и её длину (к).
Алгоритм решения этой задачи следующий. Вначале количество серий
( k o l ) и её длина (к) равны нулю. Перебираем последовательно все
элементы, если текущий элемент равен 1, то количество элементов в
с е р и и ^ увеличиваем на 1. Если текущий элемент не равен 1, то
возможны два варианта: либо сейчас оборвалась серия из единиц, либо
встретился очередной неравный единице элемент. Выбор из этих двух
вариантов можно осуществить, сравнив переменную к с единицей.
Если к>1 , сейчас оборвалась серия из единиц, и количество таких
серий ( k o l ) надо увеличить на 1, зафиксировать конец серии
( k o n : = i - l ) и длину серии ( d l i n a : = k ) . После этого необходимо
проверить порядковый номер серии. Если это первая серия (ко 1 = 1), то
объявляем ее максимальной, в переменную max записываем длину
текущей серии к, в переменную к о п _ ш а х — к о п (последний элемент
текущей серии). Если это не первая серия ( k o l > l ) , то длину текущей
серии (к) сравниваем с длиной серии максимальной длины (шах). И
если k>max, то текущую серию объявляем серией максимальной длины
(m ax:=k;
k o n _ m a x : = k o n ; ). Если встретился не равный нулю
элемент, надо количество элементов в серии положить равным нулю
( к : =0).
После выхода из цикла надо также проверить, не было ли в конце
серии, состоящей из единиц. Если серия была в конце, то следует
обработать её такж е, как и серию, которая встретилась в цикле.
Блок-схема решения задачи приведена на рис. 5.41.
Ниже приведён текст консольного приложения решения задачи.
314

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

var х : array [ 1.. 50 ] of integer;
n, i, k, kol, kon, max, kon_max, dlina : integer;
begin
{Ввод размера массива.}
write ( ’ n= ’ );
readln ( n );
{Ввод массива}
writeln ( ’Массив X ’ );
for i :=1 to n do
read ( x [ i ]);
{Начальное присваивание длины серии и количества серий}
к : = 0; {Длина серии.}
k o l : = 0; {Количество серий в массиве.}
{Перебираем все элементы в массиве}
for i :=1 to n do
{Если текущий элемент равен 1, то}
if х [ i ]=1 then
{количество подряд идущих единиц увеличить на 1.}
k:=k+l
else
{Если текущий элемент не равен 1, то}
begin
{проверяем, была ли серия до этого, к>1?}
if к> 1 then
{Если только что оборвалась серия, то}
begin
{увеличиваем количество серий.}
kol := kol +1;
{Фиксируем тот факт, что на предыдущем элементе серия закончилась,]
kon:= i-1;
{длина серии равна к.}
dlina :=к;
{Если это первая серия,}
if kol= 1 then
{объявляем ее максимальной.}
begin
{Длина максимальной серии единиц.}
max:= dlina;
{Конец максимальной серии, состоящей из единиц, хранится в переме!
315

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

{kon_max.}
kon_max:=kon;
end
{Если это не первая серия, состоящая из единиц,}
else
{то её длину сравниваем с длиной серии с максимальным количеством
{единиц.}
if k>max then
{Если длина текущей серии больше,}
begin
{то объявляем ее максимальной.}
max:= dlina;
kon_max:=kon;
end;
end;
{Если текущий элемент массива не равен 0, то количество подряд}
{встречающихся единиц начинаем считать сначала (к:=0).}
к : = 0;
end;
{Проверка, не было ли серии в конце массива.}
if k> 1 then
{Если да, увеличить счётчик ещё на единицу.}
begin
kol := kol +1;
{Серия закончилась на последнем элементе.}
kon:=n;
dlina :=k;
{Обработка последней серии так, как это происходило в цикле.}
if kol= 1 then
begin
max:= d l i n a ;
kon_max:=kon;
end
else
if k>max then
begin
max:= dlina;
kon_max:=kon;
end;
316

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

end;
{Если серии были, то}
if kol >0 then
{вывод информации о серии с максимальным количеством единиц.}
begin
writeln ( ’Количество серий, состоящих из единиц= ’, kol);
writeln ( ’Наибольшая серия начинается с номера ’,
kon_max- max+1, ’, заканчивается номером ’, kon_max,
’, её длина равна ’, шах)
end
{Вывод информации об отсутствии серий.}
else
writeln ( ’Нет серий, состоящих из единиц ’ )
end.

317

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Рис. 5.41. Блок-схема решения задачи 5.9
ЗАДАЧА 5.10. Задан массив вещественных чисел. Перевести все
318

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

элементы массива в Р-ричную систему счисления.
Перед решением всей задачи давайте разберёмся с алгоритмом перевода
ве-щественного числа из десятичной в другую систему счисления. Этот
алгоритм можно разделить на следующие этапы:
1.
2.
3.
4.

Выделение целой и дробной частей числа.
Перевод целой части числа в другую систему счисления.
Перевод дробной части числа в другую систему счисления.
Объединение целой и дробной частей числа в новой системе
счисления.

Алгоритм перевода целого числа в другую систему счисления
Разделить нацело число на основание новой системы счисления.
Получим остаток и частное. Остаток от деления будет младшим
разрядом числа. Его необходимо будет умножить на 10 в нулевой
степени. Если частное не равно нулю, то продолжим деление; новый
остаток даст нам следующий разряд числа, который надо будет
умножить на десять в первой степени и т. д. Деление будем продолжать
до тех пор, пока частное не станет равным 0. Особенностью алгоритма
является то, что число формируется в обратном порядке от младшего
разряда к старшему, что позволит в один проход собрать число в новой
системе счисления.
Алгоритм перевода дробной части числа в другую систему счисления
Умножить дробную часть числа на основание системы счисления. В
полученном произведении выделить целую часть числа, это будет
старший разряд числа, который необходимо будет умножить на П о ­
дробную часть опять умножить на основание системы счисления. В
произведении целая часть будет очередным разрядом (его надо будет
умножить на И)
а дробную часть необходимо опять умножить на
основание системы счисления до получения необходимого количества
разрядов исходного числа.
Блок-схема функции перевода вещественного числа Д г из десятичной
системы счисления в другую систему представлена на рис. 5.42.
319

Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер

Программирование на Free Pascal и Lazarus

Обратите внимание, как в блок-схеме и в функции реализовано
возведение в степень. В связи с тем, что при переводе целой части
числа последовательно используются степени 1 0 , начиная с Q, для
формирования степеней десяти вводится переменная