You are on page 1of 11

Міністерство Освіти і Науки України

Київський Національний Університет імені Тараса Шевченка

Факультет Інформаційних Технологій

Звіт з лабораторної роботи №2


з дисципліни Технології програмування

Вико
нав студент групи ІР-22
Музика Марк Сергійович
Викладач : к.ф.-м.н., ас. Пономарнеко Роман
Миколайович

Київ – 2021
ЗМІСТ
1. Постановка завдання 3
2. Аналітичні викладки 4
3. UML діаграма класу 5
4. Код програми 6
5. Тестування програми 11
6. Висновок 11
Лабораторна робота №2
Тема: Спадкування С++.
Мета: вивчити основні концепції об'єктно-орієнтованого програмування.
Вивчити особливості успадкування і множинного спадкування.
Етапи виконання завдання:
Розробити покроковий алгоритм вирішення розрахункової частини завдання
і підзадач (при необхідності). Розробити UML діаграму класів. Виконати
програмну реалізацію завдання відповідно до варіанту. Прототипи класів
повинні містяться в окремому * .h- файлі. У програмі обов'язково передбачити
висновок інформації про виконавця роботи (ПІБ), номер варіанта, обраному
рівні складності і завданні. Передбачити можливість повторного запуску
програми (запит про бажання вийти з програми, або продовжити роботу).
Ключові моменти програми обов'язково повинні містити коментарі.
Завдання 1

