Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Арифметические процедуры и функции



В арифметических выражениях часто используются следующие стандартные функции (табл. 3.2).

 

Таблица 3.2. Некоторые стандартные функции, типы значений аргумента и результата

Стандартная функция

Выполняемое действие

Тип

аргумента Результата

abs(x)

| x |

real real
integer integer

sqr(x)

X

real real
integer integer

sqrt(x)

real real
integer real

exp(x)

real real
integer real

ln(x)

ln(x)

real real
integer real
pi число пи - real

sin(x)

sin(x)

real real
integer real

cos(x)

cos(x)

real real
integer real

arctan(x)

arctg(x)

real real
integer real

 

Вызов стандартной функции осуществляется путем указания в нужном месте программы имени функции (abs, in, exp и др.) и ее аргумента, заключенного в круглые скобки. После вычисления значения функции ее вызов заменяется результатом, и расчет содержащего ее выражения продолжается дальше.

Следует знать:

- аргумент прямых тригонометрических функций sin и cos задается в радианах. Для преобразования значения угла из радианной меры в градусную необходимо умножить величину угла на число pi/180. Для перевода значения угла из градусной меры в радианную необходимо умножить величину угла на число pi/180;

- результат функции arctan получается в радианах.

Кроме приведенных в табл. 3.2 также используются следующие стандартные процедуры и функции:

- функция random (диапазон) возвращает случайное число х, удовлетворяющее условию о<=х<диапазон. Тип аргумента и результата — word. В том случае, если нам необходимы целые случайные числа из диапазона а<=х<b, мы можем получить их, используя выражение random ( b-а)+а. Если параметр диапазон не указан, то random возвращает число х в диапазоне 0<=х<1. Тип результата — real. В том случае, если нам необходимы вещественные случайные числа из другого диапазона: а<=х<b, мы можем задать его при помощи random* b+ a. Перед первым обращением к функции random необходимо с помощью вызова процедуры randomize инициализировать программный генератор случайных чисел. В противном случае при каждом запуске программы датчик будет выдавать одни и те же числа.

- процедура \ dec (х, n) уменьшает значение целочисленной переменной х на n. Например, х: =10; dec (х, 2); {результат: 8}. При отсутствии необязательного параметра n процедура принимает вид dec(x), а значение х уменьшается на единицу;

процедура inc(x, n) увеличивает значение целочисленной переменной х на п. Например, х: =10; inc(x, 3); {результат: 13}. При отсутствии необязательного параметра п процедура принимает вид inc (х), а значение х увеличивается на единицу;

функция frac(x) вычисляет дробную часть х. Аргумент и результат — real.

Например write( frac(0. 25*11): 4: 2); {результат 0. 75};

функция int(x) вычисляет целую часть х. Аргумент и результат— real.

Например, write( int(422.117):4:2); {результат 422. 00). Таким образом, x=int(x) +frac(x).
Тема. Особенности применения инструкций цикла. Вложенные циклы

Задание: Составить конспект.

План работы:

1 Ознакомиться с перечнем вопросов, подлежащих рассмотрению

2 Ознакомиться с представленным теоретическим материалам

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

4 Законспектировать ответы на вопросы, подлежащие рассмотрению

Включайте в конспект не только основные положения, но и обосновывающие их выводы, конкретные факты и примеры (без подробного описания).

5.Составляя конспект, записывайте отдельные слова сокращённо, выписывайте только ключевые слова, делайте ссылки на страницы конспектируемой литературы, применяйте условные обозначения.

6.Чтобы форма конспекта отражала его содержание, располагайте абзацы «ступеньками», подобно пунктам и подпунктам плана, применяйте разнообразные способы подчеркивания, используйте карандаши и ручки разного цвета.

Вопросы для самостоятельной работы

1 Основные особенности циклов

2 Порядок выполнения операций во вложенном цикле

3 Организация досрочного выхода из цикла

Вопросы для самоконтроля:

1 Поясните как выбрать оператор для организации цикла

2 Каким образом организовать досрочный выход из цикла в разных типах циклов

Форма контроля: Оценка составленного конспекта.

 


Теоретический материал

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

Цикл представляет собой последовательность операторов, которая выполняется неоднократно.

В языке программирования имеется три разновидности цикла — цикл с постусловием (инструкция repeat), цикл с предусловием (инструкция while) и цикл со счетчиком (инструкция for).

Следует знать:

-подавляющее большинство задач с циклами можно решить разными способами, используя при этом любой из трех операторов цикла; часто решения, использующие разные операторы цикла, оказываются равноценными;

-в некоторых случаях все же предпочтительнее использовать какой-то один из операторов;

-самым универсальным из всех операторов цикла считается while, поэтому в случае затруднений с выбором можно отдать предпочтение ему; цикл repeat имеет очень простой и понятный синтаксис, поэтому с него удобно начинать изучение циклов;

-цикл for обеспечивает удобную запись циклов с заранее известным числом повторений;

-при неумелом использовании циклов любого типа возможна ситуация, когда компьютер не сможет нормально закончить цикл (в таком случае говорят, что программа "зациклилась").

 Оператор REPEAT

