Материалы к обзорной лекции.ppt
- Количество слайдов: 57
Материалы к обзорной лекции Государственный экзамен 2011 год Доцент, к. т. н. . Бабалова И. Ф. 1
ГОСТ Р ИСО/МЭК 12207 -99 ГОСУДАРСТВЕННЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИ ИНФОРМАЦИОННАЯ ТЕХНОЛОГИЯ ПРОЦЕССЫ ЖИЗНЕННОГО ЦИКЛА ПРОГРАММНЫХ СРЕДСТВ ГОССТАНДАРТ РОССИИ Москва 2
Нормативные ссылки В настоящем стандарте использованы ссылки на следующие стандарты: ГОСТ Р ИСО 9001 -96* Системы качества. Модель обеспечения качества при проектировании, разработке, производстве, монтаже и обслуживании • Действует до 15 декабря 2003 г. ГОСТ Р ИСО 9001 -2001 Системы менеджмента качества. Требования ГОСТ Р ИСО/МЭК 9126 -93 Информационная технология. Оценка программной продукции. Характеристики качества и руководства по их применению ИСО/МЭК 2382 -1 -93** Информационная технология. Словарь. Часть 1. Основополагающие термины ИСО/МЭК 2382 -20 -90** Информационная технология. Словарь. Часть 20. Разработка систем ИСО 8402 -94** Управление качеством и обеспечение качества. Словарь ** Оригиналы международных стандартов ИСО/МЭК – во ВНИИКИ Госстандарта России. 3
Структура стандарта 4
Процессы жизненного цикла 5
Применение стандартов 6
Структурный подход к программированию Структурное проектирование программ позволяет создавать программу из отдельных хорошо структурированных компонент ПП - Подпрограмма Основная программа ПП 11 ПП 3 ПП 2 ПП 1 ПП 22 ПП 31 7
Определение ПП Часть программы, которая имеет свое уникальное имя и может быть выполнена многократно с разными значениями параметров. С помощью ПП удается структурировать текст программы. Каждая ПП позволяет реализовать некоторый набор действий или получить конкретный числовой результат. Вызов ПП ОП ПП 3 ПП 1 Возврат результата ПП 2 8
Типы ПП и их описание в ОП Функция Структурная единица программы, которая в основную программу возвращает некоторое значение function <имя>(<Совокупность формальных параметров>) : <тип результата> Структурная единица программы, Процедура которая может возвращать в программу любое количество результатов Procedure <имя> ( < совокупность формальных параметров> ); Состав ПП <Заголовок функции или процедуры>; begin < тело функции или процедуры >; end; Текст ПП располагается в разделе реализации в основной программе Параметр – это переменная, значение которой должно быть определено при вызове ПП 9
Спецификаторы функций и процедур Overload перегружаемые Virtual Динамическое связывание Function divide(x, y: integer): integer; overload; Function divide(x, y: real): real; overload; Procedure Name_x ( var y: string); virtual; Выполняется при работе программы Override Procedure Cut_arr ; override; перезаписывемые Указание, что метод перезаписывется Inline Function f_mult(n: integer): Integer; inline; встраиваемые Текст функции будет компилятором вставлен при вызове функции в текст той программы, которая вызывает эту функцию Dynamic Function Gauss(var x, y: real): Boolean; dynamic; динамические Метод аналогичен Virtul с меньшими затратами памяти 10
Рекурсии Объект называется рекурсивным, если он содержит сам себя или определен с помощью самого себя Рекурсивное изображение Рекурсии в математике : 1. а) 0! б) n!=n*(n-1)! 2. а) 1 – натуральное число б) целое число, следующее за натуральным, есть Кривая 2 -ого натуральное число 3. Кривая Гильберта Кривая 1 -ого порядка Поворотом кривой Гильберта можно получить кривые Гильберта любого порядка. Так строятся лабиринты. порядка Кривая следующего порядка получается соединением четырех кривых вдвое меньшего 11 размера
Примеры рекурсивных структур Дана произвольная строка. Записать строку в обратном порядке. Procedure Revers(var ss: s; n: integer); var t: char; begin if n>length(ss) div 2 then begin t: =ss[n]; ss[n]: =ss[length(ss)-n+1] ; ss[length(ss)-n+1]: =t; Revers(ss, n-1); end; Type s = string [60]; var s 1: s; S 1 Номера символов в строке T 2 procedure TForm 1. Button 2 Click(Sender: TObject); var t: char; r: integer; begin r: =length(s 1); revers(s 1, r); Edit 2. Text : =s 1; end; R I N n-1 g n 12
Динамическое размещение переменных в памяти Указатель – это значение физического адреса переменной в оперативной памяти Var p. I : ^Integer; Ptr : Pointer; Pi – переменная указывает на целые данные Ptr - указатель на данные любого типа Последовательность записи значений с помощью указателей: Var Ad: ^integer; x , y: integer; begin x: =5; Определили значение переменной Ad: =@x; Сохранили адрес переменной x y: =Ad^; Теперь переменная y получила значение числа x Ad^: =10; По адресу x можно записать новое значение. Значение переменной x изменилось!! Расширение типов указателей: PReal, Pinteger, Pchar, Pbyte. Операции: NEW (Pl); - выделение памяти для одного 13 значения Dispose (Pl) – освобождение памяти
Линейные связанные списки Данные Организации линейных списков: • Стеки Указатель nil Алгоритмы формирования списков: • Очереди • Двусвязные списки Вставить элемент a 1 стек a 2 a 3 Удалить элемент Начало очереди a 1 a 2 Удалить элемент LIFO Удаление и Добавление элементов Вставить элемент a 3 Конец очереди FIFO Двусвязный список a 1 a 2 a 3 Удаление и Добавление элементов 14
Объявление типа данных для односвязного линейного списка Type Pstack= ^Pst; Type PList=^Pl; Pst = record Pl = record date : Integer; date: <тип>; next : Pstack; next: PList; end; End; Списочные переменные: Var List : PList; Ps : Pstack; Доступ к полям списка: With List^ do Date: =20; next: =nil; end; List: =nil; - пустой список New (List); - Создание адреса для пустого списка в динамической области памяти Dispose (List); Освободить память 15
Двусвязные и кольцевые списки Данные nil Данные pred next Добавление элементов в начало списка Данные FIFO nil Удаление элементов Только с конца списка кольцевой список Объявление типа: Type PQueue = ^ Queue; Queue= record x : integer; Это обычный односвязный список, но pred: PQueue ; Последний элемент списка всегда ссылается next : PQueue; на начало списка. end; Есть кольцевые двусвязные списки, n - связные списки, деревья, сетевые структуры. Структура списка определяется количеством полей ссылок на структуру данных этого же типа. 16
Операции над списками • • • Создать список Сохранить данные из списка в файле Прочитать данные из файла в список Удалить элемент списка Добавить элемент в список Вставить элемент на заданное место Удалить весь список Найти в списке требуемое значение Сортировать список 17
Создание линейного односвязного списка Ls * Lb –начало списка Type PList=^Pl; lp Pl = record 125 20 date: Integer; ; next: PList; End; nil var lb, lk, lp, ls: PList; ……………. Lp : =ls; lb: =nil; lk: =nil; пустой список. Lk: =lp; If lb=nil then End; begin ……………. . new(lp); lp^. date: =Random(200); Прочтение списка: lp^. next: =nil; lp : =lb; Установили lb: =lp; While Lp<> nil do lk: =lp; end else begin new(ls); * ls^. date: =random(200); (1) ls^. next: =nil; (2) lp^. next: =ls; (3 ) writeln (lp^. date); lp : =lp^. next; end; Lk – конец списка начало 18
Удаление элементов в списках pl Удаление первого элемента a next b next c Перемещение Начала списка nil Удаляемый элемент pl lp: =pl; a b While (lp<> nil) and (lp^. date<>b) do begin If lp=nil then ls: =lp; label 1. Caption: ='Список lp: =lp^. next; пуст' end; else Это только движение по списку if (lp=pl)and (lp^. x=b) then if lp<> nil then begin pl: =pl^. next; ls^. next: =lp^. next; dispose(lp); end; // Удаление найденного значения end else Удаление 1 -ого элемента 19 ls^. next: =nil;
Добавление элементов в созданный ранее список A next New(ls); B Задан упорядоченный C D список. Вставить элемент на правильное место. next nil Вставка должна быть Место в списке выполнена перед Алгоритм вставки найденным элементом. While lp<> nil do if lp^. x <newelem then lp: =lp^, next else // while assigned (lp) do Пока список имеет адрес элемента, не равный Begin nil new(ls); ls^: =lp^; //Новому элементу списка присваиваем // значения выбранного элемента списка lp^. x: = newelem; lp^. next: =ls; end; 20
Работа со стеками Дисциплина обработки данных: Добавление и удаление элементов стека выполняются только через его вершину Новая вершина стека Новый next данные nil Top Type Pstack= ^Pst; Pst = record date : Integer; next : Pstack; end; Var Top, Ps: Pstack; x: integer; …………………. While eof(f) do begin new(Ps); Read(f, x); Ps^. date: =x; Ps^. next: =Top; Top: =Ps; end; end Стек и список можно создавать с помощью рекурсивных функций Для вставки элемента на правильное место в стек будет работать алгоритм, рассмотренный для линейных списков 21
Двусвязный список Очередь Ol, Qe Qp Qp, Qe nil Qe pred next Var Ql, Qe, Qp: PQueue; begin Ql: =nil; If Ql=nil then begin new(Qp); Qp^. x: =newelem; Qp^. next: =nil; Qp^. pred: =nil; Ql: =Qp; Qe: =Qp; end else // только один элемент в списке nil Begin new(Qp); Qp^. x: =newelem; Qp^. next: =nil; Qp^. pred: =Oe; Qe: =Qp; end; По окончании метода создания очереди у нас есть два адреса: Ql , Qe - начала и конца очереди Движение по очереди: While Qe<> nil do Qe: =Qe^. pred; 22
Выводы по работе со списочными структурами данных 1. 2. 3. Алгоритмы сложнее, чем для обработки массивов Дополнительный расход памяти на указатели Размещение списочных структур только в динамической памяти 4. Размер требуемой памяти надо контролировать: {$ M A, B, C} – A – максимальный размер статической памяти, B - нижняя граница Heap, C – верхняя граница Heap. Стандартные размеры: {$M 16384, 0, 65536} 5. Реализация алгоритмов со списками использует столько памяти, сколько нужно для хранения текущего списка 6. Удаление, вставка, сортировка элементов требуют меньших затрат времени 23
Ветвящиеся динамические структуры a 1 a 2 a 1 a 3 a 2 a 4 a 5 a 3 a 6 a 7 a 4 a 5 Древовидная структура Сетевая структура Каждый элемент связан с одним или более элементов Следующего уровня Никаких ограничений на связи элементов не накладывается 24
Древовидные структуры Дерево – это структура, содержащая узел T, с которым связано конечное число древовидных структур с базовым типом T, называемых поддеревьями. Верхний узел дерева – это корень. Корень дерева A Левое поддерево Ветвь дерева C B Правое поддерево D I E J F K Терминальный узел -лист G Алфавит можно представить в виде дерева 25
Определение типа данных –узел бинарного дерева Дерево с двумя ссылками называется Type node=^nnode; бинарным nnode = record date: <тип данных>; Дерево считается сбалансированным, если на каждом уровне содержит left, right : node; максимальное число узлов. end; var root, p, q : node; Алгоритм построения бинарного сбалансированного Правое дерева 1. Выбрать один узел в качестве корня 2. Построить левое поддерево nl=n div 2 3. Построить правое поддерево nr=n-nl-1 Root: =nil; New(p); with p^ do begin date: =x; left: =nil; rigth: =nil; end; Root: =p; nl Левое поддерево root nl nr nr 26
Пример рекурсивного создания дерева program Project_tree; uses Sys. Utils; type node=^nnode; nnode=record date: integer; left: node; right: node; end; var nn: node; n: integer; ……………. Вызов метода: nn: =create_tree(n); , где n – это число узлов function create_tree(k: integer): node; var p: node; nl, nr: integer; begin if k=0 then create_tree: =nil else begin nl: =k div 2; nr: =k-nl-1; new(p); with p^ do begin date: =random(100)+1; left: =create_tree(nl); right: =create_tree(nr); end; create_tree: =p; end; 27
Основные операции над деревом 1. Создание дерева 2. Поиск заданного элемента в дереве 3. Удаление элемента в дереве 4. Вставка элемента в дерево 5. Сортировка элементов дерева Поиск – это движение по дереву 7 3 6 10 12 4 5 Function Poisk(var t: node; r: integer): boolean; var p : node; 2 flag : boolean; begin flag : =false; В этом предложении p: =t; найден искомый while (p<> nil) and not flag do элемент if r = p^. date then flag: =true else Это движение по if r > p^. date then p: = p^. left узлам else p: = p^. right ; дерева Poisk : =flag; end; 28
Удаление элементов созданного дерева 1. Удаление листа. Удаляется ссылка на лист из соответствующего 2 8 поддерева 3 1 10 4 2. Удаление узла с одной ссылкой Ссылку верхнего узла надо заменить 12 3. Удаляемый узел содержит две ссылки. Удаление листа Удаляемый узел замещается самым правым узлом левого поддерева или 1 самым левым узлом правого поддерева 8 3 10 2 15 11 12 If r^. right =nil then begin q^. date: =r^. date; - запоминаем значение qk : =r; - сохраняем найденный узел r : =r^. Left; Dispose(qk); end else {движение по правому поддереву} 29
Правила обхода деревьев Рассмотрим запись арифметического выражения: SIN (X) *C – D+E/F/(G+H) Этот вариант записи называется ИНФИКСНОЙ ФОРМОЙ – знак операции ставится строго между операндами. Порядок вычисления выражения слева направо в соответствии с приоритетом операций. Скобки изменяют порядок вычислений. Для ускорения вычислений и исключения скобок предложено два других варианта записи выражений – ПОСТФИКСНЫЙ И ПРЕФИКСНЫЙ. . Постфиксный вариант: SIN(X) C*D-EFGH+//+ Префиксный вариант: + - * SIN(X)CD/EF/+GH Предложенные алгоритмы прочтения арифметических выражений позволяют существенно ускорить работу компилятора. Для записи выражений используются стеки и структуры бинарных 30 деревьев.
Обратный обход дерева инфиксный Инфиксный обход дерева предполагает чтение выражений в принятом порядке – знак операции ставится между операндами SIN (X) *C – D+E/F/(G+H) + - / Это чтение дерева – слева направо Procedure Infixprint(var p: nn); begin E if p<> nil then * D begin Infixprint(p^. left); F + C Sin(x) write(p^. date); E Infixprint(p^. right); G end; Начинаем обход дерева с самого левого листа. Поднимаемся к знаку. Далее спускаемся к листу. Прочитанное выражение будет обычной формой 31 записи выражений /
Постфиксный обход дерева Этот алгоритмический метод называется обратной польской записью: знак операции записывается после операндов. Procedure Postprint(var p: nn); begin if p<> nil then + begin Postprint(p^. left); / Postprint(p^. right); write(p^. date); / E * D end; F + C Sin (x) Читаем G SIN (X) *C – D+E/F/(G+H) H дерево снизу вверх SIN(X) C*D-EFGH+//+ 32
Прямой обход дерева префиксный + - * SIN(X)CD/EF/+GH SIN (X) *C – D+E/F/(G+H) Знаки операций предшествуют операндам. Это чтение дерева – сверху вниз + * Sin(x) / D C / E F Procedure Prefprint (var p: nn); begin if p<> nil then begin write(p^. date); Prefprint(p^. left); Prefprint(p^. right); + end; H G Начинаем обход дерева с корня. Спускаемся по знакам до листа. Прочитанное выражение будет обычной формой записи выражений 33
Уничтожение всего дерева Type node=^nnode; Procedure Tree. Destroy(var tr: node); nnode = record begin date: <тип if tr <> nil then данных>; begin left, right : node; with tr^ do end; begin var root, p, q : node; Tree. Destroy(left); Tree. Destroy(right); end; Вызов метода: Dispose(tr); End; ………… End; …Tree. Destroy(root); 34
Алгоритмы поиска и сортировки в абстрактных структурах данных 35
Методы поиска данных в массиве Алгоритм последовательного поиска X=5 a 1 (3) a 2 9 a 3 5 …. . an-1 8 an 7 I = 1 Перебираются последовательно все n элементов до получения истинного значения результата сравнения ai=x Количество сравнений ~ n Алгоритм бинарного поиска a -1 1 X=2 Up =1 a 2 2 i a 3 5 a 7 a 4 5 Middle= (down – up) div 2 (7 -1) div 2 =3 8 a 10 a 6 j 7 11 Down=7 i=middle Сравниваем x cо средним элементом. Если x < среднего, тогда идем к предыдущему элементу массива, иначе к следующему. Middle-1 или Middle+1 Необходима проверка величины индекса I, чтобы он не стал больше j. 36
Абстрактные типы данных для организации поиска 1. Связанные списки. Это последовательность из записей со ссылками. Данные в поле списка называются записью, так как они содержат обычно несколько полей данных разного типа Запись Key 2. Файлы. Последовательно организованные записи 3. Таблицы. Запись Key Каждая запись в этих структурах должна быть снабжена некоторым ключом, который позволит найти эту запись. 37
Алгоритмы поиска Последовательный поиск. Предполагается, что есть некоторый массив ключей K[i] записей A[i]. Ищется K[i] =key. В этом алгоритме последовательно проверяются все имеющиеся ключи. Оценка эффективности поиска через p (i) - вероятность извлечения i – ой записи. p(1)+ p(2)+ p(3)+……. P(n) =1, если искомый ключ есть в =1 структуре. Среднее число сравнений: p(1)+2* p(2)+3* p(3)+……. n* P(n) Минимизация поиска обеспечивается соотношением P(n) ≤…… ≤ p(3) ≤ p(2) ≤ p(1) Из этого соотношения видно, что переупорядочивание данных существенно увеличивает скорость последовательного поиска. Два алгоритма переупорядочивания: перемещение в начало и метод транспозиции. Найденные записи перемещаются в 38 начало или меняются местами с предыдущей записью.
Индексно-последовательный поиск Любая отсортированная структура дополняется таблицей или списком индексов. Индекс выбирается в соответствии с размером структуры. Если список содержит количество записей, кратное K, тогда в списке индексов будет каждый K-ый индекс. 23 указатель 8 56 ………. 14 K=4 21 Шаг для индексов может быть любым 23 Поиск в таких структурах выполняется по меньшей таблице индексов 37 34 41 56 запись ……… ……. . ……… запись Задачи удаления и вставки элементов должны решаться алгоритмически. Каждый удаляемый элемент может снабжаться признаком и физически не перемещаться. Вставить элемент можно на место удаленного. 39
Бинарный поиск Алгоритм может быть эффективен для неупорядоченных структур данных. Количество сравнений будет ~ log 2 n. D 1 Low D 2 D 3 …. . Mid = n+1 div 2 true Dmid < While low< high do begin mid: =(low + high) div 2; if key = D[mid] then begin result= D[mid]; exit; false Dn High key end else if key < D[mid] then high: =mid-1 else low: =mid+1; End; 40
Алгоритм бинарного Бинарный поиска n, a, x i: =1 j: =n z: =0 Считаем количество сравнений k: =( i+j) div 2 false true x>a[k] i: =k+1 j: =k-1 z: =z+1 false a[k]=x or i>j конец a[k] true 41
Хеширование Алгоритмы поиска методами хеширования применяются для структур данных типа таблиц и связанных списков Метод предполагает трансформирование ключей структуры данных в индекс в таблице c помощью хеш – функции. Например, H ( key) =key mod 10 0 93 10 nil 101 1 101 71 11 nil 75 2 112 2 33 3 93 33 43 nil 48 nil 4 71 nil 75 5 112 Любой элемент 6 nil 11 массива будет найден по ключу. 43 7 nil Например, 43 или 2 10 8 48 nil 2 42 9 nil
Выбор хеш - функции 1. Метод деления. Некоторый целый ключ делится на размер таблицы H (Key) =mod (Key , m) - 1987 mod 100 = 87 2. Метод середины квадрата. Ключ умножается сам на себя и из полученного числа выбирается несколько средних цифр этого квадрата. Пример: 1987*1987=3948169 или 1986*1986=3944196. Получены разные ключи. 3. Метод свертки. Ключ в двоичном представлении разбивается на сегменты и над этими сегментами выполняется операция XOR: Пример: Ключ = 1101010011. Разбиваем ключ на два числа по 5 разрядов И над двумя числами выполняем операцию XOR: 11010 Результат 010011 Если разряды не совпадают, то результат =1 При хешировании ключей из символов или строк надо помнить, что представление всех символов обеспечивается их цифровыми 43 кодами.
Создание структуры данных для работы с хеш таблицей Задача. Создать словарь для перевода английских слов в русские. Apple Air nil Type ss =string[40]; яблоко воздух a aa =record Clock nil a, b : ss; c часы end; Force Plist =^List; Ford nil f сила брод List = record inf : aa; …. . Next : Plist; z nil End; Tab_hesh= record Хеш - таблица имеет 26 ключей. В списках может lit : s[1]; быть любое количество слов со своим переводом. next : Plist; Ключи легко упорядочиваются по алфавиту. end; Все расширения словаря могут быть Tab=array [1. . 26] of смоделированы дополнительными списками. tab_hesh; В файле должна сохраняться только информации ff =file of aa; 44
Сортировка любых типов данных 1. 2. 3. 4. 5. 6. Простые обменные сортировки: Обменом, Вставками, Выбором Сортировка в разных направлениях ( Шейкер) Быстрая сортировка ( Хоора ) Сортировка слиянием Сортировка с убывающим приращением (Шелла) Сортировка с помощью дерева Анализ Шейкер - сортировки Задана последовательность неупорядоченных чисел 5 5 Окончание процесса 43 43 43 12 12 сортировки обеспечивается 55 55 12 43 17 неравенством left>right 12 12 41 17 41 41 41 55 41 43 Среднее число 93 93 17 55 55 перестановок 17 17 64 64 64 5 пропорционально n/3 < 64 93 93 93 64 Left=2 45 Right =8
Сортировка массивов Метод простого выбора 21 18 31 75 44 28 -1 33 -1 18 31 75 44 28 21 33 -1 18 21 75 44 28 31 33 -1 18 21 28 44 75 31 33 -1 18 21 28 31 75 44 33 Mср=n(ln(n)+0, 577216 ) -1 18 21 28 31 33 44 75 Количество перестановок - 5. а элементов в массиве – 8. При неизвестном порядке значений эта сортировка быстрее, чем сортировка простым обменом 46
Анализ быстрой сортировки Этот алгоритм обеспечивает уменьшение числа обменов за счет обменов на больших расстояниях. Берем последовательность чисел из предыдущего примера. Выбираем некоторый средний элемент последовательности. Все меньшие его значения помещаются перед ним, а большие за ним. 43 55 12 41 93 17 5 64 17 5 12 41 93 43 55 64 5 12 17 41 43 55 64 93 Окончание сортировки при left>right Оценка времени выполнения быстрой сортировки в среднем ~ n * log (n) Для других вариантов сортировки ~ O(n 2) Решение задачи на языке программирования по этому алгоритму обеспечивается созданием рекурсивной процедуры с новыми значениями левых и правых индексов сортируемой последовательности. 47
Определение класса Класс – это абстрактный тип данных, в котором объединены данные, их свойства и методы их обработки. Событие класса – это внешнее событие, на которое реагирует данный класс Объект или экземпляр класса – это переменная, обеспечивающая доступ к полям и методам класса в конкретной среде применения Type My_class = class Объект_1 Interface Класс <поля данных> Объект_2 <Наименование методов класса>; <Свойства полей данных>; Объект_3 Это объект Implementation <Описание всех методов класса> 48 Var m_cl_1 : My_class; End;
Объектная декомпозиция В теории программирования ООП определяется как технология, основанная на представлении программы в форме совокупности объектов, каждый из которых является экземпляром определенного класса. Процесс представления предметной области задачи в виде объектов, обменивающихся сообщениями, называется объектной декомпозицией. Имя переменной Объект Предметной области Класс Поля, методы, свойства Имя класса Описание поведения через типы данных и состояние Объект – переменная Правила использования объекта: 1. Создать 2. Инициализировать 3. Уничтожить 49
Базовые понятия ООП Наследование Класс наследник приобретает все свойства и методы родительского класса и дополняется своими свойствами и методами. Type Heir_Class = class (My_Class) <Поля данных наследника>; <Методы наследника> ; <свойства данных наследника> end; Полиморфизм Инкапсуляция Классы – наследники наследуют методы всех своих родительских классов и дополняются новыми методами и данными. Возможность переопределения методов класса – наследника без изменения имени метода получила название ПОЛИМОРФИЗМ. Механизм разграничения доступа к полям данных и методам их обработки назван ИНКАПСУЛЯЦИЕЙ Разработчики классов получили возможность защитить элементы класса от случайных изменений полей классов, не связанных с их предназначением. 50
Описание полей классов 1. Определение типа данных, для которого создается класс Каждый класс создается в своем модуле (Unit). Unit Class_array; interface Type ss=string[30] ; rec=record fam: ss; age; word; end; mas=array of rec; ff=file of mas; New_cl=class Класс для m: mas; работы с массивом n: integer; f: ff; ………………. { Перечисление заголовков методов класса} end; Unit Class_list; interface Type ss=string[30]; rec=record fam: ss; age; word; end; Plist=^list; List=record date: rec; Класс для next: Plist; работы со end; списком ff=file of rec; New_List=class p: Plist; 51 f: ff; ………… end;
Определение методов класса для обработки данных Методы – это процедуры и функции для обработки тех данных, которые принадлежат классу. Обязательные методы классов: Constructor Create() - Создание экземпляра класса Destructor Destroy() - Уничтожение экземпляра класса Пример описания класса для обработки списочной структуры данных : New_List=class Implementation (раздел реализации) p: Plist; Constructor New_list. Create(var v: Plist); f: ff; begin Имя метода Constructor Create(var v: Plist); v: =nil; Имя класса Function List_Create(var g: ff): Plist; end; Procedure Del_e l (s : ss); Destructor New_list. Destroy; Procedure Sort_list ( var v: plist); begin Procedure Add_list ( fn : ss); Dispose (v); Destructor Destroy; Inherited Destroy; {Наследование} 52 End; end; {метода}
Видимость элементов классов Определение. Видимость определяет режим наследования полей классов или режим их доступности в других модулях. private - Члены класса недоступны Type <Имя_класса>= class в других модулях программы, даже private ………………. в наследниках Protected ………………. . Protected – доступны в наследниках, в Public других модулях. ………………. . Published Public – Доступны везде члены класса, ………………… где доступно описание класса. End; Published – Доступны элементы класса type везде. Эти элементы можно редактировать TForm 1 = class(TForm) Button 1: TButton; в процессе выполнения программы. Button 2: TButton; procedure Button 1 Click(Sender: TObject); Так реализуется procedure Button 2 Click(Sender: TObject); механизм { Private declarations } инкапсуляции public 53 { Public declarations } в классах end;
Наследование и полиморфизм {Unit 2} Type Mouse_pos=record Type Mouse_st_col=class(Mouse_st) x, y : integer; c: Color; end; procedure M_color (z: Tcolor); Mouse_st=class { Unit 1} end; Act: Boolean; Наследник все методы и поля x, y: integer; данных класса Mouse _ st может Left, Right : Boolean; использовать, но содержит новый Vis: Boolean; Procedure Location (M: Mouse_pos); метод – установку цвета мыши. Constructor Create (a, b: integer); Inplementation Destructor Destroy; procedure Mouse_st_col. M_color (z: Tcolor); End; Метод родительского Implementaion Constructor Mouse_st. Create( a, b: integer); Класса может быть другим в наследнике. begin x: =a; Procedure Location (M: Mouse_pos , c: Tcolor); y: =b; Это пример наследования с изменением end; 54 признаков …………. .
Свойства полей классов Свойство – это поле с ключевым словом Property, доступ к которому осуществляется только через промежуточный код. Type Tcar=class private Fpetrol. Tank : Integer; Procedure Set. Petrol. Tank (Value: Integer); Published Property Petrol. Tank : Integer read Fpetrol. Tank Write Set. Petrol. Tank; End; Procedure Tcar. Set. Petrol. Tank (Value: Integer); begin В основной программе: Inc (Fpetrol. Tank, Value); Var Car : Tcar; if Fpetrol. Tank> Max_Tank_value then begin Fpetrol. Tank: = Max_Tank_value; Car: =Tcar. Create; end; Car. Petrol. Tank: =100; Автоматически вызывается метод Set. Petrol. Tank и выполняется 55 проверка возможности заполнения бака
Связывание методов класса с объектом Связывание метода с объектом – это механизм поиска метода объектом. Предлагается три способа связывания метода с объектом: 1. Статическое связывание. 1. Статический Объявляем два класса: 2. Динамический Type TAnimal =class procedure Eat; end; TCat =class(TAnimal) procedure Eat; End; Var Animal: TAnimal; Cat: TCat; 3. Виртуальный Записываем вызов каждого из методов: Animal: = TAnimal. Create; Animal. Eat; Вызов метода класса TAnimal Cat : = TCat. Create; Cat. Eat; Вызов метода класса TCat Animal: =TCat. Create; Animal. Eat; Вызов метода класса TAnimal: = TCat. Create; TCat(Animal). Eat; Это будет вызов метода класса TCat 56
Виртуальное и динамическое связывание Эти варианты связывания выполняются в процессе работы программы (позднее связывание). Для обеспечения механизма связывания используются спецификаторы методов: VIRTUAL И DYNAMIC Type TAnimal =class procedure Eat; virtual; end; TCat =class (TAnimal) procedure Eat; End; …………. . Var Animal : TAnimal; Animal: = TCat. Create; Animal. Eat; Вызван будет метод класса TAnimal В современных версиях языка более быстрое динамическое связывание Type TAnimal =class procedure Eat; reintroduce; virtual; end; TCat =class(TAnimal) procedure Eat; Override; End; …………. Animal: =TCat. Create; Animal. Eat; В этой записи вызывается уже Метод класса TCat 57
Материалы к обзорной лекции.ppt