Практические задачи на программирование алгоритмов

advertisement
«Программирование»
Тема 6.1. Обзор и краткие характеристики языков программирования.
Поколения языков программирования.
стр. 3
Тема 6.2. Язык программирования Turbo Pascal. Среда Turbo Pascal.
1. Глоссарий
стр. 4
2. Компиляция и интерпретация. Типы трансляторов.
стр. 6
3. Редактор текстов и отладчик программы
стр. 7
4. Совмещение функций редактора текстов, отладчика программы и компилятора в
единой интегрированной среде Turbo Pascal.
стр. 6
5. Диалоговые окна
стр. 8
6. Главное меню. Опции главного меню. Локальное меню.
стр. 9
Тема 6.2. Язык программирования Turbo Pascal. Основные понятия Turbo Pascal.
1. Основные понятия:
стр
a. Структура программы.
b. Типы данных.
c. Переменные и константы
2. Выражения, операнды и операции
стр.
3. Стандартные функции Паскаля:
стр.
a. Стандартные арифметические функции языка Паскаль.
b. Стандартные функции преобразования
4. Составление программы, реализующей алгоритм линейной структуры.
стр.
Тема 6.2. Язык программирования Turbo Pascal. Разветвляющая структура программы
(условные и безусловные).
Тема 6.2. Язык программирования Turbo Pascal. Операторы циклов: способы организации
циклических структур алгоритмов.
Тема 6.2. Язык программирования Turbo Pascal. Операторы циклов: операторы циклов с
известным числом повторений;
Тема 6.2. Язык программирования Turbo Pascal. Сложный тип данных. Массивы и действия
над ними: Одномерные массивы, матрицы; Управление формой вывода массивов.
Тема 6.2. Язык программирования Turbo Pascal. Алгоритмы со структурой вложенных
циклов: составление на ПК программы нахождения произведения двух матриц.
Тема 6.2. Язык программирования Turbo Pascal. Создание простейших графических
изображений в Turbo Pascal.
Тема 6.2. Язык программирования Turbo Pascal. Создание графиков функций с помощью
графических средств Turbo Pascal.
Контрольная работа по курсу «Информатика».
Раздел 6. «Программирование»
Тема 6.1. Обзор и краткие характеристики языков программирования. Поколения
языков программирования.
а. Классификация языков программирования.
По мере развития вычислительной техники возникали и развивались различные средства
программирования. До настоящего времени возникли и «прожили » определенный срок, исчезли
несколько языков программирования. Осталось и выжило всего лишь несколько из них.
Условно все средства программирования можно разбить на группы:
1.
ЯП машинно-ориентированные (низкого уровня). Разные типы процессоров имеют
разные наборы команд. Если язык программирования ориентирован на конкретный тип процессора
и учитывает его особенности, то он называется языком программирования низкого уровня. В данном
случае «низкий уровень» не значит «плохой». Имеется в виду, что операторы языка близки к
машинному коду и ориентированы на конкретные команды процессора. Языком самого низкого
уровня является язык ассемблера, который просто представляет каждую команду машинного кода,
но не в виде чисел, а с помощью символьных условных обозначений, называемых мнемониками.
Однозначное преобразование одной машинной инструкции в одну команду ассемблера называется
транслитерацией. С помощью языков низкого уровня создаются очень эффективные и компактные
программы, так как разработчик получает доступ ко всем возможностям процессора. С другой
стороны, при этом требуется очень хорошо понимать устройство компьютера, затрудняется отладка
больших приложений, а результирующая программа не может быть перенесена на компьютер с
другим типом процессора. Подобные языки обычно применяют для написания небольших
системных приложений, драйверов устройств, модулей стыковки с нестандартным оборудованием,
когда важнейшими требованиями становятся компактность, быстродействие и возможность
прямого доступа к аппаратным ресурсам. В некоторых областях, например в машинной графике, на
языке ассемблера пишутся библиотеки, эффективно реализую требующие интенсивных
вычислений алгоритмы обработки изображений.
2.
Языки программирования процедурно-ориентированные (высокого уровня). Pascal,
QBasic, C. Значительно ближе и понятнее человеку, нежели компьютеру. Особенности конкретных
компьютерных архитектур в них не учитываются, поэтому создаваемые программы на уровне
исходных текстов легко переносимы на другие платформы, для которых создан транслятор этого
языка. Разрабатывать программы на языках высокого уровня с помощью понятных и мощных
команд значительно проще, а ошибок при создании программ допускается гораздо меньше.
3.
ЯП объектно-ориентированные. Object, Pascal, Delphi, C++, Visual Basic. Такие
программы представляют возможность программировать в режиме «конструирования», т.е.
создавать и быстро изменять многие стандартные узлы, файлы баз данных уже готовыми,
встроенными стандартными средствами и не тратить время на отладку множества процедур,
подпрограмм.
4.
ЯП логического описания, напр. ПРОЛОГ.
Назначение каждого языка программирования – это решение определенного класса задач,
отсюда специфика и разнообразие ЯП,
У каждого программного продукта существуют версии. Версией программного продукта
называют усовершенствованный программный продукт, предназначенный для того же
исполнителя. пример:
Turbo Pascal 6.0.
Turbo Pascal 7.0
(одинаковое название)
Пример можно привести такой: допустим у вас дома в компьютере установили Turbo Pascal
7.0, а в колледже Turbo Pascal 6.0. Вы написали дома программу, выполнена она правильно, свою
задачу решает. Приносите сюда, а она «не идет». Это потому что более ранняя версия не понимает
более позднюю, и наоборот, более поздняя понимает все ранние версии.
Помимо версии у языков программирования есть диалекты. Диалект – это модификация
программного продукта, предназначенного в соответствии с иным исполнителем. Пример: Basic,
Turbo Basic, QBasic. Т.К. диалекты рассчитаны для различных исполнителей, то говорить о
совместимости диалектов нет смысла.
б. Поколения языков программирования
2
Языки программирования принято делить на пять поколений. В первое поколение входят
языки, созданные в начале 50-х годов, когда первые компьютеры только появились на свет. Это был
первый язык ассемблера, созданный по принципу «одна инструкция — одна строка».
Расцвет второго поколения языков программирования пришелся на конец 50-х — начало 60-х
годов. Тогда был разработан символический ассемблер, в котором появилось понятие переменной.
Он стал первым полноценным языком программирования. Благодаря его возникновению заметно
возросли скорость разработки и надежность программ.
Появление третьего поколения языков программирования принято относить к 60-м годам. В
это время родились универсальные языки высокого уровня, с их помощью удается решать задачи из
любых областей. Такие качества новых языков, как относительная простота, независимость от
конкретного компьютера и возможность использования мощных синтаксических конструкций,
позволили резко повысить производительность труда программистов. Понятная большинству
пользователей структура этих языков привлекла к написанию небольших программ (как правило,
инженерного или экономического характера) значительное число специалистов из некомпьютерных
областей. Подавляющее большинство языков этого поколения успешно применяется и сегодня.
С начала 70-х годов по настоящее время продолжается период языков четвертого поколения.
Эти языки предназначены для реализации крупных проектов, повышения их надежности и скорости
создания. Они обычно ориентированы на специализированные области применения, где хороших
результатов можно добиться, используя не универсальные, а проблемно-ориентированные языки,
оперирующие конкретными понятиями узкой предметной области. Как правило, в эти языки
встраиваются мощные операторы, позволяющие одной строкой описать такую функциональность,
для реализации которой на языках младших поколений потребовались бы тысячи строк исходного
кода.
Рождение языков пятого поколения произошло в середине 90-х годов. К ним относятся
также системы автоматического создания прикладных программ с помощью визуальных средств
разработки, без знания программирования. Главная идея, которая закладывается в эти языки, —
возможность автоматического формирования результирующего текста на универсальных языках
программирования (который потом требуется откомпилировать). Инструкции же вводятся в
компьютер в максимально наглядном виде с помощью методов, наиболее удобных для человека, не
знакомого с программированием.
Тема 6.2. Язык программирования Turbo Pascal. Среда программирования Turbo Pascal.
1. Глоссарий
Буфер ввода-вывода - это область в памяти, которая выделяется для каждого файла.
Венгерская нотация - это соглашение о наименованиях переменных и функций.
Ветвление - это конструкция, состоящая из развилки, двух операций и слияния. Одна из
операций может отсутствовать.
Выражение в алгоритмическом языке состоит из элементарных конструкций и символов, оно
задает правило вычисления некоторого значения.
Выражение-константа представляет собой выражение, которое может вычисляться
компилятором без необходимости выполнения программы.
Глобальные переменные - это переменные, описанные вне процедуры и функции и
располагающиеся в сегменте данных.
Динамическая переменная создается во время выполнения программы и память для них
выделяется в динамической области (heap).
Запись представляет собой совокупность ограниченного числа логически связанных компонент,
принадлежащих к разным типам. Компоненты записи называются полями, каждое из которых
определяется именем.
Именами (идентификаторами) называют элементы языка - константы, метки, типы,
переменные, процедуры, функции, модули, объекты. Имя - это последовательность букв и цифр,
начинающаяся с буквы. В именах может использоваться символ '_' подчеркивание.
Инициализация переменных - это задание начальных значений переменным.
3
Инкапсуляция - это объединение данных и алгоритмов их обработки в одной структуре данных
(объекте).
Компонентный или типизированный файл - это файл с объявленным типом его компонент.
Компонентные файлы состоят из машинных представлений значений переменных, они хранят
данные в том же виде, что и память ЭВМ.
Локальные переменные - это переменные, описанные в самой процедуре или функции и
располагающиеся в сегменте стека.
Массивы представляют собой ограниченную упорядоченную совокупность однотипных величин.
Каждая отдельная величина называется компонентой массива.
Методы - это инкапсулированные в объект процедуры и функции.
Множество - это ограниченная совокупность различных элементов.
Модуль - это совокупность программных ресурсов, предназначенных для использования другими
программами.
Оператор задает полное описание некоторого действия, которое необходимо выполнить. Для
описания сложного действия может потребоваться группа операторов. В этом случае операторы
объединяются в составной оператор или блок.
Операторы отношений сравнивают два значения, возвращая в результате булевское значение
True или False.
Подпрограмма - это последовательность операторов, которые определены и записаны только в
одном месте программы, однако их можно вызвать для выполнения из одной или нескольких точек
программы. Каждая подпрограмма определяется уникальным именем.
Полиморфизм - это свойство, позволяющее называть разные алгоритмические действия одним
именем.
Последовательный доступ - это доступ в каждый момент времени лишь к одной компоненте
данных из всей последовательности, записанной в файл.
Программа - это объединенная единым алгоритмом совокупность описаний и операторов на
алгоритмическом языке.
Процедура и функция - это именованная последовательность описаний и операторов.
Прямой доступ предполагает, что файл представляет собой линейную последовательность
блоков.
Семантика - определение смысла и правила использования тех элементов языка, для которых
были даны синтаксические определения.
Символы языка - это основные неделимые знаки, в терминах которых пишутся все тексты на
языке.
Синтаксис - правила построения элементов языка.
Следование - это конструкция, представляющая собой последовательное выполнение двух или
более операций.
Статической переменной (статически размещенной) называется описанная явным образом в
программе переменная, обращение к которой осуществляется по имени. Место в памяти для
размещения статических переменных определяется при компиляции программы.
Строки в языке Паскаль - это последовательность символов, записанная между апострофами.
Структурированная программа (или подпрограмма) - это программа, составленная из
фиксированного множества базовых конструкций.
Физические файлы - это файлы на внешних устройствах.
Цикл - это конструкция, имеющая линии управления, ведущие к предыдущим операциям или
развилкам.
Элементарные конструкции - это минимальные единицы языка, имеющие самостоятельный
смысл. Они образуются из основных символов языка.
1. Компиляция и интерпретация.
Для того, чтобы программа, написанная на языке программирования, была понята
вычислительной машиной, ее необходимо перевести на язык команд ЭВМ или машинный язык.
Точный перевод осуществляется автоматически специальной программой, которая получила
4
название «транслятор» (от латинского translatio – передача). Программы-трансляторы создаются для
каждого алгоритмического языка и для каждого типа компьютеров. Существует два основных
способа трансляции – компиляция и интерпретация.
При компиляции вся исходная программа сразу превращается в последовательность машинных
команд. После этого полученная результирующая программа выполняется ЭВМ с имеющимися
исходными данными. Достоинство такого способа состоит в том, что трансляция выполняется один
раз, а (многократное) выполнение результирующей программы может осуществляться с большой
скоростью. Вместе с тем результирующая программа может занять в памяти ЭВМ очень много
места, так как один оператор языка при трансляции заменяется сотнями или даже тысячами команд.
Кроме того, отладка и видоизменения транслированной программы весьма затруднены.
Рис.1. Схема выполнения программы при компиляции и интерпретации
При интерпретации исходная программа хранится в памяти ЭВМ почти в измененном виде.
Программа-интерпретатор декодирует операторы исходной программы по одному и тут же
обеспечивает их выполнение с имеющимися данными. Интерпретируемая программа занимает в
памяти компьютера мало места, ее легко отлаживать и видоизменять. Зато выполнение программы
происходит достаточно медленно, поскольку при каждом исполнении заново осуществляется
поочередная интерпретация всех операторов.
Трансляторы обычно подразделяются на три типа:
1) компиляторы, переводящие всю программу, написанную на языке программирования
высокого уровня, на машинный язык, после чего программа записывается в память ЭВМ и лишь
потом реализуется ТР, С + С ++, ТВ.
2) интерпретаторы, переводящие команды или операторы входной программы по очереди и
немедленно выполняющие их BASIC.
3) ассемблеры, переводящие входную программу, написанную
на автокоде (языке ассемблера) в систему команд машины.
Ассемблер, как правило, каждый оператор автокода отображает в одну команду ЭВМ.
Автокод используется системным программистами, для которых важно получить экономные и
эффективные машинные программы, обычные пользователи на автокоде не работают.
Любой транслятор решает две основные задачи.
1) анализирует транслируемую программу, в частности определяет, правильна ли она;
2) генерирует выходную программу (ее часто называют объектной или рабочей) на язык
команд ЭВМ.
Транслятор должен
во первых: для предъявленного текста на входном языке уметь распознать, правилен ли он
или нет, если нет, то транслятор обязан указать те места текста, где нарушены правила написания.
Если текст программы правильный, то транслятор должен уметь определить ее структуру
(Например: выделить арифметические и логические выражения, описание, циклы и т.п.)
5
во-вторых: для всякой конструкции входного текста транслятор должен суметь построить, без
изменения смысла соответствующую ей конструкции выходного языка. (П.: XY+ X) транслятор
должен построить на выходном языке программу, которая, перемножив X и Y, к полученному
результату прибавила бы Х.
Еще одной крупной задачей, решаемой в процессе трансляции, является распределение
памяти. (для входной программы (назначению каждому фрагменту или для всех фрагментов
программы (блоков, функций, подпрограммы) и информационных массивов, адресов, участков
памяти или места в общем участке памяти, организованного в виде списка.
2. Редактор текстов и отладчик программы.
Отладка программы - процесс поиска и исправления ошибки в программе.
Ошибки бывают 2-х типов синтаксические и семантические.
Синтаксические ошибки – это ошибки, связанные с нарушением
синтаксиса, т.е. правил языка программирования, каким написана программа.
Современные трансляторы сами отслеживают синтаксические ошибки и указывают места в
программе, где они есть. Только после отслеживания синтаксиса происходит полная трансляция
программы, т.е. превращение ее в последовательность машинных команд, после чего программа
может быть запущена в работу. Именно тогда и начинается основная отладка программы поиск
семантических ошибок, связанных с содержанием и смыслом программы.
Редактор – программа, позволяющая с помощью клавиатуры терминала создавать на экране
дисплея тексты или изображения, вводить их в память ЭВМ и выводить на печать.
Когда программист, сидя за терминалом и глядя на экран пишет программу на языке
программирования, он по существу пользуется редактором неотъемлемой частью программного
обеспечения этого языка.
Любой текстовый редактор имеет набор стандартных возможностей: удаление и вставка
отдельных символов, строк и кусков текста, перенос и копирование выделенного куска текста в
нужное место, различные сдвиги фрагментов текста.
3. Совмещение функций редактора текстов, отладчика программы и компилятора в
единой интегрированной среде Turbo Pascal.
Система программирования Турбо Паскаль представляет собой единство двух в известной
степени самостоятельных начал: компилятора с языка программирования Паскаль и некоторой
инструментальной программной оболочки, способствующей повышению эффективности создания
программ. Реализуемый компилятором язык программирования Паскаль –язык Турбо Паскаля, а
разнообразные сервисные услуги, предоставляемые программной оболочкой, - среда Турбо Паскаль.
Система программирования турбо Паскаль представляет собой интегрированную среду
разработки, включающую в себя:
 электронный редактор;
 компилятор входного языка;
 редактор связей;
 интерактивный символьный отладчик;
 справочную подсистему.
Указанные компоненты в совокупности обеспечивают все виды работ по созданию
программы на языке турбо Паскаль.
Многооконный интерфейс с иерархической системой
меню обеспечивает высокую
производительность труда программиста.
Интегрированность системы означает следующее;
1) единое для всех компонентов системы внутренне представление информационных
объектов:
2) единая идеология построения компонентов включая унифицированный интерфейс
(называют совокупность технических, аппаратных и/или программных средств,
обеспечивающих сопряжение (совместимость) различных аппаратных средств между
6
собой, а также полное сопряжение технических средств с человеком, позволяющее ему
общаться с этими средствами) (Пр.; телефон)
3) тесная связь компонентов: П.: в процессе отладки программ система поддерживает
визуальное соответствие исполняемого фрагмента объектного кода и соответствующей
ему строки программы, в процессе отладочного исполнения программы можно
оперативно вносить в нее изменения с помощью экранного редактора.
В системе ТР имеется всеобъемлющая встроенная справочная подсистема, представляющая в
процессе работы оперативную помощь, как по входному языку, так и по самой системе.
Справочная служба ТР.
Существуют четыре способа обращения к справочной службе непосредственно из окна
редактора:
F1 – получение контекстно-зависимой справки;
Shift-F1 – выбор справки из списка доступных справочных сообщений;
Ctrl-F1 – получение справки о нужной стандартной процедуре, функции, о стандартной
константе или переменной;
Alt-F1 – получение предыдущей справки.
По команде Shift-F1 на экране появится окно, содержащее упорядоченный по алфавиту
список стандартных процедур, функций, типов, констант и переменных, для которых можно
получить справочную информацию.
Эту же справку можно получить и по-другому. Напечатайте на экране имя процедуры
(функции, типа и т.д.) или подведите курсор к имеющемуся в тексте стандартному имени и нажмите
Ctrl-F1. Среда проанализирует ближайшее окружение курсора, выделит имя и даст нужную справку.
Небольшой пример можно «вырезать» из справки и перенести в окно редактора. Для этого
после вызова справки нажмите Alt-E, выберите в появившемся дополнительном меню продолжение
Copy examples (копировать примеры) и нажмите Enter – текст примера скопируется во внутренний
буфер редактора. Для извлечения пример из буфера, нажмите Esc, чтобы выйти из справочной
службы, подвести курсор к свободной строке в окне редактора, нажмите Shift-Insert (копирование
содержимого буфера в текст программы) и Ctrl-K H, чтобы убрать выделение скопированного текста
цветом.
Интерфейс системы ТР воплощает следующие принципы:
1) Принцип полиэкрана, при котором все возникающие и циркулирующие в системе
информационные объекты доступны через специальные выделенные области экрана
дисплея (окна). Несколько окон могут одновременно присутствовать на экране,
предоставляя пользователю исчерпывающую информацию о текущем состоянии системы в
ходе ее работы.
2) Принцип непосредственного взаимодействия, который заключается а) в том, что изменения
вносимые пользователем в его информационные объекты (тексты программы) ,
осуществляется прямым воздействием на изображения объекта в окне без помощи к-л
промежуточных средств (П.: специальных команд). б) Этот принцип означает поддержание
оперативного соответствия всех изображений на экране текущему состоянию объектов и
всей системы (что вижу – то имею).
3) Принцип меню, при котором для выполнения некоторых действий пользователя достаточно
выбрать его из предлагаемого множества возможных в данный момент действий это
исключает необходимость в специальном языке – посреднике между системой и
пользователем и значительно облегчает и ускоряет процесс работы.
4. Диалоговые окна.
В системе ТР реализована иерархическая система меню обеспечивающая все возможные в
системе виды работ.
Первичным в иерархии является главное меню, постоянное присутствующее на экране и
доступное в процессе работы. Некоторые альтернативы меню содержат подменю обеспечивающие
доступ к группе локальных действий. Некоторые наиболее часто используемые альтернативы
доступны непосредственно.
7
Экранный редактор системы ТР многооконный: возможно держать на экране дисплея
изображение нескольких файлов одновременно (до 9) и при необходимости быстро переключаться с
одного файла на другой.
Верхнюю и нижнюю строки занимают соответственно главное меню системы и оперативная
подсказка.
В центральной части располагаются окна с изображениями редактируемых файлов.
На верхней части рамок окон написано имя файла (посередине) и порядковый номер окна.
Окно считается активным, что подчеркивается двойной рамкой, остальные окна имеют
одинарную рамку. Работа ведется с активным окном.
Доступ почти ко всем средствам интегрированной среды осуществляется через
иерархическую систему меню, что иногда приводит к излишнему загромождению экрана. Поэтому,
когда требуются действия различного характера (П: Ввести имя нового файла, имея возможность
при этом рассмотреть список уже существующих) введены окна специального вида, называемые
диалоговыми окнами.
Пример диалогового окна окно «Open и file», которое возникает на экране при выборе
альтернативы File/Open или при нажатии кл. F3
Данное окно содержит несколько различных областей (полей)
 поле Name предназначенное для непосредственного ввода имеет файлы, которые нужно
