Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метадичка по Информатике и Программированию.doc
Скачиваний:
10
Добавлен:
28.03.2015
Размер:
205.82 Кб
Скачать

5.2 Динамические объекты

Для динамических объектов есть специальная форма процедуры new, с двумя параметрами, которая одновременно выделяет место объекту в куче и инициализирует его.

Объект может содержать указатели на динамические структуры или объекты, которые необходимо освободить или стереть в определённом порядке. Обычно для методов освобождения и стирания используют идентификатор done. Деструкторы – особые методы, предназначенные для освобождения динамически распределённых объектов. Их задача – осуществлять поиск размера этого типа экземпляра в таблице виртуальных методов и передавать этот размер процедуре dispose. Деструкторы применяются, когда полиморфные объекты должны быть очищены и освобождено их место в динамической памяти.

Рассмотрим программу, которая:

  1. строит иерархию графических объектов (точка, маркер, окружность), выводит их на экране и может перемещать эти изображения по экрану;

  2. выполняет предыдущее задание с использованием виртуальных методов;

  3. создаёт связанный список динамических объектов (графических изображений) и выводит их на экран.

Для создания связанного списка динамических объектов создадим новый тип объекта 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) Найти минимумы нечетных столбцов матрицы;

7) Найти произведение двух матриц.

Лабораторная работа №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. Тема – рекурсия, косвенная рекурсия.

  1. Написать программу для определения четно или нет количество символов введенной строки, для этого использовать косвенную рекурсию. Переделать косвенную рекурсию в прямую. (См. лекцию по теме «Рекурсия»).

  2. Написать программу, которая рисует на экране полигон (при помощи мыши), после указания точки внутри полигона, полигон закрашивается. Использовать рекурсивный алгоритм закраски.

Лабораторная работа №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. Тема – работа с двоичными деревьями поиска.

  1. Написать программу «частотный словарь». С клавиатуры вводятся слова, которые помещаются в двоичное дерево поиска. После окончания ввода слова выводятся на экран в алфавитном порядке (использовать обратный обход) с указанием частоты появления каждого слова.

  2. Написать программу для регистрации участников семинара. Информация о каждом участнике – город, фамилия, организация. После регистрации информацию выдать на экран следующим образом: распечатать список городов по алфавиту и для каждого города список участников по алфавиту (названия городов поместить в двоичное дерево поиска, и в каждом его узле хранить ссылку на его двоичное дерево участников).

Лабораторная работа №21. Тема – создание объектно-ориентированных программ

Написать программу, в которой определить массив указателей на динамические объекты. Объекты – снежинки мерцающие и снежинки падающие. Они являются наследниками класса «снежинка». После инициализации визуализировать массив – для каждого его элемента вызвать виртуальный метод «проявить визуальный эффект».