Вы находитесь на странице: 1из 98

МИНОБРНАУКИ РОССИИ

––––––––––––––––––––––––––––––––––––––––––––––––––––
Санкт-Петербургский государственный электротехнический
университет «ЛЭТИ» им. В. И. Ульянова (Ленина)
–––––––––––––––––––––––––––––––––––––––––––

М. В. БЕЛЬТЮКОВ

ПРОГРАММИРОВАНИЕ В СРЕДЕ RAD STUDIO


ДЛЯ РЕШЕНИЯ МЕДИКО-ТЕХНИЧЕСКИХ ЗАДАЧ

Учебно-методическое пособие

Санкт-Петербург
Издательство СПбГЭТУ «ЛЭТИ»
2020
1
УДК 621.3.06:61
ББК З 973.2 – 018 + Р
Б 44

Бельтюков М. В.
Б 44 Программирование в среде RAD Studio для решения медико-технических
задач: учеб.-метод. пособие. СПб.: Изд-во СПбГЭТУ «ЛЭТИ», 2020. 98 с.

ISBN 978-5-7629-2681-2

Содержит основы практического обучения программированию. Курс по-


строен на изучении базовых приемов программирования с использованием
языка Delphi и включает 7 тем. В качестве среды программирования выбрана
среда RAD Studio.
Предназначено для студентов бакалавриата первого семестра дневной и
вечерней форм обучения, направление «Биотехнические системы и техноло-
гии».

УДК 621.3.06:61
ББК З 973.2 – 018 + Р

Рецензент: д-р техн. наук, проф. П. Н. Афонин (Санкт-Петербургский


им. В. Б. Бобкова филиал Российской таможенной академии).

Утверждено
редакционно-издательским советом университета
в качестве учебно-методического пособия

ISBN 978-5-7629-2681-2 © СПбГЭТУ «ЛЭТИ», 2020


2
Введение
Использование компьютерных технологий в медицине. Медицина не
может обойтись без компьютерных технологий. Это и все более сложные ме-
тоды математической обработки медицинских данных, и обработка сложных
изображений, и хранение всевозможной информации. Часть этих задач мож-
но решать с помощью стандартных программных пакетов, но некоторые за-
дачи требуют создания специального программного обеспечения.
Рассмотрим в качестве примера простую задачу – отображение сигнала
ЭКГ (электрокардиограммы), снятой у пациента и записанной в текстовый
файл. Данная программа должна позволять считывать данные из файла и
строить кривую ЭКГ. Также, учитывая большую длительность сигнала,
необходимо обеспечить возможность «скроллирования» сигнала в окне про-
граммы. В качестве средства создания программного комплекса была выбра-
на оболочка RAD Studio. Вид экрана представлен на рис. В.1.

автоскрол
лер

Рис. В.1. Вид экрана


Цель данного пособия – привить студентам первичные навыки програм-
мирования с использованием языка Delphi в среде RAD Studio, которые по-
могут им создавать программные комплексы медицинского назначения.
Язык программирования Delphi. В настоящее время в компьютерном
мире существует множество языков программирования. Программу, выпол-
няющую одни и те же действия, можно написать на языках Бейсик (BASIC),

3
Паскаль (Pascal), Си (C), Питон (Python). Язык Delphi основан на базе языка
Object Pascal и лучше других языков подходит для обучения программирова-
нию. Это обусловлено тем, что язык Pascal был разработан в 1970-е гг. швей-
царским ученым Никлаусом Виртом специально для обучения студентов
программированию. Язык был назван в честь французского математика и
философа Блеза Паскаля.
Наиболее популярным компилятором стала разработка американской
фирмы «Embarcadero». С появлением системы MS Windows возникла необ-
ходимость написания программ для этой системы, и фирма «Borland» выпу-
стила несколько версий компиляторов для создания программ в среде Win-
dows (Turbo Pascal for Windows). Но наиболее удачной получилась система
визуальной среды программирования (Rapid Application development – RAD-
система) Borland Delphi.
Первая версия Delphi была создана для Windows 3.1. С появлением си-
стемы MS Windows 95 была выпущена 16-разрядная версия Delphi 2.0, а за-
тем 32-разрядная Delphi 3.0. В 2020 г. выпущена версия RAD Studio XE
10.4.1. (В 2000-х годах фирма «Borland International» передала права на среду
программирования фирме «Embarcadero», а сама система стала поддерживать
не только язык Object Pascal, который «перерос» в язык Delphi, но кроме Del-
phi поддерживает языки программирования Delphi.Net и C++ для операцион-
ных систем Windows, Linux, IOS и Android.)
Среда Delphi предполагает использование визуального проектирования
и событийного программирования (программирование процедур обработки
событий визуальных компонентов), применение которых позволяет суще-
ственно упростить процесс разработки и создания приложений. Программи-
сту требуется разработать только «идею» программы, а «представление»
программы сделает Delphi.
Этапы разработки программ включают в себя:
• построение модели программы;
• разработку и выбор алгоритма решения поставленной задачи;
• набор текста программы. В визуальной среде программирования это
означает: создание окна программы, содержащего различные визуальные
элементы, и написание команд событий;
• отладку;
• тестирование;
• написание и настройку файла помощи;
• создание инсталлятора.
4
Модель программы. На этом этапе определяется, какая информация бу-
дет входной и какие результаты должны быть представлены на выходе.
Разработка алгоритма – последовательность действий для достижения
поставленной задачи. Результатом этого этапа является подробное словесное
описание алгоритма или его графическое отображение – построение струк-
турной схемы алгоритма.
После создания алгоритма осуществляется собственно этап написания
программы. Необходимо создать макеты диалоговых окон и продумать взаи-
модействие между ними, а затем написать код программы.
При написании программы неизбежно возникают ошибки – как синтак-
сические (ошибки при наборе текста), так и алгоритмические (ошибки в са-
мом алгоритме программы). Требуется этап отладки.
После его окончания следует этап тестирования, проверка работоспо-
собности системы с различными входными данными.
При написании коммерческой программы также необходимо преду-
смотреть контекстную помощь – этап создания файла помощи. Этот этап
может быть включен в этап написания программы.
Окончательно для распространения программы другим пользователям
служит этап создания инсталлятора.
Схемы алгоритмов и программ. При написании алгоритма программы
наиболее удобным способом отображения является графический способ –
структурная схема. Для создания структурных схем алгоритма необходимо
использовать ГОСТ 19.701-90 (ИСО 5807-85). Все основные символы алго-
ритма вписываются в прямоугольник со сторонами a  b. Соотношение сто-
рон b = 2a или 3a = 2b. Базовый размер a берут из ряда 10, 15, 20 и т. д.,
кратным 5. Основные символы показаны на рис. В.2.
Структура пособия. Каждая тема разделена на две части: теоретическое
знакомство с материалом и описание алгоритма создания программы.
Работа выполняется на двух занятиях. На первом занятии требуется по
предлагаемым инструкциям набрать программу и разобраться в ее струк-
туре. Второе занятие посвящено созданию программы по индивидуально-
му заданию.
Результатами работы являются созданная программа и отчет, включаю-
щий титульный лист; схему алгоритма; тестовый пример (для вычислитель-
ных задач).

5
Комментарий
R = 0,25a 0,5 Комментарий

a
R
a
5 толщин линии
Решение
0,2a Линия
Терминатор
0,2a
a
Направление потока указывается в конце каждой
b линии или на всех потоках, или на тех, которые
Граница цикла
идут справа налево и снизу вверх.
Процесс
Пересечение потоков не имеет логической связи

0,15a
Соотношение размеров
0,25a Для сохранения формы символов при построении
Предопределенный
можно воспользоваться соотношением
процесс 2b = 3a или b = 2a
Данные

К Из Схема «Простейшая программа»


N N стр. стр. N Название
ø 0,5a NS NS программы
Начало
Соединитель или процедуры
Внешний
(N – букваи внутренний
соединения Тело программы
соединители
«A», «B» и т. д.)
(N – буква соединения;
NS – номер страницы,
соединяемого
Соединители Конец
элемента)

Рис. В.2. Основные символы, используемые для построения


структурных схем алгоритмов
Каждая работа заканчивается зачетом по теоретическому материалу рас-
сматриваемой темы и созданной программе.
Замечание. Для выполнения практических заданий подходят все версии
RAD Studio или Delphi.

1. ЗНАКОМСТВО СО СРЕДОЙ
ПРОГРАММИРОВАНИЯ RAD STUDIO

Цели: получить представление об оболочке программирования RAD


Studio, научиться запускать оболочку, создавать простейшую программу.

1.1. Теоретические сведения


Оболочка RAD Studio. Для запуска оболочки RAD Studio (поскольку
мы будем создавать программы на языке Delphi для среды Windows, то в
6
дальнейшем используем обозначение Delphi) необходимо выбрать в главном
меню MS Windows пункт Пуск/Программы/Embarcadero RAD Studio
10.4/RAD Studio 10.4. Значок иконки оболочки Delphi в зависимости от вер-
сии показан на рис. 1.1.

Embarcadero
RAD Studio X 10
(иконки RAD Studio, Delphi, C++)

Рис. 1.1. Иконка среды программирования RAD Studio


Окна Delphi показаны на рис. 1.2. Условно оболочка представляет собой
четыре основных окна: «Главное окно Delphi», «Инспектор объектов» – окно
настройки свойств и событий объектов, окно «Визуальный проектировщик
форм» и окно «Редактор программы».
При создании программы в Delphi приняты понятия «проект» и «мо-
дуль». Это связано с модульным способом построения программ. Главная
программа называется проектом и содержит ссылки на дополнительные
файлы – модули, используемые главной программой.
Object Inspector Главное окно Tool Palette

Проектировщик формы Текст программы


Рис. 1.2. Интегрированная среда программирования RAD Studio 10.4
7
При написании программы в Delphi создаются следующие типы файлов:
1) имя1.dpr – имя файла проекта. Имя создаваемой программы определя-
ется именем проекта;
2) имя2.dfm – имя визуального образа создаваемой программы;
3) имя2.pas – имя модуля программы, содержащей текст событий визу-
ального образа;
4) имя1.cfg, имя2.dcu, имя1.dof, имя1.dsk, имя1.dsm, имя1.res – вспомога-
тельные файлы;
5) *.~* – резервные копии файлов;
6) имя1.exe – файл созданной программы.
Для сохранения программы необходимы файлы, указанные в п. 1–3.
Остальные файлы создаются автоматически при компиляции программы.
Главное окно Delphi может состоять из меню системы, панели проекти-
ровщика проекта, панели кода программы, панели визуальных компонентов.
Настройка видимых элементов системы осуществляется в пункте меню View.
Меню системы включает команды Delphi для управления проектом. Панель
инструментов содержит иконки кнопок быстрого доступа к некоторым ко-
мандам меню. Панель визуальных компонентов содержит иконки всех визу-
альных компонентов, которые программист может использовать в своей про-
грамме. Для удобства визуальные компоненты сгруппированы по назначению
и расположены на различных вкладках – Standard, Additional, Win32 и т. д.
Инспектор объектов (рис. 1.3) состоит из двух частей (вкладок) – Proper-
ties (Свойства) и Events (События). В верхней строке указан визуальный ком-
понент (объект), для которого настраиваются свойства и события. Настроить
свойство объекта (вкладка Properties) можно тремя способами: набрать свой-
ство в строке ввода, выбрать свойство из списка (значок ) и воспользоваться
«Мастером настройки свойств» (значок ). Некоторые свойства содержат
подсвойства, доступ к которым можно получить, щелкнув мышью на значке .
Чтобы свернуть список подсвойств, необходимо щелкнуть на значке . Для
заполнения событий визуального объекта необходимо выбрать вкладку Events.
Чтобы запрограммировать событие, необходимо щелкнуть на выбранном
свойстве, при этом становится активным Редактор программы.
Визуальный проектировщик форм представляет собой окно создаваемой
программы. В Delphi есть шаблоны для создания некоторых «специальных»
окон: окно о программе (About), различные диалоговые окна и т. д. Для созда-
ния такого окна необходимо при создании новой формы (вид создаваемого ок-
8
на) выбрать соответствующий шаблон в галерее форм, выполнив пункт меню в
Главном окне Delphi File/New form, значок . После создания формы необхо-
димо настроить ее свойства (имя (Name) объекта формы, заголовок, цвет и др.)

Обозначение объекта
Настраиваемые события

Настраиваемые свойства

Свойство имеет подсвойства

Свойство выбирается из списка

Для настройки свойства служит «Мастер»

Рис. 1.3. Окно «Инспектор объектов»


После этого на форме размещают другие визуальные компоненты. Для
этой цели выбирают в Главном окне Delphi в Панели визуальных компонен-
тов необходимый компонент и помещают его на форме (щелкают на вы-
бранном элементе, затем щелкают на форме в том месте, где должен быть
расположен этот компонент). Для точного изменения размера компонента
можно использовать комбинацию клавиш на клавиатуре <Shift> и <стрелки>.
В Инспекторе объектов эти свойства задаются в строках Height – высота
объекта в пикселях и Width – ширина объекта. Для точного позиционирова-
ния объекта в форме можно использовать комбинации клавиш <Ctrl> и
<стрелки>. Позиция определяется свойствами Top – верхний левый угол
объекта и Left – левый край объекта.
При помещении на форму визуального компонента каждый из них полу-
чает собственное имя (свойство Name), позволяющее обращаться к этому
объекту при программировании. Имя построено так, что содержит в названии
имя класса, к которому относится объект, и порядковый номер используемо-
го элемента данного класса. Например, имя Form1 указывает на элемент
формы и показывает, что это первый элемент класса Form.
Рекомендация. Следует изменять имена элементов, чтобы было понятно
назначение каждого элемента. Но чтобы показать, к какому свойству отно-
сится объект, необходимо оставлять заглавные буквы от класса. Например,
FMain – объект класса Form (буква «F»), который обозначает главное окно
9
(«Main»); BBExit – объект класса BitBtn (кнопка с картинкой), на что указы-
вают буквы «BB», и эта кнопка служит для выхода из программы («Exit» –
выход). Те объекты, которые будут использоваться только как видимые эле-
менты, можно не переименовывать.
При выборе визуального компонента, для которого необходимо напи-
сать событие (например, для кнопки BBExit написать команду выхода из про-
граммы), выбирают в Инспекторе объектов вкладку Events и выбирают не-
обходимое событие – onClick (щелчок мыши), onKeyPress (нажатие клавиши)
и др. – и щелкают по нему мышью. Некоторое событие является событием
«по умолчанию», т. е. если в окне Визуальный проектировщик форм выбрать
визуальный элемент и дважды на нем щелкнуть, то будет программироваться
именно это событие (это событие расположено первым в списке событий).
При этом становится активным окно Редактор программы. При создании
модуля программы часть стандартного текста вводится автоматически.
Структура модуля.
unit Модуль; // Имя модуля программы
{************}
interface // Описание интерфейсной части
{Разделы доступны другим модулям, использующим этот:}
uses // Раздел модулей – модули, используемые в программе
Мод1, МодN; {Имена используемых модулей: «Мод1», «МодN»}
const // Раздел констант
Конст1 = Знач1; // Присвоение значения «Знач1» константе «Конст1»
type // Раздел типов – используемые типы
Тип1 = Описание1; // Описание типа с именем «Тип1»
var // Раздел переменных – используемые переменные
Пер1 : Тип1; // Описание переменной «Пер1» типа «Тип1»
{************}
implementation // Раздел описания модуля
{Разделы доступны глобально внутри модуля:}
uses // Раздел модулей – модули, используемые в программе
Мод2; // Внутри модуля используется модуль «Мод2»
const // Раздел констант
Конст2 = Знач2; // Присвоение значения «Знач2» константе «Конст2»
label // Описание раздела меток
Метка1; // Описание метки с именем «Метка1»
10
type // Раздел типов – используемые типы
Тип2 = Описание2; // Описание типа с именем «Тип2»
var // Раздел переменных – используемые переменные
Пер2 : Тип2; // Переменная «Пер2» типа «Тип2»
{************}
procedure Проц1; // Описание процедуры с именем «Проц1»
{Разделы доступны локально внутри процедуры:}
type // Раздел типов – используемые типы
Тип3 = Описание3; // Описание типа с именем «Тип3»
var // Раздел переменных – используемые переменные
Пер3 : Тип3; // Переменная «Пер3» типа «Тип3»
begin // Начало описания процедуры «Проц1»
Операция1; // Тело процедуры «Проц1», выполняющей «Операцию1»
end; // Конец описания процедуры «Проц1»

end. // Конец описания модуля «Модуль»


Таким образом, модуль состоит из трех частей:
1. Описание типов, констант, процедур, доступных другим программам,
использующим этот модуль.
2. Описание типов, констант и т. д., используемых в данном модуле (это
раздел глобальных переменных).
3. Описание самих процедур со своими типами и константами (раздел
локальных переменных).
Для каждого оператора или группы операторов может быть написан
комментарий. Комментарий одной строки кода начинается с двойного сле-
ша – «//», заключается в фигурные скобки – «{}» или в скобки со знаками
«звездочка» – «(* *)»:
//комментарий одной строки
{комментарий части текста}
(*Комментарий
{ // текста
программы}
с комментариями*)
При написании текста модуля целесообразно использовать отступы в
описании конкретных разделов, что дает возможность видеть начало и конец
соответствующего раздела.

11
Некоторые команды редактора. При написании программы можно ис-
пользовать следующие комбинации клавиш для упрощения набора текста:
Справка:
<F1> – выдает справку (если курсор указывает на стандартный опера-
тор, то будет выдана справка по этому оператору).
Переключение между окнами:
<F12> – переключает окна Визуальный проектировщик форм и
Редактор программы;
<F11> – делает активным окно Инспектор объектов;
<F10> – делает активным Главное окно Delphi.
Перемещение по тексту:
<↑> <↓> <→> <←> – передвинуть курсор вверх, вниз, вправо,
влево;
<PgUp>, <PgDn> – передвижение на страницу вверх, вниз;
<Ctrl><PgUp>,
<Ctrl><PgDn> – передвижение в начало текста, в конец
текста.
Ввод и удаление текста:
<Insert> – режим «вставки»/«замены»: текущий режим показан внизу
окна Редактор программы – «Insert» (вставка) или «Overwrite» (замена);
<Enter> – добавить новую строку;
<Delete>, <BackSpace> – удалить символ в позиции курсора (Delete)
или слева от курсора (BackSpace);
<Alt><BackSpace> – восстановить текст (например, удаленный фраг-
мент).
Работа с фрагментом текста:
<Shift><стрелки> – выделение текста («окраска» текста инвертируется);
<Ctrl><Insert> – поместить фрагмент в буфер обмена;
<Shift><Delete> – удалить фрагмент из текста в буфер обмена;
<Shift><Insert> – вставить текст из буфера обмена;
<Ctrl><K><H> – снять выделение фрагмента;
<Ctrl><K><U> – сдвинуть фрагмент на символ влево;
<Ctrl><K><I> – сдвинуть фрагмент на символ вправо.
Установка закладок. В большом тексте для облегчения перемещения
по тексту можно устанавливать закладки:
12
<Ctrl><K><«N»> – установить закладку с номером «N» (N – номер за-
кладки, в левой позиции строки появится символ с номером закладки, в
данном случае номер «1» (комбинация клавиш <Ctrl><K><1>));
<Ctrl><Q><«N»> – перейти на закладку с номером «N».
Компиляция и запуск программы:
<Ctrl><F9> – компиляция программы (создание файла с расширением
.exe без запуска программы);
<F9> – запуск программы.

1.2. Создание программы «Моя первая программа»