Оператор повтора repeat состоит из заголовка(repeat), тела цикла и условия окончания (until). Ключевые слова repeat, until обозначают "повторяй" и "пока" соответственно.

repeat

{ Инструкции }

until Условие выхода из цикла;

Вначале выполняется тело цикла — инструкции, которые находятся между repeat и until, затем проверяется значение Условия выхода из цикла. В том случае, если оно равно false (ложь), т. е. не выполняется — инструкции цикла повторяются еще раз. Так продолжается до тех пор, пока условие не станет true (истина).

При работе оператора:

– число повторений операторов (инструкций) цикла repeat определяется в ходе работы программы и во многих случаях заранее неизвестно;

- инструкции цикла repeat будут выполняться, пока условие, стоящее после until, будет оставаться ложным;

- после слова until записывается условие завершения цикла;

- условие — это выражение логического типа: простое выражение отношения или сложное логическое выражение;

- для успешного завершения цикла repeat в его теле обязательно должны быть инструкции, выполнение которых влияет на условие завершения цикла, иначе цикл будет выполняться бесконечно — программа зациклится. Другими словами, переменная, которая участвует в условии выхода из цикла, обязательно должна изменяться в теле цикла.

- цикл repeat — это цикл с постусловием (условие проверяется после выполнения тела цикла), т. е. инструкции тела цикла будут выполнены хотя бы один раз.

 -поэтому цикл repeat удобно использовать в тех случаях, когда тело цикла гарантированно должно выполниться хотя бы один раз;

- нижняя граница операторов тела цикла четко обозначена словом until, поэтому нет необходимости заключать эти операторы в операторные скобки begin и end.

 Оператор WHILE

Оператор повтора while состоит из заголовка и тела цикла. Ключевые слова while и do обозначают "до тех пор, пока" и "выполняй" соответственно.

while Условие выполнения цикла do begin

{ Инструкции } end;

Оператор while аналогичен оператору repeat, но проверка Условие выполнения цикла производится в самом начале оператора — если значение условия равно true (истина), то выполняются инструкции цикла, находящиеся между begin и end и снова вычисляется выражение Условие выполнения цикла. Так продолжается до тех пор, пока значение Условие выполнения цикла не станет равно false (ложь).

Взаимосвязь операторов while и repeat:

* оператор while Условие do инструкция; эквивалентен оператору

if Условие then repeat Инструкция until Not Условие;

При работе оператора:

* число повторений операторов (инструкций) цикла while определяется в ходе работы программы и, как правило, заранее неизвестно;

* после слова while записывается условие продолжения выполнения инструкций цикла, в этом отличие цикла while от цикла repeat;

* условие — это выражение логического типа: простое выражение отношения или сложное выражение отношения (логическое выражение), которое может принимать одно из двух значений: true или false;

* для успешного завершения цикла while в его теле обязательно должны присутствовать инструкции, оказывающие влияние на условие выполнения инструкций цикла.

* цикл while — это цикл с предусловием, т. е. инструкции тела цикла вообще могут быть не выполнены, если проверяемое условие ложно с самого начала;

* исходя из последнего утверждения цикл while считают самым универсальным видом цикла;

* цикл while обычно применяется в тех же задачах, что и repeat (в зависимости от личного вкуса программиста). Удобнее всего использовать его в тех случаях, когда возможны ситуации невыполнения цикла;

* в операторе цикла while точка с запятой никогда не ставится после зарезервированного слова do.

 Оператор FOR

Этот вид оператора цикла называют циклом со счетчиком или циклом с параметром. В нем важную роль играет переменная-параметр, которая на каждом шаге цикла автоматически изменяет свое значение ровно на единицу — поэтому ее и называют счетчиком.

Инструкцию for можно реализовать двумя способами.

Вариант 1 (с увеличением счетчика).

for Счетчик := НачальноеЗначение to КонечноеЗначение do

 begin

{ Инструкции }

end;

Ключевые слова for, do обозначают "для", "выполняй" соответственно. Строка, содержащая for... do, называется заголовком цикла, оператор, стоящий после do образует его тело. Очень часто тело цикла — составной оператор. Если тело цикла представлено одиночным оператором, то begin и end не пишутся.

Инструкции между begin и end выполняются столько раз, сколько определяет выражение [(КонечноеЗначение - НачальноеЗначение) + 1].

Это соответствует всем значениям счетчика от начального до конечного включительно.

Если НачальноеЗначение больше, чем КонечноеЗначение, то инструкции между begin и end не выполняются ни разу

Вариант 2 (с уменьшением счетчика).

for Счетчик := НачальноеЗначение downto КонечнооЗцачение do

begin

{ Инструкции }

end;

Инструкции между begin и end выполняются столько раз, сколько определяет выражение [(НачальноеЗначение — КонечноеЗначение) + 1].

Если НачальноеЗначение меньше, чем КонечноеЗначение, то инструкции между begin и end не выполняются ни разу.

Например, выполнение цикла — фрагмента программы:

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

При работе оператора:

* оператор (инструкция) for используется для организации циклов с фиксированным, заранее известным или определяемым во время выполнения программы числом повторений;

* количество повторений цикла определяется начальным и конечным значениями переменной-счетчика. Оператор for обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цикла от начального до конечного;