Аналітичні викладки:
Спадкування -це здатність брати існуючий (базовий) клас і породжувати з
нього новий клас – нащадок, з успадкуванням всіх його атрибутів і поведінки.
Похідний клас може успадковуватися від базового класу як public,
protected або private. Захищене і закрите наслідування зустрічаються рідко і
кожне з них потрібно використовувати з великою обережністю. При
наслідуванні класу як public, всі відкриті елементи базового класу стають
відкритими елементами похідного класу, а захищені елементи базового
захищеними елементами похідного. Закриті елементи базового класу ніколи
недоступні похідному класу, навіть при наслідуванні специфікатором public.
При захищеному спадкуванні відкриті і захищені елементи базового класу
стають захищеними елементами похідного класу. При закритому
спадкуванні відкриті і захищені елементи базового класу стають закритими
елементами похідного класу. При закритому і захищеному спадкуванні не
справедливо відношення, що об'єкт похідного класу є об'єктом базового класу.
Якщо не вказано специфікацію наслідування, то наслідування є закритим. Якщо
в класі-спадкоємця перевизначити функцію-елемент (ввести нову функцію
з тим же ім'ям), то для об'єктів цього класу нова функція скасує
батьківську. Якщо ж звертатися до об'єкта цього класу, то викликатися буде
нова функція. Якщо треба викликати саме функцію базового класу, то
необхідно використовувати операцію дозволу області дії (позначається як
class_name::).
Площа круга – S = πr2, де π = 3,14, r – радіус круга.
Площа поверхні тора S та його об'єм V визначаються за формулами:
Sтора=4π2Rr
Vтора=2π2Rr2
UML діаграма класів:
Код програми:
Lab2.cpp:

#include "pch.h"
#include "Point.h"
#include "SubClasses.h"
#include <iostream>
#include <string>
#include <ctime>

using namespace std;

int main()
{
setlocale(0, "rus");

cout << "Варiант 11(В)" << endl;


cout << "Музика Марк IP-22" << endl;

char p = 'y';
char flag;
int temp_x, temp_y;
double temp_R, temp_r;

while (p == 'y')
{
cout << "Введiть координати та радiус кола №1 через Enter: ";
cin >> temp_x;
cin >> temp_y;
cin >> temp_R;

CircleA *circleA = new CircleA(temp_x, temp_y, temp_R);


circleA->print();
cout << endl;

cout << "Введiть координати та радiус кола №2 через Enter: ";


cin >> temp_x;
cin >> temp_y;
cin >> temp_r;

CircleB *circleB = new CircleB(temp_x, temp_y, temp_r);


circleB->print();
cout << endl;

flag = 'y';

cout << "Введiть координати тора через Enter: ";


cin >> temp_x;
cin >> temp_y;

cout << "Бажаєте використати вже введенi радiуси для тора чи ввести новi, якщо
так то введiть y, якщо нi то n: ";
cin >> flag;

if (flag == 'n')
{
cout << "Введiть радiус кола оберту утворюючого коло тора: ";
cin >> temp_R;
cout << "Введiть радiус утворюючого коло тора: ";
cin >> temp_r;
}

Torus *torus = new Torus(temp_x, temp_y, temp_R, temp_r);


torus->print();
cout << "Бажаєте продовжити використання, якщо так то введiть y, якщо нi то n:
";
cin >> p;
cout << endl;

while ((p != 'y') && (p != 'n'))


{
cout << "Повторiть спробу: ";
cin >> p;
}
}

return 0;
}

Point.h:

#pragma once

#include <string>

using namespace std;

class Point
{
protected:
int x;
int y;

public:
Point(void);
Point(int X, int Y);
Point(const Point& obj);

int getX(void) const;


int getY(void) const;
void print(void) const;
};

Point.cpp:

#include "pch.h"
#include "Point.h"
#include <iostream>

using namespace std;

Point::Point(void)
{
x = 0;
y = 0;
}

Point::Point(int X, int Y) : x(X), y(Y)


{
}

Point::Point(const Point& obj)


{
x = obj.x;
y = obj.y;
}

int Point::getX(void) const


{
return x;
}
int Point::getY(void) const
{
return y;
}

void Point::print(void) const


{
cout << "Точка має координати: х = " << x << ", y = " << y << endl;
}

SubClasses.h:

#pragma once

#include"Point.h"

class CircleA : public Point {


private:
void calculateSquare(void);

protected:
const double PI = 3.141592653589793238463;
double R; //для тора радіус кола оберту утворюючого коло тора
double Square;

public:
CircleA(void);
CircleA(int X, int Y, double R);
CircleA(const CircleA& obj);

double getR(void) const;


double getSquare(void) const;
void print(void) const;
};

class CircleB : public Point {


private:
void calculateSquare(void);

protected:
const double PI = 3.141592653589793238463;
double r; //для тора радіус утворюючого коло тора
double Square;

public:
CircleB(void);
CircleB(int X, int Y, double r);
CircleB(const CircleB& obj);

double get_r(void) const;


double getSquare(void) const;
void print(void) const;
};

class Torus : public CircleA, public CircleB {


private:
void calculateSquare(void);
void calculateVolume(void);

protected:
double Volume;

public:
Torus(void);
Torus(int X, int Y, double R, double r);
Torus(const Torus& obj);

double getVolume(void) const;


void print(void) const;
};

SubClasses.cpp:

#include "pch.h"
#include "SubClasses.h"
#include <iostream>

using namespace std;

CircleA::CircleA(void)
{
x = 0;
y = 0;
R = 0;
Square = 0;
}

CircleB::CircleB(void)
{
x = 0;
y = 0;
r = 0;
Square = 0;
}

Torus::Torus(void)
{
CircleA::x = 0;
CircleA::y = 0;
R = 0;
r = 0;
CircleA::Square = 0;
Volume = 0;
}

CircleA::CircleA(int X, int Y, double R)


{
x = X;
y = Y;
this->R = R;
calculateSquare();
}

CircleB::CircleB(int X, int Y, double r)


{
x = X;
y = Y;
this->r = r;
calculateSquare();
}

Torus::Torus(int X, int Y, double R, double r)


{
CircleA::x = X;
CircleA::y = Y;
this->R = R;
this->r = r;
calculateSquare();
calculateVolume();
}

CircleA::CircleA(const CircleA& obj)


{
x = obj.x;
y = obj.y;
R = obj.R;
Square = obj.Square;
}

CircleB::CircleB(const CircleB& obj)


{
x = obj.x;
y = obj.y;
r = obj.r;
Square = obj.Square;
}

Torus::Torus(const Torus& obj)


{
CircleA::x = obj.CircleA::x;
CircleA::y = obj.CircleA::y;
R = obj.R;
r = obj.r;
CircleA::Square = obj.CircleA::Square;
Volume = obj.Volume;
}

double CircleA::getR(void) const


{
return R;
}

double CircleB::get_r(void) const


{
return r;
}

double CircleA::getSquare(void) const


{
return Square;
}

double CircleB::getSquare(void) const


{
return Square;
}

double Torus::getVolume(void) const


{
return Volume;
}

void CircleA::print(void) const


{
cout << "Коло з координатами : х = " << x << ", y = " << y << " та радiусом R = " <<
R << " має площу " << Square << endl;
}

void CircleB::print(void) const


{
cout << "Коло з координатами : х = " << x << ", y = " << y << " та радiусом R = " <<
r << " має площу " << Square << endl;
}

void Torus::print(void) const


{
cout << "Тор з координатами : х = " << CircleA::x << ", y = " << CircleA::y << ",
радiусом R = " << R << " та радiусом r = " << r << " має площу " << CircleA::Square << " та
об'єм " << Volume << endl;
}

void CircleA::calculateSquare(void)
{
Square = R * R * PI;
}

void CircleB::calculateSquare(void)
{
Square = r * r * PI;
}

void Torus::calculateSquare(void)
{
CircleA::Square = 4 * CircleA::PI * CircleA::PI * R * r;
}

void Torus::calculateVolume(void)
{
Volume = 2 * CircleA::PI * CircleA::PI * R * r * r;
}

Тестування програми:

Висновок: Я вивчив основні концепції об'єктно-орієнтованого


програмування. Я вивчив особливості успадкування і множинного спадкування
на прикладі мови програмування високого рівня С++.

You might also like