Задача. В качестве первой программы необходимо создать программу
«Цветное окно с картинкой».
Примерный вид окна программы показан на рис. 1.4.

Рис. 1.4. Примерный вид окна первой программы


Процесс создания программы проходит по следующему алгоритму:
1. Запустить оболочку Delphi из пункта меню MS Windows или с «Рабо-
чего стола».
2. Сохранить проект в рабочем каталоге с помощью команды File/Save Pro-
ject As…, значок в Главном окне Delphi. Необходимо изменить предлагаемые
по умолчанию имена на следующие: файл с расширением .dpr назвать
«Work1.dpr» (так будет называться файл создаваемой программы); модуль –
файл с расширением .pas – назвать «main», т. е. это главное окно программы.
Рекомендация. Целесообразно каждый создаваемый проект хранить в
отдельной папке; в именах файлов можно использовать только латинские
буквы без пробелов!
13
3. Настроить окно программы:
• назвать форму FMain  Окно Инспектор объектов, вкладка
Properties, свойство Name (в дальнейшем изменяемое свойство будет обо-
значаться после стрелки);
• заголовок окна изменить на Программа №1  свойство Caption;
• изменить свойство Position на poScreenCenter для вывода окна про-
граммы в центре экрана;
• изменить цвет окна на стандартный  в свойстве Color выбрать цвет
clBtnFace;
• сделать окно «прозрачным»: установить в свойстве TransporentColor
значение True (цвет прозрачный), а в свойстве TransporentColorValue вы-
брать, какой цвет прозрачный (в нашем случае выбрать clBtnFace);
• изменить тип окна программы  свойство BorderStyle, выбрать зна-
чение bsNone (в программе отсутствуют рамка и заголовок окна).
4. Поместить на форму картинку  объект Image вкладка Additional на
Панели визуальных компонентов в Главном окне Delphi, иконка значка .
На форме появится место будущей картинки. Картинка может быть отобра-
жена двумя способами: либо занять место, определенное пользователем
(рамка картинки), либо изменить рамку под реальные размеры картинки. Для
настройки картинки необходимо изменить следующие свойства:
• Picture – загружает «Мастера» для выбора картинки из файла. Выберите
любой файл с картинкой из имеющихся на жестком диске. В состав Delphi
входит набор картинок. Их можно взять в папке Image\Splash, находящейся в
папке Delphi (для версий 1, 2), или в папке Program Files\Common
Files\Borland Shared\Image\Splash (для остальных версий). Картинки находятся
в двух папках: 16 Color и 256 Color – в зависимости от используемых в кар-
тинке цветов. Если указанной папки нет, выбрать любую доступную картинку;
• AutoSize – при значении true значения, установленные пользователем
для картинки (свойства Width – ширина и Height – высота), будут изменены
в соответствии с реальными размерами картинки;
• Stretch – при значении true размеры картинки будут адаптированы к раз-
мерам, установленным пользователем (указанным в свойствах Width и Height).
Замечание. Свойства AutoSize и Stretch являются взаимоисключающими;
• Transparent – при значении true картинка будет иметь прозрачный фон.
5. Поместить на форме кнопку для выхода из программы. Можно уста-
новить кнопки двух типов: простую  объект Button, вкладка Standard, с

14
иконкой объекта , или с картинкой  объект BitBtn, вкладка Additional,

значок . Изменить свойства (пусть мы используем кнопку BitBtn):


• Name, если установлена кнопка BitBtn, изменить на BBExit;
• выбрать «родительский» тип кнопки – в свойстве Kind выбрать значе-
ние bkClose – кнопка закрытия окна. Будут выбраны стандартные значения
заголовка кнопки (свойство Caption) и картинка кнопки (свойство Glyph).
Картинка нас устраивает, а вот заголовок изменим;
• установить заголовок кнопки (свойство Caption) на значение
«В&ыход». Символ «&» указывает, что следующая буква в названии будет
«горячей», т. е. при нажатии на букву «ы» сработает кнопка. Но только если
выбрана русская раскладка клавиатуры!
6. Поместить на форму метку для подписи к картинке  объект Label,

вкладка Standard, значок . Изменить ее свойства:


• Caption – заголовок, изменить на название помещенной картинки;
• Font – шрифт текста, запускает «Мастера» для настройки названия,
цвета и стиля шрифта метки.
7. Запрограммировать выход при щелчке по кнопке:
• выбрать элемент установленной кнопки на форме (вокруг кнопки будет
рамочка). Активный элемент, т. е. элемент, свойства которого настраиваются,

выделен рамочкой ; если рамочки нет ни на одном элементе, то активна


форма;
• так как у нас взят элемент BtnFace, то кнопку даже не нужно программиро-
вать – кнопка сама закроет окно (программу) при ее нажатии!;
• если бы была выбрана кнопка Button, то такая кнопка программируется
вручную: дважды щелкнуть по кнопке мышью – будет выполнено событие on-
Click на вкладке Events в Инспекторе объектов (это событие является событием
«по умолчанию»). Станет активным окно Редактор программы. При этом ав-
томатически будет создана процедура для программирования события onClick.
Например, если была использована кнопка BExit, текст будет следующим:
Procedure TFMain.BExitClick(Sender: TObject);
begin

end;
• в тело созданной процедуры (между операторными скобками begin и
end) вписать команду закрытия окна – Close. Так как оно одно, то закрытие
окна приведет к выходу из программы. Текст программы станет таким:
15
Procedure TFMain.BExitClick(Sender: TObject);
begin
Close;
end;
• Обратите внимание! После слова «Close» стоит знак «;», так как на
языке Delphi необходимо ставить знак «точка с запятой» «;» после каждой
команды.
8. Программа создана! Для запуска программы необходимо:
• сохранить программу  команда File/Save All, значок в меню Глав-
ного окна Delphi;
• запустить программу  Run/Run в меню Главного окна Delphi или
щелкнуть на значок на Панели инструментов в Главном окне Delphi.
9. Выйти из Delphi по команде File\Exit, значок .
10. Загрузить проект (если потребуется) при следующем запуске Delphi
можно через пункт File/Open Project, значок в Главном окне Delphi. А по-
следние проекты доступны в пункте File/Reopen.

Итоги. В первой теме были изучены: оболочка Delphi; структура про-


граммы; команды редактора.
При создании демонстрационной программы получены навыки работы
со следующими командами и визуальными компонентами: окном формы
Form; кнопкой Button; кнопкой с картинкой BitBtn; рисунком Image; мет-
кой Label; командой закрытия окна Close.

2. УСЛОВНЫЕ ОПЕРАТОРЫ

Цели: изучение типов переменных, описания переменных и констант,


операций с переменными; изучение условных операторов.

2.1. Теоретические сведения


Типы данных. Язык Object Pascal предоставляет ряд типов данных. Все они
построены на базе стандартных типов переменных стандарта языка Паскаль:
• Integer – целый тип, переменные этого типа могут принимать положи-
тельные и отрицательные значения в диапазоне от –32768 до 32767.
• Real – вещественный тип, переменные этого типа могут принимать
положительные и отрицательные значения, записываемые как в простой
форме: 10.12, 5.6, так и в экспоненциальной: 2.123Е5 (= 2,123105), 0,854Е-
3(= 8.5410–4). Диапазон чисел этого типа – от 2.9Е-39 до 1.7Е38.
16
• Char – символьный тип, переменные этого типа служат для записи зна-
чений символов, которые должны заключаться в прямые кавычки: 'A', 'ю', '7' –
переменная содержит символы «А», «ю», «7».
• Boolean – логический тип, переменные этого типа могут принимать
только два значения: true (истина) и false (ложь).
• Перечисляемый тип – указывает возможные значения переменной,
например: 1, 5, 45, 56 – переменная такого типа может содержать только одно
из указанных чисел. На базе стандартных типов переменных созданы все
остальные типы Object Pascal, представленные в табл. 2.1 (ячейки стандарт-
ных типов выделены).
Таблица 2.1
Целые числа
Тип данных Диапазон Формат
ShortInt –128…127 Знаковый, 8 бит
SmalInt –32768…32767 Знаковый, 16 бит
LongInt –2147483648…2147483647 Знаковый, 32 бита
Byte 0…255 Беззнаковый, 8 бит
Word 0…65535 Беззнаковый, 16 бит
Integer –2147483648…2147483647 Знаковый, 32 бита
Cardinal 0… 2147483647 Беззнаковый, 32 бита
Comp –9,210 …9,210
18 18
Целый, абсолютно точный
Вещественные числа
Тип данных Диапазон Кол-во цифр Кол-во байт
–39
Real 2,910 …1,710 +38
11–12 6
–45
Single 1,510 …3,410 +38
7–8 4
–324
Double 5,010 …1,710 +308
15–16 8
–4932
Extended 3,410 …1,110+4932
19–20 10
Символы
Тип данных Символы Коды
AnsiChar ANSI 0…255
WideChar Unicode 0…65535
Char ANSI 0...255
Строки
Тип Тип строки
String
Статическая длина от 0 до 255 символов
ShortString
LongString Длина ограничена объемом памяти
Динамический То же, но каждый символ –
WideString
Unicode-символ (16 бит)
Логический
Тип Значение
Boolean true (истина), false (ложь)

17
Переменные и константы. Для описания переменных служит раздел
переменных, начинающийся ключевым словом Var. Переменные могут быть
глобальными (переменная доступна в любом месте программы) и локальными
(переменные доступны только в той процедуре, в которой они описаны).
Объявление переменной выглядит так:
имя : тип;
Здесь имя – имя объявляемой переменной; тип – один из типов языка
Delphi.
Пример.
var
a,b,c: Real;
S : String;
В примере введены три переменные типа real и одна переменная string.
Однотипные переменные можно перечислять через запятую.
Замечание. Имя переменной может содержать только латинские буквы
и не зависит от выбранного регистра, т. е. переменные s и S – это одна и та
же переменная. Удобно записывать разнотипные переменные на разных
строках.
При назначении переменной значения используется оператор «присво-
ить» – «:=».
В общем виде присвоение выглядит так:
Имя := Выражение;
Пример.
k := 5; – присвоить переменной k значение 5; с := 5 + t; – присвоить пе-
ременной с значение 5 + t .
В языке Паскаль существует два вида констант: обычные и именован-
ные. Обычная константа – это целое или дробное число, строка символов
или отдельный символ, логическое значение. Именованные константы, как
и переменные, перед использованием должны быть объявлены в разделе опи-
сания констант. Описание именованной константы в общем виде:
Константа = значение;
Здесь константа – имя объявляемой константы; значение – значение
именованной константы.
Пример.
const
Ch = 'S'; // Константа Ch содержит символ S
18
V = 33; // Константа V содержит значение числа 3.
Тип константы определяется ее значением. После объявления константы
в инструкциях программы вместо значения константы можно использовать
ее имя.
Операции с переменными. Выражение состоит из операторов и опе-
рандов. Операции находятся между операндами. Операндами могут быть
константы и/или переменные. Операции определяют действия, выполняемые
над операндами. В табл. 2.2 указаны операторы, их действия и тип получен-
ного выражения.
Таблица 2.2
Тип
Оператор Действие Тип оператора
выражения
Если один операнд real Real
+ Сложение
все integer Integer
– Если один операнд real Real
Вычитание
все integer Integer
Если один операнд real Real
* Умножение
все integer Integer
/ Деление Real или integer Real
div Деление нацело Всегда integer Integer
Остаток
mod Всегда integer Integer
от деления
Логические операторы
Оператор Действие Операнд1 Операнд2 Результат
False False False
Конъюнкция False True False
and
(«И») True False False
True True True
False False False
Дизъюнкция True False True
or
(«ИЛИ») False True True
True True True
Инверсия False True
not
(Отрицание) True False
Оператор Описание Значение выражения
> Больше True, если первый операнд больше второго, иначе false
True, если первый операнд меньше второго,
< Меньше
иначе false
= Равно True, если первый операнд равен второму, иначе false
True, если первый операнд не равен второму,
<> Не равно
иначе false
Больше True, если первый операнд больше или равен второму,
>=
или равно иначе false
Меньше True, если первый операнд меньше или равен второму,
<=
или равно иначе false

19
Условные операторы. Условный оператор позволяет выбирать одно из
двух действий, причем выбор осуществляется во время выполнения про-
граммы. Существует два вида условных операторов:
1. If условие then действие.
2. If условие then действие1 else действие2.
Здесь условие – выражение логического типа; действие1, действие2 –
отдельные операторы или операторы, сгруппированные вместе при помощи
операторных скобок begin и end. Такой оператор называется составным.
Графически операторы условия изображены на рис. 2.1.

Истина Истина Ложь


Условие Условие

Ложь
Действие Действие 1 Действие 2

Оператор первого типа Оператор второго типа


Рис. 2.1. Структурная схема условного оператора
Замечание. Над потоками должны быть указаны значения условия, при
котором выполняются действия (на рисунке это «Истина» и «Ложь»).
Для оператора первого типа, если выражение условие принимает значе-
ние true, выполняется действие, стоящее после ключевого слова then. Если
же значение условие равно false, то действие не выполняется.
Пример.
If X > Y then X := 5; – значение переменной Х станет равным 5 только в
том случае, если выполняется условие X > Y, в противном случае значение Х
останется прежним.
Для оператора второго типа, если условие принимает значение true, то
выполняется действие1, стоящее после оператора true, при значении условия
false выполняется действие2, стоящее после оператора else.
Пример.
If X > Y then X := 5 else X := 3; – значение переменной Х станет равным
5 при условии X > Y, при невыполнении условия Х будет равно 3.
Замечания:
1. Перед оператором else значок «точка с запятой» не ставится!

20
2. В условном операторе выполняется только один оператор, стоящий
после слов then или else. Если требуется выполнить несколько операторов,
необходимо их поместить между операторными скобками begin и end.
Пример.
Переменные X и Y должны получить значения 5 и 23 соответственно
при выполнении условия А > 0 и обнуляются (получают значение 0), если
A  0. Оператор условия будет выглядеть так:
If A > 0 then
begin
X := 5;
Y := 23;
end
else
begin
X := 0;
Y := 0;
end;
Операторы, следующие после then или else, в свою очередь также могут
быть условными операторами.
1. Условный оператор первого типа – If условие then действие. При
этом:
• если оператор действие является условным оператором первого типа
(рис. 2.2), ему соответствует конструкция:

Истина
Условие 1

Ложь Истина
Условие 2

Ложь
Действие

Рис. 2.2. Выполнение Условие 1 –


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

21
If условие1 then
If условие2 then действие
В этом случае оператор действие определяется однозначно;
• если оператор действие – условный оператор второго типа, то спра-
ведлива конструкция:
If условие1 then
If условие2 then
действие1
else
действие2.
Возникает вопрос: какому оператору then соответствует else (рис. 2.3)?
Для обеспечения однозначности в языке Паскаль принято соглашение о том,
что каждому else соответствует предыдущий свободный then.

Истина
Условие 1

Ложь Ложь
Условие 2

Истина

Действие1 Действие2

Рис. 2.3. Выполнение Условие 1 –


условный оператор второго типа
2. Условный оператор второго типа – If условие then действие1 else дей-
ствие2. Оператор действие1 – условный оператор первого типа, оператор дей-
ствие2 не является условным оператором (рис. 2.4). Получаем конструкцию:
If условие1 then
begin
If условие2 then
действие1
end
else
действие2.
Видно, что оператор действие1 необходимо заключить в операторные
скобки, иначе придем к схеме на рис. 2.3.
22
Истина
Условие 1

Ложь Истина
Условие 2

Ложь

Действие 2 Действие 1

Рис. 2.4. Выполнение Условие 1 – условный


оператор первого типа, невыполнение – Действие2
Рекомендации:
1. Для упрощения чтения текста программы при описании условных
операторов следует использовать лидирующие пробелы для выделения каж-
дого раздела.
2. Если возникают трудности в оценке порядка выполнения действий в
условном операторе, необходимо использовать операторные скобки.
Оператор выбора. Если при построении условного оператора известно
большинство возможных значений условия, то необходимо использовать
оператор выбора. В общем виде структура этого оператора следующая:
Case переменная of
Значение1 : Действие1;

ЗначениеN : ДействиеN;
else
ДействиеN1;
end;
Здесь:
Переменная – переменная перечисляемого типа (например: integer, char);
Значение1, …, ЗначениеN – возможные значения переменной;
Действие1, …, ДействиеN – действия, выполняемые при значении пере-
менной, равном одному из значений Значение1, …, ЗначениеN;
ДействиеN1 – действие, выполняемое в случае, когда переменная не
принимает ни одно из перечисленных значений (Значение1, …, ЗначениеN).
Структурная схема оператора выбора показана на рис. 2.5.
23
Условие

Значение 1 Значение 2 Значение N Иначе

Действие 1 Действие 2 … Действие N Действие N+1

Рис. 2.5. Оператор выбора


Так же как и при использовании условного оператора, если Действие
представляет собой несколько операторов, их нужно поместить в
операторные скобки begin и end. Если при отсутствии значения переменной
никакое действие не выполняется, схема оператора выбора будет следующей:
Case переменная of
Значение1 : Действие1;

ЗначениеN : ДействиеN;
end;
Замечание. Оператор Case всегда оканчивается оператором end.
Очень удобно использовать оператор выбора при анализе нажатия кла-
виш клавиатуры.
Пример.
Пусть в разделе переменных описана переменная Ch типа сhar.
Case Ch of
'W' : Y := Y + 1;
'X' : Y := Y – 1;
end;
В примере анализируется переменная Ch. Если Ch содержит символ
«W», то переменная Y увеличивается на 1; если Ch содержит символ «X», то
переменная Y уменьшается на 1.

2.2. Создание программы «Попадание точки в фигуру»


Задача. Дана сложная фигура, вписанная в квадрат с координатами: ле-
вый нижний угол (5, 5), верхний правый угол (20, 20). Требуется написать
программу для определения попадания точки с введенными координатами в
указанную фигуру. Примерный вид окна программы показан на рис. 2.6.
24
Рис. 2.6. Примерный вид окна программы «Попадание точки в фигуру»
Процесс создания программы проходит по следующему алгоритму:
1. Запустить программу Delphi.
2. Сохранить проект как «Work2», модуль назвать «Main».
3. Назвать форму Name в значении FIf.
4. Создать образ окна: изменить заголовок на Попадание точки в фигуру.
5. Создать изображение фигуры:

• поместить в форму элемент Shape, вкладка Additional, значок ;


• изменить свойства объекта:
° дать имя фигуре (Name) Shape1. Так как на углах фигуры круги, изме-
нить тип фигуры (свойство Shape изменить на stCircle). Цвет фигуры пусть
будет синий (Brush.Color и Pen.Color), назначить clBlue. Размер: ширину
(Width) изменить на 100, высоту (Height) – на 100. Положение фигуры: ле-
вую координату (Left) изменить на 100, верхнюю координату (Top) – на 100.
Остальные фигуры (три круга и пять квадратиков) будут иметь параметры,
приведенные в табл. 2.3;
• поместить два элемента Shape для отображения осей координат. Один
элемент назвать (Name) SX0, другой SY0. Для элемента SX0 установить пара-
метры: Left в значение 50, Top в значение 2, Height – 250, Width – 1. Для
элемента SX0: Left – 50, Top – 250, Height – 1, Width – 260;
25
Таблица 2.3
Значения для фигуры под номером
Свойства
2 3 4 5 6 7 8 9
Name Shape2 Shape3 Shape4 Shape5 Shape6 Shape7 Shape8 Shape9
Shape stCircle stCircle stCircle stSquare stSquare stSquare stSquare stSquare
Brush.Color clBlue clBlue clBlue clBlue clBlue clBlue clBlue clBtnFace
Pen.Color clBlue clBlue clBlue clBlue clBlue clBlue clBlue clBtnFace
Left 100 150 150 100 150 200 150 150
Top 50 50 100 100 150 100 50 100
Height 100 100 100 50 50 50 50 50
Width 100 100 100 50 50 50 50 50
• поместить фигуру для отображения точки: элемент Shape. Настроить
его свойства: имя (Name) SPoint, ширина (Width) и высота (Height) – в зна-
чение 10, координата положения по X (Left) – в значение 45, по Y (Top) – в
значение 245.
6. Создать два элемента для ввода координат точки:
• поместить на форму два элемента SpinEdit, вкладка Samples, значок
;
• назвать один элемент SECoordX (для координаты X) и SECoordY (для
координаты Y)  свойство Name;
• настроить минимальное возможное значение вводимого числа – 0, мак-
симальное – 25, значение по умолчанию 0 и шаг изменения величины 1 
соответственно MinValue, MaxValue, Value и Increment.
7. Добавить надписи к полям ввода:

• поместить три элемента Label, вкладка Standard, значок ;


• настроить надписи на Координата X, Координата Y и Результат 
Caption.
8. Поместить метку для отображения результата попадания точки:
• назвать элемент LResult  Name. Цвет текста Font.Color в красный
цвет – clRed и заголовок метки – в значение Не попала.
9. Добавить метку для вывода результата попадания точки:

• поместить элемент Label, вкладка Standard, значок ;


• изменить заголовок на «Не попала»  Caption.
10. Добавить кнопки для запуска вычислений и выхода из программы:
• добавить кнопку для закрытия программы (элемент BitBtn, вкладка

Additional, значок ;
• назвать кнопку для выхода BBExit;
26
• выбрать тип кнопки Kind в значение bkClose;
• изменить заголовок кнопки на «Выход»  Caption.
11. Образ окна создан!
12. Проанализировать форму фигуры для создания алгоритма – в нашем
случае проверить попадание в большой квадрат с четвертями окружности по
углам и проверить, не попадает ли точка во внутренний квадрат.
13. Запрограммировать элемент SECoordX:
• щелкнуть дважды по кнопке SECoordX (будет сгенерировано событие
onChange – изменение значения в элементе SpinEdit);
• записать оператор проверки координат (координаты можно получить у
элементов SECoordX и SECoordY через свойства Value – обращение к свой-
ству объекта осуществляется через «точку», например: SECoordX.Value дает
значение свойства Value элемента SECoordX. SECoordX.Value дает значе-
ние введенной координаты X, SECoordY.Value – координаты Y). Для удоб-
ства введем переменные X и Y – тип данных выбираем byte (подходит этот
тип данных, так как он позволяет содержать значения от 0 до 255, а коорди-
наты имеют значения от 0 до 25):
procedure TFIf.SECoordXChange(Sender: TObject);
var
X, Y : byte;
begin
LResult.Font.Color := clRed;
X := SECoordX.Value;
Y := SECoordY.Value;
// первый круг (Shape 1)
if ((X >= 5)and(X <= 10)and(Y >= 5)and(Y <= 10)and
(Sqr(X - 10) + Sqr(Y-10) <= 25))or
// второй круг (Shape 2)
((X >= 15)and(X <= 20)and(Y >= 5)and(Y <= 10)and
(Sqr(X - 15) + Sqr(Y-10) <= 25))or
// третий круг (Shape 3)
((X >= 15)and(X <= 20)and(Y >= 15)and(Y <= 20)and
(Sqr(X - 15) + Sqr(Y-15) <= 25))or
// четвертый круг (Shape 4)
((X >= 5)and(X <= 10)and(Y >= 15)and(Y <= 20)and
(Sqr(X - 10) + Sqr(Y-15) <= 25))or
27
// первый квадрат (Shape 5)
((X >= 5)and(X <= 10)and(Y >= 10)and(Y <= 15))or
// второй квадрат (Shape 6)
((X >= 10)and(X <= 15)and(Y >= 5)and(Y <= 10))or
// третий квадрат (Shape 7)
((X >= 15)and(X <= 20)and(Y >= 10)and(Y <= 15))or
// четвертый квадрат (Shape 8)
((X >= 10)and(X <= 15)and(Y >= 15)and(Y <= 20))
then
begin
// попадание в фигуру (отображаем зеленым цветом)
LResult.Font.Color := clGreen;
LResult.Caption := 'Попала';
end
else
begin
// непопадание в фигуру (отображаем красным цветом)
LResult.Font.Color := clRed;
LResult.Caption := 'Не попала';
end;
// передвигаем «точку» в выбранные координаты
// начало координат определяется свойствами Left и Top элементов
// осей координат SX0 и SY0 соответственно. Шаг попиксельно
// рассчитываем, зная ширину и высоту квадратика Shape6,
// умноженную на введенные значения X и Y
// учитываем направление изменения координат X – слева-направо
// Y – сверху-вниз
SPoint.Left := SX0.Left + X * Shape6.Width div 5 - (SPoint.Width div 2);
SPoint.Top := SY0.Top - Y * Shape6.Height div 5 - (SPoint.Height div 2);
end;
14. Выбрать то же событие выбора значения onChange у элемента
SECoordY, что и запрограммированное для элемента SECoordX – из выпа-
дающего списка в событии SECoordY.onChange выбрать SECoordXChange.
15. Запустить программу  <F9>.
16. Для улучшения программы можно запрограммировать:
• дооформить координатные оси: добавить промежуточные оси, прону-
меровать координаты на осях;
28
• получать результат попадания точки при нажатии кнопки мыши на
форме.
Индивидуальное задание. Создать программу по заданию, рассмотрен-
ному в 2.2, используя шаблон в соответствии с номером варианта (рис. 2.7).
Для отображения треугольника можно его нарисовать в стандартной про-
грамме Paint и вставить в Delphi с помощью элемента Image (как в работе 1).

1 2 3 4 5 6 7

8 9 10 11 12 13 14

15 16 17 18 19 20 21

22 23 24 25
Рис. 2.7. Варианты заданий
Итоги. Во второй теме были изучены: типы переменных; операции над
операндами; условные операторы.
При создании демонстрационной программы получены навыки работы
со следующими командами и визуальными компонентами: элементом фигу-
ры Shape; элементом изменения значения чисел SpinEdit; связыванием со-
бытий объектов.

3. ОПЕРАТОРЫ ЦИКЛА
Цели: изучение стандартных функций; метки; изучение операторов
цикла; отладка программ.

3.1. Теоретические сведения


Стандартные функции. Для выполнения часто встречающихся вычис-
лений и преобразования данных в Object Pascal существуют стандартные
функции.
Некоторые стандартные арифметические функции перечислены в табл. 3.1.
29
Для более сложных расчетов необходимо подключить к программе мо-
дуль Math. Для этого в разделе описания модулей (например, после слова
implementation) добавить следующую строку: Uses Math;
Некоторые функции из этого модуля (арифметические, тригонометриче-
ские и для перевода углов из одной системы в другую) представлены в табл. 3.2.
Таблица 3.1
Функция Действие
Abs(n) Абсолютное значение n
Sqr(n) Число n в степени 2
Sqrt(n) Корень квадратный из числа n
Sin(n) Синус числа n
Cos(n) Косинус числа n
ArcTan(n) Арктангенс числа n
Exp(n) Число е в степени n
Ln(n) Натуральный логарифм числа n
Таблица 3.2
Функция Действие
Арифметические
Натуральный логарифм числа (x + 1)
Lnxp1(x)
(использовать при х, близких к 0)
Ceil(x) Ближайшее большее число к х
Floor(x) Ближайшее меньшее число к х
Frexp(x,m,e) Мантисса m и порядок e числа х
IntPower(a,x) а в целой степени х – ах
LdExp(x,p) Число х, умноженное на 2 в целой степени р – х2р
Log10(x) Десятичный логарифм числа х (lg(x))
Log2(x) Двоичный логарифм числа х (lb(x))
LogN(n,x) Логарифм по основанию n числа х (lognх)
Max(a,b) Максимальное из двух чисел а и b
Min(a,b) Минимальное из двух чисел а и b
Poly(x,C) Степенной ряд с коэф. С (массив) – с0 + с1х + с2х2+…+ сnxn
Power(a,x) Число а в степени х (ах)
Тригонометрические
PI Число  ( ≈3,1415926535897932385)
ArcCos(x) Арккосинус х
ArcCosH(x) Гиперболический арккосинус х
ArcSin(x) Арксинус х
ArcSinH(x) Гиперболический арксинус х
ArcTanH(x) Гиперболический арктангенс х
CosH(x) Гиперболический косинус х
Cotan(x) Котангенс х (Cos(x) / Sin(x))
Hypon(a,b) Гипотенуза прямоугольного треугольника – a2  b 2
SinCos(r,s,c) Синус s и косинус с угла r в радианах
SinH(x) Гиперболический синус х
Tan(x) Тангенс х (Sin(x) / Cos(x))
TanH(x) Гиперболический тангенс х
30
Окончание табл. 3.2
Перевод углов из одной системы в другую
CycleToRad(x) Перевод периодов х в радианы (1 период соответствует 2)
DegToRad(x) Перевод градусов х в радианы (180 соответствуют )
Перевод величины x, представленной в радианах, в периоды
RadToCycle(x)
(2 соответствует период)
Перевод величины х, представленной в радианах, в градусы
RadToDeg(x)
( радиан соответствуют 180)
Статистические расчеты
Генерация случайного числа по распределению Гаусса,
RandG(m,sd) задается m – математическое ожидание, sd – стандартное
отклонение
MaxIntValue(D) Максимальное число из массива целых чисел D
MaxValue(D) Максимальное число из массива чисел D
Mean(D) Среднее число массива D
MeanAndStdDev(D,
Среднее число m и квадратичное отклонение sd массива D
m,sd)
MinIntValue(D) Минимальное число массива целых чисел D
MinValue(D) Минимальное число массива чисел D
StdDev(D) Квадратичное отклонение массива D
Sum(D) Сумма всех чисел массива D
SumInt(D) Сумма всех целых чисел массива D
Функции преобразования типов. Функции преобразования служат для
преобразования переменной одного типа в другой тип. Наиболее часто такие
функции используются при вводе и выводе информации. Например, для выво-
да значения переменной числового типа в поле ввода необходимо преобразо-
вать значение в строковый тип, так как поле ввода позволяет выводить только
строки. В табл. 3.3 перечислены основные функции преобразования типов.
Таблица 3.3
Функция Значение
Chr(n) Символ в стандарте ANSI с номером n
IntToStr(n) Преобразование целого числа n в строку
FloatToStr(n) Преобразование вещественного числа n в строку
Преобразование вещественного числа n в строку с форматом f,
FloatToStrF(n,f,l,m)
длиной строки l и количеством m цифр после десятичной точки
StrToInt(s) Преобразование строки s в целое число
StrToFloat(s) Преобразование строки s в вещественное число
Round(n) Ближайшее к n целое
Trunc(n) Целая часть от n
Frac(n) Дробная часть вещественного числа n
Int(n) Целая часть вещественного числа n
Операторы цикла. При разработке алгоритмов решения большинства
задач возникает необходимость повторения ряда шагов. Для организации но-
вых повторов (циклов) можно использовать три разновидности операторов
31
цикла: с параметром, с предусловием, с постусловием. Каж-
I := NV дую разновидность цикла можно реализовать с помощью
условного оператора и безусловного перехода (см. далее).
Тело цикла Если число повторений тела цикла заранее известно, то
применяется оператор цикла с параметром. Структурная
схема представлена на рис. 3.1. Общий вид следующий:
I := KV
For переменная := нач_значение to кон_значение do тело
или
Рис. 3.1. Цикл For переменная := нач_значение downto кон_значение do
с параметром тело;
Здесь:
переменная – параметр цикла, в качестве параметра может быть исполь-
зована любая переменная перечисляемого типа (например, integer);
нач_значение и кон_значение – выражения, задающие начальное и ко-
нечное значения параметра цикла соответственно;
тело – простой или составной оператор.
Тип начального и конечного значений цикла должен совпадать с типом
параметра цикла. Выполнение оператора цикла начинается с проверки усло-
вия переменная <= конзн для цикла to и переменная >= конзн для цикла
downto. Если условие не выполняется, то оператор тело не выполняется и
управление передается следующему за циклом оператору. Если же условие
истинно, то выполняется оператор тело, затем параметру цикла переменная
присваивается следующее значение (цикл to) или предыдущее значение
(цикл downto). Далее процесс повторяется. Если параметр цикла целого типа,
то это означает его увеличение (цикл to) или уменьшение (цикл downto) на
единицу при каждом вычислении расположенного в цикле оператора.
Замечание. Шаг изменения параметра всегда равен 1 или –1.
Примеры.
(Считается, что раздел переменных имеет следующий вид: var S,I: Inte-
ger; Sim : Char; L : Boolean;)
S := 0; For I := 5 to 7 do Inc(S);
Операция Inc(S,K) означает S := S + K, т. е. увеличение параметра S на
значение K. Если K не задан, то считается, что K = 1. (Обратная функция
Dec(S,K) – уменьшение переменной S на значение K.) В примере после вы-
полнения цикла переменная S получит значение 3.
S := 10; For I:= 10 downto 6 do Dec(S,2); S получит значение 0.
S := 0; For Sim := 'A' to 'D' do S := S + 1; S получит значение 4.
S := 0; For L:=false to true do Inc(S,3); S получит значение 6.
32
Если в цикле необходимо выполнить несколько операторов, то исполь-
зуется составной оператор.
Пример.
S := 0;
For I := 1 to 3 do
begin
S := S + Sqr(I);
P := S + 1;
end;
После выполнения цикла переменная S станет равной 14, а переменная
P – равной 15.
Замечания.
1. Значение переменной параметра цикла, а также начальное и конечное
значения изменять внутри цикла нельзя.
2. Для принудительного выхода из цикла в Object Pascal используют ко-
манду Break.
3. Для повторного выполнения тела цикла со следующим значением па-
раметра цикла в Object Pascal используют команду Continue.
4. При выходе из цикла значение параметра цикла не определено.
Оператор цикла с параметром применим, если известно число повторе-
ний, шаг цикла равняется 1 или –1. В противном случае необходимо исполь-
зовать два других типа цикла: с предусловием или с постусловием.
Оператор цикла с предусловием (рис. 3.2, а) имеет вид:
while условие do тело;
Здесь:
условие – выражение условного типа; Имя цикла
тело – простой или составной оператор. Имя цикла
Условие
Выполнение оператора начинается с вы-
числения значения выражения условие. Если Тело цикла Тело цикла
это значение true, то выполняется оператор
тело. Затем выполнение оператора цикла по-
Имя цикла Имя цикла
вторяется до тех пор, пока значение выражения Условие
условие не станет равным false. В этом случае
управление передается оператору, стоящему за а б
оператором цикла. Если значение выражения Рис. 3.2. Цикл
условие при первом входе в цикл равно false, то с предусловием (а)
и с постусловием (б)
цикл не выполняется ни разу.
33
Замечание. Один из операторов внутри цикла должен влиять на значе-
ние условие, иначе цикл будет повторяться бесконечно – происходит «зацик-
ливание» программы.
Пример.
k := 0;
while k <6 do
begin
Inc(k,2);
Y := Sqr(k);
end;
В примере использована процедура Inc(k,2), которая увеличивает значе-
ние переменной k на 2. Общий вид процедуры: Inc(перем [, знач]) – увели-
чить значение переменной перем на величину знач. При отсутствии величи-
ны знач переменная перем будет увеличена на 1. Процедура Dec(перем
[,знач]) уменьшает значение переменной перем на величину знач.
В процессе выполнения цикла переменная Y будет иметь значения 4, 16, 36.
Оператор цикла с постусловием (рис. 3.2, б) похож на оператор цикла с
предусловием, но условие проверяется после выполнения операторов, со-
ставляющих тело цикла. Общий вид оператора:
repeat
тело;
until условие;
Здесь:
условие – выражение логического типа;
тело – оператор или составной оператор;
Замечания:
1. Так как тело цикла заключено между ключевыми словами цикла, то
при использовании в теле цикла составного оператора помещать его между
операторными скобками begin и end не нужно.
2. Так как условие проверяется в конце цикла, то необходимо, чтобы
цикл выполнялся как минимум один раз.
Оператор цикла с постусловием начинается с выполнения операторов
внутри цикла. Затем вычисляется выражение условие. Если значение равно
true, то осуществляется выход из цикла, а при значении false выполнение
тела повторяется.
34
Замечание. Выход из цикла с предуслови-
ем осуществляется при достижении ложности
Тело цикла
условия, а из цикла с постусловием – при до-
стижении истинности условия.
Пример.
Условие
Возьмем тот же пример, что и в цикле с Ложь
предусловием: Истина
K := 0;
Рис. 3.3. Цикл с постусловием,
repeat построенный с помощью
Inc(k,2); условного оператора
Y := Sqr(k);
until(k>6);
Результат будет тот же.
Любой тип оператора цикла может быть построен с помощью условного
оператора. Например, структурная схема цикла с постусловием, построен-
ного с помощью условного оператора, показана на рис. 3.3.
При построении такого цикла необходимо переслать информационный по-
ток перед операторами цикла, используя метки и оператор безусловного пере-
хода goto. Как и переменные, метки должны быть объявлены. Метки объявля-
ются в разделе меток (label). При использовании метки необходимо указать ее
имя с двоеточием. Переход на метку осуществляется командой goto метка.
Рассмотрим тот же пример, но с использованием условного оператора.
В разделе меток необходимо описать метку. Пусть имя метки beg.
Пример.
label
beg;
begin
{Прочие операторы}
k := 0;
beg :Inc(k,2);
Y := Sqr(k);
If k < 6 then goto beg;
{Прочие операторы}
end;

35
Рекомендация. Использование безусловного оператора goto затрудняет
чтение текста программы программистом, поэтому его применять не реко-
мендуется.
Отладка программы. При построении сложных программ могут возни-
кать ошибки. Их принято делить на три группы:
1) синтаксические;
2) ошибки времени выполнения;
3) алгоритмические.
Наиболее простые из них синтаксические – ошибки набора текста – они
исправляются в процессе компиляции программы. Ошибки времени выполне-
ния – ошибки, возникающие при несоответствии типов введенных парамет-
ров типам используемых переменных, или ошибки вычислений (например,
деление на 0) – отслеживаются так же легко уже при первых запусках про-
граммы. Будем считать, что программа запускается из оболочки Delphi. По-
сле возникновения такой ошибки необходимо нажать «Ok» в окне сообщения
об ошибке, а затем завершить выполнение программы – пункт меню
Run/Program reset – или нажать комбинацию клавиш <Ctrl><F2>. При воз-
никновении такой ошибки курсор в программе будет указывать на строку,
вызвавшую ошибку. Наиболее сложно обнаружить алгоритмические ошиб-
ки. Программа компилируется без ошибок, не дает ошибок при пробных запус-
ках, но при анализе результатов выясняется, что результат неправильный.
Необходимо вручную «прокрутить» алгоритм – требуется отладка программы.
Для трассировки программы (проверки «логики алгоритма»), т. е. вы-
полнения программы по шагам, необходимо выполнить следующие действия.
В пункте меню выбрать пункт Run/Step over или Run/Trace in to (клавиши
<F8> и <F7> соответственно), команда Run/Trace in to отличаются более де-
тальной трассировкой. Для прекращения трассировки и продолжения выпол-
нения программы в автоматическом режиме необходимо выбрать пункт
Run/Run или нажать <F9>. Остановить программу можно с помощью ко-
манды Run/Program reset или нажать комбинацию клавиш <Ctrl><F2>.
Иногда необходимо выполнить трассировку с определенной строки про-
граммы. Для этого курсор подводят к интересующей строке и выполняют
команду Run/Run to cursor или нажимают <F4>.
Часто известно возможное место ошибки в алгоритме – тогда использу-
ют точку останова. Программист устанавливает на нужной строке курсор и
ставит там точку останова с помощью команды Run/Add Breakpoint или
36
нажав <F5>. Выбранная строка будет отмечена. Для снятия точки останова
необходимо на этой строке снова нажать <F5>. При выполнении программа
дойдет до точки останова, затем программист сможет трассировать програм-
му с помощью <F7> и <F8>. При необходимости можно указать условие
остановки на точке останова (эта настройка осуществляется в окне Break-
points, пункт меню Run/Add breakpoints).
При выполнении программы по шагам часто необходимо не только про-
верять правильность «логики алгоритма», но и знать значения некоторых
переменных. Для этого выполняют команду View/Watch/Add watch и вводят
имя интересующей переменной либо подводят курсор к переменной, значе-
ние которой необходимо просмотреть, и нажимают <Ctrl><F5>. При трасси-
ровке программы в этом случае в окне Watch list можно наблюдать измене-
ние значений интересующих переменных.

3.2. Создание программы «Степенные ряды»


Задача. Необходимо рассчитать значения функций ex и ln(x), заданных с
помощью рядов, с определенной точностью. Точность и аргумент функции
вводятся с клавиатуры. Результат работы сравнить со значениями стандарт-
ных функций.
Формулы разложения в ряд экспоненты и логарифма представлены в
табл. 3.4.
Таблица 3.4
Стандартная
Функция Разложение в ряд Замечания
функция
x 2 x3 x 4
exp(x) ex  1 x     ... Exp(x) –
2! 3! 4!
Необходим модуль
x 2 x3 x 4
ln(x) ln( x  1)  x     ... Lnxp1(x+1) Math
2 3 4 |x|<1
Примерный вид окна программы представлен на рис. 3.4.
Процесс создания программы проходит по следующему алгоритму:
1. Запустить Delphi.
2. Сохранить проект как «Work3», модуль – «Main».
3. Изменить свойства окна: заголовок «Степенные ряды»  Caption.
4. Создать поля ввода для значений X и погрешности Е. Считать, что все
числа целые, порядок чисел задавать программно:

• взять два элемента SpinEdit, вкладка Samples, значок ;


37
Рис. 3.4. Примерный вид окна программы «Ряды Тейлора»
• назвать (свойство Name) один SEValueX – для ввода X, другой SEVal-
ueE – для ввода E;
• настроить минимальные значения элементов на 0  MinValue;
• настроить максимальное значение для элемента SEValueX – 9, для
SEValueE – 14  MaxValue;
• изменить шаг дискретизации на 1  Increment.
5. Добавить два элемента для вывода результатов – функция, рассчитан-
ная с помощью ряда, и функция, рассчитанная с помощью стандартной
функции:

• добавить два элемента Edit, вкладка Standard, значок ;


• назвать элементы (свойство Name) для вывода рассчитанной функции
ERFun, для стандартной – ESFun. Изменить свойство Text на 0 (по умолча-
нию результат равен «0»);
• добавить метки для обозначения вводимых и выводимых величин:
• изменить заголовки (Caption) меток:
○ для поля ввода X – «Введите Х»;

38
○ для ввода погрешности «Введите погрешность 10^-Е» (погрешность
вводить как количество знаков после запятой, например, число 3 будет обо-
значать погрешность 0,001);
○ для вывода расчетного значения – «Рассчитанная функция»;
○ для вывода стандартного значения функции – «Стандартная функция».
6. Так как будут рассчитываться две функции, добавить переключатель –
какая функция рассчитывается:

• добавить элемент RadioGroup, вкладка Standard, значок ;


• изменить название на RG  Name;
• изменить заголовок на «Функция»  Caption;
• добавить названия функций «Экспонента» и «Логарифм», запустив
мастер свойства Items:
○ ввести две строки: «Экспонента» и «Логарифм»;
○ установить активным первый элемент (нумерация начинается с 0) 
ItemIndex установить в 0.
7. Добавить две кнопки для выхода из программы и для начала расчета:

• добавить элемент Button, вкладка Standard, значок ;


• кнопки назвать: кнопка выхода BExit, кнопка расчета BOk  Name;
• изменить заголовки на «Выход» и «Ok»  Caption.
8. Окно готово!
9. Запрограммировать выход на кнопку BExit (команда Close);
10. Запрограммировать расчет на кнопке BOk: расчет будет осуществлен
для функции, которая отмечена элементом RG. Первой является функция
«экспонента»:
• проанализировать ряд, по которому осуществляется расчет функции, и
выявить, как получить элемент ряда an, зная элемент an-1. Для расчета экс-
поненты необходимо элемент ряда умножить на «x / n»;
• для расчета функции потребуются следующие переменные: для хране-
ния значения функции – переменная Func вещественного типа (тип Real);
переменные а и а1 для хранения соответственно n-го и (n+1)-го членов ряда
(также тип Real); переменная е (тип Real) для хранения точности расчета;
переменная x (тип Real) для удобства записи формул; переменная n (тип In-
teger) – счетчик цикла. Эти переменные необходимо описать в разделе var
процедуры нажатия на кнопку «Оk». Текст процедуры примет вид:

39
procedure TForm1.BOkClick(Sender: TObject);
var
Func : real;
A,A1 : real;
e : real;
x : real;
n : integer;
• присвоить значению переменной x значение элемента SEValueX (свой-
ство Value). При расчете точности необходимо в цикле умножать перемен-
ную e на число 0.1 столько раз, сколько требуется знаков после запятой (дан-
ное число содержит элемент SEValueE). Для этого после начала процедуры
(оператор begin) ввести следующие строки:
x := SEValueX.Value;
e := 1;
For n := 1 to SEValueE.value do e := e * 0.1;
• выяснить, какая функция рассчитывается, можно по переменной
RG.ItemIndex: если она равна 0, то рассчитывается функция «экспонента»,
если 1 – «логарифм». Для решения такой задачи удобно использовать опера-
тор выбора Case. После расчета точности необходимо добавить:
case RG.ItemIndex of
0 : begin
{Расчет экспоненты}
end;
1 : begin
{Расчет логарифма}
end;
end; {Case}
• для расчета функции можно использовать оператор цикла с постусло-
вием, так как данная функция может быть рассчитана как минимум один раз.
Условием выхода из цикла будет тот факт, что значение очередного члена
ряда станет меньше заданной точности. После комментария {Расчет экспо-
ненты} добавить строки:
Func := 1;
a := 1;
n := 1;
repeat
40
a1 := a * x /n;
Func := Func + a1;
a := a1;
Inc(n);
until(a<e);
• для вывода результатов расчета необходимо преобразовать числа в
строки, так как полем ввода/вывода элемента Edit является строка. После
окончания цикла (строка end {Case}) необходимо добавить следующие строки:
ERFun.Text := FloatToStr(Func);
ESFun.Text := FloatToStr(Exp(x));
11. Расчет экспоненты окончен! Запустить программу, нажав <F9>.
12. Для улучшения программы:
• необходимо написать текст расчета функции «логарифм». Так как ряд
использует в качестве аргумента x+1, удобно использовать функцию Lnxp1,
которая также возвращает натуральный логарифм числа (х+1). Для этого тре-
буется подключить к программе модуль Math. Это можно сделать в разделе
описания модулей после слова implementation. Необходимо добавить:
Uses
Math;
• для автоматического расчета после ввода значений в поля ввода (без
нажатия на кнопку «Ok») необходимо назначить элементам SEValueX и SE-
ValueE событие onChange кнопки BOk и сделать невидимой кнопку BOk
(эти задачи рассмотрены в 2.2).

Индивидуальное задание. Создать демонстрационную программу, ис-


пользуя две функции в соответствии с номером варианта.
Разложение в ряд функций и стандартные функции перечислены в
табл. 3.5, а варианты – в табл. 3.6.
Таблица 3.5
Стандартная
Функция Разложение в ряд Замечания
функция
x 2 x3 x 4
ex ex  1 x     ... Exp(x) –
2! 3! 4!
Необходим модуль
x 2 x3 x 4
ln(x) ln( x  1)  x     ... Lnxp1(x+1) Math
2 3 4 |x|<1
x3 x5 x 7
Sin(x) sin( x)  x     ... Sin(x) –
3! 5! 7!
x 2 x 4 x6
Cos(x) cos( x)  1     ... Cos(x) –
2! 4! 6!
41
Окончание табл. 3.5
Стандартная
Функция Разложение в ряд Замечания
функция
x3 x5 x 7
Arctg(x) arctg( x)  x     ... ArcTan(x) |x|<1
3 5 7
e x  e x
x3 x5 x 7 Sh(x) 
Sh(x) sh( x)  x     ... 2 –
3! 5! 7!
e x  e x
x 2 x 4 x6 Ch(x) 
Ch(x) ch( x)  1     ... 2 –
2! 4! 6!
π 1 1 1 Точность ограни-
  1     ... Pi/4
4 3 5 7 чить 5 знаками
Таблица 3.6
№ F1 F2 № F1 F2 № F1 F2 № F1 F2
1 Sin Cos 6 Sin  11 Cos  16 Ln Sh
2 Sin ArcTg 7 Cos ArcTg 12 ArcTg Ln 17 Ln Ch
3 Sin Ln 8 Cos Ln 13 ArcTg Sh 18 Ln 
4 Sin Sh 9 Cos Sh 14 ArcTg Ch 19 Sh Ch
5 Sin Ch 10 Cos Ch 15 ArcTg  20 Sh 
Итоги. В третьей теме были изучены: стандартные функции; функции
модуля Math; функции преобразования типов; операторы циклов.
При создании демонстрационной программы получены навыки работы
со следующими командами и визуальными компонентами: элемент строка
ввода Edit; элемент список зависимых кнопок RadioGroup.

4. ТИП ДАННЫХ «МАССИВ»


Цели: объявление новых типов данных; генератор случайных чисел;
изучение структуры массив; алгоритмы действий с массивами.
4.1. Теоретические сведения
Новые типы данных. Когда необходимо объявить свой тип данных, то
следует поместить его описание в разделе описания типов. В общем случае
описание типов выглядит так:
Имя = Описание типа;
Здесь:
Имя – имя нового типа;
Описание типа – описание возможных значений переменных создан-
ного типа.
Замечание. При описании нового типа после имени типа ставится знак
«равно», затем следует описание типа.
42
Примеры.
DayOfWeek = (Monday, Wednesday, Friday);
Day = 1..31;
Тип подобного вида называется перечисляемым, переменные данного
типа могут принимать только перечисленные значения. В примере это одно
из названий дня недели (тип DayOfWeek) или одно из чисел от 1 до 31 (тип
Day). Обратите внимание: перечисляемый тип данных не может содержать
кириллицу! С переменными перечисляемого типа можно использовать функ-
ции Pred(переменная) и Succ(переменная), возвращающие предыдущее
(Pred) и последующее (Succ) из допустимых значений.
Примеры.
Пусть объявлены переменные W : DayOfWeek и D : Day. Тогда:
W := Wednesday;
Succ(W); {Оператор вернет значение «Monday»}
D := 5;
Pred(D); {Оператор вернет значение «4»}
Замечания:
1. Значения перечисляемого типа не могут содержать русские буквы.
2. Обращение с помощью оператора Succ или Pred к последнему (для опе-
ратора Succ) или первому (для оператора Pred) элементу приведет к ошибке.
Массивы. Массив – это структура данных, которую можно рассматри-
вать как набор переменных одного типа, имеющих общее имя. Массивы
удобно использовать для хранения однородной по своей природе информа-
ции, например, таблиц, коэффициентов уравнений, матриц.
Объявление массива. Массив, как и любая переменная, перед использо-
ванием должен быть объявлен в разделе объявления переменных. В общем
случае объявление массива выглядит следующим образом:
Имя : array [нижний_индекс..верхний_индекс] of тип;
Здесь:
Имя – имя переменной-массива;
array – зарезервированное слово языка Паскаль, обозначающее, что пе-
ременная является массивом;
нижний_индекс,
верхний_индекс – целые константы, определяющие диапазон изменения
индекса элементов массива и неявно – количество элементов массива;
тип – тип элементов массива.
43
Примеры.
day = array [1..30] of Integer; {Объявлен тип – массив 30 целых чисел}
r : array [5..7] of Boolean; {Объявлена переменная – массив трех логиче-
ских элементов}
Если необходимо объявить несколько элементов типа «массив», целесо-
образно создать новый тип «массив» в разделе описания типов, а в разделе
описания переменных указать в качестве типа созданный тип. В этом случае
описание массива будет следующим:
type {Раздел описания типов}
ИмяТипа = array [нижний_индекс..верхний_индекс] of тип;
var {Раздел описания переменных}
Имя : ИмяТипа;
При объявлении массива удобно использовать именованные константы.
Пример.
const
N = 1;
E = 5;
type
Arr = array [N..E] of Char;
Массивы могут быть многомерными (обычная размерность массива – не
более трех). Для описания такого массива необходимо указать диапазоны ин-
дексов для каждой размерности через запятую.
В общем случае описание, например, двухмерного массива будет таким:
Имя : array [н_и1..в_и1, н_и2..в_и2] of тип;
Здесь:
н_и1, в_и1, н_и2, в_и2 – целые константы, определяющие диапазон
изменения верхнего и нижнего индексов первой и второй размерностей.
Пример.
Coord : array [1..5, 1..3] of Integer;
{Переменная типа массив Coord описывает двухмерный массив}
Чтобы в программе использовать элемент массива, надо указать имя
массива и номер элемента (индекс), заключив его в квадратные скобки. Ин-
декс может быть константой или выражением целого типа.
Примеры.
P := Coord[1,3];
Coord[5,2] := Coord[3,1];
44
Типичные действия с массивом – это вывод массива; ввод массива;
поиск максимального или минимального элемента массива; поиск в массиве
заданного элемента; сортировка массива.
Под выводом массива понимается вывод в диалоговом окне значений
элементов массива. Для вывода всех элементов массива можно использовать
оператор цикла For, при этом параметр цикла может служить в качестве ин-
декса элементов массива.
При выводе элементов массива можно, например, использовать следу-

ющие элементы: метка (элемент Label, вкладка Standard, значок ),

строка ввода (Edit, Standard, ).


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

сел элемент Ввод целых чисел (SpinEdit, Samples, ); при вводе/выводе


массива (особенно двухмерного) очень удобен элемент Таблица (StringGrid,

Additional, ).
Подробно действия с этими элементами при работе с массивами будут
рассмотрены при построении демонстрационной программы.
Генератор псевдослучайных чисел. Если необходимо получить числа,
содержащие случайные значения, то можно использовать генератор псевдо-
случайных чисел. Существуют два оператора:
1. Randomize – служит для «запуска» генератора чисел (иначе последо-
вательность генерируемых чисел всегда будет одна и та же).
2. Random[(R)] – служит для генерации случайного числа в диапазоне
от 0 до R, включая значение R. Квадратные скобки при описании какого-либо
оператора обозначают, что часть кода, помещенная в них, может не указы-
ваться, тогда будут использованы начальные установки для этого оператора.
Если в операторе Random граница R не указана, то числа будут генериро-
ваться в диапазоне от 0 до 1, включая значение 1.

45
Для генерации случайного числа по нормальному распределению необ-
ходима функция RandG(m,sd) из модуля Math (задаются математическое
ожидание m и стандартное отклонение sd).
Поиск минимального (максимального) элемента. В качестве примера
рассмотрим одномерный массив целых чисел.
Алгоритм поиска минимального (максимального) элемента массива
довольно очевиден: сначала делается предположение, что первый элемент
массива является минимальным (максимальным), затем остальные элемен-
ты массива последовательно сравниваются с этим элементом. Если при
очередной проверке обнаруживается, что проверяемый элемент меньше
(больше) принятого за минимальный (максимальный), то этот элемент
принимается за минимальный (максимальный) и продолжается проверка
оставшихся элементов.
Пример.
Пусть Size – размер массива a, переменная для хранения минимума –
min, максимума – max, I – параметр цикла.
Тогда поиск минимального и максимального значений будет выглядеть
так:
min := a[1];
max := a[1];
For I := 1 to Size do
begin
If a[I] < min then min := a[I];
If a[I] > max then max := a[I];
end;
После окончания цикла в переменной min будет храниться минимальное
значение, а в переменной max – максимальное.
Поиск заданного элемента. Самый простой способ – перебора – после-
довательный перебор значений массива и сравнение с искомым. Но при
большой размерности массива это приведет к неоправданным затратам вре-
мени. Оптимальным является метод бинарного поиска. Алгоритм предпола-
гает, что исходный массив отсортирован. На структурной схеме алгоритма
(рис. 4.1) приняты следующие обозначения: A – массив значений; S – сред-
ний индекс массива; N – начальный индекс массива; K – конечный индекс
массива; F – искомое значение.

46
Начало Начало

Цикл I
N+K I := 1
S= +N
2 увеличение

Цикл J
Да J := K
A[S]=F
уменьшение
Нет
Нет J := J + 1
Да Нет A[J-1]< A[J]
A[S]<F
Да
A[J-1] := A[J]
N := S + 1 K := S – 1 A[J] := A[J-1]

Цикл J
J=I
Нет N>K
Цикл I
Да I=K

Конец Конец

Рис. 4.1. Бинарный поиск Рис. 4.2. «Пузырьковая сортировка»

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


но использовать отсортированный массив. Рассмотрим алгоритмы сортиров-
ки данных. Наиболее популярным является «метод пузырька». В основе ал-
горитма лежит обмен соседних элементов массива. Каждый элемент массива,
начиная с первого, сравнивается со следующим, и если он больше следующе-
го, то элементы меняются местами. Таким образом, элементы с меньшими
значениями передвигаются к началу массива («всплывают»), а с большими
значениями – к концу массива («тонут»). Отсюда и название «пузырьковая
сортировка». Процесс сравнения повторяется столько раз, сколько элементов
в массиве минус единица, поэтому при большом количестве элементов про-
цесс сортировки требует много времени. На структурной схеме (рис. 4.2)
приняты следующие обозначения: А – массив; K – конечный индекс массива;
I, J – параметры цикла.

47
4.2. Создание программы «Работа с массивом»
Задача. Необходимо сгенерировать матрицу случайных чисел размерно-
стью 55 и в соответствии с имеющимся шаблоном сформировать итоговый
массив по следующему правилу: если в шаблоне позиция зачернена, то в этой
позиции в итоговую матрицу записывается число из той же позиции из ис-
ходной матрицы, иначе записывается 0.
Примерный вид окна программы представлен на рис. 4.3.

Рис. 4.3. Примерный вид окна программы


«Работа с массивами»
Процесс создания программы проходит по следующему алгоритму:
1. Запустить Delphi.
2. Сохранить проект («work4.dpr» и «main.pas»).
3. Настроить окно проекта:
• изменить заголовок окна на «Работа с массивом»  Caption;
• сформировать изображение шаблона массива:
○ поместить на форму элемент фигура (элемент Shape, вкладка Addi-

tional, значок );
○ настроить размеры фигуры, чтобы можно было из них построить
квадрат размером 5 на 5 фигур. Для этого изменить свойства фигуры Width –
ширина и Height – высота;
○ скопировать элемент в буфер (<Ctrl><С>);
○ сделать 24 копии (<Shift><V>);
○ разместить квадратики в квадрат 55;
48
○ выделить средний квадрат размером 33 (удерживая <Shift>, щелкать
на нужных квадратиках) – выделенные квадратики будут отмечены рамочкой

