Реферат: В. А. Давыденко программирование и основы алгоритмизации лабораторный практикум




ГОУ ВПО

КЕМЕРОВСКИЙ ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТ

ПИЩЕВОЙ ПРОМЫШЛЕННОСТИ


Г.И. Станевко, Т.Г. Колесникова, В.А. Давыденко


ПРОГРАММИРОВАНИЕ И ОСНОВЫ АЛГОРИТМИЗАЦИИ


Лабораторный практикум


Для студентов вузов


Кемерово 2010

УДК 004.9 (075)

Б


БК 32.973-018

С 76


Рецензенты

В.Я. Карташов, доктор техн. наук, профессор;

В.С. Черкасов, канд. физ.-мат. наук, доцент.


Рекомендовано редакционно-издательским советом

Кемеровского технологического института пищевой промышленности


Станевко Г.И.

С 76 Программирование и основы алгоритмизации: лабораторный практикум / Г.И. Станевко, Т.Г. Колесникова, В.А. Давыденко. – Кемерово: КемТИПП, 2010. – 127 с.

ISBN


Лабораторный практикум предназначен для проведения лабораторных работ по дисциплине «Программирование и основы алгоритмизации». В него включены 15 лабораторных работ. В каждой работе излагаются теоретически основы по теме выполняемой работы, приводятся демонстрационные примеры, предлагаются вопросы по контролю входных знаний и задания с вариантами для самостоятельного выполнения. Выбор изучаемых тем соответствует содержанию Государственного образовательного стандарта высшего профессионального образования.

Материал лабораторного практикума охватывает широкий круг алгоритмов обработки структур данных. Лабораторный практикум предназначен для студентов специальности 220301 - Автоматизация процессов и производств (по отраслям) всех форм обучения.


УДК 004.9 (075)

ББК 32.973-018


ISBN


© КемТИПП, 2010
Оглавление



Оглавление 4

Предисловие 6

Модульное программирование 7

Построение программного меню 13

Алгоритмы работы экрана в текстовом режиме 19

ООП. Разработка программы с объектом «Окно» 27

ООП. Наследование 30

ООП. Полиморфизм. Сокрытие полей и методов 35

Обработка символьной информации 39

Обработка данных типа записи 50

Формирование и обработка переменных файлового типа. Типизированные файлы 57

Формирование и обработка данных файлового типа. Текстовые файлы 70

Динамические структуры данных 81

Работа в графическом видеорежиме 88

Последовательности, рекуррентные соотношения 98

Рекурсивные алгоритмы 107

1.Описать в виде формулы или словесно рекурсивность задачи Вашего варианта (см. табл. 13). 116

2.Разработать и отладить программу. 116

3.Разработать таблицу трассировки параметров рекурсивной подпрограммы и заполнить её. 116

4.Разработать блок-схему решения задачи циклическим алгоритмом. 116

Алгоритмы на множествах 118

Библиографический список 133

Приложение 134



Предисловие

Лабораторный практикум является составной частью методического обеспечения дисциплины «Программирование и основы алгоритмизации» и отвечает требованиям Федерального Государственного Образовательного Стандарта специальности 220301 – Автоматизация технологических процессов и производств.

В его состав входят 15 лабораторных работ. Каждая лабораторная работа посвящена определенной теме и построена по единому сценарию:

Изложены теоретические основы, вводящие в проблему тематики выполняемой работы. Изложение сопровождается демонстрационными примерами;

Сформулированы вопросы для контроля входных знаний;

Приведены задания, подлежащие выполнению.

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

В качестве языка программирования выбран язык высокого уровня Turbo Pasсal 7.0.


Лабораторная работа

^ Модульное программирование

Основы теории

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

Модуль – это автономно компилируемая коллекция программных ресурсов, предназначенная для использования другими модулями и программами.

Модульное программирование – это технология программирования, приводящая к значительному уменьшению сроков разработки программ и количества программных ошибок.

Все ресурсы модуля делятся на две группы: внешние – предназначенные для использования другими программными единицами, и внутренние – рабочие ресурсы данного модуля.

Структура модуля имеет вид:


Unit < имя модуля >;

