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

Министерство науки и высшего образования Российской Федерации

Федеральное государственное автономное образовательное


учреждение высшего образования

«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»


(ФГАОУ ВО «ЮФУ»)

Институт компьютерных технологий и информационной безопасности

ЛАБОРАТОРНАЯ РАБОТА №1
«Классы и объекты в С++»
по курсу: «Объектно-ориентированное программирование»

Выполнил
студент группы КТбо2-9 _______________ Ященко Илья Андреевич

Принял Должность ______________ Лутай Владимир Николаевич

Таганрог 2023
Задача:

Определить класс многочленов Polinom от одной переменной,


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

Спецификация класса:

Private:
Полином можно охарактеризовать степенью многочлена, поэтому
введем поле данных int len, которое будет хранить в себе степень
многочлена+1. Также введем поле int*arr – указатель на массив
коэффициентов данного полинома.

Public:

Введем конструктор от одного аргумента degree(степень многочлена),


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

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


памяти

Введем методы Calculate и Getlen, которые будут считать значение


полинома при определенном параметре х и возвращать длину полинома

Введем перегруженные операторы []+-, которые будут выполнять


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

Алгоритмы, использующиеся в задаче:

В задаче используется алгоритм сложения и вычитания двух


полиномов:

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


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

Диаграмма классов:
Polinom
-_len: int
-_arr: int*
+Polinom(int)
+Polinom(Polinom const&)
~Polinom()
+Calculate(int x) : int
+Getlen(): int
Operator[](int) const: int&
Operator+(Polinom& pol2): Polinom
Operator-(Polinom& pol2): Polinom

Листинг программы:
// Polinom.h
#pragma once
// Спецификация класса
class Polinom {
public:
// Конструкторы
Polinom(int degree = 0); // От одного аргумента и по умолчанию
Polinom(Polinom const& a); // Копирования
// Методы
int Calculate(int x); // Вычисление многочлена
int Getlen(); // Геттер длины массива
// Операторы
int& operator[](int i) const; // Индексации
Polinom operator+(Polinom& pol2); // Сложения
Polinom operator-(Polinom& pol2); // Вычитания
// Деструктор
~Polinom();
private:
// Поля
int _len = 0;
int* _arr = nullptr;
};
// Polinom.h
#include"Polinom.h"
#include<math.h>
#include<minmax.h>
using namespace std;
// Определение конструкторов и методов
Polinom::Polinom(int degree) :_len(degree + 1), _arr(new int[degree + 1]) {}
Polinom::Polinom(Polinom const& a) {
this->_len = a._len;
this->_arr = new int[_len + 1];
for (int i = 0; i <= _len; i++) {
this->_arr[i] = a._arr[i];
}
}
int Polinom::Calculate(int x) {
int sum = 0;
for (int i = 0;i < _len;i++) {
sum += pow(x, i) * _arr[i];
}
return sum;
}
int Polinom::Getlen() {
return _len;
}
int& Polinom::operator[](int i) const {
return _arr[i];
}
Polinom Polinom::operator+(Polinom& pol2) {
int maxlen = max(this->_len, pol2._len);
int minlen = min(this->_len, pol2._len);
Polinom res(maxlen - 1);
for (int i = 0; i < minlen; i++) {
res._arr[i] = this->_arr[i] + pol2._arr[i];
}
if (this->_len > pol2._len) {
for (int i = minlen; i < maxlen; i++) {
res._arr[i] = this->_arr[i];
}
}
else {
for (int i = minlen; i < maxlen; i++) {
res._arr[i] = pol2._arr[i];
}
}
return res;
}
Polinom Polinom::operator-(Polinom& pol2) {
int maxlen = max(this->_len, pol2._len);
int minlen = min(this->_len, pol2._len);
Polinom res(maxlen - 1);
if (this->_len > pol2._len) {
for (int i = 0; i < minlen; i++) {
res._arr[i] = this->_arr[i] - pol2._arr[i];
}
}
else {
for (int i = 0; i < minlen; i++) {
res._arr[i] = (pol2._arr[i] - this->_arr[i])*(-1);
}
}
if (this->_len > pol2._len) {
for (int i = minlen; i < maxlen; i++) {
res._arr[i] = this->_arr[i];
}
}
else {
for (int i = minlen; i < maxlen; i++) {
res._arr[i] = pol2._arr[i]*(-1);
}
}
return res;
}
Polinom::~Polinom() {
delete[] _arr;
}
// MyPolinom.cpp
#include "Polinom.h"
#include <iostream>
#include <clocale>
//#include <vld.h>
using namespace std;
int main() {
setlocale(LC_ALL, "RU");
int n1,n2;
cout << "Введите степень первого палинома" << endl;
cin >> n1;
cout << "Введите степень второго палинома" << endl;
cin >> n2;
try {
// Создание и заполнение массивов
Polinom p1(n1);
Polinom p2(n2);
cout << "Введите через пробел коэфф. для 1-го полинома: ";
for (int i = 0; i < p1.Getlen();i++) {
int x;
cin >> x;
p1[i] = x;
}
cout << "Введите через пробел коэфф. для -го полинома: ";
for (int i = 0; i < p2.Getlen();i++) {
int x;
cin >> x;
p2[i] = x;
}
cout << "Значение первого полинома с x = 2: " << p1.Calculate(2) << endl;
cout << "Значение второго полинома с x = 2: " << p2.Calculate(2) << endl;
Polinom p3 = p1 + p2;
Polinom p4 = p1 - p2;
cout << "Значение суммы двух полиномов с x = 2: " << p3.Calculate(2) << endl;
cout << "Значение разности первого и второго полиномов с x = 2: " << p4.Calculate(2) << endl;
}
catch (int) {
cout << "Ошибка!";
return 1;
}
return 0;}
Контрольные вопросы:

1.Для чего служит конструктор ? Может ли в классе быть несколько


конструкторов? Чем должны отличаться различные конструкторы одного и
того же класса?

2. Для чего служит деструктор класса? Имеет ли деструктор


параметры?

3. Какие сообщения и в какой последовательности будут

выведены на монитор после выполнения нижеследующей программы?

class Alpha {

public:

int x, y;

Alpha(){cout<<"Конструктор #1\n";}

Alpha(int m){cout<<"Конструктор #2\n";

x=y=m;

Alpha (const Alpha& other){

cout<<”Конструктор #3\n”;

x=other.x; y=other.y;

~Alpha(){cout<<"Деструктор "<<endl;}

};

void main()

{
Alpha a1;

a1.x=1;

Alpha *a2;

a2=new Alpha;

Alpha a3[2];

Alpha a4(4);

Alpha a6(a1);

}
4. Имеется следующий класс

class Alpha {

Alpha(const Alpha& a){/*...*/}

};

Какие члены класса в данном случае будут автоматически

определены после завершения компиляции класса?

23

5. Определен следующий класс:

class Alhpa { public: int abc; };

Запишите обращения к члену abc с использованием

точки и стрелки.

6. Каким образом компилятор отличает вызов стандартной операции от


вызова перегруженной? Вспомните

язык С и его операции <<, >> и запишите результат второго выражения

int a=4;
cout<<(a<<3);

7. Что такое отношение включения и как оно изображается на


диаграммах? Что такое делегирование?

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