поместить во вновь создаваемое окно;
 поле Files , которое является как бы «окном в окне» и содержит список файлов текущего
каталога; в этом списке можно выбрать нужное имя, перемещая подсветку с помощью
клавишным управлением курсором, при этом в нижней части окна высвечиваются
атрибуты того файла на который установлена подсветка.
 Поле Open, Replace, Cancel, Help, используются для активизации нормальных действий,
связанных с ………. окне. Эти поля называются «кнопками», т.к. их назначение и действие
соответствует кнопкам к-л устройства.
Переход от одного поля диалогового окна к другому производится клавишей Tab (в прямом
направлении) или комбинацией Shift – Tab (в обратном направлении).
Клавиша F6- используется для последовательной смены окон, нажатие на эту клавишу делает
активным очередное окно; если окно было закрыто другими окнами, оно накладывается поверх них.
Клавиша F5 – распахивает окно и возвращает окну обычный размер.
Alt-F3 – закрывает окно (удаляет с экрана).
Ctrl-F5 – изменяет параметры окна (изменяется цвет и линии рамки), таким образом среда
сигнализирует о переходе к режиму настройки.
Клавишами смещения курсора окно можно перемешать по экрану.
Клавишами курсора в сочетании с Shift меняется размер окна.
Работа с меню.
F10 – переход от редактирования к выбору из главного меню.
Esc – для возврата в редактор.
Клавишами курсора перемешать указатель к нужной опции и нажать Enter.
Flt -<буква> - опция главного меню.
Работа с диалоговым окном.
Правила:
 для перехода от одного поля к другому предназначена клавиша Tab (клавиша
располагается в левой верхней части основной зоны клавиатуры и обозначена двумя
разнонаправленными стрелками);
 для перехода внутри поля используются клавиши смещения курсора;
 закрыть диалоговое окно можно клавишей Esc ( в этом случае не происходит никаких
действий, связанных с окном) или клавишей Enter (в этом случае выполняются все
указанные в окне установки или выбирается указанный файл).
8
Система меню.
Все управление средой ТП осуществляется в основном с помощью системы последовательно
разворачивающихся меню.
File (файл) – действия с файлами и выход из системы;
Edit (редактировать) – восстановление испорченной строки и операции с временным буфером;
Search (искать) – поиск текста, процедуры, функции или места ошибки;
Run (работа) – прогон программы;
Compile (компилировать) – компиляция программы;
Debug (отладка) – отладка программы;
Tools (инструменты) – вызов вспомогательных программ (утилит);
Options (варианты) – установка параметров среды;
Window (окно) – работа с окнами;
Help (помощь) – обращение к справочной службе.
5. Главное меню. Опции главного меню. Локальные меню
Хотя взаимодействовать с системой программирования Турбо Паскаль можно с помощью
средств обычной командной строки, максимальные возможности предоставляются тем, кто работает
в специальной интегрированной среде этой системы. Интегрированная среда - это совокупность
взаимосвязанных сервисных программных средств, обеспечивающих всестороннюю поддержку
процесса разработки программ. Использование возможностей среды Турбо Паскаля позволяет
значительно повысить эффективность этапов проектирования, тестирования и отладки программ.
Переходы от режима редактирования к компиляции, а затем выполнению, просмотр результатов,
выдача справочной информации в большинстве случаев происходит практически мгновенно.
5.1 Главное меню
Когда Вы входите в интегрированную среду системы программирования Турбо Паскаль (для этого
достаточно вызвать модуль turbo.exe), Вы сразу же попадаете в главное меню, которое расположено
в самой верхней строке экрана. Это единственное меню системы программирования Турбо Паскаль,
в котором опции расположены горизонтально. Опции - это содержащиеся в меню альтернативные
варианты действий. В главном меню их десять: File, Edit, Search, Run, Compile, Debug, Tools, Options,
Windows и Help. Каждая из опций имеет свое собственное меню. В отличие от главного эти
дополнительные меню падающие, т.е. они расположены вертикально. Для навигации используйте
мышь.
5.2. Опции главного меню
Меню опции File. Выбор опции File дает возможность создавать файлы, помещать их в окно
редактора и проводить с ними различные операции. Это меню включает десять опций.
Опция Open позволяет выбрать файл с исходным текстом и поместить его в одно из окон
редактирования. После активизации опции Open на экране появляется диалоговое окно, в котором
находится список файлов текущей директории и ряд кнопок. Главными являются кнопки [Open] и
[Replace]; первая загружает выбранный файл во вновь открываемое окно, вторая - в активное в
данный момент окно редактирования. Если при использовании Replace новый выбранный файл
загружается на место старого находящегося в окне файла, имя старого файла помещается в нижнюю
часть меню опции File. В диалоговом окне опции Open открывается еще дополнительное окно - окно
ввода. В это окно можно ввести имя необходимого Вам файла или группы файлов и работать именно
с ним.
Опция New производит открытие нового окна редактирования и нового файла с именем
NONAME <цифра><цифра>.PAS .
Опция Save позволяет записать файл, находящийся в активном окне редактирования на диск.
Опция Save As дает возможность файл, находящийся в активном окне редактирования,
переименовать и записать на диск.
9
Опция Save All работает так же, как опция Save, но сохраняет файлы, находящиеся не только
в активном окне, но и во всех остальных открытых к данному моменту окнах редактирования.
Опция Change Dir позволяет изменить текущее устройство и (или) директорию. Существует
два способа смены директории: первый заключается в указании в окне ввода полного адреса новой
директории; второй - в выборе нужной директории из появляющегося в диалоговом окне дерева
директорий.
Опция Print распечатывает содержимое активного окна редактирования.
Опция Printer Setup позволяет указать имя специальной программы-фильтра,
обрабатывающей данные перед выводом их на печать. Например, можно предусмотреть выделение
различных элементов синтаксиса при печати. Сама печать производится с помощью опции Print.
Опция Dos Shell позволяет временно покинуть интегрированную среду системы
программирования Турбо Паскаль без выгрузки ее из оперативной памяти. После этого Вы
получаете доступ ко всем стандартным средствам операционной системы. Отметим, что доступная
при этом оперативная память сокращается приблизительно на 240 К. Для того чтобы вернуться в
среду Турбо Паскаль, достаточно набрать на клавиатуре команду EXIT.
Опция Exit осуществляет выход из Среды Турбо Паскаля и удаление ее из оперативной
памяти компьютера. Если перед выбором этой опции не все редактируемые файлы были сохранены,
система предложит Вам их сохранить.
Меню опции Edit. В этом режиме можно проводить различные операции с редактируемыми
текстами. В частности, можно выделять фрагменты текста, удалять, копировать и перемещать их в
любое нужное место. Выделение фрагментов текста производится как с помощью клавиатуры, так и
с помощью мыши. Кроме того, для перемещения текстов из одного окна в другое можно
использовать дополнительное окно Clipboard, называемое карманом. Тексты, помещенные в карман,
также могут редактироваться. Меню опции Edit состоит из семи подопций.
Опция Undo позволяет отменить все изменения, внесенные последней операцией
редактирования.
Опция Redo отменяет действия, выполненные с помощью опции Undo.
Опция Cut. С помощью этой опции выделенный фрагмент текста удаляется из окна
редактирования и помещается в карман.
Опция Copy помещает копию выделенного фрагмента текста в карман. Важно, что фрагмент
можно взять из окна помощи (это окно чаще всего открывается по команде Help).
Опция Paste позволяет поместить текст из кармана (или выделенный фрагмент текста из окна
Clipboard) в указанное курсором место активного окна.
Опция Clear дает возможность удалить выделенный фрагмент без помещения его в карман.
Эту опцию можно использовать для очистки кармана.
Опция Show Clipboard служит для открытия окна кармана. Окно кармана похоже на окно
редактирования. Единственное отличие заключается в том, что любой фрагмент, вырезаемый (Cut)
или копируемый (Copy) из окна кармана, автоматически помещается в конец текста, в данный
момент находящегося в кармане. Отметим, что опция Paste берет из кармана не весь текст, а только
выделенный фрагмент.
Меню опции Search. В этом режиме очень удобно осуществлять поиск любой необходимой
последовательности символов в редактируемых текстах.
Опция Find. При выборе этой опции на экране появляется диалоговое окно, а пользователю
предлагается ввести искомую последовательность символов и определить условия и область поиска.
Условия поиска задаются с помощью нескольких кнопок-флажков. Флажки позволяют установить,
следует ли при поиске:
- различать прописные и строчные буквы;
- анализировать только слова или знаки пунктуации тоже;
- распознавать включаемые в искомую строку спецификаторы формата.
Кроме того, с помощью кнопок-переключателей определяется область и направление поиска:
областью поиска может быть весь текст или выделенный фрагмент; начало или конец области может
также помечаться курсором; направление поиска может либо быть прямым, т.е. от начала области к
концу, либо обратным.
10
Опция Replace позволяет заменять в тексте одни последовательности символов на другие.
Диалоговое окно, которое появляется при выборе этой опции, очень похоже на соответствующее
окно опции Find; исключением является дополнительное поле, в которое необходимо поместить
строку замены. Если искомая строка найдена, система спрашивает, следует ли заменить только ее
первое вхождение либо все вхождения сразу. Как и в случае опции Find, текст для поиска может
быть взят из окна редактирования.
Опция Search Again позволяет установить все те условия поиска, которые были
сформированы в результате самого последнего вызова либо опции Find, либо опции Replace и
провести поиск.
Опция Goto line number. С помощью этой опции ищется участок текста, содержащий строку
с заданным номером. Найденный участок появляется в окне редактирования.
Опция Show last compiller error позволяет установить курсор на строку текста программы,
содержащую последнюю ошибку, обнаруженную компилятором. Одновременно в верхней строке
экрана появляется сообщение об ошибке.
Опция Find Error позволяет определить место нахождения ошибки, возникающей во время
выполнения программы. Если флаг Debugging установлен (см. меню опции Option), то при
возникновении ошибки курсор автоматически будет помещен на строку, содержащую ошибочный
оператор.
Опция Find Procedure позволяет отыскать в программе нужную процедуру или функцию.
Для инициализации поиска необходимо ввести имя подпрограммы.
Меню опции Run позволяет проводить компиляцию, компоновку и выполнение программы, а
также осуществлять прогоны программы в различных отладочных режимах.
Опция Run осуществляет компиляцию, компоновку и выполнение программы, находящейся
в активном окне редактирования. Если со времени последней компиляции исходный текст не
претерпел изменений, программа сразу же будет выполнена.
Нажатие клавиши Ctrl-Break приводит к приостановке процесса выполнения программы;
курсор в этом случае будет установлен на строке, которая непосредственно следует за уже
выполненной. Выполнение программы после этого можно продолжить. Повторное нажатие клавиш
Ctrl-Break завершит работу программы.
Опция Trace into приводит к выполнению очередного оператора программы. После этого
выполнение программы приостанавливается. Следующая готовая к выполнению строка программы
выделяется подсветкой. Если очередным оператором является обращение к подпрограмме,
управление передается внутрь подпрограммы.
Опция Step over аналогична предыдущей, но пооператорное сканирование подпрограмм с ее
помощью не проводится.
Опция Goto Cursor. Вначале осуществляются все необходимые действия, связанные с
компиляцией и компоновкой программы. После этого программа выполняется до строки,
помеченной курсором (строка выделяется подсветкой). В этом режиме можно пользоваться всеми
средствами встроенного отладчика.
Опция Program Reset освобождает память, отведенную для программы, закрывает все
файлы, используемые программой, и прекращает сеанс отладки.
Опция Parameters задает строку символов, которая будет интерпретироваться программой
как набор ее входных параметров.
Меню опции Compile поможет провести компиляцию и компоновку программы,
сформировать загрузочные файлы, а в случае необходимости сохранить их на диске. В состав меню
входят пять опций.
Опция Compile предназначена для компиляции программы или модуля, находящегося в
активном окне редактирования. После окончания компиляции на экране появляется окно,
содержащее информацию о результатах компиляции. Если в тексте допущена синтаксическая
ошибка, процесс компиляции прекращается, в окне редактирования появляется сообщение об
ошибке, а курсор показывает место ошибки в тексте программы.
11
В том случае, если в тексте компилируемой программы (или модуля) имеется обращение к
другим модулям, последние должны быть к этому моменту откомпилированы и храниться на диске в
виде файлов с расширением .TPU.
Опция Make. С помощью этой опции компилируются:
а) программа (модуль) либо находящийся в файле, имя которого указано в опции Primary File,
либо присутствующий в активном окне редактирования;
б) все модули, которые удовлетворяют двум условиям: во-первых, вызываются
откомпилированной программой (модулем) из пункта (а) и, во-вторых, изменялись с момента их
последней компиляции;
в) модули, которые обращаются к определенным в пунктах (а) и (б) модулям, секции связи
которых претерпели изменения.
Опция Build подобна опции Маке, но предусматривает перекомпиляцию всех модулей,
определенных в пунктах (а), (б) и (в) вне зависимости от того, подвергались они изменениям с
момента последней компиляции или нет.
Опция Destination позволяет определить, где будет размещаться загрузочный код программы
или модуля, в оперативной памяти или на диске. Эта опция может принимать одно из двух
возможных значений MEMORY (память) или DISK (диск). Отметим, что даже если значением опции
является MEMORY, все дополнительные TPU-файлы, сгенерированные в режимах RUN, MAKE и
BUILD, будут записаны на диск. Если поле Primary File пусто, то обрабатывается файл,
содержащийся в активном окне редактирования. Чаще всего в этом поле следует задавать имя файла,
содержащего текст главной программы.
Опция Clear primary File очищает поле опции Primary File.
Опция Information дает возможность по результатам компиляции получить информацию о
программе (или модуле).
Меню опции Debug позволяет пользоваться большими возможностями отладчика,
встроенного в среду программирования Турбо Паскаль 7.0. К ним, в первую очередь, относятся
средства работы с окнами наблюдений и средства временной остановки выполнения программы.
Опция Breakрoints расширяет возможности использования точек останова при отладке
программ. Активизация опции Breakpoints приводит к появлению на экране диалогового окна,
содержащего информацию о всех действующих в данный момент точках останова. О каждой точке
останова хранятся следующие данные: номер строки, условие срабатывания и регулярность
срабатывания. Последний элемент данных является числом, которое показывает, сколько раз надо
пройти через точку останова перед тем, как она сработает. Для управления диалоговыми окнами
предназначены три кнопки: [Edit], [Delete] и [View]. Они позволяют производить редактирование
данных, относящихся к выбранной точке останова; удаление и просмотр текста, связанного с
выбранной точкой останова.
Активизация режима редактирования (кнопка Edit) приводит к появлению нового диалогового
окна. Для работы в нем предназначены две кнопки: [Modify] и [New]. Первая позволяет менять
условия уже существующей точки останова, а вторая - сгенерировать новую точку останова.
Опцию Call Stack можно использовать только в том случае, когда выполнение программы
временно приостановлено.
Опция Register позволяет сделать активным окно Register, содержащее данные,
характеризующие состояние регистров центрального процессора Окно используется, когда в
программе присутствуют операторы языка Ассемблер.
Опция Watch используется для открытия и активизации окна наблюдений.
Опция Output активизирует окно вывода. В окно помещается информация, передаваемая
программой на экран дисплея и запрашиваемая у пользователя.
Опция User Screen используется для просмотра результатов работы программы не в
отдельном окне, а на всем экране, т.е. опция расширяет границы окна вывода до размеров экрана.
Опция Evaluate/Modify позволяет в процессе отладки вывести на экран значение
произвольного выражения, а также просмотреть или изменить значение любой переменной. Выбор
этой опции приводит к открытию диалогового окна, содержащего три поля: Expression (Выражение),
Result (Результаты), New Value (Новое значение). Поле New Value можно использовать только тогда,
12
когда в поле Expression находится имя переменной. Для манипулирования полями предназначены
две кнопки: Evaluate (Вычислить) и Modify (Изменить).
Опция Add Watch позволяет добавить в окно наблюдений очередное выражение. При этом
открывается диалоговое окно, в котором необходимо поместить выражение, за изменениями
значения которого надо следить в процессе выполнения программы. Это окно будет помещено в
окно наблюдений. Окно наблюдений появляется на экране после нажатия клавиши F6.
Опция Add Breakpoint приводит к открытию окна, предназначенного для определения новой
точки останова. В этом окне присутствуют те же позиции, что и в окне, связанном с опцией
Breakpoints.
Меню опции Tools предназначено для оперативного доступа к внешним программам
непосредственно из Среды Турбо Паскаль.
Меню опции Options предназначено для управления режимами компиляции и компоновки
программ, написанных на Турбо Паскале, для определения параметров интегрированной среды и, в
частности, встроенного отладчика. Специальные средства этого меню позволяют проводить
настройку текстового редактора, управлять мышкой, выбирать цветовую гамму и т.п.
Меню опции Window содержит команды управления окнами. В системе программирования
Турбо Паскаль 7.0 могут быть открыты окна редактирования, наблюдений, вывода, помощи. Каждое
из них может быть развернуто на весь экран, или несколько окон могут одновременно
присутствовать на экране. Есть средства, позволяющие осуществлять изменение размеров окна и
прокрутку содержимого окна.
Опция Tile размещает на экране дисплея все открытые в данный момент окна. Размеры всех
окон одинаковы, друг друга они не перекрывают.
Опция Cascade располагает на экране все открытые окна, но друг за другом; не перекрытым
останется только одно активное окно. У всех остальных окон видны только их заголовки.
Опция Close All предназначена для закрытия всех открытых окон.
Опция Refresh Display. Если запущенная программа выводит результаты непосредственно
на экран интегрированной среды (а не в окно вывода), то для восстановления содержимого экрана
следует выбрать опцию Refresh Display.
Опция Size/Move служит для изменения размеров активного окна и места его расположения
на экране. Операции можно осуществлять либо с помощью клавиш со стрелками, либо с помощью
мыши. Если окно имеет специально предназначенный для изменения размеров уголок, удобнее
пользоваться мышью.
Опция Zoom увеличивает размер активного окна до максимальных размеров, либо
восстанавливает предыдущие размеры окна.
Опция Next делает активным следующее по порядку за активным окно.
Опция Previous активизирует окно, которое было открыто непосредственно перед текущим
активным окном.
Опция Close закрывает активное окно.
Опция List выводит на экран список всех открытых окон.
Меню опции Help позволяет получить справочную информацию по любым аспектам языка и
его интегрированной Среды через окно помощи. Получить справку можно также о выбранной опции
меню, нажав клавишу F1, или о языке, поместив курсор в окне редактирования под интересующим
словом и нажав клавиши Ctrl-F1. Если окно Help активно, то присутствующие в нем подсвеченные
ключевые слова или предложения могут быть выбраны для получения справочной информации.
Опция Contents выдает оглавление справочной информации.
Опция Index выдает на экран список ключевых слов.
Опция Topic Search выдает справку о языковой конструкции, на котором стоит курсор в окне
редактирования.
Опция Previous Topic восстанавливает на экране содержимое предыдущего окна помощи.
Опция Using Help поясняет как пользоваться справкой.
Опция Files позволяет добавлять в справочную систему новые Help-файлы.
Опция Compiler directives выдает информацию о директивах компилятора.
Опция Procedure and functions содержит данные о подпрограммах
13
Опция Reserved words выдает информацию о зарезервированных словах языка.
Опция Standart Units содержит информацию о стандартных модулях системы
программирования.
Опция Turbo Pascal Language дает информацию о синтаксических элементах языка.
Опция Error messages содержит список сообщений об ошибках компиляции и выполнения.
5.3. Локальные меню
Имеется четыре локальных меню, каждое из которых привязано к соответствующему окну:
редактирования, помощи, наблюдений и вывода. Активизация локального меню производится
правой кнопкой мыши.
Меню окна редактирования содержит четыре опции меню Edit: Cut, Copy, Paste, Clear; одну
опцию меню Help: Topic search; одну опцию меню Run: Go to cursor; две опции меню Debug:
Evaluate/modify, Add watch; опцию Options, которая дублирует опцию Environment/Editor меню
Options; две новые опции:
Опция Open file at cursor приводит к загрузке в новое окно файла, имя которого
позиционировано курсором.
Опция Toggle breakpoint устанавливает точку останова на строку, помеченную курсором, а
если она была то снимает.
Меню окна помощи включает четыре опции меню Help: Contents, Index, Topic Search,
Previous topic; одну опцию меню Edit: Copy; и новую опцию: Copy example, которая используется
для копирования примеров программ из окна помощи в карман.
Меню окна наблюдений включает шесть опций.
Опция Add служит для добавления выражения в окно наблюдений.
Опция Modify позволяет редактировать текущее выражение в окне наблюдений.
Опция Remove удаляет текущее выражение из окна наблюдений.
Опция Clear all очищает окно наблюдений от всех выражений.
Опция Disable скрывает значение текущего выражения окна наблюдений: вместо значения
будет появляться слово <disable>.
Опция Enable отменяет действие опции Disable.
Меню окна вывода включает три опции.
Опция Clear позволяет очистить окно вывода.
Опция Goto source позволяет перейти в окно редактирования, в котором находится
анализируемый файл.
Тема 6.2. ЯЗЫК ПРОГРАММИРОВАНИЯ ТУРБО ПАСКАЛЬ 6.0-7.0.
1.1. Основные понятия
Как начать работу с Турбо Паскалем
Система Турбо Паскаль довольна значительна по объему. Она поставляется на нескольких
дистрибутивных дискетах и устанавливается на жесткий диск. При развертывании системы на
жестком диске обычно создается каталог с именем ТР (или PAS, TURBOPAS, PASCAL и т.п.), в
который помещаются все файлы с дистрибутивных дискет. Для вызова Турбо Паскаля необходимо
отыскать в древовидной структуре каталогов ПК этот каталог и в нем файл TURBO.EXE. Этот файл
содержит готовую к работе диалоговую систему программирования Турбо Паскаль. В него входят
минимально необходимые части Турбо Паскаля (текстовый редактор, компилятор, компоновщик,
загрузчик). Для нормальной работы в диалоговой среде понадобятся также основная библиотека,
располагающаяся в файле TURBO. TPL, и справочная служба (файл TURBO.HLP). В принципе, этих
файлов достаточно для написания, компиляции и исполнения большинства примеров, содержащихся
в этой книге.
Пусть перечисленные файлы располагаются в каталоге ТР на диске D. Тогда для вызова Турбо
Паскаля следует дать команду:
14
D:\TP\TURBO
По этой команде операционная система MS-DOS поставит на исполнение программу из файла
TURBO.EXE: загрузит программу в оперативную память и передаст ей управление.
Не рекомендуется работать с системой, назначив в качестве каталога по умолчанию (текущего
каталога) тот, в котором хранятся перечисленные выше файлы (этот каталог будем называть
системным). Во-первых, в таком случае можно ошибочно стереть какой-либо из файлов системы
программирования и тем самым нарушить ее работоспособность, а во-вторых, этот каталог очень
скоро заполнится другими файлами, прямо не относящимися к Турбо Паскалю. Существует и еще
одна причина, покоторой нежелательно работать в системном каталоге. Дело в том, что Турбо
Паскаль имеет свойство запоминать свою настройку в двух файлах с именами TURBO. TP и
TURBO.PCK. При вызове система начинает поиск этих файлов в текущем каталоге. Если этот каталог
- Ваш индивидуальный, система всякий раз будет настраиваться так, как Вы этого хотите. Если эти
файлы не обнаружены в Вашем каталог (а при первом обращении к Турбо Паскалю так оно и будет),
система продолжит поиск в системном каталоге, а не найдя их там, настроится стандартным образом.
Впоследствии можно сохранить настроечные файлы в своем каталоге и тем самым избавить себя от
необходимости перенастройки системы всякий раз при обращении к ней.
После успешного вызова системы экран ПК приобретает вид, показанный на рис. 1.1.
Рис. 1.1. Вид экрана после вызова Турбо Паскаля
Сразу же скажем, что для выхода из Турбо Паскаля следует нажать клавишу Alt и, не отпуская ее, клавишу с латинской буквой X, после чего можно отпустить обе клавиши.
Верхняя строка содержит «меню» возможных режимов работы Турбо Паскаля, нижняя - краткую
справку о назначении основных функциональных клавиш. Вся остальная часть экрана принадлежит
окну редактора, очерченному двойной рамкой и предназначенному для ввода и коррекции текстов
программ. В его верхней строке приводятся имя того дискового файла, откуда был прочитан текст
программы (новому файлу присваивается имя NONAME00.PAS), два специальных поля,
используемых при работе с устройством ввода «мышь» (эти поля выделены квадратными скобками),
и цифра 1 - номер окна. В Турбо Паскале можно работать одновременно с несколькими программами
(или частями одной крупной программы), каждая из которых может располагаться в отдельном окне
редактора. Среда позволяет использовать до 9-ти окон редактора одновременно.
15
Кроме окна (окон) редактора в Турбо Паскале используются также окна отладочного режима, вывода
результатов работы программы, справочной службы, стека, регистров. По желанию они могут
вызываться на экран поочередно или присутствовать на нем одновременно.
Текстовый редактор
Текстовый редактор среды Турбо Паскаля предоставляет пользователю удобные средства создания и
редактирования текстов программ. Признаком того, что среда находится в состоянии
редактирования, является наличие в окне редактора курсора -небольшого мигающего
прямоугольника. Режим редактирования автоматически устанавливается сразу после загрузки Турбо
Паскаля. Из режима редактирования можно перейти к любому другому режиму работы Турбо
Паскаля с помощью функциональных клавиш или выбора нужного режима из главного меню. Если
среда находится в состоянии выбора из меню, курсор исчезает, а в строке меню появляется цветной
указатель-прямоугольник, выделяющий одно из кодовых слов (опций меню). Для перехода от
состояния выбора режима из главного меню в состояние редактирования нужно нажать клавишу Esc
(ESCape - ускользать, убегать), а для перехода к выбору из главного меню - F10.
Рассмотрим основные приемы работы с текстовым редактором.
Для создания текста программы нужно ввести этот текст с помощью клавиатуры ПК подобно тому,
как это делается при печатании текста на пишущей машинке. После заполнения очередной строки
следует нажать на клавишу Enter, чтобы перевести курсор на следующую строку (курсор всегда
показывает то место на экране, куда будет помещен очередной вводимый символ программы).
Окно редактора имитирует длинный и достаточно широкий лист бумаги, фрагмент которого виден в
окне. Если курсор достиг нижнего края, осуществляется прокрутка окна редактора: его содержимое
смещается вверх на одну строку и снизу появляется новая строка листа. Если курсор достиг правой
границы экрана, окно начинает по мере ввода символов смещаться вправо, показывая правый край
листа. Размеры листа по горизонтали и вертикали ограничиваются только общим числом символов в
файле, которых не должно быть больше 64535, однако компилятор Турбо Паскаля воспринимает
строки программы длиной не более 126 символов.
Окно можно смещать относительно листа с помощью следующих клавиш:
Page Up -на страницу вверх;
Page Down - на страницу вниз;
Ноте - в начало текущей строки;
End - в конец текущей строки;
Ctrl-Page Up -в начало текста;
Ctrl-Page Down - в конец текста.
Клавишами перевода курсора (эти клавши помечены стрелками и располагаются в правой части
клавиатуры) его можно смещать по экрану. При достижении границ окна оно смещается на строку
Или на символ.
Если Вы ошиблись при вводе очередного символа, его можно стереть с помощью клавиши со
стрелкой (или надписью Backspace), расположенной над клавишей Enter. Клавиша Delete стирает
символ, на который в данный момент указывает курсор, а команда Ctrl-Y- всю строку, на которой
расположен курсор.
Следует помнить, что редактор Турбо Паскаля вставляет в конце каждой строки невидимый символразделитель. Этот символ вставляется клавишей Enter, а стирается клавишами Backspace или Delete.
С помощью вставки/стирания разделителя можно «разрезать»/«склеить» строки. Чтобы разрезать
16
строку, следует подвести курсор к нужному месту и нажать Enter, чтобы склеить соседние строки,
нужно установить
курсор в конец первой строки (для этого удобно использовать клавишу End) и нажать Delete или
установит курсор в начало второй строки (клавишей Ноте) и нажать Backspace.
Нормальный режим работы редактора - режим вставки, в котором каждый вновь вводимый символ
как бы «раздвигает» текст на экране, смещая вправо остаток строки. Следует учитывать, что
разрезание текста и последующая вставка пропущенных строк возможны только в этом режиме.
Редактор может также работать в режиме наложения новых символов на существующий старый
текст: в этом режиме новый символ заменяет собой тот символ, на который указывает курсор, а
остаток строки не смещается вправо. Для перехода к режиму наложения нужно нажать клавишу
Insert, а если нажать эту клавишу еще раз, вновь устанавливается режим вставки. Признаком того, в
каком режиме работает редактор, является форма курсора: в режиме вставки он похож на мигающий
символ подчеркивания, а в режиме наложения он представляет собой крупный мигающий
прямоугольник, заслоняющий символ целиком.
И еще об одной возможности редактора. Обычно редактор работает в режиме автоотступа. В этом
режиме каждая новая строка начинается в той же позиции на экране, что и предыдущая. Режим
автоотступа поддерживает хороший стиль оформления текста программы: отступы от левого края
выделяют тело условного или составного оператора и делают программу более наглядной.
Отказаться от автоотступа можно командой Ctrl-O I (при нажатой Ctrl нажимается сначала клавиша
с латинской буквой О, а затем О отпускается и нажимается I ), повторная команда Ctrl-O I
восстановит режим автоотступа.
Ниже перечислены наиболее часто используемые команды редактор Турбо Паскаля.
Смешение курсора
Page Up -на страницу вверх;
Page Down - на страницу вниз;
Ноте - в начало текущей строки;
End - в конец текущей строки;
Ctrl-Page Up - в начало текста;
Ctrl-Page Down - в конец текста.
Команды редактирования
Backspace - стирает символ слева от курсора;
Delete - стирает символ, на который показывает курсор;
Ctrl-Y- стирает строку с курсором;
Enter - вставляет новую строку, разрезает старую;
Ctrl-Q L - восстанавливает измененную строку (действует, если курсор не
покидал строку после ее изменения).
Работа с блоком
Ctrl-K В - начинает выделение блока;
Ctrl-K K- заканчивает выделение блока;
Ctrl-K Y - уничтожает выделенный блок;
Ctrl-K С - копирует блок;
Ctrl-K V - перемещает блок на новое место;
Ctrl-K W - записывает блок в файл;
Ctrl-K R - читает блок из файла;
17
Ctrl-K P - печатает блок.
Основные приемы работы в среде Турбо Паскаля
Работа с файлами
Как уже говорилось, сразу после запуска Турбо Паскаля среда переходит в режим
редактирования текста, в котором можно подготовить новую программу или исправить
существующую.
Основной формой хранения текстов программ вне среды являются файлы. После завершения
работы с Турбо Паскалем можно сохранить текст новой программы в дисковом файле с тем,
чтобы использовать его в следующий раз. Для обмена данными между дисковыми файлами и
редактором среды предназначены клавиши F2 (запись в файл) и F3 (чтение из файла). Если
Вы создаете новую программу, то среда еще не знает имя того файла, в который Вы захотите
поместить текст этой программы, и поэтому она присваивает ей стандартное имя
NONAME00.PAS (NO NAME - нет имени). Для сохранения текста программы в файле нужно
нажать F2. В этот момент среда проверит имя программы и, если это стандартное имя
NONAME, спросит, нужно ли его изменять: на экране появится небольшое окно запроса с
надписью
Save File as
(Сохранить в файле с именем...)
Ниже надписи располагается поле для ввода имени файла, в котором можно написать нужное
имя и нажать Enter - текст будет сохранен в файле. Если в имени опущено расширение, среда
присвоит файлу стандартное расширение PAS. Если Вы захотите завершить работу с Турбо
Паскалем, а в редакторе остался не сохраненный в файле текст, на экране появится окно с запросом
NONAMEOO.PAS has been modified.Save?
(Файл NONAME00.PAS был изменен. Сохранить?)
В ответ следует нажать Y(Yes - да), если необходимо сохранить текст в файле, или N(No - нет), если
сохранять текст не нужно.
Алфавит языка включает символы:
- прописные и строчные латинские буквы A..Z, a..z
- десятичные цифры 0..9
- специальные символы + - * / = < > [ ] . , ( ) : ; ^ @ { }
Следует иметь в виду, что при обработке текста программы компилятор системы
программирования ТР не различает коды латинских букв, набираемых на нижнем и верхнем
регистрах клавиатуры, в связи с этим строчные и прописные латинские буквы интерпретируются
одинаково. Эта особенность не распространяется на символьные строки и комментарии,
допускающие включение любых символов.
Язык ТР имеет некоторый набор служебных (ключевых) слов, назначение которых в языке
строго определено (зарезервировано).
Зарезервированные слова - слова, смысл и назначение которых однозначно
предопределены правилами языка. Их нельзя использовать для других целей. Это служебные слова и
директивы. Например, and, array, begin, goto, end и т.д.
Идентификаторы - имена для обозначения констант, переменных и их типов, полей,
процедур, функций, модулей, программ. Начинаются с буквы или символа подчеркивания _ и далее
возможны буквы, цифры, _. Длина имени любая, но компилятор различает идентификаторы по
первым 63-м символам.
Идентификаторы (имена) выбираются самим программистом по следующему правилу: имя
должно состоять из букв и цифр, но первым символом может быть только буква. Следующие имена
составлены без ошибок: X , Y22M, РАЗМЕР, GAMMA, R15.
А такие имена, наоборот, ошибочны: 4ABC – начинается с цифры; Y.22 – содержит недопустимый
символ – точку; А+В – содержит недопустимый символ – знак «+»; РАЗМЕР ПАЛЬТО – пробелы в
имени недопустимы.
18
Выбор имени следует осуществлять исходя из логической или физической сущности
обозначаемого объекта.
Метки - целые числа в диапазоне 0..9999 или идентификаторы. Используются при передаче
управления оператором goto.
Числа :
а) <целое>::=<цифра>[<целое>] Например: 2, 33, 796 и т.д.
б)<вещественное с фиксированной точкой>::= <знак> <целое>.<целое> Например: 77.35,
2.421, -0.3 и т.д. (Часть числа, которая читается как «умножить на десять в степени», обозначается
буквой Е, цифры, предшествующие букве Е обозначают мантиссу числа, цифры, следующие за
буквой Е – порядок), (ошибки – 15. –оканчивается точкой; .65 – начинается с точки; 155.27.54 –
содержит две точки. (мантисса и порядок могут иметь знак) (ОШИБКИ: Е-05 –отсутствует
мантисса; -5.Е02 –мантисса числа).
в)<вещественное в экспоненциальной форме >::= <знак> 0. <целое>E<знак><целое>
Например: -0.7Е+02= 70, 0.5Е-1=0.05 и т.д.
Строки - последовательность любых символов, заключенная в апострофы. Два соседних
апострофа в строке обозначают один символ - апостроф. Например: ‘Turbo Pascal’ ‘ Объявление ’ и
т.д. (ОШИБКИ – ‘const –нет конечного апострофа; PROGRAM- апострофы отсутствуют; ’15.8’E5 –
апостроф стоит не в конце строки; ‘=*.;” – не хватает еще одного апострофа в конце строки.).
Комментарии - любая комбинация символов в фигурных скобках {
} или
комбинированных скобках (* *), /* */. Например:
{Пишите программы с комментариями}
(* В них удобнее разбираться *)
Комментарии – тексты, поясняющие программу, но не влияющие на ход ее выполнения.
Могут быть вставлены в любое место программы, где может стоять пробел, и состоять из любых
допустимых машиной символов, кроме скобок комментариев.
1.2. Структура программы
Программа включает заголовок и два раздела. В первом содержатся объявления всех
объектов, используемых в программе (типы данных, константы, переменные, метки, процедуры,
функции). Во втором - операторы для описания действий над предварительно объявленными
объектами:
<программа>::=[<заголовок>];
<раздел объявлений>
Begin
<раздел операторов>
End.
Например:
Program Ex;
{пример}
Var
a: integer;
Begin
a:=5;
writeln(‘оценка – ‘, a);
End.
Общая структура программы
19
В заголовке программы после служебного слова PROGRUM указывается имя программы, не
имеющее смысла внутри программы и обозначающее всю программу в целом. После имени
программы в круглых скобках следует список файлов – наборов данных, размещенных на внешних
устройствах ЭВМ, с которыми взаимодействует программа. Обычно используют имена стандартного
входного (INPUT) и выходного (OUTPUT) файлов или одного из них, например:
PROGRAM CONUS (INPUT, OUTPUT);
Во многих версиях языка Паскаль имена стандартных файлов в заголовке программы могут
отсутствовать (они принимаются по умолчанию).
После заголовка программы следует подраздел описания меток (LABEL). Любой оператор в
программе можно выделить, поставив перед ним метку – целое число без знака, содержащее не
более четырех цифр. Метка от оператора отделяется двоеточием, например:
28: READ (X,Y,Z);
Появление меток в программе дает возможность ссылаться на эти метки в специальных
операторах управления и изменять естественный ход выполнения программы. Все метки должны
быть перечислены в разделе LABEL, например:
LABEL
1, 12, 999;
Раздел LABEL может отсутствовать, если в программе меток нет.
За подразделом меток следует подраздел описания констант (CONST). Константы в программе
могут быть представлены именем, тогда в подразделе констант этим именам должны быть
присвоены некоторые значения (числа, строки), например:
CONST
PI=3.1415926;
MAX=10000;
HEAD='ЗАГОЛОВОК ТАБЛИЦЫ';
Использование идентификаторов констант дает возможность программисту сгруппировать в
начале программы постоянные величины, характерные для данной задачи; здесь их легче
изменить, не изменяя саму программу. Программы с группированными константами становятся
более наглядными и эффектными.
Подраздел описания типов (TYPE) служит для определения простых и структурных типов
данных, задаваемых пользователем.
20
Каждая величина в программе должна быть сопоставлена с одним и только одним типом. Тип
константы определяется формой записи ее значения. Тип переменной обязательно должен быть
задан в специальном подразделе описания переменных (VAR).
Подраздел описания процедур и функций (PROCEDURE, FUNCTION) присутствует в программе,
если программист помимо стандартных процедур и функций определяет свои, являющиеся
самостоятельными программными единицами, к которым осуществляется обращение (ссылка) из
основной программы с помощью указания имени этой процедуры или функции и ее параметров
(аналогично стандартным процедурам и функциям). Более подробно эти понятия будут
рассмотрены далее.
1.3. Типы данных
Данные - это конкретные значения, которые обрабатываются во время выполнения
программы. Все данные должны быть явно приписаны к определенным типам.
Тип данного - определяет формат машинного представления данного, допустимый набор
его значений, а также те действия, которые могут быть выполнены над этими данными. Наряду со
стандартными типами данных, не требующими специальных описаний, в Турбо Паскале могут
использоваться типы, задаваемые программистом идентификатором в разделе объявлений под
рубрикой Type.
1.3.1. Простые типы
Простой тип определяет упорядоченное множество значений. Простые типы подразделяются
на порядковые и вещественные. Порядковые типы включают значения, каждому из которых
поставлен в соответствие определенный порядковый номер. К порядковым относятся упорядоченные
типы: целочисленные (по возрастанию), логический (0 - false, 1 - true), символьный (по возрастанию
ASCII-кодов), перечисляемые (в порядке перечисления), интервальные (по возрастанию или ASCII кодам).
Целочисленные типы- включают определенное подмножество целых чисел,
характеристики которых указаны в таблице.
Обозначение типа
Shortint
Integer
Longint
Диапазон значений
Длина (в байтах)
-128..127
1
-32768..32767
2
-2147483648
4
..2147483647
Byte
0..255
1
Word
0..65535
2
Например, чтобы определить переменную А как целочисленную величину типа integer, а
переменную В - типа shortint в разделе объявлений надо записать:
Var
A: integer;
B: shortint;
Логический тип - обозначается зарезервированным словом boolean. Данные логического
типа могут принимать два значения true (истинно) и false (ложно).
Объявление переменной С как переменной логического типа сводится к записи в разделе
объявлений:
Var
C: boolean;
Cимвольный тип - обозначается словом char. Данные символьного типа принимают
значения кодов символов в соответствии с таблицей ASCII - кодов.
Объявление символьной переменной D выглядит так:
Var
21
D: char;
Перечисляемый тип - определяется конечным набором значений, представленных списком
идентификаторов в объявлении типа. Программист может сам определить некоторый тип данных,
перечислив те значения, которые будут принимать переменные этого типа, и указав его имя. Каждое
значение типа задается указанием обозначающего это значение идентификатора. Формат объявления
данного перечисляемого типа:
Type
< имя типа > = (< список >);
где < список >:: = < идентификатор > [,< список >]
Например, к данным перечисляемого типа относится набор цветов лампочек светофора
(красный, желтый, зеленый ):
Type
ЦВЕТ = (КРАСНЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ);
или месяцев I квартала года:
Type
month = (January, February, March);
Объявление переменной СВЕТОФОР,
принимающей значения цвета светофора и
переменной ms, принимающей значения месяцев 1 квартала года выглядит так:
Var
СВЕТОФОР: ЦВЕТ;
ms: month;
Интервальный тип. Данные интервального типа могут принимать значения из указанного
диапазона значений. Формат объявления интервального типа:
Type
< имя типа > = < нижняя граница диапазона >..< верхняя граница диапазона >;
Например,
Type interval100 = 0..99;
БУКВА=’А’..’Z’;
Использование интервальных (ограниченных) типов в программе делает их наглядными,
позволяет экономить память машины и проводить во время выполнения программы контроль
присваиваний.
Вещественный тип - число в формате с плавающей точкой, характеризующееся мантиссой
и порядком. Определены следующие вещественные типы:
Обозначение
Диапазон
Число значащих Размер
типа
изменения
цифр
в байтах
real
2.9E-39..1.7E38
11-12
6
single
1.5E-45..3.4E38
7-8
4
double
5.0E-324..
15-16
8
1.7E308
extended
3.4E-4932..
19-20
10
1.1E4932
1.3.2. Cтруктурированные типы данных
Структурированные данные определяются типами своих компонентов и способами их
структуризации.
Регулярный тип - одномерный или многомерный массив фиксированного числа
однотипных элементов. При объявлении регулярного типа указывается тип индекса по каждому его
измерению, а также тип элементов:
Type
<имя типа> = array [<список типов индексов>] of <тип элементов>;
где
22
<список типов индексов>::=<имя типа>[,<список типов индексов>]
Например, объявим массив А из 100 вещественных чисел:
Type data = array [1..100] of real;
Var a:date;
или двумерный массив В прибыли в первом квартале:
Type matr = array [1..5,1..10] of real;
Var B: matr;
Ссылки на элементы массивов указываются как А[1], ... ,A[100], B[5,10] и т.д.
Строковый тип. Данные строковых типов представляют собой последовательности
символов переменной длины, объявленные зарезервированным словом string. При объявлении
строковой величины в квадратных скобках указывается максимальное число символов в диапазоне
от 1 до 255. Например:
Var text1: string[40];
а присвоение значения этой переменной выглядит так:
text1: = ’Happy birthday to you’
Комбинированный тип (запись) представляет собой совокупность произвольного числа
полей, которые могут принадлежать различным типам.
Формат записи:
< имя записи > = record < список полей >; end;
Например:
Type
Date = record
Year : Word;
Month : 1..12;
Day : 1..31;
End;
1.4. Переменные и константы
Для работы с данными используются переменные и константы. Переменные принимают
разные значения в ходе выполнения программы. Значения константам присваивает компилятор и они
сохраняются в процессе выполнения программы.
Объявление переменных. Каждая используемая в программе переменная должна быть
объявлена, т.е. отнесена к определённому типу данных. Чтобы объявить переменную надо указать её
имя и тип. При объявлении однотипных переменных тип можно указывать один раз после списка их
имён:
Var
< список > : < тип >;
где < список >:: = < имя переменной > [,< список >]
Объявление производится в разделе объявлений программы (подпрограммы, функции). Переменная
может быть отнесена к стандартному типу или ранее объявленному типу. Например,
Type
Matr10x5=Array[1..10,1..5] of real;
float = real;
Var
A,B,C: Matr10x5;
D:float;
или
Var
A, B, C : array[1..10,1..5] of real;
Обращение к переменным выполняется по их именам. Для обращения ко всему массиву
используется его имя: massiv
23
Для обращения к элементу массива за именем в квадратных скобках указывается индекс
элемента: massiv1[i+1] или massiv1[3], а в случае двумерного массива - два индекса massiv 2[3,7] и
т.д.
Для обращения к строковой переменной вслед за именем переменной указывается значение
индекса, задающее позицию элемента в строке. Пусть, например,
Var
Name : string [12];
Letr : char;
тогда присвоение переменной letr значения 2-го элемента строки выглядит так:
letr := name [2];
Константы. Различают константы без имени, которые используются непосредственно в виде
их значений как операнд выражений (например, A:=2*x; ), и именованные константы. Есть две
разновидности именованных констант - обычные и типизированные.
Обычные константы имеют неявно назначенные типы, которые компилятор
распознаёт автоматически, исходя из присвоенных константам значений:
< объявление константы > ::= Const < список >;
где < список > ::= < элемент > [, < список > ]
< элемент > ::= < имя константы > = < значение > | < выражение>
Например,
Const
Min = 0;
Max = 100;
center = ( Max - Min ) / 2;
Типизированные константы в объявлениях задаются не только значением, но и типом:
< элемент > ::= < имя константы > : < тип > = < значение > | < выражение >
Например,
Const
Max : real = 9999;
Delta : real = 1000;
Min : real = Max - Delta;
Типизированные константы строкового типа. При их объявлении указывается
максимальная длина строки и её начальное значение, например,
Const
Heading : string [10] = ‘ Section 3 ‘;
Типизированные константы регулярного типа. При их объявлении указываются значения
элементов, заключенные в круглые скобки и отделенные друг от друга запятыми, например,
Type
seasons=(winter, spring, summer, autumn);
matr1x4=array[seasons] of integer;
Const
Qdays : matr1x4=(90,92,92,91);
В результате элементы массива приобретают следующие значения:
Qdays[winter]=90, Qdays[spring]=92, Qdays[summer]=92, Qdays[autumn]=91
1.5. Выражения, операнды и операции
С помощью выражений задаются правила вычисления новых значений на основе ранее уже
известных. Выражения формируются из операндов, знаков операций ( далее - просто операций ) и
скобок, позволяющих устанавливать требуемый порядок выполнения действий. Операндами могут
служить переменные, константы и имена функций, типы которых должны соответствовать типу
операции. Большинство операций в языке являются бинарными, т. е. в них участвуют два операнда.
Остальные операции являются унарными, поскольку выполняются над единственным операндом.
Бинарные операции изображаются в традиционной алгебраической записи, например,
24
арифметическое сложение двух величин A и B имеет вид A+B. Обозначение унарной операции
всегда предшествует операнду, например, смена знака величины C должна записываться как -C.
Операнды и результаты выполнения операций. К моменту выполнения операции обоим её
операндам ( или одному, если операция унарная ) должны быть тем или иным способом присвоены
конкретные значения, причём они должны принадлежать к типам, над элементами которых может
быть произведена данная операция. В свою очередь, операция порождает результат, тип которого
зависит как от типов операндов, так и от принадлежности операции к определённой функциональной
группе.
Арифметические операции
Логические операции выполняются над операндами типа boolean:
Сравнение величин простых типов. Если операнды операций сравнения =, < >, <, >, <=, > =
имеют простые типы, то эти типы должны быть совместимы. Однако если один операнд относится к
действительному типу, то другой может быть целого типа.
Сравнение строк. Операции сравнения =, < >, <, >, <=, и > = применяются для
посимвольного сравнения строк на основании таблицы ASCII - кодов. Можно сравнить любые два
значения строкового типа, поскольку все они являются совместимыми. Значения символьного типа
также совместимы со значениями строкового типа, причем при их сравнении символьные значения
интерпретируются как строковое значение длиной 1.
Операции сравнения
25
Вызовы функций. Наряду с переменными и константами в операциях в качестве операнда
может выступать имя функции соответствующего типа. Кроме имени, вызов функции должен
содержать список аргументов, если в её объявлении имеется список параметров. Вызов функции
приводит к её активизации, причем каждый аргумент подставляется вместо параметра с
соответствующим порядковым номером. По завершении обработки функции вычисленное значение
присваивается переменной с её именем, которая и участвует в выполнении соответствующей
операции как операнд. Приведём примеры вызовов функций:
Sin(Alpha)
Sqrt(A*A+B*B)
Distance(Time, Velocity)
Приоритет вычисления стандартных функций выше, чем приоритет выполнения арифметических
операций. В таблице приведены арифметические стандартные функции. Например, выражение
е
2 sin 4 x  x 
3x
имеет следующую программную запись:
EXP ABC 2  SIN 4  X   X /3  X 
2. СТАНДАРТНЫЕ ФУНКЦИИ ПАСКАЛЯ
2.1. Стандартные арифметические функции языка Паскаль
26
2.2.
Стандартные функции преобразования
Для возведения переменной x в некоторую степень а, т.е. нахождения ха, используется
известное равенство:
xа=еа·lnx или ха=10а·lgx
Тогда выражение ха на языке Паскаль должно быть записано:
ЕХР (АLN(X)) или ЕХР 10 (АLOG(X))
Порядок выполнения операций, описываемых выражением, программист может
регулировать с помощью круглых скобок. Внутри скобок, а также в выражениях, не содержащих
скобок, очерёдность, в которой выполняются операции, определяется их приоритетами. Все
операции, в соответствии с приоритетами разделены на четыре категории. В первую очередь
выполняются операции, обладающие высшим приоритетом, затем вторым и т.д.
27
Последовательность вычислений сложных выражений, включающих цепочки операций, а
также, возможно, скобки, определяется тремя основными правилами:
- операнд, находящийся между двумя операциями с различными приоритетами, относится к
операции, имеющей более высокий приоритет;
- операнд, находящийся между двумя операциями с равными приоритетами, относится к
операции, стоящей от него слева;
- фрагмент выражения, заключенный в скобки, вычисляется как отдельный операнд той
операции, к которой он относится. Операции с равными приоритетами выполняются
последовательно, слева направо.
3. СОСТАВЛЕНИЕ ПРОГРАММЫ, РЕАЛИЗУЮЩЕЙ АЛГОРИТМ ЛИНЕЙНОЙ
СТРУКТУРЫ
Пример. Составим простейшую линейную программу вычисления общей поверхности и
объема круглого конуса, имеющего радиус основания R=12,54 см и длину образующей L=24,88 см.
При вычислении используем равенства:
S  R 2  RL ;
1
V  R 2 H ,
3
где Н – высота конуса, определяемая по формуле:
H  L2  R 2 .
Алгоритм решения задачи имеет следующий вид:
28
Программа рассматриваемой задачи с учетом сформулированных рекомендаций имеет
следующий вид:
/  СТУДЕНТ ИВАНОВ И.И., ГР. 000 
  ВЫЧИСЛЕНИЕ ПОВЕРХНОСТИ 
  И ОБЕМА КОНУСА  