Interfaсe <интерфейсная секция>

Implementation <секция реализации>

[ BEGIN <секция инициализации> ]

END.


Имя модуля должно совпадать с именем файла, в котором он содержится.

Интерфейсная секция содержит объявления ресурсов (в том числе заголовки подпрограмм), к которым возможны обращения извне.

^ Секция реализации содержит описание подпрограмм, объявленных в интерфейсной секции, и описание внутренних ресурсов модуля. Обращение к этим ресурсам возможно только из подпрограмм, описанных в том же модуле.

^ Секция инициализации содержит операторы, которые выполняют некоторые действия, необходимые для нормальной работы процедур модуля (например, открывают файлы, изменяют цвет, выдают информацию о разработчике и т.п.) Операции этой секции выполняются один раз при включении модуля до начала выполнения основной программы. Эта секция в модуле может отсутствовать, что показано включением ее в квадратные скобки ([ ]).

В результате компиляции модуля система формирует одноимённый файл, имеющий расширение .tpu.

Среда языка Borland Pascal предусматривает три режима компиляции программы, использующей модули (главное меню, пункт Compile):

^ Compile – компилируется только основная программа, все модули должны быть предварительно откомпилированы в tpu–файлы и размещены либо в текущем каталоге, либо в одном из каталогов, указанных как источники tpu–файлов в настройках среды (Options/Directories);

Make – модули, для которых не обнаружены tpu–файлы компилируются из соответствующих pas–файлов, которые должны находиться либо в текущем каталоге, либо в одном из каталогов, указанных как источники pas–файлов в настройках среды (Options/Directories);

^ Build – все ранее откомпилированные tpu–модули игнорируются и все модули компилируются из своих исходных файлов заново.

В процессе отладки модулей целесообразно использовать режим ^ Build, а при отладке программы – режим Compile.


Внимание!

При запуске программы на выполнение (Ctrl+F9) программа и подключаемые к ней пользовательские модули должны быть размещены либо в текущем каталоге, либо в одном из каталогов, указанных в настройках среды (Options/Directories). В противном случае система выдаст ошибку (15 File not found – файл не найден).


^ Демонстрационный пример


Unit Mod_Mas1; {Имя файла: Mod_Mas1.pas}

Interface

{Блок объявления типов:}

Type TM1_r = array[1..15] of real;

{Блок объявления подпрограмм:}

Procedure Input (var n: byte; var X: TM1_r); {возвращает количество элементов массива ^ X и их значения}

Procedure Print (n: byte; X: TM1_r); {выводит на экран количество элементов массива X и их значения}

Function Sum (n: byte; X: TM1_r): real; {возвращает сумму элементов массива X}

Implementation

Uses Crt;

Procedure Input;

Var i: byte; {i – локальный ресурс – параметр цикла}

Begin

writeln (‘Введите:’);

write (‘количество элементов массива = ’);

readln (n);

writeln (‘значения элементов: ’);

For i:= 1 to n do

begin

write (‘X[’, i, ‘] = ’);

readln (X[i]);

end;

End;


Procedure Print;

Var i: byte; {i – локальный ресурс – параметр цикла}

Begin

writeln (‘Значения элементов массива равны: ’);

For i:= 1 to n dо

writeln (‘X[’, i, ‘] = ’, X[i]: 8: 2);

End;


Function Sum;

Var i: byte; {i – локальный ресурс – параметр цикла}

s: real; {s – локальный ресурс для накопления суммы}

Begin

s:= 0;

For i:= 1 to n do

s:= s+X[i];

Sum:= s; {присваивание выполнено для передачи значения суммы во внешнюю среду}

End;


BEGIN

ClrScr;

writeln (‘Модуль разработан Ивановым М.Ф.’);

readln;

END.


Контроль входных знаний

Чем отличается модульное программирование от процедурного?

Как подключить пользовательский модуль к программе?

Какой пункт главного меню содержит информацию о размещении tpu и pas–файлов?

Ваши действия в случае, если при запуске программы на выполнение система выдаст ошибку ‘15 File not found’?

Модуль – это отдельно компилируемая или отдельно исполняемая конструкция языка?

Какому условию должны удовлетворять имя модуля и имя файла, хранящего этот модуль?

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

Объявите в модуле подпрограмму-функцию и подпрограмму-процедуру нахождения номера наибольшего по значению элемента одномерного массива.



^ Задания для выполнения

Средствами модульного программирования решить задачу обработки одномерного числового массива (см. табл. 1).

Таблица 1

Варианты заданий


№ варианта

Задание

1

Найти сумму элементов до первого положительного и произведение остальных элементов.

2

Найти количество чётных элементов, попавших в интервал [a, b].

3

Найти количество элементов, стоящих на нечётных местах и меньших заданного числа.

4

Найти количество элементов, кратных заданному числу и не попавших в интервал [a, b].

5

Найти количество нечётных элементов до первого положительного и произведение элементов после него.

6

Найти произведение элементов, стоящих на нечётных местах и меньших заданного числа.

7

Найти сумму элементов кратных заданному числу, расположенных до первого положительного и произведение положительных элементов после него.

8

Найти количество элементов до первого отрицательного, попавших в интервал [a, b], и количество отрицательных элементов после него.

9

Положительные элементы массива расставить в порядке убывания.

10

Чётные элементы массива расставить в порядке убывания.

11

Вставить заданное число после последнего отрицательного элемента массива.

12

Вставить заданное число после максимального элемента массива.

Окончание табл. 1


№ варианта

Задание

13

Найти первый элемент, кратный заданному числу и произведение отрицательных элементов после него.

14

Вставить минимальный элемент перед элементом, равным заданному значению.

15

Найти сумму элементов, стоящих на нечётных местах и не превышающих длину интервала [a, b].

16

Вставить последний отрицательный элемент после минимального элемента массива.

17

Вставить минимальный элемент после первого, равного нулю.

18

Найти среднее значение чётных элементов до первого положительного и произведение отрицательных элементов после него.

19

Неположительные элементы массива расставить в порядке убывания.

20

Вставить заданное число перед максимальным элементом массива.

21

Вставить минимальный элемент после первого отрицательного элемента массива.

22

Удалить первый положительный элемент, расположенный после минимального элемента массива.

23

Положительные элементы массива расставить в порядке возрастания.

24

Вставить минимальный элемент после первого, кратного заданному числу.

25

Нечётные элементы массива расставить в порядке возрастания.



Лабораторная работа

^ Построение программного меню

Основы теории

Пользовательский интерфейс меню обычно имеет вид:


МЕНЮ

1. Ввод данных

2. Обработка данных

3. Вывод результатов

4. Выход


Ваш выбор –


Любой пункт меню может, в свою очередь, содержать вызов подменю.

Алгоритм построения меню основан на дополнительной структуре структурного программирования – операторе выбора:


Case <управляющий параметр-код> of

{значения параметра:}

P1: <оператор 1>;

P2: <оператор 2>;

. . .

PN: <оператор N>

else < альтернативный оператор>;

end;


где управляющий параметр-код – выражение или переменная любого перечисляемого типа;

P1, P2, …, PN – значение управляющего параметра;

<оператор 1>, …,<оператор N> – операторы, вызывающие подпрограммы, ответственные за конкретные пункты меню, и могут быть простыми или составными;

альтернативный оператор – простой или составной оператор, выполняемый при значении управляющего параметра, не равного ни одному из значений P1, P2, …, PN;

часть else как необязательная может отсутствовать.


Возврат в меню осуществляется через цикл по управляющему параметру; выход – через <оператор N> или <альтернативный оператор>.

Для организации размещения меню на экране используют оконный режим, который реализуется с помощью сервисных процедур модуля CRT:

^ Window (X1, Y1, X2, Y2: byte) – задание текущего прямоугольного окна с левой верхней вершиной (X1, Y1), и правой нижней (X2, Y2);

TextColor (C: byte) – выбор цвета символов на экране;

TextBackGround (C: byte) – выбор цвета фона активного окна;

^ GotoXY (X, Y: byte) – установка курсора в строку X и столбец Y текущего окна, позволяет размещать меню в удобном для каждой программы месте экрана, а текст – по центру текущего окна. Переменная X – номер позиции в строке экрана, Y – номер строки. Отсчёт позиций и строк экрана ведётся от левого верхнего угла, 1  X  80, 1  Y  25.

