Вы находитесь на странице: 1из 14

Государственный Университет Молдовы

Факультет Математики и Информатики

Департамент Информатики

Лабораторная работа №2
Тема: Тип объекта. Создание. Инициализация.Методы.
Методы сравнения. Анонимные блоки.

Выполнил: Циуляну Андрей I2002


Преподаватель: Вишневский Борис.

Кишинев, 2021
Условия:

Цель работы:

Воспроизведение элементов объектно-реляционного


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

Применение неявных и явных методов сравнения.

Требования к оформлению работы:

Составьте отчёт, содержащий титульный лист, задание, код запросов,


с кратким его описанием, результаты его выполнения (например,
скриншот/картинка успешного выполнения кода и созданного типа,
таблицы, объекта и т.д. в Object Browser), а также выводы о проделанной
работе. (В одном файле Word).

Задание 2.1:

1. Создайте тип «Треугольник» («Triangle») с атрибутами:


сторона a, сторона b и сторона c.
 Метод существует и возвращает значение true, если треугольник с
такими сторонами существует, в другом случае будет возвращено
значение false.
 Метод сравнения МАР (по периметру); возвращает периметр
треугольника.
 Протестировать в анонимном блоке.
Используйте следующие значения атрибутов для тестирования:

Сторона a Сторона b Сторона c


5 15 20
5 16 20
5 7 9

2. Создайте тип «Прямоугольник» («Rectangle») с соответствующими


атрибутами и условиями на ваш выбор (например, описание задания в
первом пункте).

Задание 2.2:

1. Создать метод сравнения квартир, типа ORDER (см. Лабораторную


работу №1). Функция сравнения возвращает три значения: +1, 0, -1,
соответственно для ситуаций: «больше» (>),
«равно» (=) или «меньше» (<).
Логика сортировки следующая:
 квартиры одного типа равны, если они имеют одинаковую цену;
 если типы разные, то, пока по условию у них одинаковая цена, дом и
вилла «больше» (ценнее), чем другие типы,
 квартира «больше» (более ценная), чем общежитие.
2. Протестировать в анонимном блоке.
2.1
Создайте тип «Треугольник» («Triangle») с атрибутами:
сторона a, сторона b и сторона c.

CREATE OR REPLACE TYPE triangle AS OBJECT


(
s_a NUMBER,
s_b NUMBER,
s_c NUMBER,
MEMBER FUNCTION exist RETURN BOOLEAN,
MAP MEMBER FUNCTION perimetr RETURN NUMBER
);
Объявление типа (стороны и два метода)
В теле типа расписываю методы. Не применяя доп. Булиевых переменных делаю
сразу проверки. Принцип на проверку существования треугольника просто если
все стороны больше нуля то треугольник существует.
После чего в методе периметра задействуется метод exist, ведь если нет
треугольника, то и периметра у него быть не может
/
CREATE OR REPLACE TYPE BODY triangle AS
MEMBER FUNCTION exist RETURN BOOLEAN IS
BEGIN
IF (s_a> 0 AND s_b> 0 AND s_c> 0 ) THEN
RETURN TRUE;
ELSE RETURN FALSE;
END IF;
END exist;
MAP MEMBER FUNCTION perimetr RETURN NUMBER IS
BEGIN
IF (exist()) THEN RETURN (s_a+ s_b +s_c);
ELSE RETURN 0;
END IF;
END perimetr;
END;
Анониманый блок.
Сторона a Сторона b Сторона c
5 15 20
5 16 20
5 7 9

DECLARE
t1 triangle;
t2 triangle;
t3 triangle;
Per number;
BEGIN
t1 := triangle(5,15,20);
t2 := triangle(5,16,20);
t3 := triangle(5,7,9);
Per := t1.perimetr();
DBMS_OUTPUT.PUT_LINE('Perimetr 1 ='||to_char(Per));
Per := t2.perimetr();
DBMS_OUTPUT.PUT_LINE('Perimetr 2 ='||to_char(Per));
Per := t3.perimetr();
DBMS_OUTPUT.PUT_LINE('Perimetr 3 ='||to_char(Per));
END;

Результат таков:

Для прямоугольника решил оставить периметр и функцию на проверку наличия


экземпляра , то есть целого прямоугольника.
Добавил функции по расчету площади ( не МАП, поскольку мап или ордер
функция может быть одной единственной в типе) , также добавил функцию по
расчету диагонали. Проверил, все работает
CREATE OR REPLACE TYPE rectangle AS OBJECT
(
s_a NUMBER,
s_b NUMBER,
MEMBER FUNCTION exist RETURN BOOLEAN,
MAP MEMBER FUNCTION perimetr RETURN NUMBER,
MEMBER FUNCTION area RETURN NUMBER,
MEMBER FUNCTION diagonal RETURN NUMBER
);

/
CREATE OR REPLACE TYPE BODY rectangle AS
MEMBER FUNCTION exist RETURN BOOLEAN IS
BEGIN
IF (s_a> 0 AND s_b> 0) THEN
RETURN TRUE;
ELSE RETURN FALSE;
END IF;
END exist;
MAP MEMBER FUNCTION perimetr RETURN NUMBER IS
BEGIN
IF (exist()) THEN RETURN (s_a + s_a +s_b +s_b);
ELSE RETURN 0;
END IF;
END perimetr;

MEMBER FUNCTION area RETURN NUMBER IS