;
○ изменить цвет выделенного квадрата на красный (свойство
Shape/Color установить в значение clRed);
• поместить два элемента для хранения массивов:
○ поместить на форму два элемента строковая таблица (StringGrid,

Additional, ), разместив их слева (начальная матрица) и справа (итоговая


матрица) от построенного шаблона;
○ настроить имена этих элементов SGIshod и SGItog для хранения ис-
ходного и итогового массивов соответственно (Name);
○ остальные настройки этих двух элементов будут совпадать – выделить
эти два элемента;
○ настроить размеры таблиц (55 – количество квадратиков и заголовки;
итоговый размер 66) (свойства ColCount (количество столбцов) и Row-
Count (количество строк) установить в значение 6);
○ так как в ячейки будут записаны цифры размером 88 пикселей, изме-
нить размеры ячеек на значение 16 (ширину (DefaultColWidth) и высоту (De-
faultRowHeight));
○ изменить размеры (свойства Width и Height установить в значение
110);
○ изменить размер шрифта, используемого в таблицах, на 8 (Font/Size);
○ изменить свойство ScrollBars на ssNone, для того чтобы при выводе
цифр не появлялся скроллер;
• поместить на форму элементы для вывода неотсортированного и от-
сортированного массивов:
○ для неотсортированного массива использовать элемент метка (Label,

Standard, );
○ назвать элемент LSort (Name);
○ для отсортированного массива использовать элемент строка ввода

(Edit, Standard, );
○ назвать элемент ESort (Name);

49
• поместить метки для подписи всех видимых элементов: «Исходный
массив», «Итоговый массив», «Шаблон», «Неотсортированный массив» и

«Отсортированный массив» (Label, Standard, );


• добавить кнопки запуска расчетов и выхода из программы:

○ добавить два элемента Кнопка (Button, Standard, );


○ назвать один «BOk» (расчет) и другой – «BExit» (выход) (Name);
• форма готова!
4. Запрограммировать выход на кнопку BExit (команда Close).
5. Запрограммировать свойство формы onActivate для отображения пер-
вого результата расчета сразу после запуска программы, т. е. при ее активи-
зации:
• сделать активной форму – щелкнуть на окне на свободном от элемен-
тов месте;
• выбрать в Инспекторе объектов на вкладке Events свойство onActi-
vate;
• дважды щелкнуть на нем для начала ввода текста программы;
• ввести раздел переменных и сами переменные: параметры цикла I, J, K;
массивы – исходный MIs, итоговый MIt, для описания шаблона MSh (эле-
менты, отмеченные цветом, будут иметь значение 1, остальные – 0), одно-
мерный массив для сортировки Mass. Необходимо ввести следующие строки
перед оператором begin:
Var
I, J, K : Integer;
MIs, MIt, MSh : array [1..5,1..5] of Integer;
Mass : array [1..25] of Integer;
• перед заполнением массива запустить генератор псевдослучайных чи-
сел – после слова begin добавить оператор Randomize;
• пронумеровать заголовки строк и столбцов цифрами от 1 до 5. Для
этих целей удобно использовать цикл с параметром. При обращении к эле-
ментам таблицы (StringGrid) необходимо указать через точку свойство Cells.
Это свойство является двухмерным массивом и позволяет хранить значения
используемого массива. Нумерация индексов массива Cells начинается с 0,
причем нулевые элементы – это элементы заголовков; первый индекс – это
столбец, второй – строка. Текст программы будет следующим:
50
Randomize;
For I := 1 to 5 do
begin
{Элемент таблицы «строка» – требуется преобразование типов}
SGIshod.Cells[0,I] := IntToStr(I); {Пронумеровали строки}
SGIshod.Cells[I,0] := IntToStr(I); {Пронумеровали столбцы}
SGItog.Cells[0,I] := IntToStr(I); {Пронумеровали строки}
SGItog.Cells[I,0] := IntToStr(I); {Пронумеровали столбцы}
end;
• проанализировать полученный шаблон – в данном случае структура
массивов представляет собой квадрат и легко описывается циклом с пара-
метром;
• алгоритм обработки массива будет следующим:
○ обнулить массив шаблона;
○ обнулить итоговый массив;
○ заполнить массив шаблона единицами в позициях заданного шаблона
(центральный квадрат размером 33). Также изменить значения для элемен-
тов [1,1], [5,5] на значение 1 и [3,3] – на значение 0;
○ заполнить случайными числами из диапазона 1…9 исходный массив,
используя оператор Random, но так как он возвращает числа, начиная от 0,
необходимо к сгенерированному числу прибавлять 1 – команда
«Random(9)+1» как раз и будет генерировать числа от 1 до 9;
○ просматривая исходный массив, в соответствии с правилом заполнить
итоговый массив;
○ отобразить полученный итоговый массив в элементе SGItog;
○ выполнив эти пункты, получим следующий текст программы:
{Обнуляем итоговый массив и массив шаблона}
For I := 1 to 5 do
For J := 1 to 5 do
begin
MSh[I,J] := 0;
MIt[I,J] := 0;
end;
{Заполняем массив шаблона}
For I := 2 to 4 do
For J := 2 to 4 do
51
MSh[I,J] := 1;
MSh[3,3] := 0;
MSh[1,1] := 1;
MSh[5,5] := 1;
{Заполняем итоговый массив и отображаем его}
For I := 1 to 5 do
For J := 1 to 5 do
begin
MIs[I,J] := Random(9)+1;
SGIshod.Cells[I,J] := IntToStr(MIs[I,J]);
end;
{Заполняем по шаблону итоговый массив и отображаем его}
For I := 1 to 5 do
For J := 1 to 5 do
begin
If MSh[I,J] = 1 then MIt[I,J] := MIs[I,J];
SGItog.Cells[I,J] := IntToStr(MIt[I,J]);
end;
{Окончание заполнения массива}
• для реализации алгоритма сортировки массива необходимо:
○ перевести двухмерный массив в одномерный – пусть элемент с индек-
сом [1,1] будет иметь индекс [1]; [1,2] – [2]; [1,3] – [3]; [1,4] – [4]; [1,5] – [5];
[2,1] – [6]; [2,2] – [7] и т. д. Эту операцию также легко выполнить, используя
двойной цикл по параметрам цикла двухмерного массива и внутри цикла из-
меняя параметр цикла одномерного массива. Текст программы дополнится
после строки «{Окончание заполнения массива}» следующими строками:
k := 0;
For I := 1 to 5 do
For J := 1 to 5 do
begin
Inc(k);
Mass[k] := MIs[J,I];
end;
• вывести массив в поле вывода, задаваемое меткой LSort (сначала стро-
ку сделать «пустой», а затем, чтобы цифры при выводе не сливались, доба-
вить после каждой цифры пробел):
52
LSort.Caption := '';
For I := 1 to 25 do LSort.Caption := LSort.Caption+IntToStr(Mass[I])+ ' ';
{Массив еще не отсортирован}
• алгоритм сортировки массива Mass написать самостоятельно. Поме-
стить созданный текст алгоритма после строки {Массив еще не отсортирован}.
6. Для того чтобы программу можно было запускать на расчет много-
кратно, связать команду onClick кнопки BOk с командой onActivate (в поле
команды onClick в Инспекторе объектов выбрать процедуру FormActivate).
7. Запустить программу <F9>.
8. Программа готова!

Индивидуальное задание. Создать демонстрационную программу, ис-


пользуя шаблон в соответствии с номером варианта (рис. 4.4).

Итоги. В четвертой теме были изучены: объявление новых типов дан-


ных; генератор случайных чисел; структура «массив»; алгоритмы операций с
массивами.
1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

17 18 19 20

Рис. 4.4. Варианты заданий


53
При создании демонстрационной программы получены навыки работы с
командами: Randomize, Random и визуальными компонентами: элемент
строковая таблица StringGrid.

5. ГРАФИЧЕСКИЕ ПРИМИТИВЫ

Цели: знакомство с графическими примитивами; печать изображения;


мультипликация; формирование программируемого изображения.

5.1. Теоретические сведения


Графические примитивы. При создании программы может возникнуть
ситуация, когда, используя видимые элементы Delphi, не удается сформиро-
вать нужное изображение (это могут быть чертежи, иллюстрации, графики и
т. п.). В этом случае можно использовать программирование изображения.
Вся поверхность окна представ-
ляет собой холст, на который про-
грамма может выводить графику.
(0,0)
Этот холст задается свойством Can-
vas, позволяющим выводить графи-
ческие примитивы (точки, линии,
окружности, прямоугольники и т. п.)
и задавать их характеристики: цвет,
толщину и стиль линий; цвет и вид
(Image1.Width, Image1.Height)
заполнения областей; характеристи-
(Form1.ClientWidth, Form1.ClientHeight)
ки шрифта при выводе текстовой
Рис. 5.1. Координаты точек холста информации. Холст представляет со-
и элемента Image
бой систему координат с началом в
верхнем левом углу – таким образом, увеличение координаты X идет слева
направо, а координаты Y – сверху вниз (рис. 5.1). Холст можно представить
как набор пикселей – начало координат имеет координаты (0,0), а правый
нижний угол окна – (ClientWidth, ClientHeight).
Для рисования графических объектов используют «карандаш» (Pen), а
для заполнения замкнутых областей – «кисть» (Brush). Свойства инструмен-
тов Pen и Brush приведены в табл. 5.1.
В табл. 5.2 представлены все стандартные цвета, которые пользователь
может использовать в качестве значений свойства Color.

54
Таблица 5.1
Свойство Определение
«Карандаш» – Pen
Color Цвет линии
Width Толщина линии
Style Стиль линии
Mode Режим отображения
«Кисть» – Brush
Color Цвет закрашиваемой области
Style Стиль заполнения области

Таблица 5.2
Константа Цвет Константа Цвет
clAqua Бирюзовый clMedGray Средне-серый
clBlack Черный clManeyGreen Цвет мяты
clBlue Синий clNavy Темно-синий
clCream Кремовый clOlive Оливковый
Темно-серый
clDkGray clPurple Пурпурный
(clGray)
clFuchsia Фиолетовый clRed Красный
Серебристый
clGray Серый (clDkGray) clSilver
(clLtDark)
clGreen Зеленый clSkyBlue Лазурный (Delphi 6)
clLime Салатный clTeal Темно-голубой
Светло-серый
clLtGray clWhite Белый
(clSilver)
clMaroon Темно-бордовый clYellow Желтый
Если требуются другие цвета, то можно воспользоваться функцией
RGB(Red, Green, Blue), в качестве параметров которой передаются значения
соответствующего цвета (красного, зеленого, синего) в диапазоне от 0 (зна-
чение отсутствует) до 255 (цвет полностью насыщен).
Пример.
RGB(255, 0, 0) – даст чисто красный цвет (clRed);
RGB(100, 100, 100) – даст оттенок серого;
RGB(255, 255, 255) – даст чисто белый цвет (clWhite).
Также полезным может оказаться свойство Pen.Width, устанавливаю-
щее толщину рисуемой линии в пикселях. Дополнительную справку по
остальным свойствам «карандаша» и «кисти» можно получить из кон-
текстной справки Delphi.
Рассмотрим графические примитивы: TextOut – вывод текста, Pixels –
вывод точки, LineTo – вывод линии, PolyLine – вывод ломаной, PolyGon –

55
многоугольник, Rectangle – прямоугольник, RoundRec – прямоугольник с
закругленными краями, Ellipse – эллипс, Arc – дуга и Pie – сектор.
TextOut(X,Y:Integer; const Text: String) – вывод текста Text в прямо-
угольник, имеющий координаты верхнего левого угла X,Y. Стиль (Style),
цвет (Color), название шрифта (Name), размер шрифта (Size) определяются
объектом Font.
Пример.
Font.Name := 'Times New Roman'; {Название шрифта Times New Roman}
Font.Size := 14; {Размер шрифта 14}
Font.Color := clBlue; {Цвет шрифта Синий (clBlue)}
Font.Style := [fsBold, fsItalic, fsUnderLine, fsStrikeOut];
{Настройка стиля шрифта указывает-
ся в квадратных скобках через запятую: fsBold – жирный, fsItalic – курсив,
fsUnderLine – подчеркнутый, fsStrikeOut – зачеркнутый}
Для настройки фона выводимого текста необходимо настроить цвет ки-
сти (Brush.Color), например системный цвет clBtnFace позволит выводить
фон текста таким же, как фон окна.
Pixels[X,Y:Integer] := цвет – вывод точки с координатами X, Y цветом,
указанным переменной цвет.
Замечание. Все последующие процедуры чертятся цветом, установлен-
ным для инструмента «карандаш» – Pen.Color.
LineTo(X,Y:Integer) – рисует линию от текущей точки окна (позиция
курсора) до точки с координатами X и Y. Чтобы установить курсор в опреде-
ленную точку, необходимо использовать процедуру MoveTo[X,Y:Integer],
которая перемещает курсор в точку с координатами X и Y.
Пример.
MoveTo(0,0);
LineTo(ClientWidth,ClientHeight);
В примере будет проведена линия от левого верхнего угла окна до пра-
вого нижнего угла.
PolyLine(array of TPoint) – рисует ломаную кривую по точкам, указан-
ным в массиве точек, соединяя первую со второй, вторую с третьей и т. д. Точки
массива могут быть как перечислены непосредственно в процедуре PolyLine,
так и описаны ранее. Использование процедуры будет понятно из примеров.
Примеры.
1. Точки описаны в процедуре:
56
PolyLine([Point(10,20),Point(20,10),Point(30,20)]);
будет построена ломаная с вершинами в точках, указанных в стандартной
переменной Point, с координатами (10,20), (20,10), (30,20).
2. Для описания массива точек назначим массив PArray, который опи-
шем в разделе описания переменных. Затем необходимо заполнить массив
значениями точек и, наконец, вызвать процедуру PolyLine:
var
PArray : array[1..3] of TPoint;
begin
… {Описание программы}
PArray[1].X := 10;
PArray[1].Y := 20;
PArray[2].X := 20;
PArray[2].Y := 10; X3
PArray[3].X := 30; X1,Y1

PArray[3].Y := 20; Y3
PolyLine(PArray); X2,Y2

Здесь также будет построена ломаная


Рис. 5.2. Прямоугольник
с теми же координатами вершин, что и в
со скругленными углами
предыдущем случае.
Второй пример, несмотря на громоздкость, в случае многократного ис-
пользования PolyLine позволит разделить текст, описывающий точки, и
текст построения изображения, что лучше структурирует текст программы.
PolyGon(array of TPoint) – отличается от предыдущей процедуры тем,
что соединяет последнюю точку массива с первой, т. е. получаем замкнутую
фигуру.
Замечание. Все замкнутые фигуры чертятся цветом, установленным для
инструмента «карандаш» – Pen.Color, и заполняются цветом, определенным
для инструмента «кисть» – Brush.Color.
Rectangle(X1,Y1,X2,Y2:Integer) – прямоугольник, имеющий левый верх-
ний угол с координатами (X1,Y1) и нижний правый угол с координатами
(X2,Y2). Если длина X1–Y1 окажется равной X2–Y2, то получится квадрат.
RoundRec(X1,Y1,X2,Y2,X3,Y3:Integer) – вычерчивает прямоугольник
(X1,Y1,X2,Y2), но со cкругленными углами, размер скругления определяется
X3 – диаметром скругления по X и Y3 – диаметром скругления по Y (рис. 5.2).

57
Ellipse(X1,Y1,X2,Y2:Integer) – эллипс, вписанный в прямоугольник с
координатами (X1,Y1,X2,Y2); если это квадрат, то получаем окружность.
Arc(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer) – вычерчивает дугу эллипса,
вписанного в прямоугольник с вершинами (X1,Y1,X2,Y2); X3,Y3 определяют
точку начала дуги; X4,Y4 определяют точку конца дуги. Начальная (конеч-
ная) точка – это точка пересечения границы эллипса с прямой, проведенной
из центра эллипса в точки с координатами (X3,Y3) и (X4,Y4). Дуга вычерчи-
вается против часовой стрелки от начальной точки к конечной.
Pie(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer) – строит сектор. Строится по тем
же правилам, что и дуга, но отличается тем, что сектор – замкнутая фигура,
т. е. имеет цвет заполнения. Дуга и сектор изображены на рис. 5.3.
Дуга
X3,Y3 X1,Y1 X4,Y4
X1,Y1

X4,Y4 X3,Y3

X2,Y2 X2,Y2

Сектор
X1,Y1 X3,Y3 X1,Y1 X4,Y4

X4,Y4
X3,Y3

X2,Y2 X2,Y2
Рис. 5.3. Значения параметров для построения дуги и сектора
Печать изображения. Печать изображения – то же, что и вывод на
экран. Принтер, как и форма, имеет свойство Canvas. Здесь действуют та же
система координат и те же инструменты «карандаш» и «кисть». Отличие со-
стоит лишь в следующем: при печати надо сообщить принтеру, чтобы он
начал и закончил печать. Для этого надо поместить в текст программы все
графические вызовы, которые должны распечатать изображение между ко-
мандами принтера: Printer.BeginDoc и Printer.EndDoc. Как только принтер
получит команду Printer.EndDoc, он сразу отпечатает изображение.
Для печати необходимо настроить принтер с помощью стандартного ок-
на настройки. Для этого Delphi имеет вкладку наиболее популярных диало-
гов – Dialogs. На этой вкладке есть и диалоги настройки свойств принтера

58
(значок ) и свойств печати (значок ). Для вызова этих диалогов необ-
ходимо выполнить команду Execute. Например, команда
PrinterDialogSetup1.Execute откроет стандартное окно настройки принтера
(считается, что на форму помещен элемент настройки печати с именем
PrinterDialog1).
Если при создании программы планируется, что изображение будет пе-
чататься, необходимо предусмотреть умножение всех размеров используе-
мых объектов на константу, определяющую различие между размерами окна
и размерами бумаги. Для этих целей необходимо использовать свойства
принтера Printer.PageWidth и Printer.PageHeight, дающие размеры бума-
ги – ширину и высоту соответственно. Получить коэффициенты пересчета
можно, поделив самые короткие размеры печатаемой страницы на самые ко-
роткие размеры отображаемой формы:
Printer.PageWidth
Коэффициент = .
Pronter.PageHeight
Таким образом, при печати изображения останется только умножать все
размеры на эту константу.
Мультипликация. Под мультипликацией обычно понимают передви-
жение объекта или изменение его свойств (формы, цвета и т. п.). Сделать
движущийся объект очень просто – достаточно вывести изображение, затем
через некоторое время стереть его и вывести новое. Подобрав время между
выводом изображений, можно добиться плавного изменения изображения.
Для создания задержки в Delphi служит невидимый элемент Timer,

вкладка System, значок . «Невидимый элемент» означает, что во время


выполнения программы этот элемент виден не будет, поэтому на стадии раз-
работки окна данный значок можно поместить в любое место. Этот элемент
имеет всего три свойства: имя (Name), интервал (Interval) и запреще-
ние/разрешение работы (Enabled). Таким образом, необходимо настроить
интервал перерисовки (значение свойства Interval, заданное в миллисекун-
дах) и разрешить перерисовку (свойство Enabled установить в true). Для за-
пуска событий, которые должны перерисовываться, необходимо обратиться к
свойству onTimer. Картинка будет перерисовываться с частотой, заданной
свойством Interval.
59
Если требуется, чтобы картинка двигалась, при ее программировании
необходимо ввести базовую точку и все координаты рассчитывать от этой
точки. Обычно это делается так: вводятся константы по координатам, кото-
рые должны изменяться, и все соответствующие координаты изображения
увеличиваются на это значение.
Пример.
Пусть необходимо передвигать окружность с координатами (5, 5, 10, 10)
по горизонтали. Введем переменную базовой точки по координате X и назо-
вем ее dx. Рисование окружности будет осуществляться командой:
Ellipse(dx+5, 5, dx+10, 10);
Затем в нужный момент старое изображение затирается цветом фона,
изменяются координаты базовой точки и прорисовывается картинка с новы-
ми координатами.

