Смекни!
smekni.com

Методические рекомендации по организации изучения дисциплины (стр. 9 из 9)



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']
Элементы множеств нельзя вводить с клавиатуры и выводить стандартными операторами, т.к. элементы множества относятся к перечисляемому типу.
Над множествами можно выполнять следующие операции:

  1. Объединение (+). Результатом будет множество, состоящее из всех элементов первого и второго множеств без повтора:
    Пример:
    [1..3, 6, 9..11] + [2..4, 7, 10..12] = [1, 2, 3, 4, 6, 7, 9, 10, 11, 12] = [1..4, 6, 7, 9..12]
  2. Пересечение (*). Результатом будет множество, состоящее из тех элементов, которые присутствуют как в первом, так и во втором множествах.
    Пример:
    [1..3, 6, 9..11] * [2..4, 7, 10..12] = [2, 3, 10, 11]
  3. Разность двух множеств (-). Результатом будет множество, состоящее из тех элементов первого множества, которых нет во втором.
    Пример:
    [1..3, 6, 9..11] - [2..4, 7, 10..12] = [1, 6, 9]
  4. Операция in - проверяет принадлежность элемента множеству. Результатом операции будет логическое значение (true или false).
    Пример:
    [2] in [1..4] (true)
    [7] in [1..7] (false)
  5. Сравнение. Равными называются множества, состоящие из одинаковых элементов. Большим будет множество, у которого больше элементов. Из двух множеств с равным количеством элементов большим будет то, первое несовпадающее значение которого больше.

Пример: из введенной последовательности символов, признаком конца которой является '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.


Записи.

Пример:


Для реализации объединения данных разного типа в языке Pascal существует специальная структура - запись. Объявление записи начинается с зарезервированного слова record, за которым перечисляются имена и типы всех составляющих записей ее полей. Заканчивается объявление скобкой end.
Пример:
type
karta = record
family: string[20];
name: string[15];
age: integer;
end;
При обращении к записи в программе указывается имя записи и через точку имя поля.
Пример:
karta.family:='Иванов';
karta.name:='Иван';
karta.age:=20;
Для упрощения обращения к записи может быть использован оператор работы со структурой with.
Пример:
with karta do
begin
family:='Иванов';
name:='Иван';
age:=20;
end;
Полями записи наряду с простыми типами могут быть и данные структурированных типов, например, массивы или записи.
Пример 1:
var z: record
pole1: string;
pole2: array [1..10] of byte;
end;
Begin
for i:=1 to 10 do
read (z.pole2[i]);
End.

Пример 2: объявите запись, содержащую сведения о фамилии, дате рождения и адресе студента.
var student: record
fam: string[15];
data: record
day: 1..31;
mes: 1..12;
year: integer;
end;
adres: record
street: string[15];
dom: byte;
kvart: byte;
end;
end;
Begin
with student do
begin
fam:= 'Иванов';
with data do
begin
day:= 30;
mes:= 4;
year:= 1987;
end;
with adres do
begin
street:= 'Туполева';
dom:= 22;
kvart:= 154;
end;
end;
End.
Для использования в программе набора с одинаковыми полями используются массивы записей.
Пример: объявить массив из десяти записей.
1 вариант решения:
var A: array [1..10] of record
fam: string;
name: string;
end;
2 вариант решения:
type student = record
fam: string;
name: string;
end;
var A: array [1..10] of student;

Лекция 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:&bsol;tp&bsol;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:&bsol;tp&bsol;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;