PROGRAM CONUS;
CONST
PI=3.1415926;
VAR
H, L, R, S, V: REAL;
BEGIN   CONUS  
READ (L,R);
WRITELN (‘L=’, L,’R=’, R);
H: =SQRT (LL-RR);
WRITELN (‘H=’,H);
S: =PIRR+PIRL;
V: =PIRRH3;
WRINELN (‘ПОВЕРХНОСТИ КОНУСА S=’, S);
WRITELN (‘ОБЪЕМ КОНУСА V=’, V)
END.
Задача. Найти сумму и произведение 3 введенных с клавиатуры целых чисел.
/  СТУДЕНТ ИВАНОВ И.И., ГР. 000 
  ВЫЧИСЛЕНИЕ СУММЫ 
PROGRAM cумма;
VAR a, b, c:integer; sum, proizv:integer;
BEGIN   сумма 
READLN (a, b, c);
WRITELN (‘Введите 3 целых числа’);
sum: 0; proizv: 0;
sum: a + b + c;
proizv: = A*B*C;
WRITELN (‘ Сумма введенных чисел равна’, cum);
WRITELN (‘Произведение введенных чисел равно’, proizv);
END.
Задача. Найти площадь прямоугольника по введенным с клавиатуры значениям двух его сторон.
/  СТУДЕНТ ИВАНОВ И.И., ГР. 000 
  ВЫЧИСЛЕНИЕ ПЛОЩАДИ прямоугольника 