* переменная-счетчик должна быть порядкового типа- чаще — integer, реже — char, boolean или одного из пользовательских типов. Использование вещественного типа недопустимо;

* начальное и конечное значения параметра цикла могут быть константами переменными, выражениями и должны принадлежать к одному и том уже типу данных. Начальное и конечное значение нельзя изменять во время выполнения цикла;

* после нормального выполнения оператора for значение параметра цикла равно конечному значению. Если оператор for не выполняется, значение параметра цикла не определено;

* параметр цикла for может изменяться (увеличиваться или уменьшаться ) каждый раз при выполнении тела цикла только на единицу. Если нужен другой шаг изменения параметра, предпочтительнее циклы repeat и while.

Замечание

Для досрочного выхода из цикла можно использовать оператор goto или оператор break. Но лучше использовать циклы repeat и while. Процедура continue позволяет прервать выполнение любого цикла и передает управление на его заголовок.

Например, рассмотрим фрагмент программы с досрочным выходом из цикла:

for I:=1 to 45 do

 begin

f:=f+I;

if (f>100)or (I=39) then break;

end;

Вложенные циклы

В теле любого оператора цикла могут находиться другие операторы цикла. При этом цикл, содержащий в себе другой, называют внешним, а цикл, находящийся в теле первого — внутренним (вложенным). Правила организации внешнего и внутреннего циклов такие же, как и для простого цикла. Обратите внимание — при программировании вложенных циклов необходимо соблюдать следующее дополнительное условие: все операторы внутреннего цикла должны полностью располагаться в теле внешнего цикла. Рассмотрим задачу вывода на экран таблицы умножения, решение которой предполагает применение вложенных циклов. С использованием цикла for соответствующий фрагмент программы имеет вид:

var i, j : byte;

begin

for i:=l to 10 do

for j:=l to 10 do

вывод(i,' * ', j, ' = ',i*j); end.

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


 

Тема. Примеры использования основных и специальных классов.

Задание: Составить конспект.

План работы:

1 Ознакомиться с перечнем вопросов, подлежащих рассмотрению

2 Ознакомиться с представленным теоретическим материалам

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

4 Законспектировать ответы на вопросы, подлежащие рассмотрению, привести примеры

Включайте в конспект не только основные положения, но и обосновывающие их выводы, конкретные факты и примеры (без подробного описания).

5.Составляя конспект, записывайте отдельные слова сокращённо, выписывайте только ключевые слова, делайте ссылки на страницы конспектируемой литературы, применяйте условные обозначения.

6.Чтобы форма конспекта отражала его содержание, располагайте абзацы «ступеньками», подобно пунктам и подпунктам плана, применяйте разнообразные способы подчеркивания, используйте карандаши и ручки разного цвета.

Вопросы для самостоятельной работы

1 Понятие объекта, класса, класса-предка, класса-наследника

2 Наследование, инкапсуляция, полиформизм

3 Иерархия классов

Вопросы для самоконтроля:

1 Класс – это …?

2 Как в программе определяются методы

3 С помощью чего в Object Pascal реализуется ограничение доступа к полям объекта?

4 Как называется возможность определять новые классы посредством добавления полей, свойств и методов к уже существующим классам

5 DELPHI содержит сложную иерархию классов. В начале этой иерархии стоят классы, называемые ______________ классами.

6 Класс _________ является предком всех других классов, используемых в DELPHI.

 

Форма контроля: Оценка составленного конспекта.

 

Теоретический материал

Любая программа в широком смысле может рассматриваться как модель[1](воспроизведение или отражение) части реального мира (внешней среды, предметной области).

Различные образования реального мира могут быть определены единым термином: объекты. К ним относятся окружающие нас в быту предметы, технические устройства, сооружения, животные и, наконец, сами люди. Каждый объект характеризуется только присущим ему набором (множеством) параметров (свойств), а также множеством действий, которые может выполнить сам объект и которые могут быть выполнены над данным объектом другими объектами.

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

Любая схема (или система) классифицирования обычно строится по принципу от “общего” к “частному” и, как правило, имеет многоуровневую структуру отношений, в которой элементы высших ступеней порождают (производят) элементы низших уровней. Эти элементы имеют свои конкретные особенности и одновременно получают все основные свойства и действия, то есть “наследуют” их от элементов верхнего уровня. Например, реальный объект стол обладает множеством различных свойств, таких как тип (обеденный, книжный, кухонный), габариты, цвет, тип древесины и т. д. К нему применимы различные действия: стол можно изготовить, смонтировать (собрать), ремонтировать, передвигать, демонтировать и т. д. Очевидно, что конкретный стол, как объект реального мира, можно считать принадлежащим к классу столов, который определяет общие характеристики всех столов. В свою очередь класс столов можно считать порождением элемента верхнего уровня, а именно класса мебели, все свойства которого одновременно являются и свойствами класса столов. Это означает, что класс столов “наследует” свойства и действия класса мебели. Далее можно рассмотреть класс изделий, в который будет включен класс мебели. О классе изделий и классе мебели можно сделать такие же заключения, что и о классах мебели и столов.

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

В основе ООП лежат понятия класса и его физической реализации – объекта.