Действия процедуры ClrScr следует рассматривать как процесс заливки экрана выбранным цветом.

Алгоритм создания окна и задания цветов символов и фона:

создаём окно;

задаём цвет символов;

задаём цвет фона под символами;

заливаем окно цветом фона.

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

размеры окна – экрана, задав координаты левой верхней вершины (1, 1) и правой нижней – (80, 25);

жёлтый цвет символов и синий цвет фона.


Контроль входных знаний

Чем отличается оператор Case от условного оператора?

Как записать значение управляющего параметра символьного типа?

Возможно ли присутствие в одном операторе Case нескольких управляющих параметров?

Заголовок подпрограммы MENU, выводящей на экран текст меню и запрашивающей значение управляющего параметра для передачи его во внешнюю среду, имеет вид:


^ Procedure MENU;


Какая ошибка допущена в её заголовке?

Пункт “Обработка данных” главного программного меню содержит в свою очередь подменю, состоящее из m пунктов. Как организовать возврат из этого подменю в главное меню?


^ Задания для выполнения

Разработать программу, управляемую через программные меню. Пункты главного меню должны обеспечивать ввод, вывод и обработку исходных данных, кроме этого пункт “Обработка данных” должен обеспечивать вызов дополнительного подменю, подпрограммы которые реализуют обработку данных согласно решаемой задаче (см. табл. 2). В программе предусмотреть её реакцию на отсутствие требуемых данных.

Таблица 2

Варианты заданий


№ вари-анта

Задание

Организовать ввод и вывод элементов одномерного массива. Вывести значение требуемого элемента массива:

1

первого чётного;

наибольшего.

2

первого отрицательного;

последнего, равного заданной величине.

Продолжение табл.2


№ вари-анта

Задание

3

первого, целая часть которого меньше заданной величины;

последнего кратного произвольному значению q.

4

последнего, большего заданной величины;

первого, дробная часть которого равна нулю.

Организовать ввод и вывод элементов одномерного массива. Вывести значение требуемых сумм элементов массива:

5

всех, дробная часть которых равна нулю;

меньших заданной величины.

6

попавших в заданный интервал;

отрицательных.

7

не попавших в заданный интервал;

чётных.

8

кратных произвольному значению q;

положительных.

9

меньших заданной величины;

дробная часть которых больше произвольного значения q.

10

положительных;

принадлежащих заданному интервалу.

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

11

наибольший;

первый положительный.

12

наименьший;

первый чётный.

13

первый, равный заданной величине;

последний чётный.

14

последний отрицательный;

первый, попавший в заданный интервал.



Окончание табл. 2


№ вари-анта

Задание

15

последний, не попавший в заданный интервал;

первый отрицательный, принадлежащий главной диагонали.

Организовать ввод и вывод элементов одномерного массива. Сформировать новые массивы из элементов:

16

чётных;

попавших в заданный интервал.

17

больших некоторой заданной величины;

совпадающих по значению со своими порядковыми номерами.

18

отрицательных;

нечётных.

19

кратных некоторому числу;

расположенных после элемента с заданным номером.

Организовать ввод и вывод элементов двумерного массива. Определить суммы требуемых элементов:

20

принадлежащих главной диагонали;

всех положительных.

21

расположенных выше главной диагонали;

всех чётных.

22

расположенных ниже главной диагонали;

всех, не превышающих заданной величины.

23

принадлежащих заданной строке;

всех, целая часть которых меньше некоторой величины.

24

принадлежащих заданному столбцу;

всех, попавших в заданных интервал.

25

до первого отрицательного;

положительных, принадлежащих побочной диагонали.



^ Лабораторная работа

^ Алгоритмы работы экрана в текстовом режиме

Основы теории

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

В Turbo Pascal работа экрана в текстовом режиме обеспечивается средствами модуля CRT.

Аббревиатура CRT расшифровывается по-русски как «электроннолучевая трубка». По умолчанию программа в Turbo Pascal использует режим, при котором на экране выделяется 25 строк и 80 столбцов.

