Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практика ООП.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.36 Mб
Скачать

Тема: агрегування та композиція класів.

Мета: поляга у вивченні механізму повторного використання коду на основі контейнерних класів.

Матеріально-технічне оснащення робочого місця: ПК, інструкційна картка.

Зміст та послідовність виконання завдань

1. Створити ієрархію класів ВЕКТОР та БЕЗПЕЧНИЙ ВЕКТОР з перевіркою виходу індексу за межі одновимірного масиву. Безпечний вектор визначає змінні:нижню і верхню межу (індекси). Перевизначити виведення у потік і введення з потоку, конструктор копіювання, операцію присвоювання через відповідні функції базового класу.

Програма:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include <iostream>

#include<cstring>

using namespace std;

struct zarplata

{

char name [20];

int nomer;

int oplata;

int dni;

int prem;

};

int main ()

{

zarplata *m;

int i,n,j;

char *temp;

int e[1];

printf ("\n Vvedite kolichestvo chelovek :\n\n n=");

scanf ("%d",&n);

m=(zarplata*)malloc(n*sizeof(zarplata));

temp = (char*)malloc(20*sizeof(char));

for (i=0; i<n; i++)

{

cout<<" Premiya - "<<endl;

cin>>m[i].prem;

cout<<" nomer - "<<endl;

cin>>m[i].nomer;

cout<<" Oplata - "<<endl;

cin>>m[i].oplata;

cout<<" Dni - "<<endl;

cin>>m[i].dni;

cout<<" FIO - "<<endl;

cin>>m[i].name;

}

for (i=0; i<n-1; i++)

{

for(j=i; j<n; ++j)

if (strcmp(m[j].name,m[i].name)<0)

{

strcpy (temp,m[i].name);

strcpy (m[i].name,m[j].name);

strcpy (m[j].name,temp);

}

}

for(int i = 0;i<n;i++)

{

e[i]=m[i].oplata*8*m[i].dni+m[i].prem;

}

for (i=0; i<n; i++)

{

cout<<"FIO: "<<m[i].name<<" | Zarplata: "<<e[i]<<endl;

}

free (m);

free(temp);

getch ();

return 0;

}

Результат:

2. Створити ієрархію типів, що описує ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ та

ОПЕРАЦІЙНУ СИСТЕМУ. Визначити клас WINDOWS ІЯТ як операційну

систему. Класи повинні містити необхідні дані, конструктори, деструктори,

методи, перевантажені функції виведення у потік і введення з потоку.

Програма:

#include <iostream.h>

#include <vector.h>

#include <string.h>

int main()

{

setlocale(LC_ALL, "");

vector<std::string> students;

string buffer = "";

cout << "Вводите ОС. "

<< "По окончание ввода введите пустую строку" << std::endl;

do {

std::getline(std::cin, buffer);

if (buffer.size() > 0) {

students.push_back(buffer);

}

} while (buffer != "");

unsigned int vector_size = students.size();

::cout << "Ваш вектор." << std::endl;

for (int i = 0; i < vector_size; i++) {

std::cout << students[i] << std::endl;

}

return 0;

}

Результат:

Тема: віртуальні функції, поліморфізм.

Мета: полягає у вивченні поліморфізму класів та механізму його реалізації за допомогою віртуальних функцій.

Матеріально-технічне оснащення робочого місця: ПК, інструкційна картка.

Зміст та послідовність виконання завдань

1. Створити абстрактний БАЗОВИЙ клас з віртуальною функцією - площа поверхні. Створити похідні класи: прямокутний ПАРАЛЕЛЕПІПЕД, ТЕТРАЕДР, КУЛЯ зі своїми функціями площі поверхні. Площа поверхні паралелепіпеда: S = 2(ab + bc + ca), дe a, b, c - ребра. Площа поверхні кулі:

S = 4кг2, де г - радіус. Площа поверхні тетраедра: S = a2-JÏ, де а- довжинаребра. Для перевірки пізнього зв’язування визначити масив вказівників на абстрактний клас, яким присвоюються адреси об’єктів неабстрактних класів. Використати вказівники для виклику віртуальної функції.

Програма:

#include <iostream.h>

#include <conio.h>

#define interface struct

interface IVolume {

virtual ~IVolume(){};

virtual double FindVol(double x, double y, double t) = 0;

};

class CParall : public IVolume{

public:

CParall(){ cout<<"CParall type obj create\n"; }

virtual ~CParall(){ cout<<"CParall type obj destroy\n"; }

virtual double FindVol(double x, double y, double t){ return x*y*t;}

};

//A yoii eeanna ia ae?o eiaeee, io iioi?ioea oae iieo?aaony.

class CPyramid : public IVolume {

public:

CPyramid() { cout<<"CPyramid type obj create\n"; }

virtual ~CPyramid() { cout<<"CPyramid type obj destroy\n"; }

virtual double FindVol(double x, double y, double t){ return x*y*t;}

};

class CSphere : public IVolume {

public:

CSphere() { cout<<"CSphere type obj create\n"<<'\n'; }

virtual ~CSphere() { cout<<"CSphere type obj destroy\n"; }

virtual double FindVol(double x, double y, double t){

y = 0;

t = 0;

return (4*3.14*x/3)/3;

}

};

int main(){

const int size = 3;

CParall *cp = new CParall ;

CPyramid *cpyr = new CPyramid ;

CSphere *cs = new CSphere ;

IVolume *i_ptr[size] = {cp,cpyr,cs};

cout<<i_ptr[0]->FindVol(2,3,4)<<'\n';

cout<<i_ptr[1]->FindVol(2,3,2)<<'\n';

cout<<i_ptr[2]->FindVol(5,0,0)<<'\n';

cout<<'\n';

for(int i =0;i<size;i++)delete i_ptr[i];

cout<<'\n';

getch();

}

Результат:

2. Створити абстрактний клас з віртуальним методом для обчислення характеристик одновимірного масиву цілих чисел. Визначити похідні класи, у яких реалізовано віртуальний метод для знаходження суми та добутку елементів масиву, найменший та найбільший елементи, кількість додатних, від’ємних та нульових елементів. Ввести масив з клавіатури та знайти його характеристики.

Програма:

# include <iostream.h>

# include <conio.h>

struct node

{

int info;

node *l, *r;

};

node * tree=NULL;

void push(int a,node **t)

{ if ((*t)==NULL)

{

(*t)=new node;

(*t)->info=a;

(*t)->l=(*t)->r=NULL;

return;

}

if (a>(*t)->info) push(a,&(*t)->r);

else push(a,&(*t)->l);

}

void print (node *t,int u)

{

if (t==NULL) return;

else

print(t->r,++u);

}

void main ()

{ int n;

int s;

cout<<"vvedite kilkist elementiv ";

cin>>n;

for (int i=0;i<n;++i)

{ cout<<"vvedite chislo ";

cin>>s;

push(s,&tree);

}

cout<<"vashe derevo \n";

print(tree,0);

getch();

}

Результат: