- •Федеральное агентство по образованию
- •Государственное образовательное учреждение высшего профессионального образования
- •«Орловский государственный технический
- •Университет»
- •Учебно-научно-исследовательский институт информационных технологий
- •302030, Г. Орел, ул. Московская, 65
- •3 Основные операторы языка паскаль
- •3.1 Среда turbo pascal
- •3.2 Операторы turbo pascal
- •3.2.1 Условный оператор
- •3.2.2 Оператор варианта
- •3.2.3 Операторы цикла
- •3.2.3.1 Оператор цикла с параметром
- •3.2.3.2 Оператор цикла с предусловием
- •3.2.3.3 Оператор цикла с постусловием
- •4 Основные процедуры графического модуля
- •5 Объектно-ориентированная модель turbo pascal
- •5.1 Основные концепции ооп
- •5.1.1 Абстрактные типы данных. Инкапсуляция
- •5.1.2 Классы
- •5.1.3 Наследование
- •5.1.4 Полиморфизм. Раннее и позднее связывание
- •5.2 Динамические объекты
- •6 Задания к лабораторным работам
- •7 Контрольные вопросы
- •8 Содержание отчета
- •9 Список литературы
5.2 Динамические объекты
Для динамических объектов есть специальная форма процедуры new, с двумя параметрами, которая одновременно выделяет место объекту в куче и инициализирует его.
Объект может содержать указатели на динамические структуры или объекты, которые необходимо освободить или стереть в определённом порядке. Обычно для методов освобождения и стирания используют идентификатор done. Деструкторы – особые методы, предназначенные для освобождения динамически распределённых объектов. Их задача – осуществлять поиск размера этого типа экземпляра в таблице виртуальных методов и передавать этот размер процедуре dispose. Деструкторы применяются, когда полиморфные объекты должны быть очищены и освобождено их место в динамической памяти.
Рассмотрим программу, которая:
строит иерархию графических объектов (точка, маркер, окружность), выводит их на экране и может перемещать эти изображения по экрану;
выполняет предыдущее задание с использованием виртуальных методов;
создаёт связанный список динамических объектов (графических изображений) и выводит их на экран.
Для создания связанного списка динамических объектов создадим новый тип объекта LIST, его предназначение – возглавлять список других объектов (PointPtr – указатель на суперкласс графических объектов)
NodePtr=^Node;
Node=record
Item : PointPtr;
Next : NodePtr;
end;
ListPtr=^List;
List=object
Nodes : NodePtr;
Constructor Init;
Destructor Done; virtual;
Procedure Add (Item ; PointPtr);
Procedure View;
end;
…
Constructor List.Init;
begin
Nodes:=nil;
end;
Destructor List.Done;
var T: NodePtr;
begin
while Nodes <> nil do
begin
T:=Nodes;
dispose (T^.Item, Done);
Nodes:=T^.Next;
dispose (T);
end;
end;
Procedure List.ADD (Item : PointPtr);
var T ; NodePtr;
begin
new(T);
T^.item:=Item;
n^.Next:=Nodes;
Nodes:=T;
end;
Procedure List.View;
var curr : nodePtr;
begin
curr;=Nodes;
while cur <> nil do
begin
curr^.Item^.Show;
curr:=curr^.Next;
end;
end;
6 Задания к лабораторным работам
Лабораторная работа №1. Тема – условные операторы - if, вложенные операторы if, оператор case.
Напишите программу, которая вводит с клавиатуры символ, определяющий площадь какой фигуры необходимо вычислить. «R» определяет прямоугольник, «T» – треугольник, «С» – круг. Выдать результат на экран, в случае ввода неправильного символа выдать сообщение об ошибке. Программа должна обеспечить возможность вычислять площади фигур, пока пользователь не решит из нее выйти (использовать оператор цикла). Программу представить в двух вариантах:
1) с использованием вложенных операторов if;
2) с использованием оператора варианта.
Лабораторная работа №2. Тема – вложенные операторы case.
Напишите программу перевода римских чисел в десятичные. Алгоритм перевода представлен в следующей таблице:
символ состоян. |
'X' |
'V' |
'I' |
1 |
n:=10; state:=2 |
n:=5; state:=3 |
n:=1; state:=6 |
2 |
n:=n+10; state:=2 |
n:=n+5; state:=3 |
n:=n+1; state:=6 |
3 |
ok:=false |
ok:=false |
n:=n+1; state:=4 |
4 |
ok:=false |
ok:=false |
n:=n+1; state:=5 |
5 |
ok:=false |
ok:=false |
n:=n+1; state:=7 |
6 |
n:=n+8; state:=7 |
n:=n+3; state:=7 |
n:=n+1; state:=5 |
7 |
ok:=false |
ok:=false |
ok:=false |
Программа выполняет перевод чисел, пока пользователь не решит из нее выйти (использовать оператор цикла).
Программа должна обрабатывать следующие типы ошибок пользователя:
1) введен неверный символ (отсутствует в алфавите программы);
2) символы введены в неправильном порядке.
Лабораторная работа №3. Тема – работа с массивами.
Напишите следующие программы работы с массивами:
1) Найти сумму элементов одномерного массива;
2) Найти произведение элементов одномерного массива;
3) Найти сумму элементов матрицы, расположенных на главной диагонали;
4) Найти сумму элементов матрицы, расположенных ниже главной диагонали;
5) Найти сумму элементов матрицы, расположенных выше главной диагонали;
6) Найти произведение элементов матрицы, расположенных на побочной диагонали;
7) Найти максимумы четных строк матрицы;
8) Найти минимумы нечетных столбцов матрицы;
9) Найти произведение двух матриц.
Лабораторная работа №4. Тема – работа с графикой, с мышью, использование перечислимых типов.
Напишите программу, при запуске которой рисуется графическое меню, имеющее следующие команды: окружность, треугольник, отрезок, выход. При выборе мышкой команды, на экране рисуется соответствующая фигура или производится выход из программы. Замечание: при определении команд в программе использовать перечислимый тип.
Лабораторная работа №5. Тема – работа с записями, с массивами записей, с графикой.
В программе определить массив записей. Каждая запись описывает графический маркер (координаты, цвет, тип маркера (например - крест, косой крест, окружность, звездочка), размер (например - малый, средний, большой). Массив заполнить при помощи генератора случайных чисел. На экране нарисовать прямоугольную область. Затем визуализировать маркеры и посчитать, сколько маркеров, например, красного цвета, попало вовнутрь прямоугольной области.
Лабораторная работа №6. Тема – работа с массивами записей.
В программе определить массив записей. Каждая запись хранит информацию о работнике фирмы: табельный номер, ФИО, оклад, должность, пол. Заполнить массив с клавиатуры. Затем программа должна уметь ответить на следующие вопросы: 1) посчитать фонд зарплаты фирмы; 2) посчитать количество женщин и количество мужчин, работающих в фирме; 3) посчитать фонд зарплаты отдельно для мужчин и отдельно для женщин.
Лабораторная работа №7. Тема – работа с записями с вариантами, графикой.
В программе определить массив записей с вариантами. Каждая запись определяет геометрическую фигуру: окружность, треугольник, прямоугольник. Общие поля – координаты точки привязки фигуры, цвет. Заполнить массив с клавиатуры или при помощи генератора случайных чисел, и нарисовать фигуры на экране.
Лабораторная работа №8. Тема – работа с множествами, со строками.
Написать программу для распознавания лексем. Задача - преобразовать последовательность символов, вводимых с клавиатуры в последовательность лексем языка программирования. В языке имеется следующие лексемы:
1) Идентификатор – последовательность букв и цифр, начинающаяся с буквы;
2) Число – последовательность цифр;
3) Лексемы больше-равно, меньше-равно, присвоить ( >=, <=, := ).
Результатом работы программы является массив записей, где каждая запись хранит саму лексему, а также ее название. Выдать его содержимое на экран. Обрабатывать ошибки в случае неправильного ввода.
Лабораторная работа №9. Тема – Работа с текстовыми файлами.
Текстовая информация вводится с клавиатуры и заносится в текстовый файл. Признаком окончания ввода служит ввод пустой строки. Файл закрыть, затем открыть его для чтения и отредактировать: в каждой строке текста проверить правильность расстановки запятых. Правила следующие – в начале строки не должно быть запятой, не может идти подряд две и более запятых, перед запятой не может быть пробела, после запятой должен быть хотя бы один пробел. Отредактированный текст записать в промежуточный файл. Затем старый файл удалить, а новый переименовать – дать ему старое имя. Содержимое отредактированного файла выдать на экран.
Лабораторная работа №10. Тема – работа с типизированными файлами, процедуры и функции.
Программу из лабораторной работы № 6 переделать – информацию о работнике фирмы хранить не в массиве, а в типизированном файле. Функциональность программы не изменилась. Для реализации запросов к информации файла использовать процедуры и функции. При написании процедур и функций продемонстрировать все способы передачи параметров – параметры переменные, параметры значения и параметры константы.
Лабораторная работа №11. Тема – работа с типизированными файлами
На экране нарисовать несколько заполненных областей. Информацию о каждой области – цвет, количество вершин, координаты вершин, тип заливки записать в нетипизированный файл. Каждая запись файла имеет фиксированный размер. Так как количество полигонов, и число их вершин – произвольны, то каждый раз запись хранит информацию о разном числе полигонов, при чем информация об одном полигоне может попасть в разные записи. Сохранить файл на диске. Восстановить содержимое экрана из файла.
Лабораторная работа №12. Тема – Нетипизированные параметры
Написать процедуру рисования полигона. Параметры: 1) адрес массива координат полигона (так как количество вершин каждый раз разное – параметр нетипизирован); 2) количество вершин полигона. В процедуре привести нетипизированный параметр к удобному для программиста типу и нарисовать полигон. Из основной программы обратиться к данной процедуре 3 раза, в качестве фактического параметра использовать различные структуры данных, хранящие координаты полигонов (например, массив записей, двумерный массив, одномерный массив).
Лабораторная работа №13. Тема – создание модулей.
Создать модуль, в который включить несколько процедур и функций для работы с массивами, например, процедура поиска наименьших элементов нечетных столбцов, процедура поиска наибольших элементов четных строк, функция нахождения суммы элементов побочной диагонали. В основной программе заполнить исходный массив, и затем вызвать имеющиеся процедуры и функции. Обосновать выбор способов передачи параметров.
Лабораторная работа №14. Тема – работа с процедурным типом.
Написать программу, в которой определить массив графических маркеров (координаты X, Y, цвет), заполнить его данными при помощи генератора случайных чисел. Для рисования маркеров определить 3 процедуры (например, звездочка, крестик, кружок). Указанные процедуры использовать следующим образом:
1-й вариант: Написать процедуру визуализации, в которую передать в качестве параметров: 1) массив маркеров; 2) процедуру для рисования маркера (использовать параметр процедурного типа);
2-й вариант: В массив маркеров в записи добавить поле процедурного типа. При инициализации ему присваивать значение одной из процедур рисования маркеров. В процедуру визуализации передавать только один параметр – массив маркеров.
Лабораторная работа №15. Тема – рекурсия, косвенная рекурсия.
Написать программу для определения четно или нет количество символов введенной строки, для этого использовать косвенную рекурсию. Переделать косвенную рекурсию в прямую. (См. лекцию по теме «Рекурсия»).
Написать программу, которая рисует на экране полигон (при помощи мыши), после указания точки внутри полигона, полигон закрашивается. Использовать рекурсивный алгоритм закраски.
Лабораторная работа №16. Тема – тестирование алгоритмов поиска.
Создать модуль, в который включить все изученные алгоритмы поиска. В модуле в процедурах поиска использовать открытый параметр массив. Измерить время работы каждого алгоритма в различных условиях – искомый элемент находится в начале, в конце, в середине массива. Результаты представить при помощи диаграмм в программе Excel.
Лабораторная работа №17. Тема – тестирование алгоритмов сортировки.
Создать модуль, в который включить все изученные алгоритмы сортировки. Измерить время работы каждого алгоритма в различных условиях – 1) сортируемый массив имеет сравнительно небольшие размеры и 2) сравнительно большие размеры. Для каждого варианта проанализировать еще три ситуации: 1) массив почти упорядочен; 2) массив почти упорядочен в обратном порядке; 3) массив заполнен случайными значениями. Результаты представить при помощи диаграмм в программе Excel.
Лабораторная работа №18. Тема – работа со связанными списками.
Написать программу – графический редактор, рисующий маркеры. При запуске программы на экране появляется главное меню, его команды:
1) создать маркер;
2) удалить маркер;
3) переместить маркер;
4) перерисовать все;
5) удалить все маркеры;
6) выход.
Кроме того, на экране появляется меню для выбора типа маркера (*, +, о), а также меню для выбора цвета – палитра. Активный пункт каждого меню выделяется красным цветом. Каждый маркер при создании помещается в связанный список. Выполнение каждой команды сопровождается соответствующей операцией со списком.
Лабораторная работа №19. Тема – работа с двусвязанными кольцами.
Написать программу – графический редактор, рисующий ломаные линии. При запуске программы на экране появляется главное меню, его команды:
1) создать ломаную линию;
2) удалить ломаную линию;
3) добавить точку в ломаную линию;
4) переместить точку в ломаной линии;
5) удалить точку в ломаной линии;
6) перерисовать все;
7) удалить все ломаные линии;
8) выход.
Кроме того, на экране появляется меню для выбора цвета – палитра. Активный пункт каждого меню выделяется красным цветом. Каждая ломаная при создании помещается в двусвязаное кольцо. Информация о ломаной включает цвет и указатель на список точек, принадлежащих данной ломаной. Выполнение каждой команды сопровождается соответствующей операцией с кольцом или со списком точек.
Лабораторная работа №20. Тема – работа с двоичными деревьями поиска.
Написать программу «частотный словарь». С клавиатуры вводятся слова, которые помещаются в двоичное дерево поиска. После окончания ввода слова выводятся на экран в алфавитном порядке (использовать обратный обход) с указанием частоты появления каждого слова.
Написать программу для регистрации участников семинара. Информация о каждом участнике – город, фамилия, организация. После регистрации информацию выдать на экран следующим образом: распечатать список городов по алфавиту и для каждого города список участников по алфавиту (названия городов поместить в двоичное дерево поиска, и в каждом его узле хранить ссылку на его двоичное дерево участников).
Лабораторная работа №21. Тема – создание объектно-ориентированных программ
Написать программу, в которой определить массив указателей на динамические объекты. Объекты – снежинки мерцающие и снежинки падающие. Они являются наследниками класса «снежинка». После инициализации визуализировать массив – для каждого его элемента вызвать виртуальный метод «проявить визуальный эффект».