BEGIN
IF (exist()) THEN RETURN (s_a * s_b);
ELSE RETURN 0;
END IF;
END area;
MEMBER FUNCTION diagonal RETURN NUMBER IS
BEGIN
IF (exist()) THEN RETURN (sqrt((s_a * s_a)+(s_b*s_b)));
ELSE RETURN 0;
END IF;
END diagonal;
END;
DECLARE
r1 rectangle;
Per number;
area number;
diagonal number;
BEGIN
r1 := rectangle(2,3);
Per := r1.perimetr();
DBMS_OUTPUT.PUT_LINE('Perimetr ='||to_char(Per));
area := r1.area();
DBMS_OUTPUT.PUT_LINE('Area ='||to_char(area));
diagonal := r1.diagonal();
DBMS_OUTPUT.PUT_LINE('Diagonal ='||to_char(diagonal));
END;
Результат:
Что же касается второй части лабороторной работы, то я использовал код
первой лабы, модифицировав его ордер функцией, объявление в целом, то же,
только все это делается в pl-sql блоке, в отличии от перовй лабораторной. Кроме
того создал отдельные условия проверки и возвращаемых значений -1,0,1 в
блоке инициализации тела типа (функции ордер для сравнения).
1. Создать метод сравнения квартир, типа ORDER (см. Лабораторную
работу №1). Функция сравнения возвращает три значения: +1, 0, -1,
соответственно для ситуаций: «больше» (>),
«равно» (=) или «меньше» (<).
Логика сортировки следующая:
 квартиры одного типа равны, если они имеют одинаковую цену;
 если типы разные, то, пока по условию у них одинаковая цена, дом и
вилла «больше» (ценнее), чем другие типы,
 квартира «больше» (более ценная), чем общежитие.
2. Протестировать в анонимном блоке.
CREATE OR REPLACE TYPE APARTMENTSECLAB AS OBJECT
(
address add_typ,
owner own_typ,
ap_typ APARTYPSECLAB,
rooms NUMBER,
price NUMBER,
image bfile,
area NUMBER,
windows NUMBER,
balcony NUMBER,
order member function compare(ap APARTMENTSECLAB)
return number
);
Также создал отделиный тип для выявления «ценности» того или иного вида
аппартаментов.

В данном случае это то же самое что own_typ, к примеру


CREATE OR REPLACE TYPE APARTYPSECLAB AS OBJECT
(
name_ap VARCHAR2(30),
value_ap number
);

CREATE OR REPLACE TYPE BODY APARTMENTSECLAB AS


ORDER MEMBER FUNCTION compare(ap APARTMENTSECLAB) RETURN
NUMBER IS
BEGIN
IF ap_typ.value_ap = ap.ap_typ.value_ap AND price = ap.price THEN RETURN 0;
ELSE IF ap_typ.value_ap = ap.ap_typ.value_ap AND price > ap.price THEN
RETURN 1;
ELSE IF ap_typ.value_ap = ap.ap_typ.value_ap AND price < ap.price THEN
RETURN -1;
ELSE IF ap_typ.value_ap > ap.ap_typ.value_ap THEN RETURN 1;
ELSE IF ap_typ.value_ap < ap.ap_typ.value_ap THEN RETURN -1;
END IF;
END IF;
END IF;
END IF;
END IF;
END compare;
END;

DECLARE
a_1 APARTMENTSECLAB;
a_2 APARTMENTSECLAB;
a_3 APARTMENTSECLAB;
a_4 APARTMENTSECLAB;
a_5 APARTMENTSECLAB;
result number;
BEGIN
a_1 := APARTMENTSECLAB(add_typ('Chisinau','Botanica
Veche',2,11),own_typ('Tiuleanu','Andrei',to_date('27.10.2001','dd.mm.yyyy'),7864249
6),APARTYPSECLAB('obshaga',1),5,40000,NULL,110,2,1);
a_2 := APARTMENTSECLAB(add_typ('Chisinau','Botanica
Veche',2,11),own_typ('Tiuleanu','Andrei',to_date('27.10.2001','dd.mm.yyyy'),7864249
6),APARTYPSECLAB('obshaga',1),5,40000,NULL,100,2,2);
a_3 := APARTMENTSECLAB(add_typ('Chisinau','Botanica
Veche',2,11),own_typ('Tiuleanu','Andrei',to_date('27.10.2001','dd.mm.yyyy'),7864249
6),APARTYPSECLAB('kvartira',1),5,50000,NULL,235,3,5);
a_4 := APARTMENTSECLAB(add_typ('Chisinau','Botanica
Veche',2,11),own_typ('Tiuleanu','Andrei',to_date('27.10.2001','dd.mm.yyyy'),7864249
6),APARTYPSECLAB('dom',2),5,99999,NULL,400,8,5);
a_5 := APARTMENTSECLAB(add_typ('Chisinau','Botanica
Veche',2,11),own_typ('Tiuleanu','Andrei',to_date('27.10.2001','dd.mm.yyyy'),7864249
6),APARTYPSECLAB('villa',3),5,99999,NULL,500,7,7);
result := a_1.compare(a_2);
DBMS_OUTPUT.PUT_LINE(result);
result := a_2.compare(a_3);
DBMS_OUTPUT.PUT_LINE(result);
result := a_4.compare(a_5);
DBMS_OUTPUT.PUT_LINE(result);
result := a_5.compare(a_4);
DBMS_OUTPUT.PUT_LINE(result);
END;
Результат:

Вывод:
В этой лабороторной мы познакомились с такими методами сравнения , типам
ORDER , а также MAP.
На практике ознакомилсиь с труктурой построения, а также убедились в
принципах их работы.

Вам также может понравиться