Модуль CRT содержит типы, константы, переменные и подпрограммы, которые позволяют:

выполнять вывод в заданное место экрана заданным цветом символа и фона;

открывать на экране окна прямоугольной формы и выполнять вывод в пределах этих окон;

очищать экран, окно, строку и её часть;

обрабатывать ввод с клавиатуры: управлять курсором, проводить опрос клавиатуры;

управлять встроенным динамиком.

Буфер клавиатуры – участок оперативной памяти, организованный по принципу очереди, в котором может храниться до 127 символов, вводимых с клавиатуры.

При подключённом модуле CRT можно выводить на дисплей строки и символы, содержащие в себе управляющие коды (коды 0..31). При этом они не будут оказывать управляющие воздействия, а будут изображаться на дисплее, согласно таблице изображения символов по их ASCII-коду. Исключение составляют лишь четыре кода:

#07 – вызывает один короткий звук динамика;

#08 – перемещает курсор влево на один символ, если есть куда сдвинуться в пределах строки; в противном случае не имеет эффекта;

#10 – перемещает курсор на строку ниже, не меняя текущего столбца. Если курсор находился в последней строке экрана, то информация выдаётся на первой строке нового экрана, то есть экран «прокручивается» на строку вверх;

#13 – перемещает курсор в начало текущей строки.


Процедуры и функции модуля ^ CRT

Работа с экраном в целом

Процедура Window (X1, Y1, X2, Y2: byte) – создаёт текущее окно, где (X1, Y1) – координаты верхней левой вершины, и (X2, Y2) – правой нижней вершины.

Координаты текущего окна хранятся в специальных переменных WindMin: word и WindMax: word. Для их определения используются функции Lo (WM: word): byte – левый и Hi (WM: word): byte – правый, поэтому


^ X1 = Lo (WindMin); Y1 = Hi (WindMin);

X2 = Lo (WindMax); Y2 = Hi (WindMax);


Процедура ClrScr – заливает текущее окно экрана текущим цветом.


Позиционирование курсора

Процедура GotoXY (X, Y: byte) – устанавливает курсор в столбец X, строку Y.

Функция WhereX: byte – выдаёт номер текущего столбца.

Функция WhereY: byte – выдаёт номер текущей строки.

Процедура ^ ClrEOL – стирает все символы строки справа от курсора.

Процедура InsLine – вставляет пустую строку на место текущей.

Процедура DelLine – удаляет текущую строку.


Настройка цвета

Процедура TextColor (C: byte) – задаёт цвет символа.

Процедура TextBackGround (C: byte) – задаёт текущий цвет фона окна.

Для кодировки цвета используются десятичные числа 0..15 и 128.


Black = 0

{черный}

DarkGrey = 8

{темно-серый}

Blue = 1

{синий}

LightBlue = 9

{светло-серый}

Green = 2

{зеленый}

LightGreen = 10

{светло-зеленый}

Cyan = 3

{голубой}

LightCyan = 11

{светло-голубой}

Red = 4

{красный}

LightRed = 12

{розовый}

Magenta = 5

{фиолетовый}

LightMagenta = 13

{сиреневый}

Brown = 6

{коричневый}

Yellow = 14

{желтый}

LightGrey = 7

{светло-серый}

White = 15

{белый}

Blink = 128

{мерцание}








Текущие цвета фона и символа можно определять через выше приведенные процедуры или через значение специальной переменной ^ TextAttr: word, через которую цвет фона определяется как


(TextAttr div 16) mod 8,


а текущий цвет символа как


TextAttr mod 8,


где div – целочисленное деление,

mod – остаток от деления нацело.


Так, приведенные ниже операторы выполняют следующие действия:


TextAttr:= 16 + 14; {выделяет красные символы на синем фоне}

TextAttr:= 2·16 + 15; {выделяет белые символы на зеленом фоне}


Подача звуковых сигналов

Процедура ^ Sound (Hz: word) – включает звук с частотой Hz в герцах.

Процедура NoSound – выключает звук.


Использование встроенного таймера

Delay (ms: word) – задержка процесса (пауза) в ms миллисекунд.