Класс – это сложная структура (аналогичная типу), включающая в себя, помимо описания данных, описание подпрограмм (процедур и функций), которые могут быть выполнены над объектом, а также характеристики данных и подпрограмм.

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

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

Класс объявляется на основе общего правила задания типов. Описание структуры класса в языке ОbjеctPascal начинается с зарезервированного слова class, после которого в круглых скобках указывается имя родительского класса. Если он не указан, то предполагается, что родительским является класс TОbjеct, который в ООП-модели языка Objec Pascal по умолчанию считается предком всех объявленных классов. Далее в виде отдельных строк записываются поля данных, методы и свойства. Завершается описание класса зарезервированным словом end. Если ни одного поля, метода или свойства у объявляемого класса нет, но указан непосредственный предок класса, зарезервированное слово end в конце объявления можно не писать. Последовательность записи отдельных элементов (поля, методы, свойства) класса безразлична (с учетом возможности использования одними элементами других), однако чаще всего сначала записываются поля, затем методы и, наконец, свойства.

Пример описания простого класса [2]:

TTPerson=class

Private

fname:string[15];

faddress:string[35];

Public

procedure show;

end;

В приведенном примере TTPerson – это имя класса, fname и faddress – имена полей, show – имя метода.

Отдельные элементы класса могут иметь различные возможности по их использованию вне рассматриваемого класса (иметь разные области доступности или, иначе, видимости). В ООП DELPHI имеется несколько вариантов задания областей видимости, которые определяют разделы (секции) в описании класса и начинаются с ключевых слов private, public, protected, published и automated. Количество и порядок следования этих разделов могут быть произвольными.

Общую структуру описания класса можно представить следующим образом:

Type

ИмяКласса = class(ИмяРодительскогоКласса)

         Опубликованные поля, методы, свойства;

Private

         Скрытые поля, методы, свойства;

Public

         Общедоступные поля, методы, свойства;

Protected

          Защищенные поля, методы, свойства;

Published

           Опубликованные поля, методы, свойства;

Automated

            Поля, методы, свойства для OLE-объектов;

end;

 

В программе представители классаобъекты, объявляются в разделе var.

Например, так:

Var

student:TTPerson;

professor:TTPerson;

 

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

Выделение памяти и инициализация объекта осуществляются с помощью специального метода класса — конструктора, которому обычно присваивают имя create (создать). Чтобы подчеркнуть особую роль и поведение конструктора, вместо ключевого слова procedure в заголовке конструктора используется слово constructor.

Ниже приведено описание класса TTPerson, в состав которого введен конструктор.

TTPerson = class

Private

fname:string[15];

faddress:string[35];

constructor create; // конструктор

Public

procedureshow; // метод

end;

 

Выделение памяти для данных объекта происходит присваиванием результата применения метода-конструктора к типу (классу) объекта.

Например, после выполнения оператора

professor:=TTPerson.create;

выделяется необходимая память для данных объекта professor.

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

Пример реализации конструктора для объекта TTPerson.

constructorTTPerson.create;

Begin

fname:=’’;

faddress:=’’;

end;

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

Например, для доступа к полю fname объекта professor вместо следует писать professor.fname

Если в программе некоторый объект больше не используется, то можно освободить память, занимаемую полями этого объекта. Для выполнения этого действия используют метод-деструктор free. Например, чтобы освободить память, занимаемую полями объекта professor, достаточно записать                      professor.free;

 

Методы - это процедуры и функции, объявление которых включено в описание класса и которые выполняют действия над объектами класса. Объявляются и описываются они в интерфейсной части модуля внутри описания класса записывается лишь заголовок подпрограммы, а в исполнительной части – само содержание метода. Чтобы метод был выполнен, надо указать имя объекта и имя метода, отделив одно имя от другого точкой. Например, оператор - professor.show;

вызывает применение метода show к объекту professor. Фактически оператор применения метода к объекту — это специфический способ записи оператора вызова процедуры.

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

Ниже приведен пример определения метода show описанного выше класса ТТРегson.

// метод show классаTTPerson

procedureТТРегson.show;

Begin