PROGRAM S;
VAR a, b:integer; s:real;
BEGIN   площадь 
READLN (a, b);
WRITELN (‘Введите a=’, a, ‘Ведите b= ’,b);
S: = A*B;
WRITELN (‘Площадь прямоугольника равна’, S);
END.
29
Задача. Найти периметр трапеции, длины всех его сторон вводятся с клавиатуры.
/  СТУДЕНТ ИВАНОВ И.И., ГР. 000 
  ВЫЧИСЛЕНИЕ ПЛОЩАДИ прямоугольника 
PROGRAM P;
VAR a, b, c, d: real; P: real;
BEGIN   периметр трапеции 
READLN (a, b, c, d);
WRITELN (‘Введите a=’, a, ‘Ведите b= ’,b, ‘Ведите c= ’, c ,‘Ведите d= ’,d);
P:= a*b*c*d;
WRITELN (‘Периметр трапеции равен’, P);
END.
Практические задачи на программирование алгоритмов
линейной структуры
1. Даны два числа a и b. Получить их сумму, разность и произведение.
2. Даны действительные числа x и y. Получить (|x| – |y|) / (1 + |x·y|).
3. Дана длина ребра куба. Найти площадь грани, площадь полной поверхности и объем этого куба.
4. Даны два действительных положительных числа. Найти среднее арифметическое и среднее
геометрическое этих чисел.
5. Даны катеты прямоугольного треугольника. Найти его гипотенузу и площадь.
6. Определить периметр правильного n-угольника, описанного около окружности радиуса r.
7. Даны x, y, z. Вычислить a, b, если
а)
;
б)
;
в)
;
г)
д)
е)
;
;
;
ж)
.
8. Дана сторона равностороннего треугольника. Найти площадь этого треугольника.
9. Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.
10. Найти площадь кольца, внутренний радиус которого равен 20, а внешний – заданному числу r
(r>20).
11. Найти площадь равнобочной трапеции с основаниями a и b и углом α при большем основании a.
12. Вычислить расстояние между двумя точками с координатами x1, y1 и x2, y2.
13. Треугольник задан координатами своих вершин. Найти:
а) периметр треугольника;
б) площадь треугольника.
30
14. Найти площадь сектора, радиус которого равен 3,7, а дуга содержит заданное число радиан φ.
15. Дано действительное число a. Не пользуясь никакими другими арифметическими операциями,
кроме умножения, получить:
а) a4 за две операции;
б) a6 за три операции;
в) a7 за четыре операции;
г) a8 за три операции;
д) a9 за четыре операции;
е) a10 за четыре операции;
ж) a13 за пять операций;
з) a15 за пять операций (указание:a15=(a5)3);
и) a21 за шесть операций;
к) a28 за шесть операций;
л) a64 за шесть операций.
16. Дано действительное число a. Не пользуясь никакими другими арифметическими операциями,
кроме умножения, получить:
а) a3 и a10 за четыре операции;
б) a4 и a20 за пять операций;
в ) a5 и a13 за пять операций;
г) a5 и a19 за шесть операций;
д) a2 и a5, a17 за шесть операций;
е) a4 ,a12, a28 за шесть операций.
Задачи на программирование алгоритмов ветвящейся структуры
1. Даны действительные числа x, y. Получить:
а) max(x,y);
б) min(x,y);
в) max(x,y), min(x,y).
2. Даны действительные числа x, y, z. Получить:
а) max(x,y,z);
б) min(x,y,z);
в) max(x,y,z), min(x,y,z).
3. Даны действительные числа x, y, z. Вычислить:
а) max2(x+y+z,xyz);
б) min(x+y+z/2,xyz)+1;
в) min(x+5y+z,2x-y+z) + max(x+y+z,xy+z).
4. Даны действительные числа a, b, c. Удвоить эти числа, если a > b > c, и заменить их абсолютными
значениями, если это не так.
5. Даны действительные числа x, y. Вычислить z:
31
6. Даны два действительных числа. Вывести первое число, если оно больше второго, и оба числа,
если это не так.
7. Даны два действительных числа. Заменить первое число нулем, если оно меньше или равно
второму, и оставить без изменения в противном случае.
8. Даны действительные числа x, y (x ¹ y). Меньшее из этих двух чисел заменить их полусуммой, а
большее – их удвоенным произведением.
9. Даны действительные числа x, y, z. Выяснить, существует ли треугольник с длинами сторон x, y, z.
10. Даны действительные числа a, b, c (a ¹ 0). Выяснить, имеет ли уравнение ax2 + bx + c = 0
действительные корни. Если действительные корни имеются, то найти их. В противном случае
ответом должно служить сообщение, что действительных корней нет.
11. Дано действительное число a. Вычислить f(a), если
а)
б)
в)
в)
12. Дано действительное число a. Для функций f(x), графики которых представлены на рис. 2,
вычислить f(a).
13. Даны действительные числа x, y. Определить, принадлежит ли точка с координатами x, y
заштрихованной части плоскости (рис. 3).
14. Дано натуральное число n (n < 100), определяющее возраст человека (в годах). Дать для этого
числа наименования "год", "года" или "лет": например, год, 23 года,5 лет и т.д.
15. Дата вводится в формате "дд.мм.гг". Записать словесно название месяца и полностью указать год.
Например, для 10.02.96 вывести 10 февраля 1998 года.
16. Дано натуральное число n. Определить является ли число четным.
32
аб
вг
де
жз
33
ик
лм
Рис. 2
аб
вг
34
де
жз
ик
лм
Рис. 3
17. Сравнить между собой значение величины x и y. Вывести на печать результат сравнения в виде
"x > y", "x = y" или "x < y".
35
18. Определить, какая из двух точек T1(x1,y1) или T2(x2,y2) расположена ближе к началу координат.
Вывести на печать координаты этой точки.
19. Определить, какая из двух фигур - круг или квадрат имеет большую площадь. Известно, что
сторона квадрата равна a, радиус круга r. Вывести на печать название и значение площади большей
фигуры.
Задачи на программирование алгоритмов циклической структуры
1. Дано натуральное n. Вычислить:
а) 2n;
б) n!;
в)
г)
д)
2. Даны действительное число a, натуральное число n. Вычислить:
а) an;
б) a× (a + 1) × … × (a + n -1);
в)
г) a× (a – n) × (a – 2n) ×…× (a – n2);
3. Вычислить:
(1 + sin 0,1) + (1 + sin 0,2) + … + (1 + sin 10).
4. Дано действительное a. Найти:
а) среди чисел 1,
б) такое наименьшее n, что
первое, большее a;
.
5. Даны натуральное n, действительное x. Вычислить:
а) sin x + sin2 x + … + sinn x;
б) sin x + sin x2 + … + sin xn;
в) sin x + sin sin x + … + sin sin sin x +sin sin … sin x.
6. Дано натуральное число n.
а) Сколько цифр в числе n?
б) Чему равна сумма его цифр?
в) Найти первую цифру числа n?
36
7. Даны натуральные числа n, m. Получить сумму m последних цифр числа n.
8. Дано натуральное число n. Выяснить, входит ли цифра 3 в запись числа n2.
9. Даны натуральное число n, действительное число x. Вычислить:
а)
б)
в)
10. Дано целое число m >. Получить наибольшее целое k, при котором
4k < m.
11. Дано натуральное число n. Получить наименьшее число вида 2r, превосходящее n.
12. Дано натуральное число n. Вычислить
1×2 + 2×3×4+ … + n×(n + 1)×…× 2n.
13. Вычислить:
а)
б)
в)
г)
д)
14. Даны натуральное число n, действительное число x. Вычислить:
а)
б)
в)
г)
15. Дано натуральное число n. Вычислить произведение первых n сомножителей:
; б)
a)
16. Вычислить бесконечную сумму с заданной точностью e (e > 0). Считать, что требуемая точность
достигнута, если вычислена сумма нескольких первых слагаемых и очередное слагаемое оказалось
по модулю меньше, чем e, - это и все последующие слагаемые можно уже не учитывать. Вычислить:
а)
б)
в)
г)
.
17. Вычислить сумму положительных и произведение отрицательных значений функции z =
cos(nx+a)×sin(nx-a), где n=1,2,…,10.
Задачи на использование одномерных массивов
1. Даны натуральное число n, массив A[n]. Вычислить:
37
а) a1 + … + an ; б) a1 ×….× an; в) sin |a1 + … + an|; г) |a1|×|a2|× … × |an|;
д) a1 + … + an и a1 × a2 × …× an; е) a1, a1+a2, …, a1+a2+ … + an;
ж) a1×a1, a1×a2, a1×a3, …, a1×an ; з) |a1|, |a1 + a2|, |a1 + … + an| ;
и) -a1, a2, -a3, …, (-1)n×an .
2. Дано натуральное число n. Получить последовательность b1, …, bn, где при i = 1, 2, …, n значение
bi равно:
а) i ; б) i2 ; в) i! ; г) 2i+1 ; д) 2i + 3i+1 ; е) (-1)i×3i; ж) 1+1/2+…1/i; з) 2i /i!.
3. Вычислить значения многочлена x3 - 9x2 + 3,2x - 7,5 для x = 0, 1, …, 5.
4. Даны натуральное число n, действительные числа a, b (a¹b). Получить r1, r2, …, rn, где ri = a + ih, h =
(b - a) / n.
5. Получить таблицу температур по Цельсию от 0 до 100 градусов и их эквивалентов по шкале
Фаренгейта, используя для перевода формулу
.
6. Вычислить значения функции y = 5x3 - 3x2 + 5 для значений x, изменяющихся -3 … 1, с шагом 0,1.
7. Даны натуральные числа i, n, действительные числа a1, …,an (i £ n). Найти среднее арифметическое
всех чисел a1, …, an, кроме ai.
8. Даны действительные числа a1, a2, … Известно, что a1>0 и что среди a2, a3,… есть хотя бы одно
отрицательное число. Пусть а1, …, аn – члены данной последовательности, предшествующие первому
отрицательному члену (n заранее неизвестно). Получить:
а) a1 + a2 + … + an;
б) среднее арифметическое a1,…, an;
в) a1, a1a2, a1a2a3, …, a1a2 … an; г) a1a2 + a2a3+ … + an-1an + ana1;
д) (-1)nan; е) n + an;
ж) |a1 – an|.
9. Даны натуральное число n, действительные числа a1, …, an. Получить числа b1, …, bn, которые
связаны с a1, …, an следующим образом:
b1 = a1, bn = an, bi = (ai+1 – ai)/3, i=2, …, n-1.
10. Даны натуральные числа x, y1, …, y100. (y1 < y2 … < y100, y1 < x < y100). Найти натуральное k, при
котором yk-1 < x £ yk.
11. Даны натуральные числа n, a1,…, an. Определить количество членов ak последовательности a1, …,
a:
а) являющихся нечетными числами;
б) кратных 3 и не кратных 5;
в) являющихся квадратами четных чисел;
г) имеющих четные порядковые номера и являющихся нечетными числами.
12. Даны целые числа а1, …, а50. Получить сумму тех чисел данной последовательности, которые а)
кратны; б) нечетны и отрицательны.
38
13. Даны натуральное число n, целые числа а1, …, аn. Найти количество и сумму тех членов данной
последовательности, которые делятся на 5 и не делятся на 7.
14. Даны натуральные числа n, p, целые числа а1, …, аn. Получить произведение членов
последовательности а1, …, аn, кратных p.
15. Даны натуральное число n, действительные числа а1, …, аn. Получить удвоенную сумму всех
положительных членов последовательности а1, …, аn.
16. Даны натуральное число n, действительные числа х1, …, хn. В последовательности х1, …, хn все
члены, меньшие двух, заменить нулями. Кроме того, получить сумму членов, принадлежащих
отрезку [3,7], а также число таких членов.
17. Даны натуральное число n, целые числа а1, …, аn. Получить сумму положительных и число
отрицательных членов последовательности а1, …, аn.
18. Даны натуральное число n, целые числа а1, …, аn. Заменить все большие семи члены
последовательности а1, …, аn числом 7. Вычислить количество таких членов.
19. Даны целые числа а1, …, а45. Получить число отрицательных членов последовательности а1, …,
а35 и число нулевых членов всей последовательности а1, …, а45.
20. Даны натуральное число n, целые а, х1, …, хn. Если в последовательности х1, …, хn есть хотя бы
один член, равный а, то получить сумму всех членов, следующих за первым таким членом; в
противном случае ответом должно быть число -10.
21. Даны натуральное число n, действительные числа а1, …, аn.
Получить:
а) max(а1, …, аn); б) min(а1, …, аn); в) max(а2, a4, …); г) min(a1, a3, …);
д) min(а2, a4, …) + max (|а1|, |a3|, …); е) max( |a1|, …, |an|).
22. Даны натуральное число n, действительные числа а1, …, аn.
а) Верно ли, что отрицательных членов в последовательности а1, …, аn больше, чем
положительных?
б) Верно ли, что наибольший член последовательности а1, …, аn по модулю больше единицы?
23. Даны натуральное число n, действительные числа а1, …, аn. В последовательности а1, …, аn
определить число соседств:
а) двух положительных чисел;
б) двух чисел разного знака;
в) двух чисел одного знака, причем модуль первого числа должен быть больше модуля второго
числа.
24. Даны целые числа c1, …, c80. Имеются ли в последовательности
c1, …, c80:
а) два идущих подряд нулевых члена;
б) три идущих подряд нулевых члена?
39
25. Даны целые числа a1, a2, … Известно, что a1 > 0 и что среди a2,a3,… есть хотя бы одно
отрицательное число. Пусть a1,…,an – члены данной последовательности, предшествующие первому
отрицательному члену (n заранее неизвестно). Получить:
a) max (а1, …, аn ); б) min (a1,2a2, …,nan); в) min (a1+a2, a2+a3, …,an-1+an);
г) количество четных среди а1, …, аn; д) max(a1, a1+a2, …, a1+a2+ … + an);
26. Даны натуральное число n, действительные числа а1, …, аn. Выяснить, является ли
последовательность а1, …, аn упорядоченной по убыванию.
Использование библиотеки Graph
Переход в графический режим и возврат в текстовый
Краткая характеристика графических режимов работы дисплейных адаптеров
Процедуры и функции
Координаты, окна, страницы
Линии и точки
Многоугольники
Дуги, окружности, эллипсы
Краски, палитры, заполнения
Сохранение и выдача изображений
Вывод текста
Включение драйвера и шрифтов в тело программы
Начиная с версии 4.0, в состав Турбо Паскаля включена мощная библиотека графических
подпрограмм Graph, остающаяся практически неизменной во всех последующих версиях.
Библиотека содержит в общей сложности более 50 процедур и функций, предоставляющих
программисту самые разнообразные возможности управления графическим экраном. Для облегчения
знакомства с библиотекой все входящие в нее процедуры и функции сгруппированы по
функциональному принципу.