Опрос клавиатуры

Функция ^ KeyPressed: Boolean – описывает состояние буфера клавиатуры и принимает значение true, если в буфере есть хотя бы один символ, и false, если буфер пуст.

Функция ReadKey: char – анализирует буфер клавиатуры и если он не пуст, то в качестве результата возвращает первый символ буфера. В противном случае ожидается нажатие на любую клавишу.

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

Первый цикл – цикл ожидания нажатия любой клавиши:


repeat until Keypressed;


приводит к ожиданию нажатия любой клавиши, вырабатывающей код, при условии, что буфер клавиатуры пуст (^ KeyPressed = False). Если же буфер клавиатуры содержит хотя бы один код (KeyPressed = True), то этот цикл не приводит ни к каким действиям и управление передаётся следующему за ним оператору.

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


while KeyPressed do ch:= ReadKey; {ch – переменная типа char}


Информация, считанная при нажатии клавиши, поступает в буфер клавиатуры и занимает в нём очередной байт. Нажатие цифровых, буквенных и символьных клавиш посылает в буфер клавиатуры ASCII-код (один символ). Нажатие управляющих функциональных клавиш F1-F10, клавиш управления курсором, клавиш Enter и Escape, а также совокупности клавиш Alt +…, Ctrl +…, посылает в буфер клавиатуры не один, а два символа, первый из которых #0. Такая пара символов называется расширенным кодом клавиатуры.

В таблице 3 приведены коды функциональных клавиш.

Таблица 3

Коды функциональных клавиш


Клавиша

Нажатие

Клавиша

Нажатие

A–Z

65–90

End

079

↑

072

Delete

083

→

077

Page Up

073

↓

080

Page Down

081

←

075

F1–F10

059–068

Ins

082

F11

0133

Home

071

F12

0134


Функция Chr (x: byte): char – возвращает символ, соответствующий ASCII-коду x, x – переменная, константа или выражение типа byte (0 ≤ x ≤ 255).

Пример 1.


writeln (Chr (17)); {Результат – символ ◄}


Функция Ord (ch: char): byte – возвращает числовой код, соответствующий символу ch.


Пример 2.


writeln (Ord (‘A’)); {Результат – числовой код = 65}


Распознать принадлежность нажатой клавиши к простому или расширенному коду можно по алгоритму, реализованному фрагментом примера 3.

Пример 3.


Var

ch1, ch2: char; {символьные значения нажатой клавиши}

…

ch1:= Readkey; {считываем нажатие клавиши}

if ch1 = #0 then {если код расширенный}

begin

ch2:= Readkey; {считываем второй символ расширенного кода}

writeln (‘Расширенный код = ’, ord (ch2))

end

else

writeln (‘Код = ’, ord (ch1));


Функции опроса клавиатуры в совокупности с оператором выбора Case позволяют реализовывать процессы обработки нажатий только на определённые клавиши и даже переопределять функции, закреплённые за этими клавишами.

Пример 4.

Переопределение функций, закреплённых за клавишами: PgUp, PgDn, → , ← ; обработка нажатий на эти клавиши и клавишу Enter.


Var

ch1, ch2: char; {символьные значения нажатых клавиш}

p: byte; {ключ для оператора Case}

k: integer; {счётчик повторений цикла}

…

BEGIN

…

k:= 0;

repeat

k:= k + 1;

while KeyPressed do ch:= ReadKey;{очищаем буфер клавиатуры}

ch1:= Readkey; {считываем нажатие клавиши}

if ch1 = #0 then {если код расширенный – клавиша упра­вляющая}

ch2:= Readkey; {считываем второй символ расширенного кода}

p:= Ord (ch2); {определяем ASCII-код, нажатой клавиши}

gotoXY (40, 12);

Case p of

73: begin GotoXY (40, 5); write (k, ‘Маше дали кашу’);

end;{PgUp}

81: begin GotoXY (40, 2); write (k, ‘Маша съела кашу’);

end;{PgDn}

77: begin GotoXY (60, 12); write (k, ‘Маша ест кашу’);

end;{→}

75: begin GotoXY (10, 12); write (k, ‘Маша, ешь кашу!’);

