| Program slovo; Var word1, word2: string[60]; Begin readln(word1); readln(word2); if word1 > word2 then writeln ('>') else begin if word1 = word2 then writeln ('=') else writeln ('<'); End. |
Множества.
Множеством называется упорядоченная совокупность данных одного типа, записанных без повторений и отсортированных по возрастанию. Максимальное множество состоит из 256 элементов. Для объявления множеств используется зарезервированное слово set, за которым указывается тип элемента множества или сами элементы.
Пример:
type A: 5..9;
var
B: set of A;
C: set of char;
D: set of '1'..'5';
Внутри программы элементы множества записываются в квадратных скобках. Для перечисления используется интервальный, перечисляемый типы или их комбинации.
Пример: e:['A'..'Q', 'T', 'x'..'z']
Элементы множеств нельзя вводить с клавиатуры и выводить стандартными операторами, т.к. элементы множества относятся к перечисляемому типу.
Над множествами можно выполнять следующие операции:
Пример: из введенной последовательности символов, признаком конца которой является '0', сформировать множество заглавных и строчных латинских букв.
var
c: char;
a, pl: set of 'A'..'Z';
b, sl: set of 'a'..'z';
i: char;
Begin
pl:= [0];
sl:= [0];
repeat
read(c);
if [c] in a then pl:=pl+[c];
if [c] in b then sl:=sl+[c];
until [c]='0';
for i:='A' to 'Z' do
if [i] in pl then write(i:3);
for i:='a' to 'z' do
if [i] in sl then write(i:3);
End.
Записи.
Пример:
Лекция 11 Объектно - ориентированное программирование
Тип объект.
Объект можно рассматривать как усовершенствование типа запись, в которой описание свойств и параметры моделируемой сущности дополняются методами - описаниями действий с объектом. В отличие от записи объект объявляется словом object.
Пример: создадим простейший объект: позицию на экране в графическом режиме:
program oop;
uses graph;
type pozicia = object
x, y: integer;
procedure init (xn, yn: integer);
procedure locate (var xl, yl: integer);
end;
procedure pozicia.init;
begin
x:=xn;
y:=yn;
end;
procedure pozicia.locate;
begin
xl:=x;
yl:=y;
end;
var d, r, xx, yy: integer;
p: pozicia;
begin
d:=detect;
randomize;
initgraph (d, r, 'c:\tp\bgi');
p.init (random(GetMaxX), random(GetMaxY));
closegraph;
p.locate (xx, yy);
write (xx, yy);
end.
Инкапсуляция.
Одним из главных свойств ООП является инкапсуляция - замыкание в общей оболочке (Object…end) всех составляющих описания. При этом поля оказываются глобальными для методов данного объекта, т.к. у полей и методов общая область действия, то совпадение имен полей и формальных параметров методов не допустимо. Блоки-методы вынесены за описание типа объект. Имена блоков-методов, принадлежащих разным типам могут совпадать. Даже при совпадении имен заголовки методов будут различны, т.к. состоят из префикса (имени типа) и имени метода.
Доступ к полям объектов из вне можно принудительно ограничивать. Для этого группа полей в описании объекта заключается в скобки Private Public. После этого поля окажутся доступными лишь методам данного модуля.
Наследование.
Примитивные объекты не используются как програмные модули, а используются в качестве носителей общих свойств и методов. Такие объекты называют родительскими. Объекты основанные на родительских называют дочерними. Родительский тип не используемый для описания переменных называется абстрактным. Тип потомок наследует все поля типа отца. В их числе все поля унаследованные отцом, если у него есть предки. Увеличение числа полей у потомка необязательно. Наследоваться также могут и методы, но выборочно. Описание типа потомка имеют отличительную деталь - имя типа отца:
<имя типа потомка>=object(<имя типа отца>)
С увеличением сложности объектов увеличивается число действий, которое можно заменить построением нового метода, причем имена методов создаются так, как если бы объекты не имели между собой родственной связи. Одинаковое обозначение функционально-подобных методов упрощает не только восприятие системы объектов, но и программирование.
Важной деталью использования наследования в программах является применение присваивания объектам значений объектов. Присваивание A:=B допустимо, если A и B - однотипны, A - предок B или для каждого поля A есть соответствующее поле в B.
Полиморфизм.
Полиморфизм предполагает определение класса или нескольких классов для родственных объектных типов так, что каждому классу отводится своя функциональная роль. Методы одного класса обычно наделяются общим именем. В ситуации когда необходимо сложный метод использовать в нескольких объектах и различия в поведении объектов минимальны, возможно создание смежного сложного метода с вынесением различий в сменные подчиненные методы. Такой метод называется конструктивным полиморфизмом. Осуществляется эта идея созданием виртуальных сменных методов. В заголовке такого метода присутствует слово virtual, а для их подключения к общему методу - обращение к конструктору - блоку со специальным заголовком.
constructor <имя блока> (<список формальных параметров>)
К конструктору надо обращаться для каждого объекта использующего виртуальные методы.
Задача: тип kom - сын типа pozicia представляет закрашенные квадраты с длиной стороны raz (в пикселах). Наследуемые поля x, y являются координатами центра квадрата. Процедура kom.zoom увеличивает (уменьшает) объект если аргумент znak>0 (znak<=0). Длина raz изменяется на 2*delt, где delt - еще один аргумент.
uses graph, crt;
type pozicia = object
x, y: integer;
procedure init (xn, yn: integer);
procedure locat (var xl, yl: integer);
end;
kom=object (pozicia)
cvet, raz: word;
procedure init (xn, yn: integer; color: word);
procedure zoom (delt, znak: integer);
end;
procedure pozicia.init;
begin
x:=xn;
y:=yn;
end;
procedure pozicia.locat;
begin
xl:=x;
yl:=y;
end;
procedure kom.init;
begin
pozicia.init (xn, yn);
cvet:=color;
raz:=1;
end;
procedure kom.zoom;
var j, d: integer;
begin
if znak>0 then setcolor (cvet)
else setcolor (getBkcolor);
for j:=1 to delt do
begin
if znak>0 then raz:=raz+2;
d:=raz div 2;
moveto (x-d, y-d);
linerel (d+d, 0);
linerel (0, d+d);
linerel (-d-d, 0);
linerel (0, -d-d);
if (znak<=0) and (raz>1) then raz:=raz-2;
end;
end;
const n=50;
var j, d, r, xx, yy: integer;
kvad: array [1..n] of kom;
begin
d:=detect;
randomize;
initgraph (d, r, 'c:\tp\bgi');
for j:=1 to n do
kvad[j].init (random(GetMaxX), random(GetMaxY), random(GetMaxColor);
repeat
delay (100);
j:=random (n)+1;
kvad[j].zoom(random(8)+1, random(3)-1);
until kepressed;
closegraph;
kvad[1].locat (xx, yy);
write (xx, ' ', yy);
readln;