5.2. Создание программы «Графические примитивы»


Задача. Написать программу, формирующую графическое изображение,
используя графические примитивы. Идея программы такая: изображение «го-
лова» имеет «глаза» и «следит взглядом» за перемещением курсора мыши.
Окно программы представлено на рис. 5.4.

Рис. 5.4. Возможный вид экрана программы


«Графические примитивы»
Процесс создания программы проходит по следующему алгоритму:
1. Запустить Delphi.
2. Сохранить проект («work5.dpr», «main.pas»).
3. Настроить вид экрана:
• форму назвать FPaint – свойство Name;
• настроить размеры формы: ширину (свойство Width) и высоту (свой-
ство Height) установить в 600;

60
• форма содержит всего три элемента: контекстное меню (PopupMenu,
Standard, ) в Object Inspector – назвать этот элемент PM (свойство

Name), и два элемента таймер (Timer, System, ) для создания мульт-


фильма – один из них назвать TEyes – таймер для прорисовки глаз и второй
TMig – таймер для прорисовки мигания глаз. Все рисованные элементы со-
здаются программно;
• настроим окно для отображения графики без отображения самого окна:
свойство BorderStyle установить в значение bsNone – рамки у окна нет! Сде-
лаем цвет окна «прозрачным»: свойство TransparentColor установить в зна-
чение true – будет использоваться «прозрачный» цвет, свойство Transpar-
entColorValue установить в значение clBtnFace – стандартный цвет окна бу-
дет «прозрачный», т. е. все окно «прозрачное»;
• для выхода из программы настроить элемент контекстного меню;
щелкнуть мышкой на этом элементе дважды – откроется «Мастер настройки
меню», ввести в свойстве Caption название пункта меню В&ыход – таким
образом создали контекстное меню для вызова команды Выход;
• установить время обращения к элементам таймера: TEyes будет сраба-
тывать 10 раз в секунду (100 мс) – этого достаточно, чтобы оперативно сле-
дить за курсором; так как значения таймера задаются в миллисекундах, убе-
диться, что значение Interval равно 100; для второго элемента TMig устано-
вить интервал 5000 – интервал мигания глаз 5 с.
4. Форма настроена!
5. Запрограммировать выход из программы: команда Close при нажатии
на кнопку пункта контекстного меню Выход.
6. Так как в окне программы нет заголовка, то выход из программы сде-
лан через контекстное меню, но без заголовка нет возможности перемещать
окно программы по экрану! Для осуществления перемещения окна будем
считать, что вся форма – это заголовок окна – окно можно будет перемещать,
«удерживая» мышкой за любую часть окна программы. В тексте программы
необходимо ввести процедуру WMNChitTest. Для этого перейти в текст про-
граммы (нажать клавишу <F12>) и вписать после строчки private строчку:
• procedure WMNCHitTest(var Message: TWMNCHitTest);
message WM_NCHITTEST;
• реализовать эту процедуру: выбрать строку procedure WMNCHitTest
и нажать комбинацию строк <Ctrl><Shift><C> – Complete class at cursor –
закончить написание элемента класса;
61
• в созданном автоматически «теле» процедуры вписать:
// унаследовать все свойства предка
inherited;
// дать возможность вызывать контекстное меню по правой кнопке
мыши
if ((GetAsyncKeyState(VK_RBUTTON) and $F000) = 0) and
(Message.Result = htClient) then
// перенаправление команд – вся форма – заголовок
Message.Result := htCaption;
7. Для отслеживания положения курсора потребуется переменная, хра-
нящая последнюю до перемещения мыши позицию курсора:
• после строк:
private
{ Private declarations }
procedure WMNCHitTest(var Message: TWMNCHitTest);
message WM_NCHITTEST;
ввести защищенный раздел класса и там описать переменную:
protected
m_lastPos : TPoint;
8. Сформировать процедуру, которая будет рисовать глаза:
• после строки m_lastPos : TPoint вписать заголовок процедуры:
procedure DrawPupil(const in_eyeRect : TRect);
• реализовать эту процедуру – набрать в теле процедуры код:
const
// ширина зрачка
PUPIL_WIDTH = 50;
// высота зрачка
PUPIL_HEIGHT = 50;
// радиус перемещения зрачка
MOVE_RADIUS = 90;
// дистанция направления взгляда
FULL_DIST = 200;
var
// точка рисования зрачка
eyePos : TPoint;
// направление взгляда
62
eyeDist : integer;
// смещение по x и y
dx, dy : integer;
// зона, занимаемая глазами
pupilRect : TRect;
begin
// нарисовать зрачки
// eyePos присвоить значение точки
{Функция Point берет параметры X и Y и
возвращает значение TPoint, содержащее их.}
eyePos := Point((in_eyeRect.Left + in_eyeRect.Right) div 2,
(in_eyeRect.Top + in_eyeRect.Bottom) div 2);
// задает координаты прямоугольника
{в Delphi функция Rect создает объект TRect (прямоугольник),
для создания прямоугольника необходимо указать 4 координаты или 2
точки.}
pupilRect := Rect(eyePos.X - PUPIL_WIDTH div 2,
eyePos.Y - PUPIL_HEIGHT div 2,
eyePos.X + PUPIL_WIDTH div 2 + 1,
eyePos.Y + PUPIL_HEIGHT div 2 + 1);
// определить позицию глаз
eyePos := ClientToScreen(eyePos);
dx := m_lastPos.X - eyePos.X;
dy := m_lastPos.Y - eyePos.Y;
eyeDist := Round(Sqrt(Sqr(dx) + Sqr(dy)));
// граница перемещения зрачка не превышает диаметр радужки
if (eyeDist > FULL_DIST) then
// изменяет координаты прямоугольника на указанное смещение
{procedure OffsetRect(var Rect: TRect; X, Y: Integer);
изменяет координаты прямоугольника на указанные смещения по X и Y.}
OffsetRect(pupilRect,
MulDiv(dx, MOVE_RADIUS, eyeDist),
{function MulDiv(Number, Numerator, Denominator: Integer): Integer;
умножает Numerator на Number и делит результат на Denominator,
округляя получаемое значение до ближайшего целого.}
MulDiv(dy, MOVE_RADIUS, eyeDist))
63
else
if (eyeDist > 0) then
OffsetRect(pupilRect,
MulDiv(dx, MulDiv(MOVE_RADIUS, eyeDist, FULL_DIST),
eyeDist),
MulDiv(dy, MulDiv(MOVE_RADIUS, eyeDist, FULL_DIST),
eyeDist));
Canvas.Ellipse(pupilRect);
9. Ввести координаты глаз и тела в виде констант точек для удобства
программирования. Для этого после строки {$R *.dfm} ввести следующие
строки:
const
// положение глаз и тела
LEFT_EYE : TRect = (Left:60; Top:85; Right:285; Bottom:310);
RIGHT_EYE : TRect = (Left:325; Top:85; Right:550; Bottom:310);
BOTTOM_EYE : TRect = (Left:188; Top:320; Right:412; Bottom:545);
BODY : TRect = (Left:0; Top:0; Right:600; Bottom:600);
10. Ввести переменную Mig для отслеживания фазы мигания:
• после строки: BODY : TRect = (Left:0; Top:0; Right:600; Bottom:600);
вписать:
var
Mig : Boolean = True;
11. Чтобы осуществить прорисовку изображения сразу при запуске про-
граммы, настроить событие прорисовки окна – onPaint (щелкнуть на форму
(FPaint), выбрать свойство onPaint, вкладка Events в Инспекторе объектов),
щелкнуть на этом событии.
12. Запрограммировать рисование:
• назначить область рисования Canvas – набрать после begin текст:
with canvas do //Обращаемся к свойствам холста
begin
//Область рисования
end;
• После строки //Область рисования вписать следующий текст:
// рисуем тело голубым цветом
Brush.Color := clSkyBlue;
Brush.Style := bsSolid;
64
Pen.Color := clSkyBlue;
Pen.Style := psSolid;
Pen.Width := 1;
Canvas.Ellipse(BODY);
// рисуем радужку глаз салатным цветом
Brush.Color := clLime;
Brush.Style := bsSolid;
Pen.Color := clLime;
Pen.Style := psSolid;
Pen.Width := 1;
Canvas.Ellipse(LEFT_EYE);
Canvas.Ellipse(RIGHT_EYE);
Canvas.Ellipse(BOTTOM_EYE);
// рисуем зрачки черным цветом
Brush.Color := clBlack;
Brush.Style := bsSolid;
Pen.Style := psClear;
drawPupil(LEFT_EYE);
drawPupil(RIGHT_EYE);
drawPupil(BOTTOM_EYE);
end; // Конец рисования на холсте
Замечание. При программировании сложного изображения следует рас-
полагать элементы послойно – сначала те, что расположены на нижнем фоне,
а затем те, что выше.
13. Запрограммировать «мультипликацию» – движение глаз за курсором
и мигание:
• дважды щелкнуть на элементе TMig (будет сформирована процедура
для события onTimer). Ввести нужные переменные (раздел var перед begin)
и записать событие:
// таймер мигания глаза
var
Color1, Color2 : TColor;
Interval : Word;
begin
if Mig then
begin
65
// если глаз мигает, цвет фона (голубой)
Color1 := clSkyBlue;
Color2 := clSkyBlue;
// интервал мигания 0,2 с
Interval := 200;
end
else
begin
// радужка зеленая
Color1 := clLime;
// зрачки черные
Color2 := clBlack;
// интервал мигания 5 с
Interval := 5000;
end;
with Canvas do
begin
// нарисовать глаза (радужку)
Brush.Color := Color1;
Brush.Style := bsSolid;
Pen.Color := Color1;
Pen.Style := psSolid;
Pen.Width := 1;
Canvas.Ellipse(LEFT_EYE);
Canvas.Ellipse(RIGHT_EYE);
Canvas.Ellipse(BOTTOM_EYE);
// нарисовать зрачки
Brush.Color := Color2;
Brush.Style := bsSolid;
Pen.Style := psClear;
// левый глаз
drawPupil(LEFT_EYE);
// правый глаз
drawPupil(RIGHT_EYE);
// нижний глаз
drawPupil(BOTTOM_EYE);
66
TMig.Interval := Interval;
end;
// фазу мигания сменить
Mig := not Mig;
• запрограммировать «слежение» за курсором – дважды щелкнуть на
элементе TEyes. Ввести переменную и запрограммировать событие:
var
mousePos : TPoint;
begin
mousePos := Mouse.CursorPos;
// отслеживаем и перерисовываем глаза
if (mousePos.X <> m_lastPos.X) or (mousePos.Y <> m_lastPos.Y) then
begin
self.Invalidate;
m_lastPos := mousePos;
end;
14. Так как мы перехватили нажатие мыши для перемещения формы, то
стандартный способ вызова контекстного меню из формы (свойство
PopupMenu) не срабатывает! Необходимо вручную запрограммировать со-
бытие нажатия мыши: выбрать у формы событие OnMouseDown и запро-
граммировать его:
// вызвать контекстное меню в позиции курсора в окне программы
// нажата правая кнопка мыши
if (Button = mbRight) then
mnuPopup.Popup(m_lastPos.X, m_lastPos.Y);
15. Создание программы завершено! Запустить программу – <F9>.

Индивидуальное задание. Придумать изображение средней сложности


(не меньше 20 команд рисования) и запрограммировать его.

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


печати графического изображения; способ программирования мультиплика-
ции; диалог настройки принтера; диалог настройки печати.
При создании демонстрационной программы получены навыки рабо-
ты с визуальным компонентом «таймер», навыки построения сложного
изображения.
67
6. РАБОТА С ТЕКСТОВОЙ ИНФОРМАЦИЕЙ

Цели: изучение работы со строковыми переменными; работа с тексто-


выми файлами; стандартные диалоговые окна.

6.1. Теоретические сведения


Символы и строки. Для задания в программе символьных переменных
можно использовать стандартный тип языка Паскаль – Char. Значением пе-
ременной типа Char может быть любой символ, отображаемый на экране:
буква русского или латинского алфавита, цифра, знак препинания, специаль-
ные символы, например, символ клавиши <Enter> («переход на новую стро-
ку»). Переменная должна быть объявлена в разделе описания переменных.
Значение переменной заключается в прямые одинарные кавычки: ch := 'Л' –
переменная ch получает значение – символ буквы Л. Переменные типа Char
можно сравнивать друг с другом, используя соотношение:
'0'<'1'<…<'A'<'B'<…<'a'<'b'<…<'А'<'Б'<…<'а'<…<'я'.
Часть символов не имеет буквенных обозначений на клавиатуре. Для их
обозначения необходимо использовать оператор Chr(код), где код – номер
символа, который нужно вывести. Все символы пронумерованы: системные
символы имеют коды 1…31, цифры ('0'…'9') – 48…57, латинские буквы
('A'…'z') – 65…122, русские буквы ('А'…'п') – 128…175, ('р'…'я') – 224…239.
Вместо функции Chr можно использовать оператор #. Для обратной опера-
ции – получения номера указанного символа – служит оператор Ord(символ).
Примеры.
Ch := Chr(13) – переменной символьного типа Ch присвоить значение
символа «переход на новую строку».
S := #10 – переменной символьного типа S присвоить значение символа
«конец строки».
V := Ord('5') – переменная целого типа получит значение кода символа
«5» – код символа «5» равен 53.
На базе стандартного типа Char созданы тип «строка» – String и все
производные от него типы (см. 2.1). Далее будем рассматривать стандартный
тип String. Строка представляет собой массив символов, т. е. является описа-
нием array [0..255] of Char. Таким образом, к элементу строки можно обра-
щаться по номеру: если переменная S имеет тип «строка», то S[2] даст второй
символ строки, S[5] – пятый символ строки. По умолчанию максимально до-
ступная длина строки равняется 255 символам. Если необходимо ограничить
68
длину строки, то после описания типа переменной String указывают в квад-
ратных скобках требуемую длину строки.
Примеры.
S : String[15]; – переменная S является строкой с максимально доступной
длиной, равной 15.
Если переменная имеет значение S := 'абвгд', то S[2] даст значение 'б' –
второй символ в строке s.
Строки можно сравнивать друг с другом посимвольно: если символы
строк одинаковы, то такие строки равны; если в одинаковых позициях распо-
ложены разные символы, то больше та строка, у которой код символа больше.
Примеры.
'Аб' > 'АБ' – во второй позиции код символа «б» больше кода «Б»;
'Аб' < 'Аб' – вторая строка имеет большую длину;
'Аб' = 'Аб' – строки равны по длине и по составу символов.
Со строками можно выполнять следующие операции:
• Length(строка) – возвращает длину строки, описанной переменной
строка. Команда Length возвращает числовое значение длины строки.
• Delete(строка, позиция, количество) – удаляет из строки количество
символов, начиная с позиции позиция.
• Pos(подстрока, строка) – возвращает позицию вхождения подстроки
подстрока в строку строка. Если в строке нет искомой подстроки, оператор
Pos вернет значение 0.
• Copy(строка, позиция, количество) – копирует из строки строка с по-
зиции позиция количество символов, указанных в переменной количество.
• Insert(подстрока, строка, позиция) – вставляет в строку строка с по-
зиции позиция подстроку подстрока.
Примеры.
Пусть переменная S – строкового типа, имеющая значение «Санкт-
Петербург», и V – переменная целого типа:
V := Length(S) – V получит значение 14;
Delete(S,1,6) – переменная S получит значение «Петербург»;
V := Pos('Петербург',S) – переменная V получит значение 7;
S := Copy(S,7,8) – переменная S получит значение «Петербург»;
Insert('+-',S,7) – строка S получит значение «Санкт-+-Петербург».
Файлы и работа с текстом. Иногда необходимо выводить информацию
не на экран, а в файл или считывать информацию из файла. Для этих целей
69
существует переменная типа file. При ее создании указывается тип файла,
т. е. тип данных, которые будет хранить файл. Для указания типа файла ука-
зывают file of тип. Особым является файл для содержания текстовой инфор-
мации, который описывается как TextFile.
Примеры.
Res : file of char; – переменная Res указывает на файл символов;
T : file of integer; – переменная T указывает на файл целых чисел;
Str : File of String; – переменная Str указывает на файл строк;
Text : TextFile; – переменная Text указывает на текстовый файл.
Замечание. Файл строк и текстовый файл – это не одно и то же. Тек-
стовый файл самостоятельно обрабатывает признак конца строки и переход
на новую строку.
Для связки переменной типа «файл» с конкретным файлом на диске
необходимо использовать оператор AssignFile(переменная, путь_к_файлу).
Примеры.
AssignFile(text, 'document.txt'); – установление связи между переменной
text и файлом «document.txt»;
AssignFile(res, 'a:\chars.dat'); – установление связи между переменной
res и файлом «chars.dat», находящимся в корневой папке диска а:.
Замечание. Для обеспечения возможности запуска программы с разных
папок/компьютеров не следует без необходимости указывать жесткий путь к
файлу, а нужно считать, что файл хранится в текущей папке, или указывать
путь от текущей папки. Данное соглашение позволит переносить программу
на другой компьютер без требования идентичной настройки структуры папок
на двух компьютерах.
Для вывода информации в файл используется оператор
write(переменная_типа_файл, информация)
или writeln(переменная_типа_файл, информация),
Здесь:
переменная_типа_файл – переменная, указывающая на файл, в который
осуществляется вывод информации;
информация – записываемая в файл информация.
Оператор writeln работает только в текстовых файлах, его отличие от
write в том, что после вывода информации курсор в файле переводится на
новую строку.
Команда writeln(переменная_типа_файл) – добавит пустую строку.
70
Пример.
Пусть описана переменная F типа «текст» (F : TextFile), и выводимая
информация хранится в переменных X1 и Y1. Вывод значений этих перемен-
ных в файл на разных строках может быть выполнен так: writeln(F,X1);
writeln(F,Y1);
Для считывания информации используется оператор
read(переменная_типа_файл, информация)
или readln(переменная_типа_файл, информация).
Описание этих операторов такое же, как и у операторов вывода. Опера-
тор readln также может быть использован только для считывания информа-
ции из текстового файла, при этом предполагается, что считываемые значе-
ния находятся на разных строках.
Команда readln(переменная_типа_файл) переведет курсор в файле на
новую строку.
Для работы с файлом необходимо указать операцию, которая будет вы-
полняться с файлом: чтение или запись (здесь не рассматриваются случаи,
когда необходима работа с файлом, позволяющая одновременно и записы-
вать, и считывать информацию). Для текстовых файлов существует еще одна
возможность – открыть файл на последней строке для дописывания инфор-
мации. Эти операции описываются операторами:
Reset(переменная_типа_файл) – открыть файл для чтения;
Rewrite(переменная_типа_файл) – открыть файл для записи;
Append(переменная_типа_файл) – открыть файл для дописывания.
Необходимо отметить особенности работы этих операторов. Оператор
Reset открывает файл для чтения; если в момент открытия файла не существу-
ет, то это приведет к ошибке. Это же ограничение накладывается и на команду
Append. При открытии для записи (команда Rewrite) уже имеющегося файла
он будет предварительно очищен, т. е. вся информация из него будет удалена;
если файл на момент открытия отсутствовал, то он будет создан.
При возникновении ошибок открытия файла программа выдаст стан-
дартное окно сообщения об ошибке. Для того чтобы самостоятельно учиты-
вать и обрабатывать возможные ошибки при работе с файлами, необходимо:
1. Отключить автоматический контроль работы с файлами – директива
{$I-}; такая команда сообщает компилятору, что автоматическая обработка
исключительных ситуаций при работе с файлами отключена (все директивы
71
компилятора начинаются с последовательности двух значков – «открываю-
щаяся фигурная скобка» и «знак доллара» – и заканчиваются «закрывающей-
ся фигурной скобкой»).
2. Выполнить критическую операцию (открытие, чтение и т. д.).
3. Включить директиву автоматической проверки корректности опера-
ций с файлами – директива {$I-}.
4. Проверить результат операции, возвращаемый оператором IOResult.
Если этот оператор возвращает 0, то операция прошла успешно, иначе он
возвращает код ошибки.
5. Проанализировать сообщение оператора IOResult и при необходимо-
сти выполнить соответствующие действия. Например, если при открытии
файла для чтения выяснилось, что файл не существует, то нужно создать его
командой Rewrite, а затем снова открыть для чтения.
После окончания работы с файлом необходимо закрыть переменную ти-
па «файл» с помощью команды CloseFile(переменная_типа_файл).
Замечание. Сколько раз файл был открыт (для чтения или для записи),
столько же раз он должен быть закрыт.
При считывании информации из файла необходимо знать, сколько ин-
формации можно из него считать. Для этих целей введена переменная
EOF(переменная_типа_файл, читаемая End Of File – конец файла), которая
принимает значение true при достижении конца файла и false – в против-
ном случае. Поэтому процесс считывания информации из файла обычно
осуществляется в цикле до тех пор, пока не достигнут конец файла (если
нет другого условия окончания операции считывания). Для текстовых
файлов существует также переменная, оценивающая, не достигнут ли ко-
нец строки – EOLn(переменная_типа_файл, читаемая End Of Line – конец
строки), которая принимает значение true при достижении конца строки и
false – в противном случае.
Для демонстрации последовательности работы с файлом рассмотрим
фрагмент программы посимвольного считывания информации из текстового
файла «document.txt» и подсчета количества символов в файле. Будем счи-
тать, что раздел переменных содержит описание переменных: F : TextFile; –
текстовый файл; C : Char; – считываемые символы; I : Integer; – переменная
для подсчета количества символов.
72
Пример.
var //Раздел описания переменных
F : TextFile;
C : Char;
I : Integer;
begin
AssignFile(F, 'document.txt'); //Связка файла и файловой переменной
{$I-} //Отключить автоматическую проверку
reset(F); //Открыть файл для чтения
{$I+} //Включить автоматическую проверку
If IOResult = 0 then //Если операция прошла успешно, то
begin
I := 0; //Установить счетчик символов в 0
While Not EOF(F) do //Пока не конец файла
begin
while Not EOLn(F) do //Пока не конец строки
begin
read(F,C); //Считать очередной символ
Inc(I); //Увеличить счетчик символов
end;
readln(F); //Перейти к считыванию новой строки
end
end
else
begin
MessageDlg('Ошибка открытия файла', mtError, [mbOk], 0);
//В случае ошибки выдать сообщение об ошибке
end;
end;
В примере для вывода сообщения об ошибке было использовано стан-
дартное диалоговое окно.
Стандартные диалоговые окна. Для вывода различных сообщений
можно использовать стандартные диалоговые окна Delphi. Диалоговые окна
запускаются командой:
MessageDlg(Сообщение, Тип, Кнопки, КонтекстСправки);