end;{←}

end;

until (ch1 = #13) or (k = 20); {#13 – Enter}

…

END.


Контроль входных знаний

Какие функции выполняет функция ReadKey?

К моменту выполнения оператора Ch1:= ReadKey; в буфере клавиатуры находились коды нажатия клавиш Delete, End и F1. По запросу этого оператора Вы нажали клавишу Enter. Код какой клавиши будет считан в переменную ch1?

Какой вид имеет цикл очистки буфера?

Как обрабатываются расширенные коды клавиатуры?

Какие функции выполняет функция KeyPressed?

В программе выполняется цикл, управляемый функцией KeyPressed. Как отразится на его выполнении случайное нажатие на любую клавишу?

При выводе ASCII-кодов 0..31 символы каких кодов не будут отображены на экране?


Задания для выполнения

Открыть 4 окна разного цвета и вписать:

в первое – тему лабораторной работы;

во второе – фамилию, имя, отчество, номер группы исполнителя и ASCII-коды фамилии;

интерфейсом третьего окна должен быть текст меню:


МЕНЮ

1. Ввод данных

2. Обработка данных

3. Вывод результатов

4. Выход


Ваш выбор –


в четвертом окне разместить символы, соответствующие ASCII-кодам из интервала [0..n], где n – количество символов Вашего полного имени.

Во втором окне реализовать процесс отображения бегущей строки.

В третьем окне реализовать циклический процесс, управляемый клавишей Escape (код #27), в котором нажатие управляющей клавиши из совокупности: ←, →, ↑, ↓ вызывает изменение цвета символов соответствующего ей пункта меню.



^ Лабораторная работа

^ ООП. Разработка программы с объектом «Окно»

Основы теории

Объектно-ориентированное программирование (ООП) – это технология программирования, базирующаяся на свойствах:

инкапсуляции – объединения данных и методов их обработки в одну конструкцию при определении объектного типа;

наследования – создания иерархии объектных типов с тем, чтобы поля данных и методы предков автоматически были полями данных и методами потомков;

полиморфизма – такого определения методов в иерархии классов, чтобы метод с одним именем мог применяться к различным родственным объектам, сохраняя при этом возможность переопределять его собственными действиями.

^ Объектный тип в дальнейшем будем называть классом, данные – полями (аналогично типу record – запись), а процедуры и/или функции, обрабатывающие эти поля – методами.

Объявление класса осуществляется в разделе объявления типов программы или модуля по структуре:


Type <имя класса> = object

{объявление полей данных}

{объявление методов, содержащее только их заголовки}

end;


Полное объявление методов размещается в описательной части программы или в разделе Implementation модуля. При этом список формальных параметров опускается, а перед именем метода через точку указывается имя класса, к которому этот метод принадлежит.

Синтаксис полного объявления методов имеет вид:

для метода-процедуры:


procedure <имя класса>.< имя метода>;

{объявление местных ресурсов}

<тело подпрограммы-процедуры>;


для метода-функции:


function <имя класса>.< имя метода>;

{объявление местных ресурсов}

<тело подпрограммы-функции>;


Инициализацию полей класса принято возлагать на один из его методов, который является процедурой и, по установившейся традиции, поименован как метод Init.

Переменная, объявленная через конкретный класс, называется экземпляром этого класса или объектом и объявляется по стандартным правилам объявления переменных.

Обращение к полям и методам объекта осуществляется через составное имя


<имя объекта>.<вызываемое поле или метод>


Вспомогательный материал

Оператор присоединения, применяемый при работе с составными именами:


With … do begin … end;


Функция TextColor (C: byte) модуля CRT – устанавливает цвет символов (С = 0..15; C = 128 – мерцание).

Функции WindMax и WindMin типа word хранят информацию о размерах текущего окна.



Контроль входных знаний

Что общего в данных типа record и типа object?

В чём заключается свойство инкапсуляции и на каком этапе конструирования объекта оно используется?

Какая часть процедур и функций включается в класс?

Методы Init и MakeWin класса Win объявлены как


Procedure Init (…);

Procedure MakeWin;


Как оформить их заголовки при полном описании методов?

Какая функция при конструировании класса возлагается на метод Init?

Переменные a, b, c типа real являются полями некоторого класса. Как объявить метод их инициализации? Как организовать вызов этого метода из основной программы?

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


^ Задания для выполнения

Дан фрагмент объявления класса Win:


Type Win = Object {класс ОКНО}

{Поля:}

x1, y1, {координаты верхнего левого угла окна}

x2, y2, {координаты нижнего правого угла окна}

colf: byte; {цвет фона}

{Заголовки методов:}

{инициализация полей:}

Procedure Init (<список формальных параметров>);

{создание окна:}

Procedure MakeWin;

{задание размеров окна по оси OX:}

^ Function GetSizeX: byte;

End;

Procedure Win. MakeWin;

Begin

Window (x1, y1, x2, y2); {изображение текущего окна на экране}

Textbackground (colf); {установка фона: colf = 0..7}

ClrScr;

End;


Дополнить класс функцией задания размеров окна по оси OY.

Разработать модуль, содержащий данный класс.

Разработать программу, выводящую на экран:

цвет и размеры окна;

окно выбранного Вами цвета;

три окна разных размеров и цветов;

случайное количество окон случайных цветов.

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

Вписать в одно окно Вашу фамилию, в другое – имя. Дополнить класс методом вывода строковых данных в заданное окно.

Сформировать окно(а) и разместить в нём/них название лабораторной работы.



^ Лабораторная работа

^ ООП. Наследование

Основы теории

Условимся в дальнейшем тип объекта называть классом, а экземпляр класса называть объектом.

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

Иерархия классов с наследованием образует дерево классов, в корне которого находится родительский класс. Дерево может иметь несколько уровней и ветвей, на каждом уровне добавляются необходимые поля и методы.

Потомок наследует все поля и методы родителя и дополняет их собственными полями и методами.

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

Отношения между различными классами проекта принято иллюстрировать диаграммой отношений классов, такую диаграмму называют иерархией классов (Рис. 1).





Рис. 1. Демонстрация иерархии классов

В иерархии классов методы можно переопределять, т.е. называть одинаковыми именами, поля же переопределять нельзя.

Поиск метода в иерархии классов выполняется следующим образом:

В первую очередь компилятор устанавливает тип класса.

Ищет метод в этом классе и если находит, то подключает его.

Если метода в данном классе нет, то идёт поиск в родительском классе. В случае успеха вызывается метод родителя.

Если метод в родителе не найден, то поиск продолжается в классах-предках (в направлении к корню дерева) до тех пор, пока вызванный метод не будет найден.


Если компилятор не обнаруживает метод, то он фиксирует ошибку 44 (^ Field indentifier expented – ожидается имя поля или метода класса).


Объявление класса-потомка

Структура объявления класса-потомка имеет вид:


Type <имя класса-потомка> = Object (<имя класса-родителя>)

<собственные поля класса-потомка>;

<собственные методы класса-потомка>;

End;


Активизация полей и методов родительского класса.

Доступ к полям родителя осуществляется в потомке как к собственным. Обращение же к методам осуществляется через составное имя:


<имя класса-родителя>.<вызываемый метод>;


или через использование служебного слова inherited (наследуемый):


inherited <вызываемый метод>;

Вспомогательный материал

Процедуры Inc (k) и Dec (k) – формируют соответственно следующее и предыдущее значения переменной k.

Процедуры Inc (k, n) и Dec (k, n) – соответственно увеличивают и уменьшают значения переменной k на n.


Контроль входных знаний

В чём заключается наследование?

Что иллюстрирует диаграмма иерархии классов?

Можно ли из класса-наследника вызвать метод класса-предка? Если такой вызов возможен, то объясните почему. Возможен ли вызов метода в обратном направлении?

Что произойдёт, если в классе-наследнике не предусмотрена инициализация полей родительского класса?

Класс-родитель T_obj1 имеет поля a1, b1, c1, инициализация которых осуществляется через метод


Procedure Init (a1f, b1f, c1f: real);

^ Begin

a1:= a1f;

b1:= b1f;

c1:= c1f;

En
еще рефераты
Еще работы по разное