Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Zadanie_na_OOP

.pdf
Скачиваний:
9
Добавлен:
15.03.2016
Размер:
919.45 Кб
Скачать

Содержание

Разработка модулей……………………………………………………………………. 2

Задание на лабораторную работу 1…………………………………………………… 5 Объектно-ориентированное программирование…………………………………….. 6 Задание на лабораторную работу 2,3…………………………………………………. 43

1

Разработка модулей

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

Модуль имеет следующую структуру:

UNIT имя модуля;

INTERFACE

интерфейсная часть

IMPLEMENTATION

исполняемая часть

BEGIN

инициирующая часть

END.

Заголовок модуля состоит из служебного слова UNIT и следующего за ним имени. Причем имя модуля должно совпадать с именем файла, в котором он хранится. Модуль EDIT должен храниться в файле edit.pas.

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

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

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

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

procedure sum (a,b:complex; var c:complex) — процедура сложения двух ком-

плексных чисел a и b, результат возвращается в переменной c;

procedure razn(a,b:complex;var c:complex) — процедура вычитания двух ком-

плексных чисел a и b, результат возвращается в переменной c;

procedure umn(a,b:complex;var c:complex) — процедура умножения двух ком-

плексных чисел a и b, результат возвращается в переменной c;

procedure delenie(a,b:complex;var c:complex) — процедура деления двух ком-

плексных чисел a и b, результат возвращается в переменной c;

Кроме того, в модуле будет процедура вывода комплексного числа на экран procedure vivod(a:complex).

2

Текст модуля приведен ниже.

UNIT compl; INTERFACE type

complex=record

x:real;

y:real;

end;

procedure sum(a,b:complex;var c:complex); procedure razn(a,b:complex;var c:complex); procedure umn(a,b:complex;var c:complex); procedure delenie(a,b:complex;var c:complex); procedure vivod(a:complex); IMPLEMENTATION

procedure sum(a,b:complex;var c:complex); begin

c.x:=a.x+b.x;

c.y:=a.y+b.y;

end;

procedure razn(a,b:complex;var c:complex); begin

c.x:=a.x-b.x; c.y:=a.y-b.y;

end;

procedure umn(a,b:complex;var c:complex); begin

c.x:=a.x*b.x-a.y*b.y; c.y:=a.y*b.x+a.x*b.y;

end;

procedure delenie(a,b:complex;var c:complex); begin

c.x:=(a.x*b.x+a.y*b.y)/(b.x*b.x+b.y*b.y); c.y:=(a.y*b.x-a.x*b.y)/(b.x*b.x+b.y*b.y);

end;

procedure vivod(a:complex); begin

if a.y>=0 then writeln(a.x:1:3,'+',a.y:1:3,'i') else writeln(a.x:1:3,'-',-a.y:1:3,'i')

end;

end.

Для работы с модулем, введем текст модуля, сохраним его под именем compl.pas. После этого выполним команду Собрать. В каталоге, где сохранен модуль, в результате компиляции появятся два файла — с расширением .o (в Linux и .obj в Windows), и с расширением .ppu. Для использования нужен именно файл с расширением .o. Теперь скомпилированный файл модуля с расширением .o должен находиться либо в том же

3

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

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

uses compl;

var g,h,e:complex; begin

writeln('Введите первое комплексное число'); read(g.x,g.y);

vivod(g);

writeln('Введите второе комплексное число'); read(h.x,h.y);

vivod(g);

sum(g,h,e); writeln('Сумма чисел'); vivod(e);

razn(g,h,e); writeln('Разность чисел'); vivod(e);

umn(g,h,e); writeln('Произведение чисел'); vivod(e);

delenie(g,h,e); writeln('Частное чисел'); vivod(e);

end.

Результаты работы программы представлены на рис. 1.

Рисунок 1: Операции с комплексными числами

4

Задачи на лабораторную работу №1

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

1.Вводится последовательность целых чисел, 0 – конец последовательности. Определить, содержит ли последовательность хотя бы одно число, сумма цифр в котором равна их количеству. Создать процедуру, которая возвращает сумму и количество цифр в числе.

2.Вводится последовательность целых чисел, 0 – конец последовательности. Определить, содержит ли последовательность хотя бы одно совершенное число. Для определения совершенного числа создать функцию.

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

4.Вводится последовательность из N целых положительных элементов. Посчитать количество чисел палиндромов. Для определения палиндрома создать функцию.

5.Вводится последовательность из N целых положительных элементов. Подсчитать количество совершенных чисел в последовательности. Для определения совершенного числа создать функцию.

6.Поступает последовательность целых положительных чисел, 0 – конец последовательности. Определить, в каком из чисел больше всего делителей. Для подсчета делителей числа использовать функцию.

7.Поступает последовательность целых положительных чисел, 0 – конец последовательности. Определить, в каком из чисел больше всего цифр. Для подсчета количества цифр числа использовать функцию.

8.Вывести на экран значения функции f(x)=2ех и ее первой производной f ‘(x), в диапазоне от -5 до 5, с шагом 0.5. Для вычисления значений f(x) и f ‘(x) создать функции.

9.Вводится последовательность из N целых положительных элементов. Найти число с минимальным количеством цифр. Для определения количества цифр в

числе использовать функцию.

10.Вводится последовательность из N целых элементов. Для всех положительных элементов последовательности вычислить значение факториала и вывести его на печать. Вычисление факториала оформить в виде функции.

11.Поступает последовательность целых положительных чисел, 0 – конец последовательности. Вывести на экран все числа последовательности, не являющиеся простыми, и их делители. Определение простого числа оформить в виде функций.

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