73
Здесь:
Сообщение – выводимое сообщение;
Тип – тип сообщения. Оно может быть информационным, предупре-
ждающим или сообщением об ошибке;
Кнопки – список, определяющий число и вид кнопок;
КонтекстСправки – определяет номер экранной справки; так как экран-
ная справка не используется, то необходимо установить значение 0.
Константы, определяющие тип окна сообщения и вид кнопок, перечис-
лены в табл. 6.1.
Таблица 6.1
Тип сообщения
Константа Сообщение Значок
mtWarning Внимание
mtError Ошибка
mtInformation Информация
mtConfirmation Запрос подтверждения
mtCustom Пользовательское окно –
Вид кнопок
Константа Обозначение Код возврата
mbYes Да mrYes
mbNo Нет mrNo
mbOk Ok mrOk
mbCancel Отмена mrCancel
mbHelp Помощь mrHelp
mbAbort Прекращение mrAbort
mbRetry Повтор mrRetry
mbIgnore Игнорировать mrIgnory
mbAll Все mrAll
При вызове диалогового окна с набором кнопок их константы перечис-
ляются в квадратных скобках через запятую. Для анализа, какая кнопка была
активирована, следует значение, возвращаемое диалоговым окном, присво-
ить переменной типа word.
Пример.
Пусть необходимо выдать диалоговое окно запроса с тремя кнопками
«Yes», «No» и «Cancel» и проанализировать, какая кнопка была «нажата».
W := MessageDlg('Какую кнопку нажать?', mtConfirmation,
[mbYes, mbNo, mbCancel]);
74
Case W of
mrYes : {действие, связанное с «нажатием» на кнопку Yes};
mrNo : {действие, связанное с «нажатием» на кнопку No};
mrcancel : {действие, связанное с «нажатием» на кнопку Cancel};
end;

6.2. Создание программы «Редактор текста»


Задача. Написать программу, считывающую посимвольно информацию
из текстового файла, позволяющую отредактировать считанный текст и со-
хранить файл на диске.
Окно программы представлено на рисунке.
D:\text.txt
Файл Редактирование Формат Вид

Проверка чтения текста


из редактора RichEdit
с подсчетом строк и символов

В файле содержатся 3 строки и


71 символ (а/ов)

Примерный вид окна программы «Работа с текстом»


Процесс создания программы проходит по следующему алгоритму:
1. Запустить Delphi.
2. Сохранить проект («work6.dpr», «main.pas»).
3. Настроить вид экрана:
• для отображения быстрой справки – подсказки видимых элементов ок-
на – необходимо установить свойство формы ShowHint (показывать под-
сказку) в значение true. Все элементы, размещенные в окне, автоматически
будут иметь свойство ShowHint в значении true;

75
• в качестве дизайна окна использовать «главное меню» и панель «горя-
чих клавиш». Поместить панель на форму и настроить ее свойства:
○ поместить панель (элемент Panel, вкладка Standard, значок );
○ изменить заголовок на ''  Caption;
○ изменить высоту панели так, чтобы она была чуть больше кнопок, ко-
торые будут в нее вставлены (Height = 40);
○ настроить панель, чтобы она всегда находилась вверху окна, незави-
симо от его размера  Align установить в значение alTop – вверху;

• поместить на экран «горячие кнопки» (SpeedButton, Additional, ).


Такие кнопки обычно не имеют заголовка, а несут функциональную инфор-
мацию по картинке и контекстной справке. Поместить три такие кнопки:
«Выход», «Открыть файл», «Сохранить файл»:
○ назвать кнопки (Name) соответственно SBExit, SBOpen и SBSave;
○ выбрать картинки для кнопок в соответствии с назначением кнопок
(картинки можно взять из папки кнопок в папке общих программ Borland или
в папке Delphi (папка Images\Buttons))Glyph; можно выбрать следующие
картинки: FileOpen для открытия файла, FileSave для закрытия файла, Door-
Shot для выхода из программы;
○ назначить подсказки для кнопок: для кнопки SBExit – «Выход из програм-
мы»; для SBOpen – «Открыть файл»; для SBSave – «Сохранить файл»  Hint;
• создать главное меню:

○ поместить главное меню на форму (MainMenu, Standard, );


○ этот значок запускает программу «Мастера построения меню» –
щелкнуть на значке для запуска «Мастера»;
○ построить иерархическое меню. Для этого в поле
Файл
ввода набрать название пункта меню («Файл») (Caption),
Открыть затем сместиться в подменю и ввести названия «Открыть»
Сохранить
и «Сохранить», затем поставить разделитель пунктов – при
Выход
вводе названия поставить «-» (минус);
○ для каждого пункта меню назначить «горячую клавишу»,
т. е. ту комбинацию клавиш, при нажатии которой этот пункт меню будет ак-
тивизироваться (свойство ShortCut). Назначить такие комбинации (выбрать
из списка): для пункта «Открыть» – <Ctrl><O>; «Сохранить» – <Ctrl><S>;
«Выход» – <Ctrl><Q>;

76
• для открытия файла поместить стандартный диалог открытия файлов:
○ поместить объект открыть файл (Dialogs, OpenDialogs, );
○ дать ему имя ODText (Name);
○ настроить заголовок окна на «Открытие текстового файла» (Title);
○ назначить имя папки, из которой будут открываться файлы по умол-
чанию, дав ему имя «точка» (.) – текущая папка (папка программы) (Ini-
tialDir);
○ настроить фильтр файлов, которые будут открываться (Filter). Это
свойство запустит «Мастера» – слева в окне описание групп файлов (Filter
Name), справа – шаблон группы (Filter). Изменить описание на «Текстовые
файлы», а шаблон – на «*.txt»;
• для сохранения файлов необходимо:
○ поместить на форму элемент диалог сохранения (SaveDialog,
Dialogs, );
○ настроить имя на SDText (Name);
○ остальные свойства настроить, как и у объекта OpenDialog;
• для переключения между режимами чтения файла (посимвольное чте-
ние или чтение сразу всего файла) необходимо:
○ поместить на панель объект независимая метка (CheckBox,

Standard, );
○ настроить имя на CBChar ( Name);
○ заголовок изменить на «Посимвольно» ( Caption);
○ кнопка активна (выполняется чтение посимвольно) ( Checked уста-
новить в true);
• для вывода текста необходимо:

○ на форму поместить элемент примечаний (Memo, Standard, );


○ настроить имя на MText ( Name);
○ изменить свойство ScrollBars на ssBoth для добавления в поле вывода
текста скроллеров – обеспечение перемещения по тексту, если текст окажет-
ся больше окна вывода;
○ очистить окно текста. Выбрать свойство Lines и удалить строку
MText;
○ расположить поле вывода текста на все доступное пространство фор-
мы. Для этого изменить свойство Align на alClient;
77
• форма настроена!
4. Приступить к программированию событий:
• запрограммировать выход из программы на кнопку SBExit (Событие
onClick, команда – Close);
• запрограммировать открытие файла на кнопку SBOpen (Событие on-
Click), добавив следующий текст:
○ в разделе описания переменных процедуры добавить следующие пе-
ременные: F – переменная типа текстовый файл для связки с файлом на
диске; C – считываемый символ – переменная типа символ I – переменная
для подсчета количества символов и W – переменная типа целое число для
записи текста в поле MText, так как этот объект не позволяет добавлять
строку посимвольно:
var
F : TextFile;
C : Char;
I : Word;
W : Word;
○ технология считывания следующая:
▪ открыть диалог открытия файлов;
▪ получить имя открываемого файла из этого диалога;
▪ открыть файл;
▪ проверить результат открытия файла, в случае ошибки выдать сообще-
ние, иначе приступить к считыванию информации;
▪ при чтении сразу всего файла считать текст,
иначе: пока не конец файла – добавить в поле вывода текста пустую стро-
ку; пока не конец строки – считать символ и добавить его к пустой строке;
○ текст, реализующий этот алгоритм:
If ODText.Execute then //Если в диалоге выбран файл
begin
MText.Clear; //Очистить поле вывода
AssignFile(F,ODText.FileName); //Связать файл с F
{$I-} //Отключить проверку
reset(F); //Открыть файл
{$I+} //Включить проверку
If IOResult = 0 then //Файл открыт удачно
begin
78
Form1.Caption := ODText.FileName;
{В заголовке окна отобразить имя открытого файла}
W := 0; //Счетчик строк
I := 0; //Счетчик символов
If CBChar.Checked then //Если посимвольный ввод
begin
while Not EOF(F) do //Пока не конец файла
begin
MText.Lines.Add(''); //Добавить пустую строку
While Not EOLn(F) do //Пока не конец строки
begin
read(F,C); //Считать очередной символ
inc(I); //Увеличить счетчик символов
MText.Lines[W]:=MText.Lines[W]+C;
{Добавить к пустой строке считанный символ}
end;
Inc(W); //Увеличить счетчик строк
readln(F);
{Перейти к считыванию новой строки}
end;
{Вывести окно с количеством символов в файле}
ShowMessage('Количество символов: '+IntToStr(I));
end
else //Файл считывается сразу
begin
{Считать файл}
MText.Lines.LoadFromFile(ODText.FileName);
end;
CloseFile(F); //Закрыть файл
end
else //Файл не открыть
ShowMessage('Ошибка открытия файла '+ODText.FileName);
{Выдать сообщение об ошибке}
end; //Конец работы с файлом
В программе виден способ заполнения элемента MText текстом: текст
представляет собой массив строк (свойство Lines) и либо загружается сразу
79
из указанного файла (строка MText.Lines.LoadFromFile(ODText.FileName);),
либо происходит обращение по индексу к нужной строке и заполнение ее
(строка MText.Lines[W]:=MText.Lines[W]+C; – к строке с индексом W доба-
вить считанный символ C, учитывая, что нумерация строк начинается с 0);
○ запрограммировать сохранение введенного или отредактированного
файла на диске кнопкой SBSave (Событие onClick):
▪ ввести следующий текст:
If SDText.Execute then
{Если выбрано сохранение файла}
begin
Mtext.Lines.SaveToFile(SDText.FileName); //Сохранить файл
Form1.Caption := SDText.FileName;
{Изменить заголовок окна на имя сохраненного файла}
end;
5. Для улучшения программы можно выполнить следующее:
а) ввести индикатор изменения текста в поле ввода – как только текст
изменен, отобразить индикатор изменения;
б) при сохранении файла проверять, нет ли уже файла с таким именем, и
выдавать запрос на перезапись.
Например, п. 5а можно выполнить так:

• на форму (на панель) добавить элемент «метка» (Label, Standard, ).


Изменить его свойства:
○ имя изменить на LModify (Name);
○ заголовок – на Текст изменен (Caption);
○ видимость (если текст не изменен, то и индикатор изменения не пока-
зывать) установить в значение false (Visible);
• запрограммировать событие onKeyPress элемента MText, выполняе-
мое при нажатии клавиш, и ввести текст:
LModify.Visible := true;
• при сохранении текста (событие onClick кнопки SBSave) после строки
«{изменить заголовок окна на имя сохраненного файла}» добавить строку
изменения состояния индикатора:
LModify.Visible := false;
6. При желании п. 5б запрограммировать самостоятельно. (Рекоменда-
ция. Попытаться открыть файл с введенным именем, и, если это удается
(файл существует!), то требуется вывести запрос на перезапись.)
7. Программа готова – запуск <F9>.
80
Индивидуальное задание. Модифицировать созданную программу для
выполнения операции с текстом в соответствии с номером варианта:
1. В считанном из файла тексте подсчитать количество гласных букв.
2. В считанном из файла тексте подсчитать количество согласных букв.
3. Заменить все гласные буквы в тексте на порядковые номера: «а» – 1,
«е» – 2 и т. д.
4. Добавить после каждого слова текста запятую.
5. Подсчитать количество слов в тексте.
6. Найти слово с максимальным соотношением согласные/гласные.
7. Найти в тексте самое длинное слово.
8. Подсчитать все знаки препинания в тексте.
9. Найти в тексте самое длинное предложение.
10. Выводить каждую строчку в обратном порядке.
11. Выводить только нечетные слова текста.
12. Выводить только четные слова текста.
13. Подсчитать количество предложений в тексте.
14. Выводить только те слова, длина которых больше введенного числа.
15. Выводить только те строки, которые содержат введенную подстроку.
16. Каждый символ, считываемый из файла, закодировать кодом симво-
ла, после кода ставить знак «;».
17. Выводить каждое считанное предложение с новой строки.
18. Найти предложение с максимальным количеством слов.
19. Удалить из текста введенный фрагмент строки.
20. Заменить в тексте один введенный фрагмент на другой введенный
фрагмент.

Итоги. В шестой теме были изучены: функции языка Delphi для работы
со строками; функции для работы с текстовыми файлами; стандартные диа-
логовые окна.
При построении демонстрационной программы получены навыки ис-
пользования новых компонентов: панели; кнопок быстрого доступа – «горя-
чих кнопок»; главного меню окна; диалоговых окон – открытие файла и со-
хранение файла; элемента независимого выбора.

81
7. РАБОТА С ГРАФИКАМИ

Цель: изучение работы с компонентом TChart, позволяющим строить


графики функций.

7.1. Теоретические сведения


Построение графиков функций. В инженерных расчетах, а также в ме-
дицинских исследованиях часто приходится строить разные графики. При
построении графиков функций возникают различные проблемы: большое ко-
личество точек построения, требующих либо скроллировать график, либо
масштабировать для возможности просматривать все имеющиеся значения
или видеть общий вид кривой. Также возникает проблема масштабирования
по оси ординат, позволяющего увидеть разброс значений. Данные могут быть
либо взяты из таблицы значений, либо (чаще всего в математических зада-
чах) получены с использованием расчетной формулы.
Для решения подобных задач можно использовать уже рассмотренные
графические примитивы (см. гл. 5), но тогда все возникающие вопросы отоб-
ражения данных придется решать самостоятельно. Поэтому еще в первых
версиях Delphi появились компоненты, позволяющие упростить процесс по-
строения графиков. Один из таких компонентов – TeeChart, позволяющий
строить различные кривые наподобие используемых, например, в MS Office.
Компонент TChart. Компонент построения графиков может отсутство-
вать среди компонентов RAD Studio! В этом случае его можно установить
(Trial version) с сайта разработчика:
https://www.steema.com/downloads/vcl
Рассмотрим некоторые основные особенности работы с этим компонен-
том. (Рассмотрена версия TeeChart Standard
v.2016.17.160129 32bit VCL.)

Компонент TChart может распола-


гаться, например, на вкладке TeeChart Std.
Его необходимо поместить в нужное место
на форме. На форме он будет представлен
Рис. 7.1. Заготовка графика
сразу заготовкой графика (рис. 7.1).

82
Editing Chart1
Series View
Chart
General
Axis Add…
Titles
Legend Delete
Panel
Paging
Walls Title…
3D
Data Clone
Export
Print
Change

Upgrade to Pro version with 100% source code Close

Рис. 7.2. Мастер настройки TChart


Далее, если щелкнуть мышью дважды на этом элементе, то запустится
«Мастер настройки TChart» (рис. 7.2).
Как видно на рисунке, настроек очень много. Можно настроить по-
чти все, что требуется для построения графика. Это разделы: Series (вид
графика), Chart (настройка свойств графика), Data (данные графика),
Export (экспорт полученного графика) и Print (печать графика). Рассмот-
рим основные настройки.
Первым разделом является Series. При выборе этого раздела появляются
кнопки управления графиками: Add (добавить график), Delete (удалить гра-
фик), Title (название данных), Clone (сделать копию настроенного графика) и
Change (изменить тип графика) (рис. 7.2). При выборе кнопки Add появляет-
ся окно выбора типа графика (Series), а также становятся доступными ис-
пользование функций над данными (Functions) и шаблоны сложных графи-
ков (Templates) (рис. 7.3).

83
Рис. 7.3. Раздел Series
В списке можно выделить различные типы диаграмм (табл. 7.1).
Таблица 7.1
Тип диаграммы Рисунок Название

Line Линия