ShowMessage(‘Имя:’+fname+#13+'Адрес:'+faddress);

end;

 

Следует обратить внимание на то, что в операторах метода доступ к полям объекта осуществляется без указания имени объекта.

Обычно методы применяются к ранее созданным объектам программы. Такие методы можно считать методами объектов. В DELPHI существует возможность создания методов, которые можно использовать даже тогда, когда ни один объект класса не создан. К таким методам относятся, например, конструкторы, которые вызываются для создания объектов. Подобные методы называются методами класса и особым образом оформляются (за исключением конструкторов, о которых сказано выше). Объявление такого метода начинается с зарезервированного слова class, после которого следует обычное объявление метода, например:

TMyForm = class(TForm)

class procedureMessageCreate;

end;

class procedureTMyForm.MessageCreate;

Begin

end;

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

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

В ObjectPascal ограничение доступа к полям объекта реализуется с помощью свойств объекта. Свойство объекта характеризуется полем, хранящим значение свойства, и двумя методами, обеспечивающими доступ к полю свойства. Метод установки значения свойства называется методом записи свойства (write), метод получения значения свойства называется методом чтения свойства (read).

В описании класса перед именем свойства записывают ключевое слово property (свойство). После имени свойства указываются его тип, затем имена методов, обеспечивающих доступ к значению свойства. После слова read указывается имя метода, обеспечивающего чтение свойства, после слова write —имя метода, обеспечивающего запись свойства. Ниже приведен пример описания класса TTPerson, содержащего два свойства: Name и Address.

Type

TName=string[15];

TAddress=string[35];

TTPerson = class

Private

FName:Tname; //значениесвойства Name

FAddress:TAddress; // значениесвойства Address

ConstructorCreate(Name:Tname);

Procedure Show;

    FunctionGetName:TName;

    FunctionGetAddress:TAddress;

ProcedureSetAddress(NewAddress:TAddress);

 

Public

Property Name: Tname

readGetName;

Property Address: TAddress

readGetAddress;

writeSetAddress;

end;

В программе для установки значения свойства необязательно записывать оператор применения к объекту метода установки значения свойства, можно записать обычный оператор присваивания значения свойству. Например, чтобы присвоить значение свойству Address объекта student, достаточно записать

student.Address:=’С.Петербург, ул. Садовая, 21, кв.3’;

Компилятор перетранслирует приведенный оператор присваивания значения свойству в оператор вызова метода:

student.SetAddress('С.Петербург, ул. Садовая, 21, кв.3');

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

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

Оформление данных объекта как свойства позволяет ограничить доступ к полям, хранящим значения свойств объекта, например можно разрешить только чтение. Чтобы операторы программы не могли изменить значение свойства, в описании свойства надо указать только имя метода чтения. Попытка присвоить значение свойству, предназначенному только для чтения, вызывает ошибку времени компиляции Вприведенном выше описании класса TTPerson свойство Name доступно только для чтения, а свойство Address — для чтения и записи.

Установить значение свойства, защищенного от записи, можно во время инициализации объекта. Ниже приведены методы класса TTPerson, обеспечивающие создание объекта класса TTPerson и доступ к его свойствам.

//конструкторобъектаTTPerson

ConstructorTTPerson.Create(Name:TName);

Begin

Fname:=Name;

end;

//метод получения значения свойства Name

FunctionTTPerson.GetName;

Begin

      Result:=FName;

end ;

//метод получения значения свойства Address

FunctionTTPerson.GetAddress;

Begin

Result:=FAddress;

end;

//метод изменения значения свойства Address

ProcedureTTPerson.SetAddress(NewAddress:TAddress);

Begin

ifFAddress =’’

thenFAddress:=NewAddress;

end;

 

Приведенный конструктор объекта TTPerson создает объект и устанавливает значение поля FName, определяющего значение свойства Name.

Операторы программы, обеспечивающие создание объекта класса TTPerson и установку его свойства, могут быть, например, такими:

student:=TTPerson.create('Иванов');

student.address:=’ул. Садовая, д.21, кв. 3’;

Концепция объектно-ориентированного программирования предполагает возможность определять новые классы посредством добавления полей, свойств и методов к уже существующим классам. Такой механизм получения новых классов называется порождением. При этом новый, порожденный, класс (класс-потомок) наследует свойства и методы своего базового, родительского класса.

В объявлении класса-потомка указывается класс родителя. Например, класс TEmployee (сотрудник) может быть порожден от рассмотренного выше класса TTPerson путем добавления поля Department (отдел). Объявление класса TEmployee в этом случае может выглядеть так:

TEmployee = class(TTPerson)

FDepartment:integer; // номеротдела

constructor Create(Name:TName;Dep:integer);

end;

Заключенное в скобки имя класса TTPerson показывает, что класс TEmployee является производным от класса TTPerson. В свою очередь, класс TTPerson является базовым для класса TEmployee.

Класс TEmployee имеет свой собственный конструктор, который обеспечивает инициализацию класса родителя и своих полей. Пример реализации конструктора классаTEmployee:

constructorTEmployee.Create(Name:Tname;Dep:integer);

Begin

inherited Create(Name);

FDepartment:=Dep;

end;

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

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

engineer:=TEmployee.create('Сидоров',413);

engineer.address:='ул.Блохина, д.8, кв.10';

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

Помимо объявлений элементов класса (полей, методов, свойств) описание класса, как правило, содержит несколько директив, которые устанавливают степень видимости элементов класса в программе.

Рассмотрим семантику директив видимости.

Директива private.

Поля, свойства и методы, описанные в разделе private, называются личными или закрытыми. Сюда помещаются элементы (чаще всего поля), которые выполняют в объекте специфичные функции и которые поэтому целесообразно скрыть от других частей программы, либо такие элементы, для которых по ряду причин не следует разрешать доступ извне объекта.

Директива public.

Элементы, описанные в разделе public, называются общедоступными. Они могут быть использованы всюду в программе. Поля, свойства и методы, расположенные сразу после заголовка класса, при выключенной директиве компилятора {$M-}, по умолчанию принимаются общедоступными.

Директива protected.

Элементы класса, объявленные в разделе protected(защищенный), доступны только в классах, порожденных от исходного. Здесь размещаются элементы, которые важны лишь для функционирования объектов данного класса и его потомков. Обычно в секцию protected помещаются описания методов класса.

Директива published.

Поля, свойства и методы, описанные в разделе published, называются опубликованными. Их область видимости эквивалентна области видимости общедоступных описаний. Отличие состоит в том, что информация о них, за исключением ряда типов, например real, на этапе проектирования программы помещается в инспектор объектов. Описания, расположенные сразу после заголовка класса, при включенной директиве компилятора {$M+}, по умолчанию принимаются опубликованными.

Директива automated.

Элементы класса, объявленные в разделе automated, называются автоматическими. Их область видимости эквивалентна области видимости общедоступных описаний. Отличие состоит в том, что для автоматических свойств и методов генерируется дополнительная информация, которая используется для реализации OLE-механизма. Использовать директиву automated имеет смысл при объявлении потомков стандартного класса TAutoObject.

Ниже приведено описание класса TTPerson, в которое включены директивы видимости.

ТТРегsоп = class

Private

FName:TName; { значение свойства Name }

FAddress:TAddress; ( значениесвойства Address}

Protected

ConstructorCreate(Name:TName);

FunctionGetName:TName;

FunctionGetAddress:TAddress;

ProcedureSetAddress (NewAddress: TAddress);

PropertyName:TName

readGetName;

PropertyAddress:TAddress

readGetAddress

writeSetAddress;

end;

Полиморфизм — это возможность использовать одинаковые имена для методов, входящих в различные классы.

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

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

Type

// базовыйкласс

TPerson=class

fname:string;{ имя }

constructor Create(name:string);

function info: string; virtual;

end;

// производныйотбазовогоTPerson

TStud=class(TPerson)

fgr:integer; { номергруппы }

constructor Create(name:string;gr:integer);

function info: string; override;

end;

// производный от базового TPerson

TProf=class(TPerson)

fdep:string; { названиекафедры }

constructor Create(name:string;dep:string);

function info: string; override;

end;

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

functionTPerson.info:string;

Begin

result:=’’;

end;

functionTStud.info:string;

Begin

  result:=fname+' гp.'+IntTostr(fgr);

end;

 

functionTProf.info:string;

Begin

result:=fname+'каф.'+fdep;

end ;

 

В программе список людей можно представить массивом объектов класса TPerson, например

1ist:array[1..SZL] of TPerson; // SZL — размермассива

Здесь следует отметить, что объект list— это массив указателей. Объявить подобным образом список можно потому, что ObjectPascal позволяет указателю на родительский класс присвоить значение указателя на дочерний класс. Поэтому элементами массива list могут быть как объекты класса TStud, так и объекты класса TProf.

Вывод списка можно осуществить применением метода info к элементам массива, например, так:

st:=’’;

for i:=l to SZL do

if list[i] <> NIL then st:=st+info.list[i]+#13;

ShowMessage(st);

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

Классы и объекты DELPHI

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

Структура некоторых абстрактных классов, находящихся в начале иерархии классов, приведена на рисунке.[3]

TObject
TPersistent
TComponent
TCanvas
TPicture
TGraficControl
TWinControl
TControl

 


Класс TObject является предком всех других классов, используемых в DELPHI. Он включает в себя характеристики, свойственные всем используемым классам. Некоторые методы класса TObject могут использоваться без создания соответствующих объектов с учетом того, что реального объекта такого класса может и не быть. Эти методы позволяют получить общие характеристики класса – адрес таблицы, содержащей характеристики класса, имя класса, имя предка класса, характеристики методов и т. д. Примеры некоторых методов класса TObject:

ClassName – функция класса (типа ShortString) формирует строку, содержащую имя класса, данное ему при создании;

ClassParent – функция, определяющая класс непосредственного предка данного класса;

ClassType – функция возвращает класс конкретного объекта;

InstanceSize – функция (типа Longint) возвращает размер класса или объекта в байтах;

FieldAddress(Name) – функция типа Pointerвозвращает адрес поля объекта с именем Name типа ShortString.

Класс TPersistent (Постоянный) является потомком класса TObject и предком всех классов, объекты которых могут быть помещены в память и взяты из памяти. Основными потомками класса TPersistent являются классы TComponent (Компонента) – предок всех компонент проекта; TStrings (Строки) – предок всех списков строк; TCollection (Коллекция) – коллекция (список) элементов; TGraphicObject (Графический объект), TCanvas (Канва – основа для рисования), TGraphic (Графический элемент), TPicture (Изображение) – классы, образующие так называемый графический инструментарий DELPHI.

Класс TControl является родоначальником всех элементов управления, с помощью которых выводится информация на экран и с помощью которых можно вводить информацию в программу, используя клавиатуру и мышь. Его потомок класс TWinControl служит для создания окон Windows. Класс TGraphicControl отличается от класса TWinControl отсутствием у объектов его семейства оконной функции, в связи с чем такие элементы либо служат для вывода на экран информации, либо являются чисто декоративными.

В ObjectPascal можно задавать указатель на класс, называемый метаклассом. Для этого в объявлении записываются ключевые слова classof, после чего указывается имя класса, ссылка на который формируется:


Type

<имя типа>=classof<базовый класс>;

Примером может быть следующее описание:

Type

TControlClass= class of TControl;

Этот тип является стандартным в DELPHI и именно так он определяется в модуле Controls. Введя такой тип данных, далее можно задавать переменные этого типа, например:

varControlClass: TControlClass;

Значениями такой переменной могут быть классы, входящие в семейство исходного класса TControl: сам класс TControl, класс TForm, класс TButton и т. д. Таким образом, метакласс может быть указателем на любой класс, входящий в семейство исходного класса.

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


 

 

Тема. Структура фрагмента программы обработки исключений

Задание: Составить конспект.

План работы:

1 Ознакомиться с перечнем вопросов, подлежащих рассмотрению

2 Ознакомиться с представленным теоретическим материалам

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

4 Законспектировать ответы на вопросы, подлежащие рассмотрению, привести примеры

Включайте в конспект не только основные положения, но и обосновывающие их выводы, конкретные факты и примеры (без подробного описания).

5.Составляя конспект, записывайте отдельные слова сокращённо, выписывайте только ключевые слова, делайте ссылки на страницы конспектируемой литературы, применяйте условные обозначения.

6.Чтобы форма конспекта отражала его содержание, располагайте абзацы «ступеньками», подобно пунктам и подпунктам плана, применяйте разнообразные способы подчеркивания, используйте карандаши и ручки разного цвета.

Вопросы для самостоятельной работы

1 Свойства и методы базового класса исключений

2 Два направления обработки исключений

3 Виды исключительных ситуаций

Вопросы для самоконтроля:

1 Какую ситуацию называют исключительной

2 Какой класс является базовым для всех исключений

3 Синтаксис обработчиков исключений

Форма контроля: Оценка составленного конспекта.

 

Теоретический материал

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

Базовым классом для всех исключений является класс Exception. Объекты данного класса имеют следующие свойства и методы:

- Message – описание исключительной ситуации;

- HelpContext – номер идентификатора контекстной помощи для объекта исключения;

- Create – метод, который служит для создания объекта исключительной ситуации.

Класс Exception имеет множество потомков, каждый из которых служит для обработки определенный динамической ошибки.

Обработка исключительных ситуаций может происходить по двум направлениям:

1. Глобальная обработка исключений. Механизм ее реализуется через объект Application. При получении от системы сообщения об исключении объект Application генерирует событие OnException. Программист может создать свой глобальный обработчик. С этой целью удобно использовать компонент ApplicationEvents, для которого пишется обработчик события OnException/

2. Локальная обработка исключений. Для обеспечения возможности использования специализированных обработчиков исключений, в состав языка введены две конструкции try… finally и try…exept.

Try

//операторы, выполнение которых может вызвать ошибку

Finally

//операторы, которые должны быть выполнены в случае ошибки

End;

Данная конструкция применяется для выполнения всех необходимых действий перед передачей управления на следующий уровень обработки ошибки или глобальному обработчику. Если в любом из операторов секции try возникает исключительная ситуация, то управление передается первому оператору секции finally для выполнения всех операторов секции. Если исключительная ситуация не возникла, то последовательно выполняются все операторы обеих секций.

Try

//операторы, выполнение которых может вызвать ошибку

Except

//операторы, которые должны быть выполнены в случае ошибки

End;

Эта конструкция применяется для перехвата исключительной ситуации и предоставляет возможность ее обработки. Если в операторах секции try возникла исключительная ситуация, то управление передается первому оператору секции except. Если исключительная ситуация не возникла, то операторы секции Except не выполняются. Секция except может быть разбита на несколько частей конструкциями on…do. Это позволяет анализировать класс исключительной ситуации с целью ее обработки. При необходимости исключительную ситуацию можно вызвать программно.

Для этого используется оператор Raise, выполнение которого приводит к созданию объекта исключения класса Exception или одного из его потомков. Оператор имеет следующий синтаксис:

Raise ClassException.Method;

Процесс отладки исключительных ситуаций в Delphi имеет некоторые особенности. По умолчанию при возникновении динамической ошибки Delphi перехватывает исключительную ситуацию и выдает соответствующее сообщение. Если работу приложения надо продолжить, то необходимо выбрать из меню Run команду Run и возникшее исключение будет обработано средствами приложения.

Исключительные ситуации:

- EConvertError - происходит в случае возникновения ошибки при выполнении функций StrToInt и StrToFloat, когда конвертация строки в соответствующий числовой тип невозможна.

- EIntError - предок исключений, случающихся при выполнении целочисленных операций.

- EDivByZero - вызывается в случае деления на ноль, как результат RunTime Error 200.

- EIntOverflow - вызывается при попытке выполнения операций, приводящих к переполнению целых переменных, как результат RunTime Error 215 при включенной директиве {$Q+}.

- ERangeError - вызывается при попытке обращения к элементам массива по индексу, выходящему за пределы массива, как результат RunTime Error 201 при включенной директиве {$R+}.

- EInvalidCast - происходит при попытке приведения переменных одного класса к другому классу, не совместимому с первым (например, приведение переменной типа TListBox к TMemo).

- EListError - вызывается при обращении к элементу наследника TList по индексу, выходящему за пределы допустимых значений (например, объект TStringList содержит только 10 строк, а происходит обращение к одиннадцатому).

- EMathError - предок исключений, случающихся при выполнении операций с плавающей точкой.

- EOverflow - происходит как результат переполнения операций с плавающей точкой при слишком больших величинах. Соответствует RunTime Error 205.

- Underflow - происходит как результат переполнения операций с плавающей точкой при слишком малых величинах. Соответствует RunTime Error 206.

- EZeroDivide - вызывается в результате деления на ноль.

EMenuError - вызывается в случае любых ошибок при работе с пунктами меню для компонент TMenu, TMenuItem, TPopupMenu и их наследников

Пример

Необходимо заполнить таблицу числами по следующему правилу: генерируется случайное число, а затем в ячейке компонента StringGrid 1 сохраняется обратное значение. Заранее не известно, был ли сгенерирован 0, и будет ли допустима операция деления. Для корректной работы данной программы необходимо задавать защищенный блок; процедура формирования таблицы будет иметь вид:

procedure TForm1.Button1Click(Sender: TObject);

var i,j:Integer;

 a:real;

begin

with StringGrid1 do

 begin

 ColCount:=SpinEdit1.Value+1;

 RowCount:=SpinEdit2.Value+1;

 for i :=1 to ColCount do

 for j:=1 to RowCount do

 Try                                                                  {Начало блока}

 a:=Random(10);

 Cells[i,j]:=FloatToStr(1/a);

 except

 On EZeroDivide do ShowMessage('Деление на ноль в ячейке '+IntToStr(i)+’,’ +IntToStr(j));         {Проверка класса ошибки}

 end;

 end;

end;

 


 

Тема. Операции над множествами.

Задание: Составить конспект.

План работы:

1 Ознакомиться с перечнем вопросов, подлежащих рассмотрению

2 Ознакомиться с представленным теоретическим материалам

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

4 Законспектировать ответы на вопросы, подлежащие рассмотрению, привести примеры

Включайте в конспект не только основные положения, но и обосновывающие их выводы, конкретные факты и примеры (без подробного описания).

5.Составляя конспект, записывайте отдельные слова сокращённо, выписывайте только ключевые слова, делайте ссылки на страницы конспектируемой литературы, применяйте условные обозначения.

6.Чтобы форма конспекта отражала его содержание, располагайте абзацы «ступеньками», подобно пунктам и подпунктам плана, применяйте разнообразные способы подчеркивания, используйте карандаши и ручки разного цвета.

Вопросы для самостоятельной работы

1 Понятие множества

2 Операции над множествами

3 Описание множеств в программе

4 Применение множеств

Вопросы для самоконтроля:

1 Чем отличаются понятия «множество» в математике и программировании

2 Приведите примеры описания множеств в программе

3 Перечислите операции, которые можно выполнять над множествами

 

Форма контроля: Оценка составленного конспекта.

 

Теоретический материал

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

Множества в Delphi

Понятие множества в языке программирования несколько отличается от математического определения этого понятия, но смысл сохраняется. Основное отличие в том, что в программировании множество может содержать только конечное число элементов, т.е. не может состоять из бесконечного числа объектов. В математике же последнее допустимо. Например, мы можем определить множество натуральных чисел, которое бесконечно: N = {1, 2, 3, ...}

Следует понимать, что множество не предназначено для хранения каких-либо значений (чисел, символов и т.д.) - оно лишь может дать нам ответ на вопрос: присутствует конкретный элемент в множестве или его там нет.

Множество может быть построено на основе перечислимого типа данных

Например, на основе символьного типа Char. По-английски множество называется set (набор) и именно этим словом описывается в Delphi:

var A: set of Char;

В данном примере мы объявили множество A на основе символьного типа Char.

Запомните: множество не может состоять более чем из 255 элементов!

Например, следующее описание:

var N: set of Integer;

приведёт к ошибке "Set base type out of range".

Задание множеств

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

Чтобы задать множество, мы можем воспользоваться операцией присваивания, где слева стоит переменная-множество, а справа - нужный нам набор. Например, в описанное выше множество A мы хотим поместить элементы-символы A, B, C, D. Тогда это запишется так:

A:=['A','B','C','D'];

Теперь множество A содержит 4 элемента.

Если вспомнить, что тип данных Char упорядочен, то данную запись можно сократить следующим образом:

A:=['A'..'D'];

Мы просто указали диапазон значений, который должен находиться во множестве. Результаты одинаковый, но вторая запись короче и красивее. Допустимы, конечно же, комбинации диапазонов и отдельных значений:

A:=['A','B','K'..'N','R','X'..'Z'];

Помните, что множество - это виртуальный набор элементов: множество нельзя ввести с клавиатуры и точно так же нельзя вывести на экран. Поэтому добавление элементов во множество делается только программным путём. Безусловно, вы каким-либо образом можете связать элементы интерфейса программы и операцию добавления элементов во множество, но напрямую ввести множество нельзя. Аналогично, вы можете показать множество на экране с помощью каких-либо элементов (например, флажков TCheckBox), но само множество "в чистом виде" вывести нельзя.

Операции над множествами

В программировании, как и в математике, над множествами допустимы некоторые операции. Рассмотрим их.


Поделиться:



Последнее изменение этой страницы: 2019-04-11; Просмотров: 229; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.545 с.)
Главная | Случайная страница | Обратная связь