5

13.Поступает последовательность целых положительных чисел, 0 – конец последовательности. Найти среднее арифметическое простых чисел в этой последовательности. Определение простого числа оформить в виде функций.

14.В последовательности из N целых положительных элементов найти число с наибольшим количеством нулей в своем представлении. Составить функцию для подсчета нулей в числе.

15.В последовательности из N целых положительных элементов найти сумму всех палиндромов. Для определения палиндрома создать функцию.

16.Поступает последовательность целых положительных чисел, 0 – конец последовательности. Посчитать количество элементов последовательности, имеющих в своем представлении цифру 0. Создать процедуру, возвращающую значение истина, если в числе есть нули, и ложь в противном случае.

17.Поступает последовательность целых положительных чисел, 0 – конец последовательности. Для каждого числа найти количество нулей и единиц. Создать процедуру, которая возвращает количество нулей и единиц в заданном числе.

18.Вводится последовательность из N целых элементов. Для каждого элемента последовательности найти среднее значение его цифр. Создать функцию для расчета среднего значения цифр в числе.

19.Поступает последовательность целых положительных чисел, 0 – конец последовательности. Определить количество цифр и наименьшую цифру для каждого числа последовательности. Написать процедуру, которая для заданного числа возвращает два параметра: количество цифр в нем и наименьшую цифру.

20.Вводится последовательность из N целых элементов. Для каждого элемента последовательности вывести на экран количество цифр и количество делителей. Написать процедуру, которая рассчитывает оба параметра.

6

Объектно-ориентированное программирование

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

Основные понятия

Основой объектно-ориентированного программирования является объект. Он состоит из трех основных частей:

Имя (например, автомобиль);

Состояние или переменные состояния (например, марка автомобиля, цвет, масса, число мест и т. д.);

Методы, или операции, которые выполняют некоторые действия над объектами

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

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

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

экземплярами класса.

Объектно-ориентированное программирование (ООП) – представляет собой технологию разработки программ с использованием объектов.

В объектно-ориентированных языках есть три основных понятия: инкапсуляция, на-

следование и полиморфизм.

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

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

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

Для объявления класса используется конструкция: type

<название класса> = class(<имя класса родителя>) <методы и переменные класса>

private

<поля и методы, доступные только в пределах модуля> protected

<поля и методы, доступные только в классах-потомках> public

<поля и методы, доступные из других модулей> published

7

<поля и методы, видимые в инспекторе объектов> end;

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

Структуры отличаются от классов тем, что поля структуры доступны всегда. При использовании классов могут быть члены, доступные везде — публичные (описатель public), и приватные (описатель private), доступ к которым возможен только с помощью публичных методов. Это также относится и к методам класса.

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

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

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

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

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

< имя поля 1>: <тип_данных>; <имя поля 2>: <тип_данных>;

...

Методы в классе объявляются так же, как и обычные подпрограммы: function <имя метода 1> (<список параметров>): <тип результата>; procedure <имя метода 2> (<список параметров>);

Описание процедур и функций, реализующих методы, помещается после слова implementation того модуля, где объявлен класс, и выглядит так:

function <имя класса>.<имя метода 1> (<список параметров>): <тип результата>; begin

тело функции;

end;

procedure <имя класса>.<имя метода 2> (<список параметров>); begin

тело процедуры;

end;

8

Объявление переменной типа class называется созданием (инициализацией) объекта (экземпляра класса). Экземпляр класса объявляется в блоке описания переменных:

var <имя_переменной> : <имя_класса>;

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

<имя_переменной>.<поле1>:=<выражение>; <имя_переменной>.<метод1>(<список параметров>);

...

Также можно использовать оператор With:

With <имя_переменной> do begin

<поле1>:=<выражение>; <метод1>(<список параметров>);

...

end;

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

Рассмотрим это на примере проекта с формой, на которой есть кнопка Button1.

unit Unit1;

interface uses

Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

{ TForm1 }

//объявление класса формы TForm1 TForm1 = class(TForm)

//объявление компонента кнопки Button1 Button1: TButton;

//объявление метода обработки события — //щелчка по кнопке Button1

procedure Button1Click(Sender: TObject); private

{ private declarations }

public

{ public declarations }

end;

var

//описание переменной класса формы TForm1 Form1: TForm1;

9

implementation

{ TForm1 }

//описание метода обработки события — щелчка по кнопке Button1 procedure TForm1.Button1Click(Sender: TObject);

begin

//Текст процедуры обработки события end;

initialization

{$I unit1.lrs}

end.

Во Free Pascal класс (объект) –это динамическая структура. В отличие от статической она содержит не сами данные, а ссылку на них.

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

constructor Create;

Описывают конструктор так же, как и другие методы, после ключевого слова implemention того модуля, в котором объявлен класс.

constructor <имя_класса>.Create; begin

<поле1>:=<выражение1>; <поле2>:=<выражение2>;

...

inherited Create;

end;

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

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

destructor Destroy;

Если в программе какой-либо объект больше не используется, то оператор

<имя_переменной_типа_класс>.free;

с помощью метода free вызывает деструктор и освобождает память, занимаемую по-

лями объекта <имя_переменной_типа_класс>.

Рассмотрим все описанное на примере класса — комплексное число. Назовем класс – Tcomplex, в классе будут члены класса: x – действительная часть комплексного числа, y – мнимая часть комплексного числа. Также в классе будут методы:

конструктор Create, который будет записывать в действительную и мнимую части значение 0;

Modul() – функция вычисления модуля комплексного числа;

Argument() – функция вычисления аргумента комплексного числа;

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]