FastLine Быстрая линия

Horizontal Line Горизонтальная линия

Bar Столбцы, пирамиды, конусы

HorizBar Горизонтальные столбцы

Area Область

Horizontal Aria Горизонтальная область

Point Точка

84
Окончание табл. 7.1
Тип диаграммы Рисунок Название

Pie Сектор эллипса («пирог»)

Arrow Стрелка

Bubble Эллипс («пузырь»)

Gantt Каждая точка – горизонтальный столбик

Shape Фигура

Можно выбрать диаграмму для выполнения некоторых математических


функций (табл. 7.2).
Таблица 7.2
Тип диаграммы Рисунок Математическая функция

Add Суммирует значения серии

Получает среднее значение


Average
всех значений серии

Divide Делит значения исходной серии

Отображает наибольшее значение


High
серии
Отображает наименьшее значение
Low
серии

Median Вычисляет медианное значение серии

Вычисляет значение исходной серии,


Mode
которое повторяется

Multiply Умножает значения исходной серии

Диаграмма Парето – зависимость


Pareto
серии от серии причин

85
Окончание табл. 7.2
Тип диаграммы Рисунок Математическая функция

Smoothing Сглаживает значения серии

Subset Выводит часть функции

Отображает значение вычитаемых входных


Subtract
данных в порядке убывания

Y=f(x) Строит график заданной функции

Выбрав нужный тип графика, можно приступить к настройке парамет-


ров. Рассмотрим только основные разделы. Раздел General (основные
настройки) позволяет настроить, как график будет меняться при работе с
мышью (Mouse); при масштабировании (Zoom) и скроллировании (Scroll);
как будет выглядеть курсор мыши (Cursor); шрифт (Fonts); цветовую палит-
ру графика (Palette) и выделение частей графика (Hover).
Раздел Axes (оси) – настройка осей координат (изменение, подписи, сетка и
др.). Titles (заголовки) – подписи к графику. Legend (легенда) – расшифровка
обозначений на графике. Panel (панель) – настройка панели (фона) графика.
Paging (страницы) – разбиение данных на страницы (экраны). Walls (границы) –
границы графика. 3D (объем) – настройка объема графика (позволяет строить
трехмерные поверхности). Data (данные) позволяет заполнить данные графика.
Export (экспорт) – позволяет экспортировать (сохранять) полученный график в
виде картинки или метаданных. Print (печать) – печать полученного графика.
Для программного добавления точек на график используется функция:
function AddXY (Const AXValue, AYValue: Double; Const AXLabel: String;
AColor: TColor) : Longint;
Здесь AXValue, AYValue – значения координат X и Y; AXLabel –
название ряда данных; AColor – цвет графика. Сама функция возвращает по-
зицию в списке значений графика.
Например, если необходимо поместить на график 100 точек, распреде-
ленных по синусоиде, то потребуется следующий код (считается, что уже со-
здана серия данных Series1):
for I := 1 to 100 do
Series1.AddXY(0.02*PI*I, Sin(0.02*PI*I), '' , clRed);
86
Коэффициент (0.02) перед X и Y (Sin) позволяет масштабировать график
для более наглядного вывода на экран.
Еще несколько интересных функций TChart будут рассмотрены в при-
мере.

7.2. Создание программы «Электрокардиограмма»


Задача. Написать программу, считывающую данные электрокардио-
граммы, предварительно записанные в текстовый файл.
Окно программы представлено на рис. 7.4.

автоскроллер

Рис. 7.4. Программа отображения сигнала ЭКГ


Процесс создания программы проходит по следующему алгоритму:
1. Запустить Delphi.
2. Сохранить проект («work7.dpr», «main.pas»).
3. Настроить вид экрана:
• изменить заголовок окна на «График сигнала ЭКГ»  Caption; вывод
формы в центре экрана: свойство Position установить в poScreenCenter;
• поместить на форму панель (Panel, вкладка Standard). Настроить ее
свойства:
○ Align  alRight;
○ Caption  '';
• на панель поместить элементы:

87
○ два элемента SpinEdit (вкладка Samples). Назвать их: свойство Name –
верхний SEValueX (элемент для указания числа точек, которые будут отобра-
жаться по горизонтали) и нижний SEStepX (элемент указывает шаг изменения
значений элемента SEValueX);
○ элемент ComboBox (вкладка Standard) для возможности отображения
всех данных сразу (масштабировать график в пределах поля вывода графи-
ка). Свойство Name заменить на SBAllPoint. Свойство Caption – на «Все до-
ступные измерения». Checked – False;
○ еще один элемент ComboBox для указания автоскроллирования дан-
ных на графике. Его свойства: Name – CBAutoScroll; Caption – «Автоскролли-
рование»; Checked – False;
○ элемент SpinEdit (вкладка Samples) для ввода величины сдвига при
скроллировании. Его свойство Name – SEScroll;
○ элемент UpDown (вкладка Win32) для скроллирования графика. Его
свойства: Name – UDScroll; Orientation – upVertical;
○ поместить кнопку BitBtn (вкладка Additional). Настроить кнопку для
закрытия программы: свойство Kind установить в значение bkClose. Свой-
ство Caption установить в значение «В&ыход»;
• на форму поместить элемент Timer (вкладка System) для осуществле-
ния автоскроллирования. Его свойство Name – TScroll;
• на форму поместить элемент для построения графика TChart (вкладка
TChartStd). Его свойства: Name – CEKG; Align – alClient – распахнуто на
всю доступную часть формы.
• Настройка всех основных элементов готова!
• Настроить элемент для построения графика CEKG (поставленный на
форму на предыдущем шаге) – щелкнуть на него мышкой дважды – запу-
стится «Мастер». Настроить этот элемент:
○ добавить график, нажав на кнопку Add в пункте Series;
○ назвать этот график EKG (кнопка Title);
○ настроить цвет графика на красный: Series  EKG  Format 
Format  Color  выбрать красный цвет;
○ выбрать сплошную линию: Series  EKG  Format  Style вы-
брать значение Solid;
○ убрать легенду графика: Series  EKG  General  Legends  Vis-
ible  снять галочку;
○ разрешить горизонтальное скроллирование графика: Chart  General
 Allow Scroll  Horisontal;

88
○ настроить масштаб: Chart  Axis  Left Axis, а также Right Axis,
Top Axis и Depht Axis оставить в значении «Автоматически»  свойство
Automatic оставлено с галочкой (масштаб подстраивается автоматически).
А вот в свойстве Bottom Axis галочку со свойства Automatic снять и скоррек-
тировать свойство вручную: Min (минимальное значение) – поставить 0, Max
(максимальное значение) – поставить 10000, Increment (шаг изменения свой-
ства) – поставить значение 1000;
○ изменить заголовок графика: Chart  Titles написать «Электрокар-
диограмма»;
○ подписать оси графика: ось ординат Chart -> Axis -> Title для
LeftAxis настроить Style -> Title -> написать «мкВ», так как на графике дан-
ные отображаются в микровольтах. Задать угол отображения: Angle устано-
вить в 0 и Position в end. Аналогично настроить вторую ось (BottomAxis) –
подпись изменить на «мкс» (данные записаны с частотой одна запись в одну
микросекунду), угол и позицию задать аналогично оси ординат.
4. Форма настроена!
5. Запрограммировать событие активации формы – при активной форме
выбрать в Object Inspector на вкладке Events событие onActivate и щелк-
нуть по нему. В текст программы вписать событие:
var
I,R : Integer; // значения по X и Y
F : TextFile; // файл с данными
begin
// очистить график
Series1.Clear;
// открыть файл с ЭКГ
AssignFile(F,'EKG.txt');
{$I-}
// открыть для чтения
Reset(F);
{$I+}
// если файл не открыт, закрыть программу
if IOResult <> 0 then
Close;
// начальное значение по X
i := 0;
89
// пока не конец файла
while not EOF(F) do
begin
inc(i); // увеличить счетчик
readln(F,R); // считать данные из файла
Series1.AddXY(i, R, '' , clRed); // добавить точку в график
end;
CloseFile(F); // закрыть файл
// по горизонтали первые 10000 измерений
SEValueX.Value := 10000;
// шаг изменения горизонтальных значений – 1000 измерений
SEStepX.Value := 1000;
end;
6. Запрограммировать изменение значения в элементе SEValueX, два-
жды щелкнув по нему. Вписать текст:
// изменять масштабирование графика от начала 0
// до указанного в SEValueX.Value значения
CEKG.Axes.Bottom.Minimum := 0;
CEKG.Axes.Bottom.Maximum := SEValueX.Value;
7. Запрограммировать изменение значения в элементе SEStepX, дважды
щелкнув по нему. Вписать текст:
// установить шаг масштабирования графика
SEValueX.Increment := SEStepX.Value;
8. Для возможности сохранять «старый» масштаб при просмотре всех
значений по оси абсцисс и возможности его восстановить ввести глобальную
переменную Max. Для этого в тексте программы после строки {$R *.dfm} до-
бавить описание этой переменной:
var
Max : Integer;
9. Запрограммировать возможность просмотреть на графике сразу все
значения по оси абсцисс. Дважды щелкнуть на элементе CBAllPoint и впи-
сать текст:
// если выбраны все измерения, то настроить свойство
// отображения графика на автоматическое
// иначе в соответствии со значением SEValueX.Value
CEKG.Axes.Bottom.Automatic := CBAllPoint.Checked;
If CEKG.Axes.Bottom.Automatic then
begin
90
// если значение автоматическое, то запомнить «старое» значение
Max := SEValueX.Value;
// установить в элемент SEValueX.Value максимальное значение
SEValueX.Value := Round(CEKG.Series[0].MaxXValue);
end
else
begin
// вернуть «старое» значение
SEValueX.Value := Max;
// выполнить перепостроение графика
SEValueX.OnChange(Sender);
end;
10. Запрограммировать автоскроллирование графика. Дважды щелкнуть
на элемент TScroll и вписать текст:
// скроллировать график на величину, указанную в SEScroll
CEKG.Axes.Bottom.Scroll(SEScroll.Value);
11. Запрограммировать включение/выключение автоскроллирования.
Для этого щелкнуть дважды на элементе CBAutoScroll и вписать текст:
// разрешить или запретить автоскроллирование
TScroll.Enabled := CBAutoScroll.Checked;
12. Запрограммировать скроллирование графика при изменении значе-
ния UPScroll. Скроллирование графика будет изменяться на величину, за-
данную в элементе SEScroll. Дважды щелкнуть на элементе UPScroll и впи-
сать текст:
// провести скроллирование влево (–) или вправо (+)
if Button = btNext then
CEKG.Axes.Bottom.Scroll(SEScroll.Value)
else
CEKG.Axes.Bottom.Scroll(-SEScroll.Value);
13. Программа готова!

Индивидуальное задание. Модифицировать созданную программу для


выведения графика функции, заданной в зависимости от номера варианта
(табл. 7.3). Обеспечить возможность программно изменять: начальные и ко-
нечные значения диапазона на оси абсцисс (по умолчанию назначить началь-
ным значением 0, а конечным – 500); коэффициент k (по умолчанию присво-
ить k значение 0,02).
91
Таблица 7.3
№ Функция Условие
1 y  sin(k x)  (cos(k x))2 –
2 y  (cos(k x)  sin(k x))2 –
3 y  cos(sin(k x))  2k x –
4 y  cos(k x)(k x)2 –
5 y  sin(k x)(k x)2 –
6 y  k x cos(k x) x>0
7 y  k x sin(k x) x>0
sin(k x)
8 y –
cos(k x)
9 y  k x sin(k x) –
k x
10 y x>0
cos(k x)
1
11 y –
cos(k x)
12 y  k x  20sin(k x) –
cos(k x)
13 y  sin(k x) x>0
sin(k x  5)
sin(k x)
14 y  sin(k x) –
cos(k x  5)
2
 sin(k x) 
15 y   –
 cos(k x) 
2
 cos(k x) 
16 y   x>0
 sin(k x) 
17 y  esin(k x)  cos(k x) –
18 y  esin(k x) –
19 y  ecos(k x) –
sin( k x )
20 cos( k x ) –
ye

Итоги. В седьмой теме был изучен компонент TChart, позволяющий без


особого труда строить различные графики функций.
При построении демонстрационной программы получены навыки ис-
пользования компонента TChart для отображения графика ЭКГ, данные ко-
торого предварительно были сохранены в текстовом файле.
92
8. ВЫПОЛНЕНИЕ КУРСОВОЙ РАБОТЫ.
ВАРИАНТЫ РАБОТ

В процессе выполнения курсового проекта студент должен составить ал-


горитм и написать реализующую его программу.
На защите курсового проекта студент предъявляет работающую про-
грамму и отчет.
Отчет должен включать следующие разделы: титульный лист; задание
на курсовое проектирование; основной текст, содержащий словесное описа-
ние алгоритма работы программы; структурную схему алгоритма програм-
мы; распечатку программы; для расчетных программ – расчет контрольного
примера с помощью программы и выполненный вручную.

Варианты курсовых работ


1. Создание программы расчета биоритмов человека на определенный
срок.
2. Программирование стрелочного таймера.
3. Построение графика электрокардиограммы по заданным параметрам
PQRST.
4. Выдача гороскопа для введенной даты рождения.
5. Построение психодиагностического теста для оценки типа темпера-
мента.
6. Нахождение корней степенного уравнения (показатель степени  4).
7. Преобразование арифметических операций во введенной строке в
польскую запись.
8. Построение строчного калькулятора.
9. Создание программы для статистических расчетов в фармакологии и
токсикологии (использование методов альтернативного анализа).
10. Создание графического редактора.
11. Создание программы выравнивания текста по ширине (справа и слева).
12. Создание программы разбиения слов текста на слоги.
13. Создание программы для расчета статистических показателей в ра-
боте практического врача-организатора здравоохранения.
14. Создание программы для расчета показателей, используемых в
пульмонологии.
15. Расчет системы линейных уравнений.

93
16. Создание программы, реализующей простейшие операции (сложе-
ние, вычитание, умножение и деление) с комплексными числами.
17. Создание программы для расчетов кардиогемодинамических показа-
телей.
18. Создание программы вычисления показателей работы почек.
19. Создание программы расчета средних показателей эксперимента
(среднее арифметическое, среднее гармоническое, среднее кубическое и др.).
20. Заполнение шахматной доски ходами коня, чтобы конь побывал на
каждом поле.
21. Перевод чисел из одной системы счисления в другую (двоичная, де-
сятичная, шестнадцатеричная, римские числа).
22. Размещение восьми ферзей на шахматном поле так, чтобы ни один
ферзь не оказался под ударом.
23. Написание шифровальщика и дешифровальщика текста.
24. Создание электронного варианта программы «Мадагаскарские шашки».
25. Создание программы для оценки степени соответствия эмпириче-
ских и теоретических данных по различным критериям.
26. Создание архиватора и разархиватора файлов.
27. Программа умножения матриц. Размерность матрицы задается.
28. Написание программы создания правильного тетраэдра с возможно-
стью его вращения.
29. Построение самостоятельно пополняющегося словаря перевода с од-
ного языка на другой. (Задается текст; программа, просматривая текст, пере-
водит все слова, имеющиеся в словаре. При отсутствии слова в словаре выда-
ется запрос о его переводе и введенное слово и перевод заносятся в словарь.)
30. Написание программы прохода через вершины графа, используя соеди-
няющие его дуги, при условии, что проходить по дуге можно только один раз.

94
Заключение
Пособие содержит семь тем; каждая тема заканчивается рассмотрени-
ем практической задачи, решение которой основано на приведенных тео-
ретических сведениях. Пособие содержит начальные сведения по построе-
нию программ, предоставляя студенту исходную информацию по про-
граммированию в RAD Studio, являясь основой для решения задач, выпол-
няемых на старших курсах.
Также данное пособие является основой для создания системы управле-
ния базами данных (СУБД) психодиагностического назначения, которая бу-
дет рассмотрена во втором семестре в курсе «Информационные технологии»
и логически завершит рассмотрение вопросов программирования для созда-
ния программ медико-технического назначения.

95
Список рекомендуемой литературы
Архангельский А. Я. Программирование в Delphi 5. 2-е изд. М.: БИ-
НОМ, 2000.
Бельтюков М. В. Информационные технологии: учеб.-метод. пособие.
СПб.: Изд-во СПбГЭТУ «ЛЭТИ», 2019.
Вирт Н. Алгоритмы и структуры данных. СПб.: Невский диалект, 2001.
ГОСТ 19.701-90 (ИСО 5807-85). Схемы алгоритмов, программ, данных и
систем. Условные обозначения и правила выполнения. М.: Изд-во стандар-
тов, 1990.
Дантеманн Д., Мишел Д., Тейлор Д. Программирование в среде Delphi.
Киев: DiaSoft Ltd., 1995.
Иванов Ю. И., Погорелюк О. Н. Обработка результатов медико-
биологических исследований на микрокалькуляторах. М.: Медицина, 1990.
Культин Н. Delphi 4. Программирование на языке Object Pascal. СПб.:
БХВ – Санкт-Петербург, 1999.
Сван Т. Delphi 4. Библия разработчика. Киев; М.; СПб.: Диалектика,
1998.
Тюкачев Н. А., Илларионов И. В., Хлебостроев В. Г. Программирование
графики в Delphi. СПб.: БХВ – Санкт-Петербург, 2008.

96
Содержание
Введение ................................................................................................................... 3
1. ЗНАКОМСТВО СО СРЕДОЙ ПРОГРАММИРОВАНИЯ RAD STUDIO ..... 6
1.1. Теоретические сведения .............................................................................. 6
1.2. Создание программы «Моя первая программа» ..................................... 13
2. УСЛОВНЫЕ ОПЕРАТОРЫ ............................................................................. 16
2.1. Теоретические сведения ............................................................................ 16
2.2. Создание программы «Попадание точки в фигуру» .............................. 24
3. ОПЕРАТОРЫ ЦИКЛА...................................................................................... 29
3.1. Теоретические сведения ............................................................................ 29
3.2. Создание программы «Степенные ряды» ................................................ 37
4. ТИП ДАННЫХ «МАССИВ»............................................................................ 42
4.1. Теоретические сведения ............................................................................ 42
4.2. Создание программы «Работа с массивом» ............................................ 48
5. ГРАФИЧЕСКИЕ ПРИМИТИВЫ ..................................................................... 54
5.1. Теоретические сведения ............................................................................ 54
5.2. Создание программы «Графические примитивы» ................................. 60
6. РАБОТА С ТЕКСТОВОЙ ИНФОРМАЦИЕЙ ................................................ 68
6.1. Теоретические сведения ............................................................................ 68
6.2. Создание программы «Редактор текста» ................................................. 75
7. РАБОТА С ГРАФИКАМИ ............................................................................... 82
7.1. Теоретические сведения ............................................................................ 82
7.2. Создание программы «Электрокардиограмма» ...................................... 87
8. ВЫПОЛНЕНИЕ КУРСОВОЙ РАБОТЫ. ВАРИАНТЫ РАБОТ .................. 93
Заключение............................................................................................................. 95
Список рекомендуемой литературы .................................................................... 96

97
Бельтюков Михаил Витальевич

Программирование в среде RAD Studio


для решения медико-технических задач

Учебно-методическое пособие

Редактор Н. В. Кузнецова
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Подписано в печать 26.10.20. Формат 60×84 1/16.
Бумага офсетная. Печать цифровая. Печ. л. 6,25.
Гарнитура «Times New Roman». Тираж 77 экз. Заказ .
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Издательство СПбГЭТУ «ЛЭТИ»
197376, С.-Петербург, ул. Проф. Попова, 5
98

Вам также может понравиться