Переход в графический режим и возврат в текстовый
Стандартное состояние ПК после его включения, а также к моменту запуска программы из среды
Турбо Паскаля соответствует работе экрана в текстовом режиме, поэтому любая программа,
использующая графические средства компьютера, должна определенным образом инициировать
графический режим работы дисплейного адаптера. После завершения работы программы ПК
возвращается в текстовый режим.
Краткая характеристика графических режимов работы дисплейных адаптеров
Настройка графических процедур на работу с конкретным адаптером достигается за счет
подключения нужного графического драйвера. Драйвер - это специальная программа,
осуществляющая управление теми или иными техническими средствами ПК. Графический драйвер,
как это не трудно догадаться, управляет дисплейным адаптером в графическом режиме. Графические
драйверы разработаны фирмой Borland практически для всех типов адаптеров. Обычно они
располагаются на диске в отдельном подкаталоге BGI в виде файлов с расширением BGI (от англ.:
Borland Graphics Interface - графический интерфейс фирмы Borland). Например, CGA.BGI - драйвер
для CG4-адаптера, EGA VGA.BGI - драйвер для адаптеров EGA и VGA и т.п.
Выпускаемые в настоящее время ПК оснащаются адаптерами, разработанными фирмой IBM, или
совместимыми с ними. Если не учитывать уже упоминавшийся в гл.13 монохромный адаптер MDA,
все они имеют возможность работы в графическом режиме. В этом режиме экран дисплея
рассматривается как совокупность очень близко расположенных точек - пикселей, светимостью
которых можно управлять с помощью программы.
40
Графические возможности конкретного адаптера определяются разрешением экрана, т.е. общим
количеством пикселей, а также количеством цветов (оттенков), которыми может светиться любой из
них. Кроме того, многие адаптеры могут работать с несколькими графическими страницами.
Графической страницей называют область оперативной памяти, используемая для создания «карты»
экрана, т.е. содержащая информацию о светимости (цвете) каждого пикселя. Ниже приводится
краткая характеристика графических режимов работы наиболее распространенных адаптеров.
Адаптер CGA (Color Graphics Adapter - цветной графический адаптер) имеет 5 графических режимов.
Четыре режима соответствуют низкой разрешающей способности экрана (320 пикселей по
горизонтали и 200 по вертикали, т.е. 320x200) и отличаются только набором допустимых цветов палитрой. Каждая палитра состоит из трех цветов, а с учетом черного цвета несветящегося пикселя из четырех: палитра 0 (светло-зеленый, розовый, желтый), палитра 1 (светло-бирюзовый, малиновый,
белый), палитра 2 (зеленый, красный, коричневый) и палитра 3 (бирюзовый, фиолетовый, светлосерый). Пятый режим соответствует высокому разрешению 640x200, но каждый пиксель в этом
случае может светиться либо каким-то одним заранее выбранным и одинаковым для всех пикселей
цветом, либо не светиться вовсе, т.е. палитра этого режима содержит два цвета. В графическом
режиме адаптер CGA использует только одну страницу.
Адаптер EGA (Enhanced Graphics Adapter - усиленный графический адаптер) может полностью
эмулировать графические режимы адаптера CGA. Кроме того, в нем возможны режимы: низкого
разрешения (640x200, 16 цветов, 4 страницы) и высокого разрешения (640x350, 16 цветов, 1
страница). В некоторых модификациях используется также монохромный режим (640x350, 1
страница, 2 цвета).
Адаптер MCGA (Multi-Color Graphics Adapter - многоцветный графический адаптер) совместим с
CGA и имеет еще один режим - 640x480, 2 цвета, 1 страница. Такими адаптерами оснащались
младшие модели серии ПК PS/2 фирмы IBM. Старшие модели этой серии оснащаются более
совершенными адаптерами VGA (Video Graphics Array -графический видеомассив. Адаптер VGA
эмулирует режимы адаптеров CGA и EGA и дополняет их режимом высокого разрешения (640x480,
16 цветов, 1 страница).
Не так давно появились так называемые cynep-VGA адаптеры (SVGA) с разрешением 800x600 и
более, использующие 256 и более цветовых оттенков. В настоящее время эти адаптеры получили
повсеместное распространение, однако в библиотеке Graph для них нет драйверов. Поскольку SVGA
совместимы с VGA, для управления современными графическими адаптерами приходится
использовать драйвер EGAVGA.BGI и довольствоваться его относительно скромными
возможностями.
Несколько особняком стоят достаточно популярные адаптеры фирмы Hercules. Адаптер HGC имеет
разрешение 720x348, его пиксели могут светиться одним цветом (обычно светло-коричневым) или не
светиться вовсе, т.е. это монохромный адаптер. Адаптер HGC+ отличается несущественными
усовершенствованиями, а адаптер HIСС (Hercules In Color Card) представляет собой 16-цветный
вариант HGC+.
Процедуры и функции
Процедура InitGraph. Инициирует графический режим работы адаптера. Заголовок процедуры:
Procedure InitGraph(var Driver,Mode: Integer; Path: String);
Здесь Driver - переменная типа Integer, определяет тип графического драйвера; Mode - переменная
того же типа, задающая режим работы графического адаптера; Path - выражение типа String,
содержащее имя файла драйвера и, возможно, маршрут его поиска.
К моменту вызова процедуры на одном из дисковых носителей информации должен находиться
файл, содержащий нужный графический драйвер. Процедура загружает этот драйвер в оперативную
память и переводит адаптер в графический режим работы. Тип драйвера должен соответствовать
типу графического адаптера. Для указания типа драйвера в модуле предопределены следующие
константы:
const
Detect=0;{Режим автоопределения типа}
CGA=1;
MCGA=2;
41
EGA=3;
EGA64=4;
EGAMono=5;
IBM8514=6;
HercMono=7;
ATT400=8;
VGA=9;
PC3270=10;
Большинство адаптеров могут работать в различных режимах. Для того, чтобы указать адаптеру
требуемый режим работы, используется переменная Mode, значением которой в момент обращения к
процедуре могут быть такие константы:
const
{ Адаптер CGA : }
CGACO = 0;
{Низкое разрешение, палитра 0}
CGAC1 = 1;
{Низкое разрешение, палитра 1}
CGAC2 = 2;
{Низкое разрешение, палитра 2}
CGAC3 = 3;
{Низкое разрешение, палитра 3}
CGAHi = 4;
{Высокое разрешение}
{Адаптер MCGA:}
MCGACO = 0;
{Эмуляция CGACO}
MCGAC1 = 1;
{Эмуляция CGAC1}
MCGAC2 = 2;
{Эмуляция CGAC2}
MCGAC3 = 3;
{Эмуляция CGAC3}
MCGAMed = 4;
{Эмуляция CGAHi}
MCGAHi = 5;
{640x480}
{Адаптер EGA :}
EGALo = 0;
{640x200, 16 цветов}
EGAHi = 1;
{640x350, 16 цветов}
EGAMonoHi = 3; {640x350, 2 цвета}
{Адаптеры HGC и HGC+:}
HercMonoHi = 0; {720x348}
{АдаптерАТТ400:}
ATT400CO = 0;
{Аналог режима CGACO}
ATT400C1 = 1;
(Аналог режима CGAC1}
ATT400C2 = 2;
{Аналог режима CGAC2}
ATT400C3 = 3;
{Аналог режима CGAC3}
ATT400Med = 4; {Аналог режима CGAHi}
ATT400H1 = 5;
{640x400, 2 цвета}
{Адаптер VGA:}
VGALo = 0;
{640x200}
VGAMed = 1;
{640x350}
VGAHi = 2;
{640x480}
PC3270H1 = 0;
{Аналог HercMonoHi}
{Адаптер 1ВМ8514}
IBM8514LO =0;
{640x480, 256 цветов}
IBM8514H1 = 1; {1024x768, 256 цветов}
42
Пусть, например, драйвер CGA.BGI находится в каталоге TP\BGI на диске С и устанавливается
режим работы 320x200 с палитрой 2. Тогда обращение к процедуре будет таким:
Uses Graph;
var
Driver, Mode : Integer;
begin
Driver := CGA;{Драйвер}
Mode := CGAC2;{Режим работы}
InitGraph(Driver, Mode,' С:\TP\BGI') ;
.......
Если тип адаптера ПК неизвестен или если программа рассчитана на работу с любым адаптером,
используется обращение к процедуре с требованием автоматического определения типа драйвера:
Driver := Detect;
InitGraph(Driver, Mode, 'C:\TP\BGI');
После такого обращения устанавливается графический режим работы экрана, а при выходе из
процедуры переменные Driver и Mode содержат целочисленные значения, определяющие тип
драйвера и режим его работы. При этом для адаптеров, способных работать в нескольких режимах,
выбирается старший режим, т.е. тот, что закодирован максимальной цифрой. Так, при работе с CGA
-адаптером обращение к процедуре со значением Driver = Detect вернет в переменной Driver
значение 1 (CGA) и в Mode -значение 4 (CGAHi), а такое же обращение к адаптеру VGA вернет
Driver = 9 (VGA) и Mode = 2 (VGAHi).
Функция GraphResult. Возвращает значение типа Integer, в котором закодирован результат
последнего обращения к графическим процедурам. Если ошибка не обнаружена, значением функции
будет ноль, в противном случае - отрицательное число, имеющее следующий смысл:
const
grOk = 0;{Нет ошибок}
grlnitGraph =-1;{He инициирован графический режим}
grNotDetected =-2;{Не определен тип драйвера}
grFileNotFind =-3;{Не найден графический драйвер}
grlnvalidDriver =-4;{Неправильный тип драйвера}
grNoLoadMem =- 5;{Нет памяти для размещения драйвера}
grNoScanMem = - 6;{Нет памяти для просмотра областей}
grNoFloodMem =- 7;{Нет памяти для закраски областей}
grFontNotFound = -8;{Не найден файл со шрифтом}
grNoFontMem =- 9;{Нет памяти для размещения шрифта}
grlnvalidMode =-10;{Неправильный графический режим}
grError =-11;{Общая ошибка}
grIOError =-12;{Ошибка ввода-вывода}
grlnvalidFont =-13;{Неправильный формат шрифта}
grInvalidFontNum=-14; {Неправильный номер шрифта}
После обращения к функции GraphResult признак ошибки сбрасывается, поэтому повторное
обращение к ней вернет ноль.
Функция GraphErrorMsg.
Возвращает значение типа String, в котором по указанному коду ошибки дается соответствующее
текстовое сообщение. Заголовок функции:
Function GraphErrorMsg(Code: Integer): String;
Здесь Code - код ошибки, возвращаемый функцией GraphResult.
Например, типичная последовательность операторов для инициации графического режима с
автоматическим определением типа драйвера и установкой максимального разрешения имеет
следующий вид:
var
Driver, Mode, Error:Integer;
begin
43
Driver := Detect;{Автоопределение драйвера}
InitGraph(Driver, Mode,' ');{Инициируем графику}
Error := GraphResult;{Получаем результат}
if Error <> grOk then{Проверяем ошибку}
begin{Ошибка в процедуре инициации}
WriteLn(GraphErrorMsg(Error));{Выводим сообщение}
.......
end
else{Нет ошибки}
.......
Чаще всего причиной возникновения ошибки при обращении к процедуре InitGraph является
неправильное указание местоположения файла с драйвером графического адаптера (например, файла
CGA.BGI для адаптера CGA). Настройка на местоположение драйвера осуществляется заданием
маршрута поиска нужного файла в имени драйвера при вызове процедуры InitGraph. Если, например,
драйвер зарегистрирован в подкаталоге DRIVERS каталога PASCAL на диске D, то нужно
использовать вызов:
InitGraph(Driver, Mode, 'd:\Pascal\Drivers');
Замечание. Во всех следующих примерах процедура InitGraph вызывается с параметром Driver в
виде пустой строки. Такая форма обращения будет корректна только в том случае, когда нужный
файл графического драйвера находится в текущем каталоге. Для упрощения повторения примеров
скопируйте файл, соответствующий адаптеру Вашего ПК, в текущий каталог.
Процедура CloseGraph.
Завершает работу адаптера в графическом режиме и восстанавливает текстовый режим работы
экрана. Заголовок:
Procedure CloseGraph;
Процедура RestoreCRTMode.
Служит для кратковременного возврата в текстовый режим. В отличие от процедуры CloseGraph не
сбрасываются установленные параметры графического режима и не освобождается память,
выделенная для размещения графического драйвера. Заголовок:
Procedure RestoreCRTMode;
Функция GetGraphMode.
Возвращает значение типа Integer, в котором содержится код установленного режима работы
графического адаптера. Заголовок:
Function GetGraphMode: Integer;
Процедура SetGraphMode.
Устанавливает новый графический режим работы адаптера. Заголовок:
Procedure SetGraphMode(Mode: Integer);
Здесь Mode - код устанавливаемого режима.
Следующая программа иллюстрирует переход из графического режима в текстовый и обратно:
Uses Graph;
var .
Driver, Mode, Error : Integer;
begin
{Инициируем графический режим}
Driver := Detect;
InitGraph(Driver, Mode, '');
Error := GraphResult; {Запоминаем результат}
i£ Error <> grOk then {Проверяем ошибку}
WriteLn(GraphErrorMsg(Error)) {Есть ошибка}
else
begin {Нет ошибки}
WriteLn ('Это графический режим');
WriteLn ('Нажмите "Enter"...':20);
44
ReadLn;
{Переходим в текстовый режим}
RestoreCRTMode;
WriteLn (' А это текстовый...');
ReadLn;
{Возвращаемся в графический режим}
SetGraphMode (GetGraphMode);
WriteLn ('Опять графический режим...');
ReadLn;
CloseGraph
end
end.
В этом примере для вывода сообщений как в графическом, так и в текстовом режиме используется
стандартная процедура WriteLn. Если Ваш ПК оснащен нерусифицированным адаптером CGA,
вывод кириллицы в графическом режиме таким способом невозможен, в этом случае замените
соответствующие сообщения так, чтобы использовать только латинские буквы.
Процедура DetectGraph.
Возвращает тип драйвера и режим его работы. Заголовок:
Procedure DetectGraph(var Driver,Mode: Integer);
Здесь Driver - тип драйвера; Mode - режим работы.
В отличие от функции GetGraphMode описываемая процедура возвращает в переменной Mode
максимально возможный для данного адаптера номер графического режима.
Функция GetDriverName.
Возвращает значение типа String, содержащее имя загруженного графического драйвера. Заголовок:
Function GetDriverName: String;
Функция GetMaxMode.
Возвращает значение типа Integer, содержащее количество возможных режимов работы адаптера.
Заголовок:
Function GetMaxMode: Integer;
Функция GetModeName.
Возвращает значение типа String, содержащее разрешение экрана и имя режима работы адаптера по
его номеру. Заголовок:
Function GetModName(ModNumber: Integer): String;
Здесь ModNumber - номер режима.
Следующая программа после инициации графического режима выводит на экран строку,
содержащую имя загруженного драйвера, а также все возможные режимы его работы.
Uses Graph;
var
a,b: Integer;
begin
a := Detect;
InitGraph(a, b, '');
WriteLn(GetDriverName);
for a := 0 to GetMaxMode do
WriteLn(GetModeName(a):10);
ReadLn;
CloseGraph
end.
Процедура GetModeRange.
Возвращает диапазон возможных режимов работы заданного графического адаптера. Заголовок:
Procedure GetModeRange(Drv: Integer; var Min, Max: Integer);
Здесь Drv - тип адаптера; Min - переменная типа Integer, в которой возвращается нижнее возможное
значение номера режима; Мах - переменная того же типа, верхнее значение номера.
45
Если задано неправильное значение параметра Drv, процедура вернет в обеих переменных значение 1. Перед обращением к процедуре можно не устанавливать графический режим работы экрана.
Следующая программа выводит на экран названия всех адаптеров и диапазоны возможных номеров
режимов их работы.
Uses Graph;
var
D,L,H: Integer;
const
N: array [1..11] of String [8] =
('CGA ', 'MCGA ', 'EGA ',
'EGA64 ', 'EGAMono ', ЧВМ8514 ',
'HercMono', 'ATT400 ', 'VGA ',
'PC3270 ', 'Ошибка ');
begin
WriteLn('Адаптер Мин. Макс.');
for D := 1 to 11 do
begin
GetModeRange(D, L, H);
WriteLn(N[D], L:7, H:10)
end
end.
Координаты, окна, страницы
Многие графические процедуры и функции используют указатель текущей позиции на экране,
который в отличие от текстового курсора невидим. Положение этого указателя, как и вообще любая
координата на графическом экране, задается относительно левого верхнего угла, который, в свою
очередь, имеет координаты 0,0. Таким образом, горизонтальная координата экрана увеличивается
слева направо, а вертикальная - сверху вниз.
Функции GetMaxX и GetMaxY.
Возвращают значения типа Word, содержащие максимальные координаты экрана в текущем режиме
работы соответственно по горизонтали и вертикали. Например:
Uses Graph;
var
a,b: Integer;
begin
a := Detect; InitGraph(a, b, '');
WriteLn(GetMaxX, GetMaxY:5);
ReadLn;
CloseGraph
end.
Функции GetX и GetY.
Возвращают значения типа Integer, содержащие текущие координаты указателя соответственно по
горизонтали и вертикали. Координаты определяются относительно левого верхнего угла окна или,
если окно не установлено, экрана.
Процедура SetViewPort.
Устанавливает прямоугольное окно на графическом экране. Заголовок:
Procedure SetViewPort(XI,Y1,X2,Y2: Integer; ClipOn: Boolean);
Здесь X1...Y2 - координаты левого верхнего (XI,Y1) и правого нижнего (X2,Y2) углов окна; СНрОп выражение типа Boolean, определяющее «отсечку» не умещающихся в окне элементов изображения.
Координаты окна всегда задаются относительно левого верхнего угла экрана. Если параметр ClipOn
имеет значение True, элементы изображения, не умещающиеся в пределах окна, отсекаются, в
противном случае границы окна игнорируются. Для управления этим параметром можно
использовать такие определенные в модуле константы:
const
46
ClipOn = True; {Включить отсечку}
ClipOff = False; {He включать отсечку}
Следующий пример иллюстрирует действие параметра СНрОп. Программа строит два
прямоугольных окна с разными значениями параметра и выводит в них несколько окружностей. Для
большей наглядности окна обводятся рамками (см. рис. 14.1).
Рис. 14.1. Отсечка изображения в окне
Uses Graph,CRT;
var
x,y,e: Integer;
xll,yll,xl2,yl2, {Координаты 1-го окна}
x21,x22, {Левый верхний угол 2-го}
R, {Начальный радиус}
k: Integer;
begin
DirectVideo := False {Блокируем прямой доступ к видеопамяти в модуле CRT}
{Инициируем графический режим}
х := Detect; InitGraph(x, у, '');
{Проверяем результат}
е := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg (e) ) {Ошибка}
else
begin {Нет ошибки}
{Вычисляем координаты с учетом разрешения экрана}
x11:=GetMaxX div 60;
x12:=GetMaxX div 3;
y11:=GetMaxY div 4; y12:=2*y11;
R:=(x12-x11) div 4; x21:=x12*2;
x22:=x21+x12-x11;
{Рисуем окна}
WriteLnt'ClipOn:':10,'ClipOff:':40);
Rectangle(x11, y11, x12, y12); Rectangle(x21, y11 x22, y12);
{Назначаем 1-е окно и рисуем четыре окружности}
SetViewPort(x11, y11, x12, y12, ClipOn);
for k := 1 to 4 do
Circle(0,y11,R*k);
{Назначаем 2-е окно и рисуем окружности}
SetViewPort(x21, y11, x22, y12, ClipOff);
for k := 1 to 4 do
Circle(0,y11,R*k);
{Ждем нажатия любой клавиши}
47
if ReadKey=#0 then k := ord(ReadKey);
CloseGraph
end
end.
Процедура GetViewSettings.
Возвращает координаты и признак отсечки текущего графического окна. Заголовок:
Procedure GetViewSettings(var Viewlnfo: ViewPortType);
Здесь Viewlnfo - переменная типа ViewPortType. Этот тип в модуле Graph определен следующим
образом:
type
ViewPortType = record
x1,y1,x2,y2: Integer; {Координаты окна}
Clip : Boolean {Признак отсечки}
end ;
Процедура MoveTo.
Устанавливает новое текущее положение указателя. Заголовок:
Procedure MoveTo(X,Y: integer);
Здесь X, Y - новые координаты указателя соответственно по горизонтали и вертикали.
Координаты определяются относительно левого верхнего угла окна или, если окно не установлено,
экрана.
Процедура MoveRel.
Устанавливает новое положение указателя в относительных координатах.
Procedure MoveRel(DX,DY: Integer);
Здесь DX.DY- приращения новых координат указателя соответственно по горизонтали и вертикали.
Приращения задаются относительно того положения, которое занимал указатель к моменту
обращения к процедуре.
Процедура ClearDevice.
Очищает графический экран. После обращения к процедуре указатель устанавливается в левый
верхний угол экрана, а сам экран заполняется цветом фона, заданным процедурой SetBkColor.
Заголовок:
Procedure ClearDevice;
Процедура ClearViewPort.
Очищает графическое окно, а если окно не определено к этому моменту - весь экран. При очистке
окно заполняется цветом с номером О из текущей палитры. Указатель перемещается в левый
верхний угол окна. Заголовок:
Procedure ClearViewPort;
В следующей программе на экране создается окно, которое затем заполняется случайными
окружностями (рис. 14.2). После нажатия на любую клавишу окно очищается. Для выхода из
программы нажмите Enter.
Рис. 14.2. Окно со случайными окружностями
Uses CRT,Graph;
48
var
x1,y1,x2,y2,Err: Integer;
begin
{Инициируем графический режим}
xl := Detect; InitGraph(xl,x2,'');
Err := GraphResult; if ErrogrOk then
WriteLn(GraphErrorMsg(Err))
else
begin
{Определяем координаты окна с учетом разрешения экрана}
x1 := GetMaxX div 4,-y1 := GetMaxY div 4;
x2 := 3*x1; y2 := 3*y1;
{Создаем окно}
Rectangle(x1,y1,x2,y2);
SetViewPort(x1+1,y1+1,x2-1,y2-1,ClipOn);
{Заполняем окно случайными окружностями}
repeat
Сirclе(Random(Ge tMaxX),Random(Ge tMaxX)
Random(GetMaxX div 5))
until KeyPressed;
{Очищаем окно и ждем нажатия Enter}
ClearViewPort;
OutTextXY(0,0,'Press Enter...1);
ReadLn;
CloseGraph
end
end.
Процедура GetAspectRatio.
Возвращает два числа, позволяющие оценить соотношение сторон экрана. Заголовок:
Procedure GetAspectRatio(var X,Y: Word);
Здесь X, Y - переменные типа Word. Значения, возвращаемые в этих переменных, позволяют
вычислить отношение сторон графического экрана в пикселях. Найденный с их помощью
коэффициент может использоваться при построении правильных геометрических фигур, таких как
окружности, квадраты и т.п. Например, если Вы хотите построить квадрат со стороной L пикселей
по вертикали, Вы должны использовать операторы
GetAspectRatio (Xasp, Yasp);
Rectangle(x1, y1, x1+L*round (Yasp/Xasp), y1+L);
а если L определяет длину квадрата по горизонтали, то используется оператор
Rectangle (x1,y1,x1+L,y1+L*round(Xasp/Yasp));
Процедура SetAspectRatio.
Устанавливает масштабный коэффициент отношения сторон графического экрана. Заголовок:
Procedure SetAspectRatio(X,Y: Word);
Здесь X, Y- устанавливаемые соотношения сторон.
Следующая программа строит 20 окружностей с разными соотношениями сторон экрана (рис. 14.3).
49
Рис.14.3. Окружности при разных отношениях сторон экрана
Uses Graph,CRT;
const
R =.50;
dx = 1000;
var
d,m,e,k : Integer;
Xasp,Yasp: Word;
begin
d := Detect;
InitGraph(d, m,.'');
e : = GraphResult;
if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
GetAspectRatio(Xasp, Yasp);
for k := 0 to 20 do
begin
SetAspectRatio(Xasp+k*dx,Yasp);
Circle(GetMaxX div 2,GetMaxY div 2,R)
end;
if ReadKey=#0 then k := ord(ReadKey);
CloseGraph
end
end.
Процедура SetActivePage.
Делает активной указанную страницу видеопамяти. Заголовок:
Procedure SetActivePage(PageNum: Word);
Здесь PageNum - номер страницы.
Процедура может использоваться только с адаптерами, поддерживающими многостраничную работу
(EGA, VGA и т.п.). Фактически процедура просто переадресует графический вывод в другую область
видеопамяти, однако вывод текстов с помощью Write/WriteLn всегда осуществляется только на
страницу, которая является видимой в данный момент (активная страница может быть невидимой).
Нумерация страниц начинается с нуля.
Процедура SetVisualPage.
50
Делает видимой страницу с указанным номером. Обращение:
Procedure SetVisualPAge(PageNum: Word);
Здесь PageNum - номер страницы.
Процедура может использоваться только с адаптерами, поддерживающими многостраничную работу
(EGA, VGA и т.п.). Нумерация страниц начинается с нуля.
Следующая программа сначала рисует квадрат в видимой странице и окружность -в невидимой.
После нажатия на Enter происходит смена видимых страниц.
Uses Graph;
var
d,m,e: Integer;
s : String;
begin
d := Detect; InitGraph(d, m, '');
e := GraphResult; if e <> grOk then
WriteLn (GraphErrorMsg(e))
else {Нет ошибки. Проверяем, поддерживает ли драйвермногостраничную работу с видеопамятью:}
if d in [HercMono,EGA,EGA64,MCGA,VGA] then
begin {Используем многостраничный режим}
if d<>HercMono then
SetGraphMode(m-1);
{Заполняем видимую страницу}
Rectangle(10,10,GetMaxX div 2,GetMaxY div 2);
OutTextXY(0,0,'Page 0. Press Enter...');
{Заполняем невидимую}
SetActivePage (1);
Circle(GetMaxX div 2, GetMaxY div 2, 100);
OutTextXY(0,GetMaxY-10,'Page 1. Press Enter...');
{Демонстрируем страницы}
ReadLn;
SetVisualPage(1);
ReadLn;
SetVisualPage (0);
ReadLn;
CloseGraph
end
else
begin {Драйвер не поддерживает многостраничный режим}
s := GetDriverName; CloseGraph;
WriteLn('Адаптер ',s,' использует только 1 страницу')
end
end.
Обратите внимание на оператор
if doHercMono then
SetGraphMode(m-1);
С его помощью гарантированно устанавливается многостраничный режим работы на адаптерах EGA,
MCGA, VGA. Как уже говорилось, после инициации графики с Driver=Detect устанавливается режим
работы с максимально возможным номером; перечисленные адаптеры в этом режиме могут работать
только с одной графической страницей, чтобы обеспечить работу с двумя страницами, следует
уменьшить номер режима.
Многоугольники
Процедура Rectangle.
Вычерчивает прямоугольник с указанными координатами углов. Заголовок:
Procedure Rectangle(X1,Y1,X2,Y2: Integer);
51
Здесь X1... Y2 - координаты левого верхнего (X1, Y1) и правого нижнего (Х2, Y2) углов
прямоугольника. Прямоугольник вычерчивается с использованием текущего цвета и текущего стиля
линий.
В следующем примере на экране вычерчиваются 10 вложенных друг в друга прямоугольников.
Uses Graph, CRT;
var
d,r,e,xl,yl, x2,y2,dx,dy: Integer;
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, ' ') ;
e := GraphResult; if e <> grOK then
WriteLn(GraphErrorMsg(e))
else
begin
{Определяем приращения сторон}
dx := GetMaxX div 20;
dy := GetMaxY div 20;
{Чертим вложенные прямоугольники}
for d := 0 to 9 do
Rectangle(d*dx,d*dy,GetMaxX-d*dx,GetMaxY-d*dy);
if ReadKey=#0 then d := ord(ReadKey);
CloseGraph
end
end.
Процедура DrawPoly.
Вычерчивает произвольную ломаную линию, заданную координатами точек излома.
Procedure DrawPoly(N: Word; var Points)
Здесь N - количество точек излома, включая обе крайние точки; Points - переменная типа PointType,
содержащая координаты точек излома.
Координаты точек излома задаются парой значений типа Word: первое определяет горизонтальную,
второе - вертикальную координаты. Для них можно использовать следующий определенный в
модуле тип:
type
PointType = record
х, у : Word
end;
При вычерчивании используется текущий цвет и текущий стиль линий. Вот как, например, можно с
помощью этой процедуры вывести на экран график синуса:
Uses Graph;
const
N = 100; {Количество точек графика}
var
d, r, e: Integer;
m : array [O..N+1] of PointType; k : Word;
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, '');
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
{Вычисляем координаты графика}
for k := 0 to N do with m[k] do
52
begin
x := trunc(k*GetMaxX/N);
у := trunc(GetMaxY*(-sin(2*Pi*k/N)+1)/2)
end;
{Замыкаем график прямой линией}
m[succ(N)].x := m[0] .x;
m[succ(n)].y := m[0] .у;
DrawPoly(N + 2, m);
ReadLn;
CloseGraph
end
end.
В этом примере для проведения горизонтальной прямой используется «замыкание» ломаной - первая
и последняя координаты ее точек излома совпадают.
Замечу, что хотя количество точек излома N - выражение типа Word, на самом деле внутри
процедуры на этот параметр накладываются ограничения, связанные с конечным размером
используемой буферной памяти. Вы можете убедиться в этом с помощью, например, изменения N в
предыдущем примере: при N=678 график перестанет выводиться на экран, а функция GraphResult
будет возвращать значение -6 (не хватает памяти для просмотра областей). Таким образом, для этой
программы пороговое значение количества точек излома составляет 679. В то же время для
программы
Uses Graph;
const
N=510; {Предельное значение, при которомна экране еще видна диагональная линия}
var
d,k: Integer;
Coo: array [1..N] of PointType;
begin
d := Detect; InitGraph(d,k,' ') ;
for k := 1 to N do with Coo[k] do
if odd(k) then
begin
X := 0;
Y := 0
end
else
begin
X := GetMaxX;
Y := GetMaxY
end;
DrawPoly(N,Coo);
ReadLn;
CloseGraph
end.
это значение равно 510. В этой программе ломаная задается в виде многократно накладывающихся
друг на друга диагональных линий.
Дуги, окружности, эллипсы
Процедура Circle.
Вычерчивает окружность. Заголовок:
Procedure Circle(X,Y: Integer; R: Word);
ЗдесьX, Y- координаты центра; R - радиус в пикселях.
Окружность выводится текущим цветом. Толщина линии устанавливается текущим стилем, вид
линии всегда SolidLn (сплошная). Процедура вычерчивает правильную окружность с учетом
53
изменения линейного размера радиуса в зависимости от его направления относительно сторон
графического экрана, т.е. с учетом коэффициента GetAspectRatio. В связи с этим параметр R
определяет количество пикселей в горизонтальном направлении.
В следующем примере в центре экрана создается окно, постепенно заполняющееся случайными
окружностями. Для выхода из программы нажмите на любую клавишу.
Uses Graph, CRT;
var
d,r,e,x,y: Integer;
begin.
{Инициируем графику}
d i= Detect; InitGraph(d, r, '');
e := GraphResult; if e <> grOK then
WriteLn(GraphErrorMsg(e))
else
begin
{Создаем окно в центре экрана}
х := GetMaxX div 4;
у := GetMaxY div 4;
Rectangle(х,у,3*х,3*у);
SetViewPort(x+1,y+1,3*x-1,3*y-1,ClipOn);
{Цикл вывода случайных окружностей}
repeat
SetColor(succ(Random(white))); {Случайный цвет}
SetLineStyle(0,0,2*Random(2)+1); {и стиль линии}
х := Random(GetMaxX); {Случайное положение}
у := Random(GetMaxY); {центра окружности}
Circle(х,у,Random(GetMaxY div 4));
until KeyPressed;
if ReadKey=#0 then x := ord(ReadKey);
CloseGraph
end
end.
Процедура Arc.
Чертит дугу окружности. Заголовок:
Procedure Arc(X,Y: Integer; BegA,EndA,R: Word);
Здесь X, Y - координаты центра; BegA, EndA - соответственно начальный и конечный углы дуги; R радиус.
Углы отсчитываются против часовой стрелки и указываются в градусах. Нулевой угол соответствует
горизонтальному направлению вектора слева направо. Если задать значения начального угла 0 и
конечного - 359, то будет выведена полная окружность. При вычерчивании дуги окружности
используются те же соглашения относительно линий и радиуса, что и в процедуре Circle.
Вот как выглядят две дуги: одна с углами 0 и 90, вторая 270 и 540 градусов (рис. 14.6):
54
Рис.14.6. Иллюстрация процедуры Arc
Следующая программа создает это изображение:
Uses Graph, CRT;
var
d, r, е : Integer;
Xasp,Yasp: Word;
begin
{Инициируем графику}
d := Detect;
InitGraphtd, r, '');
e := GraphResult; if e <> grOK then
WriteLn(GraphErrorMsg(e))
else
begin
GetAspectRatio(Xasp,Yasp);
{R = 1/5 от вертикального размера экрана}
r := round(Yasp*GetMaxY/5/XAsp);
d := GetMaxX div 2; {Смещение второго графика}
e : = GetMaxY div 2; {Положение горизонтальной оси}
{Строим левый график}
Line (0,e,5*r div 2,e); {Горизонтальная ось}
Line (5*r div 4,e div 2,5*r div 4,3*e div 2) ;
Arc (5*r div 4,e,0,90,R); {Дуга}
OutTextXY(0,e+e div 8,'0 - 90'); {Надпись}
{Правый график}
Line (d,e,d+5*r div 2,e);
Line (d+5*r div 4,e div 2, d+5*r div 4,3*e div 2);
Arc (d+5*r div 4,e,270,540,R);
OutTextXY(d,e+e div 8,'270 - 540');
{Ждем нажатия на любую клавишу}
if ReadKey=#0 then d := ord(ReadKey);
CloseGraph
end
end.
Процедура GetArcCoords.
Возвращает координаты трех точек: центра, начала и конца дуги. Заголовок:
Procedure GetArcCoords(var Coords: ArcCoordsType);
Здесь Coords - переменная типа ArcCoordsType, в которой процедура возвращает координаты центра,
начала и конца дуги.
55
Тип ArcCoordsType определен в модуле Graph следующим образом:
type
ArcCoordsType = record
X,Y : Integer; {Координаты центра}
Xstart,Ystart: Integer; {Начало дуги}
Xend,Yend : Integer; {Конец дуги}
end;
Совместное использование процедур Arc и GetArcCoords позволяет вычерчивать сопряжения двух
прямых с помощью дуг. Обратите внимание на коррекцию длины радиуса в следующем примере, в
котором вычерчивается прямоугольник со скругленными углами.
Uses Graph,CRT;
const
RadX = 50; {Горизонтальный радиус}
lx = 400; {Ширина}
ly = 100; {Высота}
var
d,r,e: Integer;
coo : ArcCoordsType;
x1,y1: Integer;
xa,ya: Word;
RadY : Integer; {Вертикальный радиус}
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, ' ') ;
e := GraphResult; if e <> grOK then
WriteLn(GraphErrorMsg(e))
else
begin
GetAspectRatio(xa,ya) ; {Получаем отношение сторон}
{Вычисляем вертикальный радиус и положение фигуры с учетом отношения сторон экрана}
RadY := round (RadX *( xa /ya) );
x1 := (GetMaxX-lx) div 2;
y1 := (GetMaxY-2*RadY-ly) div 2;
{Вычерчиваем фигуру}
Line (x1,y1,x1+lx,y1); {Верхняя горизонтальная}
Arc (x1+lx,y1+RadY,0,90,RadX) ; {Скругление}
GetArcCoords(coo);
with coo do
begin
Line(Xstart,Ystart,Xstart,Ystart+ly);
{Правая вертикальная}
Arc(Xstart-RadX,Ystart+ly,270,0,RadX);
GetArcCoords (coo);
Line(Xstart,Ystart,Xstart-lx,Ystart);
{Нижняя горизонтальная}
Arc(Xstart-lx,Ystart-RadY,180,270,RadX);
GetArcCoords(coo);
Line(Xstart,Ystart,Xstart,Ystart-ly);
Arc(Xstart+RadX,Ystart-ly,90,180,RadX)
end ;
if ReadKey=#0 then d := ord(ReadKey);
CloseGraph
end
56
end.
Процедура Ellipse.
Вычерчивает эллипсную дугу. Заголовок:
Procedure Ellipse(X,Y: Integer; BegA,EndA,RX,RY: Word);
Здесь X, Y - координаты центра; BegA, EndA - соответственно начальный и конечный углы дуги; RX,
RY- горизонтальный и вертикальный радиусы эллипса в пикселях.
При вычерчивании дуги эллипса используются те же соглашения относительно линий, что и в
процедуре Circle, и те же соглашения относительно углов, что и в процедуре Arc. Если радиусы
согласовать с учетом масштабного коэффициента GetAspectRatio, будет вычерчена правильная
окружность.
В следующей программе вычерчиваются три эллипсных дуги (рис. 14.7) при разных отношениях
радиусов. Замечу, что чем выше разрешение графического экрана, тем ближе к единице отношение
сторон и тем меньше первый график отличается от третьего.
Рис.14.7. Эллипсные дуги
Uses Graph, CRT;
var
d,r,e: Integer;
xa,ya: Word;
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, '');
e := GraphResult; if e <> grOK then
WriteLn(GraphErrorMsg(e))
else
begin
{Первый график}
OutTextXY(5 0,4 0,'RX = RY'); {Надпись}
Line (0,100,160,100); {Ось X}
Line (80,55,80,145); {Ось Y}
Ellipse (80,100,180,90,40,40);
{Второй график}
OutTextXY(260,40,'RX = 5*RY');
Line (190,100,410,100);
Line (300,55,300,145);
Ellipse (300,100,0,359,100,20);
{Третий график}
OutTextXY(465,40,'Aspect Ratio');
Line (440,100,600,100);
Line (520,55,520,145);
GetAspectRatio(xa, ya);
Ellipse (520,100,0,270,40,round(40*(xa/ya)));
if ReadKey=#0 then
d := ord(ReadKey);
CloseGraph
end
end.
57
Краски, палитры, заполнения
Процедура SetColor.
Устанавливает текущий цвет для выводимых линий и символов. Заголовок:
Procedure SetColor(Color: Word);
Здесь Color - текущий цвет.
В модуле Graph определены точно такие же константы для задания цвета, как и в модуле СИГ (см.
п.13.2).
Функция GetColor. Возвращает значение типа Word, содержащее код текущего цвета. Заголовок:
Function GetColor: Word;
Функция GetMaxColor.
Возвращает значение типа Word, содержащее максимальный доступный код цвета, который можно
использовать для обращения к SetColor. Заголовок:
Function GetMaxColor: Word;
Процедура SetBkColor.
Устанавливает цвет фона. Заголовок:
Procedure SetBkColor(Color: Word);
Здесь Color - цвет фона.
В отличие от текстового режима, в котором цвет фона может быть только темного оттенка, в
графическом режиме он может быть любым. Установка нового цвета фона немедленно изменяет
цвет графического экрана. Это означает, что нельзя создать изображение, два участка которого
имели бы разный цвет фона. Для CGA -адаптера в режиме высокого разрешения установка цвета
фона изменяет цвет активных пикселей. Замечу, что после замены цвета фона на любой, отличный от
0 (Black) цвет, Вы не сможете более использовать цвет 0 как черный, он будет заменяться на цвет
фона, т.к. процедуры модуля Graph интерпретируют цвет с номером 0 как цвет фона. Это означает, в
частности, что Вы уже не сможете вернуть фону черный цвет!
Если Ваш ПК оснащен цветным экраном, следующая программа продемонстрирует работу
процедуры SetBkColor. Программа выводит десять вложенных друг в друга прямоугольников, после
чего циклически меняет цвет фона. Для выхода из программы достаточно нажать на любую клавишу.
Uses Graph, CRT;
const
NC: array [0..15] of String [12] =
('Black','Blue','Green','Cyan','Red','Magenta',
' Brown','LightGray','DarkGray','LightBlue',
'LightGreen1,'LightCyan1,'LightRed',
'LightMagenta','Yellow','White');
var
d, r, e, k, color, dx, dy: Integer;
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, ' ') ;
e := GraphResult; if e <> grOK then
WriteLn(GraphErrorMsg(e))
else
begin
{Выводим текст в центре экрана}
OutTextXY(200,GetMaxY div 2,'BACKGROUND COLOR');
dx := GetMaxX div 30; {Приращение длины}
dy := GetMaxY div 25; {Приращение высоты}
for k := 0 to 9 do{Выводим 10 прямоугольников}
Rectangle(k*dx,k*dy,GetMaxX-k*dx,GetMaxY-k*dy);
color := black; {Начальный цвет фона}
repeat {Цикл смены фона}
SetBkColor(color) ;
58
SetFillStyle(0,Color);
Bar(345,GetMaxY div 2,440,GetMaxY div 2+8);
OutTextXY(345,GetMaxY div 2,NC[color]);
delay(1000);
inc(color);
if color > White then
color := Black until KeyPressed;
if ReadKey=#0 then
k := ord(ReadKey);
CloseGraph
end
end.
Функция GetBkColor.
Возвращает значение типа Word, содержащее текущий цвет фона. Заголовок:
Function GetBkColor: Word;
Процедура SetPalette.
Заменяет один из цветов палитры на новый цвет. Заголовок:
Procedure SetPalette(N: Word; Color: Shortlnt);
Здесь N - номер цвета в палитре; Color - номер вновь устанавливаемого цвета.
Данная процедура может работать только с адаптерами EGA или VGA. Она не должна
использоваться с IBM8514 или 256-цветным вариантом VGA - для этих адаптеров предназначена
особая процедура SetRGBPalette (см. ниже). Первоначальное размещение цветов в палитрах
EGA/VGA соответствует последовательности их описания константами Black,....White, т.е. цвет с
индексом 0 - черный, 1 - синий, 2 - зеленый и т.д. После обращения к процедуре все фрагменты
изображения, выполненные цветом с индексом N из палитры цветов, получат цвет Color. Например,
если выполнить оператор
SetPalette(2,White);
то цвет с индексом 2 (первоначально это - бирюзовый цвет Cyan) будет заменен на белый. Замечу,
что цвет с индексом 0 отождествляется с цветом фона и может изменяться наряду с любым другим
цветом.
Следующая программа выводит на экран ряд прямых разного цвета и затем случайным образом
меняет цвета палитры.
Uses Graph, CRT;
var
d,r,e,N,k,color: Integer;
Palette : PaletteTyper;
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, ' ') ;
e := GraphResult; if e <> grOK then
WriteLn(GraphErrorMsg(e))
else
begin
{Выбираем толстые сплошные линии}
SetLineStyle(SolidLn, 0, ThickWidth);
GetPalette(Palette) ; {Текущая палитра}
for Color := 0 to Palette.Size-1 do
begin
SetColor(Color);
Line(GetMaxX div 3,Color*10,2*GetMaxX div 3,Color*10)
end;
{Меняем палитру и ждем инициативы пользователя}
while not KeyPressed do
59
for e := 0 to Palette.Size-1 do
SetPalette(e,Random(Palette.Size));
if ReadKey=#0 then d := ord(ReadKey);
CloseGraph
end
end.
Процедура GetPalette.
Возвращает размер и цвета текущей палитры. Заголовок:
Procedure GetPalette(var Palettelnfo: PaletteType);
Здесь Palettelnfo - переменная типа PaletteType, возвращающая размер и цвета палитры.
В модуле Graph определена константа
const
MaxColors =15;
и тип
type
PaletteType = record
Size : Word; {Количество цветов в палитре}
Colors : array [0..MaxColors] of Shortlnt
{Номера входящих в палитру цветов}
end;
С помощью следующей программы можно вывести на экран номера всех возможных цветов из
текущей палитры.
Uses Graph;
var
Palette: PaletteType;
d,r,e,k: Integer;
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, ' ') ;
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
GetPalette(Palette); {Получаем палитру}
CloseGraph; {Возвращаемся в текстовый режим}
with Palette do {Выводим номера цветов}
for k := 0 to pred(Size) do
Write(Colors[k]:5);
end
end.
Процедура SetAllPalette.
Изменяет одновременно несколько цветов палитры. Заголовок процедуры:
Procedure SetAllPalette(var Palette);
Параметр Palette в заголовке процедуры описан как нетипизированный параметр. Первый байт этого
параметра должен содержать длину N палитры, остальные N байты - номера вновь устанавливаемых
цветов в диапазоне от -1 до MaxColors. Код -1 означает, что соответствующий цвет исходной
палитры не меняется.
В следующей программе происходит одновременная смена сразу всех цветов палитры.
Uses Graph, CRT;
var
Palette: array [0..MaxColors] of Shortint;
d,r,e,k: Integer;
begin
60
{Инициируем графику}
d := Detect; InitGraph(d, r, '');
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
{Выбираем толстые сплошные линии}
SetLineStyle(SolidLn, 0, ThickWidth);
{Выводим линии всеми доступными цветами}
for k := 1 to GetMaxColor do
begin
SetColor(k);
Line(GetMaxX div 3,k*10,2*GetMaxX div 3,k*10)
end;
Palette[0] := MaxColors; {Размер палитры}
repeat {Цикл смены палитры}
for k := 1 to MaxColors do
Palette[k] := Random(succ(MaxCoLors));
SetAllPalette(Palette)
until KeyPressed;
if ReadKey=#0 then k := ord(ReadKey);
CloseGraph
end
end.
Функция GetPaletteSize.
Возвращает значение типа Integer, содержащее размер палитры (максимальное количество
доступных цветов). Заголовок:
Function GetPaletteSize: Integer;
Процедура GetDefaultPalette.
Возвращает структуру палитры, устанавливаемую по умолчанию (в режиме автонастройки).
Заголовок:
Procedure GetDefaultPalette(var Palette: PaletteType);
Здесь Palette - переменная типа PaletteType (см. процедуру GetPalette), в которой возвращаются
размер и цвета палитры.
Процедура SetFillStyle.
Устанавливает стиль (тип и цвет) заполнения. Заголовок:
Procedure SetFillStyle(Fill,Color: Word);
Здесь Fill - тип заполнения; Color - цвет заполнения.
С помощью заполнения можно покрывать какие-либо фрагменты изображения периодически
повторяющимся узором. Для указания типа заполнения используются следующие предварительно
определенные константы:
const
EmptyFill = 0;{Заполнение фоном (узор отсутствует)}
SolidFill = 1;{Сплошное заполнение}
LineFill = 2;{Заполнение -------}
LtSlashFill = 3;{Заполнение ///////}
SlashFill = 4;{Заполнение утолщенными ///}
BkSlashFill = 5;{Заполнение утолщенными \\\}
LtBkSlashFill = 6;{Заполнение \\\\\\\}
HatchFill = 7;{Заполнение +++++++}
XHatchFill = 8;{Заполнение ххххххх}
InterleaveFill= 9;{Заполнение прямоугольную клеточку}
WideDotFill = 10;{Заполнение редкими точками}
61
CloseDotFill = 11;{Заполнение частыми точками}
UserFill = 12;{Узор определяется пользователем}
Программа из следующего примера продемонстрирует Вам все стандартные типы заполнения.
Uses Graph, CRT;
var
d,r,e,k,j,x,y: Integer;
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, ' ') ;
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
x := GetMaxX div 6;{Положение графика}
у := GetMaxY div 5;{на экране}
for j := 0 to 2 do{Два ряда}
for k := 0 to 3 do{По четыре квадрата}
begin
Rectangle((k+1)*x,(j+1)*y,(k+2)*x,(j+2)*y);
SetFillStyle(k+j*4,j+1);
Bar((k+1)*x+1,(j+1)*y+1,(k+2)*x-1,(j+2)*y-1)
end;
if ReadKey=#0 then k := ord(ReadKey);
CloseGraph
end
end.
Если параметр Fill имеет значение 12 (UserFill), то рисунок узора определяется программистом
путем обращения к процедуре SetFillPattern.
Процедура SetFillPattern.
Устанавливает образец рисунка и цвет штриховки. Заголовок:
Procedure SetFillPattern(Pattern: FillPatternType;Color: Word);
Здесь Pattern - выражение типа FillPatternType; устанавливает образец рисунка для Fill - UserFill в
процедуре SetFillStyle; Color - цвет заполнения.
Образец рисунка задается в виде матрицы из 8x8 пикселей и может быть представлен массивом из 8
байт следующего типа:
type
FillPatternType = array [1..8] of Byte;
Каждый разряд любого из этих байтов управляет светимостью пикселя, причем первый байт
определяет 8 пикселей первой строки на экране, второй байт - 8 пикселей второй строки и т.д.
На рис. 14.8 показан пример двух образцов заполнения. На рисунке черточкой обозначается
несветящийся пиксель, а прямоугольником - светящийся. Для каждых 8 пикселей приводится
шестнадцатеричный код соответствующего байта.
Следующая программа заполняет этими образцами две прямоугольных области экрана.
62
Рис.14.8. Образцы заполнения и их коды
Uses Graph, CRT;
const
pattl: FillPatternType= ($49,$92,$49,$92,$49,$92,$49,$92);
patt2: FillPatternType= ($00,$18,$24,$42,$42,$24,$18,$00);
var
d,r,e: Integer;
begin {Инициируем графику}
d := Detect; InitGraph(d, r, '');
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
if d=CGA then
SetGraphMode (0) ; {Устанавливаем цвет для CGA}
SetFillStyle(UserFill,White);
{Левый верхний квадрат}
SetFillPattern(Patt1,1);
Bar(0,0,GetMaxX div 2, GetMaxY div 2);
{Правый нижний квадрат}
SetFillPattern(Patt2,2);
Bar(GetMaxX div 2,GetMaxY div 2,GetMaxX,GetMaxY);
if ReadKey=#0 then d := ord(ReadKey);
CloseGraph
end
end.
Если при обращении к процедуре указан недопустимый код цвета, вызов процедуры игнорируется и
сохраняется ранее установленный образец заполнения. В частности, если в предыдущем примере
убрать оператор
if d=CGA then
SetGraphMode(0);
устанавливающий цветной режим работы CGA -адаптера, на экран ПК, оснащенного адаптером
этого типа, будут выведены два одинаковых прямоугольника, так как обращение
SetFillPattern(patt2, 2);
содержит недопустимо большой для данного режима код цвета и обращение игнорируется.
Сказанное, однако, не относится к процедуре SetFillStyle для значения параметра Fill в диапазоне от
0 до 11: программа будет нормально работать и в режиме высокого разрешения CGA-адаптера,
причем все цвета палитры, кроме цвета фона, при этом заменяются на белый.
Процедура GetFillPattern.
Возвращает образец заполнения, установленный ранее процедурой SetFillPattern. Заголовок:
63
Procedure GetFillPattern(var Pattern: FillPatternType);
Здесь Pattern - переменная типа FillPatternType, в которой возвращается образец заполнения.
Если программа не устанавливала образец с помощью процедуры SetFillPattern, массив Pattern
заполняется байтами со значением 255 ($FF).
Процедура GetFillSettings.
Возвращает текущий стиль заполнения. Заголовок:
Procedure GetFillSettings(var Pattlnfo: FillSettingsType);
Здесь Pattlnfo - переменная типа FillSettingsType, в которой возвращается текущий стиль заполнения,
В модуле Graph определен тип:
type
FillSettingsType = record
Pattern: Word; {Образец}
Color : Word {Цвет}
end;
Поля Pattern и Color в этой, записи имеют то же назначение, что и аналогичные параметры при
обращении к процедуре SetFillStyle.
Процедура SetRGBPalette.
Устанавливает цветовую гамму при работе с дисплеем IBM 8514 и адаптером VGA. Заголовок:
Procedure SetRGBPalette(ColNum,RedVal, GreenVal,BlueVal:Integer);
Здесь ColNum - номер цвета; RedVal, GreenVal, BlueVal - выражения типа Integer, устанавливающие
интенсивность соответственно красной, зеленой и синей составляющих цвета.
Эта процедура может работать только с дисплеем IBM 8514, а также с адаптером VGA,
использующим видеопамять объемом 256 Кбайт. В первом случае параметр ColNum задается числом
в диапазоне 0...255, во втором - в диапазоне 0...15. Для установки интенсивности используются 6
старших разрядов младшего байта любого из параметров RedVal, GreenVal, BlueVal.
В следующей программе в центре экрана выводится прямоугольник белым цветом, после чего этот
цвет случайно изменяется с помощью процедуры SetRGBPalette. Для выхода из программы нужно
нажать любую клавишу.
Uses Graph,CRT;
var
Driver, Mode, Err, xl, yl: Integer;
begin
{Инициируем графический режим}
Driver := Detect;
InitGraph(Driver, Mode, '');
Err := GraphResult;
if ErroO then
WriteLn(GraphErrorMsg(Err))
else if Driver in [IBM8514, VGA] then
begin
{Выводим прямоугольник в центре экрана}
x1 := GetMaxX div 4;
y1 := GetMaxY div 4;
SetColor(lS);
Bar(x1,y1,3*x1,3*y1);
{Изменяем белый цвет на случайный}
while not KeyPressed do
SetRGBPalette(15,Random(256),Random(256),Random(256));
CloseGraph
end
else
begin
CloseGraph; .
64
WriteLn('Адаптер не поддерживает ' , 'RGB-режим управления цветами')
end
end.
Процедура FloodFill.
Заполняет произвольную замкнутую фигуру, используя текущий стиль заполнения (узор и цвет).
Заголовок:
Procedure FloodFill(X,Y: Integer; Border: Word);
Здесь X, Y- координаты любой точки внутри замкнутой фигуры; Border - цвет граничной линии.
Если фигура незамкнута, заполнение «разольется» по всему экрану.
Следует учесть, что реализованный в процедуре алгоритм просмотра границ замкнутой фигуры не
отличается совершенством. В частности, если выводятся подряд двепустые строки, заполнение
прекращается. Такая ситуация обычно возникает при заполнении небольших фигур с
использованием типа LtSlashFill. В фирменном руководстве по Турбо Паскалю рекомендуется, по
возможности, вместо процедуры FloodFill использовать FillPoly (заполнение прямоугольника).
Следующая программа демонстрирует заполнение случайных окружностей. Сначала в центре экрана
создается окно, в котором заполняется небольшой прямоугольник. Часть прямоугольника останется
незаполненной, в чем Вы можете убедиться, так как программа в этот момент приостанавливает
работу, ожидая нажатия на клавишу Enter. Затем осуществляется вывод и заполнение случайных
окружностей до тех пор, пока не будет нажата любая клавиша. Замечу, что прямоугольник
заполняется полностью, если вместо типа LtSlashFill (косая штриховка линиями обычной толщины)
используется SlashFill (штриховка утолщенными линиями). Если программа будет работать
достаточно долго, она может «зависнуть», что лишний раз свидетельствует о несовершенстве
реализованного в ней алгоритма.
Uses Graph, CRT;
var
d, r, е, х, у, с : Integer;
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, ' ') ;
e := GraphResult;
if e <> grOk then . . WriteLn(GraphErrorMsg(e))
else
begin
{Создаем прямоугольное окно}
х := GetMaxX div 4;
у. := GetMaxY div 4;
Rectangle(х,у,3*x,3*y);
SetViewPort(x+1,y+1, 3*x-1,3*y-1,ClipOn);
{Демонстрируем заливку маленького прямоугольника}
SetPillStyle(LtSlashFill,GetMaxColor);
Rectangle(0,0,8,20); FloodFill(1,1,GetMaxColor);
OutTextXY(10,25,'Press Enter...');
ReadLn; {Ждем нажатия Enter}
{Выводим окружности до тех пор, пока не будет нажата любая клавиша}
repeat
{Определяем случайный стиль заливки}
SetFillStyle(Random(12),Random(GetMaxColor+1));
{Задаем координаты центра и цвет окружности}
х := Random (GetMaxX div 2);
у := Random (GetMaxY div 2);
с := Random (succ(GetMaxColor));
SetColor(c);
{Выводим и заливаем окружность}
65
Circle(x, у, Random(GetMaxY div 5));
FloodFill (x, у, с)
until KeyPressed;
if ReadKey=#0 then
x := ord(ReadKey);
CloseGraph
end
end.
Процедура Bar.
Заполняет прямоугольную область экрана. Заголовок:
Procedure Bar(X1,Y1,X2,Y2: Integer);
Здесь XJ...Y2 - координаты левого верхнего (X1, Y1) и правого нижнего (Х2, Y2) углов
закрашиваемой области.
Процедура закрашивает (но не обводит) прямоугольник текущим образцом узора и текущим цветом,
которые устанавливаются процедурой SetFillStyle.
Следующая программа дает красивые цветовые эффекты (закраска случайных прямоугольников).
Uses Graph, CRT;
var
d, r, e : Integer;
begin
{Инициируем графику}
d : = Detect; InitGraph(d, r, '');
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
{Создаем окно в центре экран}
d := GetMaxX div 4;
r := GetMaxY div 4; Rectangle(d,r,3*d,3*r);
SetViewPort(d+1,r+1,3*d-1,3*r-1,ClipOn);
{Цикл вывода и закраски случайных многоугольников}
repeat
SetFillStyle(Random(12),Random(succ(GetMaxColor)));
Bar(Random(Ge tMaxX),Random(Ge tMaxY),
Random(Ge tMaxX),Random(Ge tMaxY));
until KeyPressed;
if ReadKey=#0 then d := ord(ReadKey);
CloseGraph
end
end.
Процедура Ваr3D.
Вычерчивает трехмерное изображение параллелепипеда и закрашивает его переднюю грань .
Заголовок:
Procedure Ваr3D (X1,Y1,X2,Y2,Depth: Integer; Top: Boolean);
Здесь X1... Y2 - координаты левого верхнего (X1, Y1) и правого нижнего (Х2, Y2) углов передней
грани; Depth - третье измерение трехмерного изображения («глубина») в пикселях; Тор - способ
изображения верхней грани.
Если параметр Тор имеет значение True, верхняя грань параллелепипеда вычерчивается, в противном
случае - не вычерчивается (этот вариант используется для изображения поставленных друг на друга
параллелепипедов, см. следующий пример). В качестве значения этого параметра может
использоваться одна из следующих констант, определенных в модуле Graph:
const
TopOn = True;
66
TopOff = False;
При вычерчивании используется текущий стиль линий (SetLineStyle) и текущий цвет (SetColor).
Передняя грань заливается текущим стилем заполнения (SetFillStyle).
Процедура обычно применяется при построении столбиковых диаграмм. Следует учесть, что
параллелепипед «прозрачен», т.е. за его незакрашенными гранями могут быть видны другие
элементы изображения.
Следующая программа иллюстрирует различные аспекты применения процедуры Bar3D.
Uses Graph,CRT;
var
d, r, e: Integer;
begin
{Инициируем графику}
d := Detect;
Ini-tGraph(d, r, ' ') ;
e := GraphResult;
if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
{Столбик с верхней гранью:}
Bar3D (80, 100, 120, 180, 15, TopOn);
{Столбик без верхней грани:}
Ваг3D (150, 150, 190, 180, 15, TopOff);
{Этот столбик "стоит" на следующем и прозрачен:}
Bar3D (230, 50, 250, 150, 15, TopOn);
Bar3D (220, 150, 260, 180, 15, TopOn);
{У этого столбика нет верхней грани, и поэтому он не мешает поставленному на него сверху:}
Bar3D (300, 150, 340, 180, 15, TopOff);
SetLineStyle(3,0,1);
SetColor(Yellow);
SetFillStyle(LtSlashFill,Yellow);
Bar3D (300, 50, 340, 150, 15, TopOn);
if ReadKey=#0 then d := ord(ReadKey);
CloseGraph;
end
end.
Процедура Fill Poly.
Обводит линией и закрашивает замкнутый многоугольник. Заголовок:
Procedure FillPoly(N: Word; var Coords);
Здесь N - количество вершин замкнутого многоугольника; Coords - переменная типа PointType,
содержащая координаты вершин.
Координаты вершин задаются парой значений типа Integer: первое определяет горизонтальную,
второе - вертикальную координаты. Для них можно использовать следующий определенный в
модуле тип:
type
PointType = record
х, у : Integer
end;
Стиль и цвет линии контура задаются процедурами SetLineStyle и SetColor, тип и цвет заливки процедурой SetFillStyle.
В следующем примере на экран выводятся случайные закрашенные многоугольники.
Uses Graph, CRT;
var
67
d, r, e: Integer;
p : array [1..6] of PointType; n, k : Word;
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, ' ') ;
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
{Создаем окно в центре экрана}
d := GetMaxX div 4;
r := GetMaxY div 4;
Rectangle(d,r,3*d,3*r);
SetViewPort(d+l,r+l,3*d-l,3*r-l,ClipOn);
{Цикл вывода случайных закрашенных многоугольников}
repeat
{Выбираем случайный цвет и узор)
SetFillStyle(Random(12),Random(succ(GetMaxColor)));
SetColor (Random(succ(GetMaxColor)));
{Назначаем случайные координаты}
n := Random (4) + 3 ; for k := 1 to n do with p[k] do
begin
x := Random (GetMaxX div 2);
у := Random (GetMaxY div 2)
end;
FillPoly (n, p) {Выводим и закрашиваем}
until KeyPressed;
if ReadKey=#0 then k := ord(ReadKey);
CloseGraph
end
end.
Процедура FillEllipse.
Обводит линией и заполняет эллипс. Заголовок:
Procedure FillEllipse(X,Y,RX,RY: Integer);
Здесь X, Y - координаты центра; RX, RY- горизонтальный и вертикальный радиусы эллипса в
пикселях.
Эллипс обводится линией, заданной процедурами SetLineStyle и SetColor, и заполняется с
использованием параметров, установленных процедурой SetFillStyle.
Процедура Sector.
Вычерчивает и заполняет эллипсный сектор. Заголовок: Procedure Sector(X,Y: Integer;
BegA,EndA,RX,RY: Word);
Здесь BegA, EndA - соответственно начальный и конечный углы эллипсного сектора. Остальные
параметры обращения аналогичны параметрам процедуры FillEllipse.
В следующей программе на экран выводятся случайные закрашенные эллипсы и секторы. Для
выхода из программы нажмите любую клавишу.
Uses Graph, CRT;
var
d, r, e : Integer;
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, '');
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e))
68
else
begin
{Создаем окно в центре экрана}
d := GetMaxX div 4;
r := GetMaxY div 4;
Rectangle(d,r,3*d,3*r);
SetViewPort(d+1,r+1,3*d-1,3*r-1,ClipOn);
{Цикл вывода}
repeat
SetFillStyle(Random(12), Random(succ(GetMaxColor)));
SetColor (Random(succ(GetMaxColor)));
Sector(Random(GetMaxX div),Random(GetMaxY div 2),
Random(360),Random(360),Random(GetMaxX div 5),
Random(GetMaxY div 5));
FillEl.lipse (Random (GetMaxX div 2),
Random(GetMaxY div 2),Random(GetMaxX div 5),
Random(GetMaxY div 5))
until KeyPressed;
if ReadKey=#0 then d := ord(ReadKey);
CloseGraph
end
end.
Процедура PieSlice.
Вычерчивает и заполняет сектор окружности. Заголовок:
Procedure PieSlice(X,Y: Integer; BegA,EndA,R: Word);
В отличие от процедуры Sector, указывается лишь один горизонтальный радиус R, остальные
параметры аналогичны параметрам процедуры Sector.
Сектор обводится линией, заданной процедурами SetLineStyle и SetColor, и заполняется с помощью
параметров, определенных процедурой SetFillStyle. Процедуру удобно использовать при построении
круговых диаграмм, как, например, в следующей программе (рис. 14.9).
Рис. 14.9. Иллюстрация процедуры PieSlice
Uses Graph, CRT;
var
d, r, e : Integer;
begin
{Инициируем графический режим}
d := Detect;
InitGraph(d, r, '');
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
{Выводим маленький сектор}
SetFillStyle(WideDotFill, White);
69
PieSlice(GetMaxX div 2+5,GetMaxY div 2+4,270,360,100);
{Выводим большой сектор}
SetFillStyle (SolidFill, Red);
PieSlice (GetMaxX div 2,GetMaxY div 2, 0,270,100).;
{Выводим надписи}
OutTextXY (GetMaxX div 2+90,GetMaxY div 2+70, '25%');
OutTextXY(GetMaxX div 2-50,GetMaxY div 2-20, '75%');
{Ждем нажатия на любую клавишу}
if ReadKey=#0 then d := ord(ReadKey);
Close,Graph
end
end.
Сохранение и выдача изображений
Функция ImageSize.
Возвращает размер памяти в байтах, необходимый для размещения прямоугольного фрагмента
изображения. Заголовок:
Function ImageSize(X1,Y1,X2,Y2: Integer): Word;
Здесь X1... Y2 - координаты левого верхнего (X1, Y1) и правого нижнего (Х2, Y2) углов фрагмента
изображения.
Процедура Getlmage.
Помещает в память копию прямоугольного фрагмента изображения. Заголовок:
Procedure Getlmage(X1,Y1,X2,Y2: Integer; var Buf)
Здесь X1...Y2 - координаты углов фрагмента изображения; Buf - переменная или участок кучи, куда
будет помещена копия видеопамяти с фрагментом изображения.
Размер Buf должен быть не меньше значения, возвращаемого функцией ImageSize с теми же
координатами X1....Y2.
Процедура Put Image.
Выводит в заданное место экрана копию фрагмента изображения, ранее помещенную в память
процедурой Getlmage. Заголовок:
Procedure Putlmage(X,Y: Integer; var Buf; Mode: Word);
Здесь X,Y- координаты левого верхнего угла того места на экране, куда будет скопирован фрагмент
изображения; Buf - переменная или участок кучи, откуда берется изображение; Mode - способ
копирования.
Как видим, координаты правого нижнего угла не указываются, так как они полностью определяются
размерами вновь выводимой на экран копии изображения. Координаты левого верхнего угла могут
быть какими угодно, лишь бы только выводимая копия уместилась в пределах экрана (если копия не
может разместиться на экране, она не выводится и экран остается без изменений).
Параметр Mode определяет способ взаимодействия вновь размещаемой копии с уже имеющимся на
экране изображением. Взаимодействие осуществляется путемприменения кодируемых этим
параметром логических операций к каждому биту копии и изображения. Для указания применяемой
логической операции можно использовать одну из следующих предварительно определенных
констант:
const
NormalPut= 0;{Замена существующего изображения на копию}
XorPut = 1;{Исключительное ИЛИ}
OrPut = 2;{Объединительное ИЛИ}
AndPut = 3;{Логическое И}
NotPut = 4;{Инверсия изображения}
Наиболее часто используются операции NormalPut, XORPut и NotPut. Первая из них просто стирает
часть экрана и на это место помещает копию из памяти в том виде, как она там сохраняется.
Операция NotPut делает то же самое, но копия выводится в инверсном виде. Для монохромного
режима это означает замену светящихся пикселей на темные и наоборот. В цветном режиме
операция NotPut применяется к коду цвета каждого пикселя. Например, для White (код 15 или в
70
двоичном виде 1111) эта операция даст код 0000 = 0 = Black, для Red = 4 = 0100 получим 1011 = 11 =
LightCyan и т.д. Операция XORPut, примененная к тому же месту экрана, откуда была получена
копия, сотрет эту часть экрана. Если операцию применить дважды к одному и тому же участку, вид
изображения на экране не изменится. Таким способом можно довольно просто перемещать
изображения по экрану, создавая иллюзию движения.
Следующая программа рисует «Неопознанный Летающий Объект» - летающую тарелку на звездном
фоне (рис. 14.10).
Рис.14.10. Иллюстрация процедур Getlmage/Putlmage
Uses Graph, CRT;
const
r = 20; {Характерный размер НЛО}
pause = 50; {Длительность паузы}
var
d,m,e,xm/ym,x,y/lx,ly,rx,ry,
Size,i,dx,dy,Width,Height: Integer;
Saucer : Pointer;
label
loop;
begin
{Инициируем графику}
d := Detect; lnitGraph(d, m, ' ') ;
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
x := r*5;
у := r*2;
xm := GetMaxX div 4;
ym := GetMaxY div 4;
{Создаем "тарелку" из двух эллипсов с усами антенн}
Ellipse (х,у,0,360,r,r div 3+2); ,
Ellipse (х,у-4,190,357,r,r div 3);
Line (х+7,у-б,х+10,у-12);
Line (x-7,y-6, х-10, у-12);
Circle (x+10,y-12,2);
Circle (х-10,у-12,2);
FloodFill(x+l,y+4,White);
{Определяем габариты НЛО и помещаем его в кучу}
1х := х-r-1;
1у := у-14;
гх := х+r+1;
гу := у+r div 3+3;
Width := rx - lx + 1;
Height:= ry - ly + 1;
Size := ImageSize(lx, ly, rx, ry);
GetMem (Saucer, Size);
Getlmage (lx, ly, rx, ry, Saucer^);
{Стираем построенное}
Putlmage (lx, ly, Saucer^, xorPut);
{Создаем звездное небо}
Rectangle(xm,ym,3 *xm,3 *ym);
SetViewPort(xm+1,ym+1,3*xm-1,3*ym-1,ClipOn);
xm := 2*xm;
71
ym := 2*ym;
for i:=1 to 200 do
PutPixe1 (Random(xm), Random(ym), White) ;
{Задаем начальное положение НЛО и направление движения}
х := xm div 2;
у := ym div 2;
dx := 10;
dy := 10;
{Основной цикл}
repeat
Putlmage(x,y,Saucer^,xorPut); {Изображаем НЛО на}
Delay(pause); {новом месте и после}
Putlmage (x, у, Saucer^, XorPut);{паузы стираем его}
{Получаем новые координаты}
loop: x := x+dx;
у := y+dy;
{НЛО достиг границы экрана?}
if (x<0) or (x+Width+1>xm) or
(у<0) or (y+Height+1>ym) then
begin {Да - НЛО достиг границы: меняем направление его перемещения}
x := x-dx;
y:= y-dy;
dx : = GetMaxX div 10 - Random(GetMaxX div 5);
dy := GetMaxY div 30 - Random(GetMaxY div 15);
goto loop
end
until KeyPressed;
if ReadKey=#0 then x := ord(ReadKey);
CloseGraph
end
end.
Контрольные вопросы
1. Что такое программа?
2. Что такое оператор языка?
3. Какие символы допускает Турбо-Паскаль?
4. Какое количество символов может содержать идентификатор?
5. С какими типами данных работает Паскаль?
6. Какие допускаются способы хранения символьных массивов?
7. Какого типа данные составляют множества?
8. Из чего состоит запись?
9. Что такое указатель?
10. Что представляет собой выражение-константа ?
11. К каким типам данных применимы операции битовой арифметики?
12. Из каких разделов состоит программа на языке Паскаль?
13. Какими символами отделяются друг от друга операторы?
14. Что такое ключ компиляции?
15. Какие операторы могут выполняться несколько раз в одной и той же последовательности?
16. Что такое подпрограмма? Какие типы подпрограмм существуют в Паскале?
17. Чем отличается модуль от программы?
18. Что такое рекурсия?
19. Какие операции выполняются с данными файлового типа?
72
20. Чем отличаются статические и динамические переменные?
21. В чем особенность структурного программирования?
22. Что такое объектно-ориентированное программирование?
23. Что такое инкапсуляция?
73
Download