30.«Произвольный многоугольник в двумерном пространстве»
#include <iostream>
#include<math.h>
using namespace std;
struct Coordinata {
public:
double x;
double y;
Coordinata() {
x = 0;
y = 0;
}
Coordinata(double x, double y) {
this->x = x;
this->y = y;
}
Coordinata(const Coordinata& temp) {
this->x = temp.x;
this->y = temp.y;
}
Coordinata(Coordinata&& temp)noexcept {
this->x = temp.x;
this->y = temp.y;
}
Coordinata& operator=(const Coordinata& temp) {
this->x = temp.x;
this->y = temp.y;
return *this;
}
Coordinata& operator=(Coordinata&& temp) noexcept {
this->x = temp.x;
this->y = temp.y;
return *this;
}
};
class Polygon {
private:
int colVershun;
Coordinata* coordinates;
public:
// конструктор по умолчанию
Polygon() {
colVershun = 1;
coordinates = new Coordinata[1];
coordinates[0] = Coordinata();
}
// конструктор копирования
Polygon(const Polygon& objrect) {
colVershun = objrect.colVershun;
coordinates = new Coordinata[colVershun];
for (int i = 0; i < colVershun; i++) {
coordinates[i] = objrect.coordinates[i];
}
}
// конструктор перемещения
Polygon(Polygon&& objrect) noexcept {
colVershun = objrect.colVershun;
coordinates = new Coordinata[colVershun];
for (int i = 0; i < colVershun; i++) {
coordinates[i] = objrect.coordinates[i];
}
}
// деструктор
~Polygon() {
delete[] coordinates;
}
// параметрический конструктор
Polygon(int colVershun, Coordinata* coordinates) {
this->colVershun = colVershun;
this->coordinates = coordinates;
}
// функция ввода
void input() {
cin >> colVershun;
coordinates = new Coordinata[colVershun];
for (int i = 0; i < colVershun; i++) {
double x, y;
cin >> x;
cin >> y;
coordinates[i] = Coordinata(x, y);
}
}
//функция вывода
void output() {
for (int i = 0; i < colVershun; i++) {
cout << "[" << coordinates[i].x << ";" << coordinates[i].y << "]" << endl;
}
}
// функция определения типа фигуры
string checkFigera() {
int vershunu = sizeof(coordinates);
if (vershunu < 3) return"Не фигура";
if (vershunu == 3) return isTringle(coordinates);
if (vershunu == 4) return isQuadrilateral(coordinates);
}
// функция проверки треугольников
string isTringle(Coordinata* coord) {
Coordinata A = coord[0];
Coordinata B = coord[1];
Coordinata C = coord[2];
double AB = sqrt(pow((B.x - A.x), 2) + pow((B.y - A.y), 2));
double AC = sqrt(pow((C.x - A.x), 2) + pow((C.y - A.y), 2));
double BC = sqrt(pow((C.x - B.x), 2) + pow((C.y - B.y), 2));
if (AB == AC || AB == BC || BC == AC) return "Равнобедренный треугольник";
if (AB == BC == AC) return "Равносторонний треугольник";
if ((AB * AB == BC * BC + AC * AC) || (BC * BC == AC * AC + AB * AB) || (AC * AC == AB * AB + BC * BC)) return "Прямоугольный треугольник";
else return "Произвольный треугольник";
}
// функция проверки четырехугольников
string isQuadrilateral(Coordinata* coord) {
Coordinata A = coord[0];
Coordinata B = coord[1];
Coordinata C = coord[2];
Coordinata D = coord[3];
double AB = sqrt(pow((B.x - A.x), 2) + pow((B.y - A.y), 2));
double BC = sqrt(pow((C.x - B.x), 2) + pow((C.y - B.y), 2));
double CD = sqrt(pow((D.x - C.x), 2) + pow((D.y - C.y), 2));
double AD = sqrt(pow((D.x - A.x), 2) + pow((D.y - A.y), 2));
//если все стороны равны, проверяем на квадрат/ромб
if (AB == BC == CD == AD) {
// находим угол между сторонами через скалярное произведение векторов
if ((B.x - A.x) * (C.x - B.x) + (B.y - A.y) * (C.y - B.y) == 0) return "Квадрат";
else return"Ромб";
}
// если противоположные стороны равны, проверяем тем же методом на прямоугольник/параллелепипед
if (AB == CD && BC == AD) {
// находим угол между сторонами через скалярное произведение векторов
if ((B.x - A.x) * (C.x - B.x) + (B.y - A.y) * (C.y - B.y) == 0) return "Прямоугольник";
else return"Параллелепипед";
}
if ((B.x - A.x) * (C.y - D.y) == (C.x - D.x) * (B.y - A.y) || (C.x - B.x) * (D.y - A.y) == (D.x - A.x) * (C.y - B.y)) return "Трапеция";
else return "Произвольный четыхеругольник";
}
// функция проверки выпуслоси многоугольника
bool isBulging() {
int vershunu = sizeof(coordinates);
if (vershunu <= 3) {
return true;
}
Coordinata A = coordinates[0];
Coordinata B = coordinates[1];
Coordinata C = coordinates[2];
Coordinata D = coordinates[3];
double ABx = B.x - A.x;
double ABy = B.y - A.y;
double BCx = C.x - B.x;
double BCy = C.y - B.y;
double CDx = D.x - C.x;
double CDy = D.y - C.y;
double ADx = D.x - A.x;
double ADy = D.y - A.y;
double array[8];
array[0] = ABx;
array[1] = ABy;
array[2] = BCx;
array[3] = BCy;
array[4] = CDx;
array[5] = CDy;
array[6] = ADx;
array[7] = ADy;
bool value;
for (int i = 0; i < vershunu * 2; i += 2) {
bool valueNow;
if (i == 6) {
valueNow = checkForBulging(array[i], array[i + 1], array[0], array[1]);
}
else valueNow = checkForBulging(array[i], array[i + 1], array[i + 2], array[i + 3]);
if (i == 0) value = valueNow;
if (value != valueNow) break;
}
}
// функция знака поворота ребет при вершине для функции выпуклости
bool checkForBulging(double arr1x, double arr1y, double arr2x, double arr2y) {
double value;
// формала, которая дает знак поворота следующего ребра по отношению к предыдущему
// Для поворота налево это значение будет положительным, а для поворота направо - отрицательным
// (я предполагаю, что ось Y направлена вверх). Нулевое значение означает, что ребра коллинеарны.
value = arr1x * arr2y - arr1y * arr2x;
if (value > 0) return 1;
else return 0;
}
// функция вычисления площади
double sqaure() {
int vershunu = sizeof(coordinates);
if (vershunu < 3) return 0;
if (vershunu == 3) {
Coordinata A = coordinates[0];
Coordinata B = coordinates[1];
Coordinata C = coordinates[2];
return 1 / 2 * ((B.x - A.x) * (C.y - A.y) - (C.x - A.x) * (B.y - A.y));
}
if (vershunu == 4) {
Coordinata A = coordinates[0];
Coordinata B = coordinates[1];
Coordinata C = coordinates[2];
Coordinata D = coordinates[3];
return abs(((A.x * B.y - A.y * B.x) + (B.x * C.y - B.y * C.x) + (C.x * D.y - C.y * D.x) + (D.x * A.y - D.y * A.x)) / 2);
}
}
};
31.«Вектор в многомерном пространстве».
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
class Vector {
private:
int size;
int* point;
public:
Vector();
explicit Vector(int);
Vector(int, const int[]);
Vector(const Vector&);
Vector(Vector&&) noexcept;
~Vector();
int getSize() const;
void print() const;
int getValue(int) const;
Vector Sum(const Vector&) const;
Vector Diff(const Vector&);
Vector Multi(int);
float Mod() const;
int Scalar(const Vector&) const;
};
Vector::Vector() {
size = 0;
point = nullptr;
}
Vector::Vector(int a) {
if (a < 0) {
abort();
}
else
{
srand(time(nullptr));
size = a;
point = new int[size];
for (int i = 0; i < size; i++)
{
point[i] = -10 + rand() % 21;
}
}
}
Vector::Vector(int size_arr, const int a[]) {
size = size_arr;
point = new int[size];
for (int i = 0; i < size; i++)
{
point[i] = a[i];
}
}
Vector::Vector(const Vector& a)
{
size = a.size;
point = new int[size];
for (int i = 0; i < size; i++)
{
point[i] = a.point[i];
}
}
Vector::Vector(Vector&& a) noexcept {
size = a.size;
point = new int[size];
for (int i = 0; i < size; i++)
{
point[i] = a.point[i];
}
a.size = 0;
delete[] a.point;
}
int Vector::getSize() const {
return size;
}
int Vector::getValue(int a) const {
if (a > size) {
abort();
}
return point[a + 1];
}
Vector Vector::Sum(const Vector& a) const {
int sizeTemp;
int* pointTemp;
if (size > a.size) {
sizeTemp = size;
pointTemp = new int[size];
for (int i = 0; i < a.size; ++i)
pointTemp[i] = point[i] + a.point[i];
for (int i = a.size; i < size; i++)
pointTemp[i] = point[i];
}
else {
sizeTemp = a.size;
pointTemp = new int[a.size];
for (int i = 0; i < size; ++i)
pointTemp[i] = point[i] + a.point[i];
for (int i = size; i < a.size; i++)
pointTemp[i] = a.point[i];
}
Vector temp(sizeTemp, pointTemp);
delete[] pointTemp;
return temp;
}
Vector Vector::Diff(const Vector& a) {
int sizeTemp;
int* pointTemp;
if (size > a.size) {
sizeTemp = size;
pointTemp = new int[size];
for (int i = 0; i < a.size; ++i)
pointTemp[i] = point[i] - a.point[i];
for (int i = a.size; i < size; i++)
pointTemp[i] = point[i];
}
else {
sizeTemp = a.size;
pointTemp = new int[a.size];
for (int i = 0; i < size; ++i)
pointTemp[i] = point[i] - a.point[i];
for (int i = size; i < a.size; i++)
pointTemp[i] = -a.point[i];
}
Vector temp(sizeTemp, pointTemp);
delete[] pointTemp;
return temp;
}
Vector Vector::Multi(int a) {
int* pointTemp = new int[size];
for (int i = 0; i < size; i++)
{
pointTemp[i] = a * point[i];
}
Vector temp(size, pointTemp);
delete[] pointTemp;
return temp;
}
float Vector::Mod() const {
float res = 0;
for (int i = 0; i < size; i++)
{
res += pow(point[i], 2);
}
res = sqrt(res);
return res;
}
void Vector::print() const
{
for (int i = 0; i < size; i++)
{
cout << point[i] << ' ';
}
cout << endl;
}
int Vector::Scalar(const Vector& a) const {
int res = 0;
if (size != a.size)
abort();
for (int i = 0; i < size; i++)
{
res += point[i] * a.point[i];
}
return res;
}
Vector::~Vector() {
size = 0;
delete[] point;
}
32. «Полином от одной переменной»
#include <iostream>
#include <math.h>
using namespace std;
class Polinom
{
private:
int sz;
double* zn;
public:
// конструктор по умолчанию
Polinom() {
sz = 1;
zn = new double[1];
}
// конструктор копирования
Polinom(const Polinom& objrect) {
sz = objrect.sz;
zn = new double[sz];
for (int i = 0; i < sz; i++) {
zn[i] = objrect.zn[i];
}
}
// конструктор перемещения
Polinom(Polinom&& objrect) noexcept {
sz = objrect.sz;
zn = new double[sz];
for (int i = 0; i < sz; i++) {
zn[i] = objrect.zn[i];
}
}
// деструктор
~Polinom() {
delete[] zn;
}
// параметрический конструктор
Polinom(int sz, double* zn) {
this->sz = sz;
this->zn = zn;
}
void In()
{
cin >> sz;
double* a = new double[sz];
for (int i = 0; i < sz; i++)
cin >> a[i];
zn = a;
}
void Out()
{
for (int i = 0; i < sz; i++)
{
if (zn[i] != 0) {
if (i == sz - 1 and zn[i] > 0) cout << zn[i]; else
if (i == sz - 1 and zn[i] < 0) cout << "\b" << zn[i]; else
if (zn[i] > 0) cout << zn[i] << "x^" << sz - 1 - i << "+"; else
if (zn[i] < 0) cout << "\b" << zn[i] << "x^" << sz - 1 - i << "+";
}
}
cout << endl;
}
Polinom AddP(Polinom P)
{
if (sz <= P.sz)
{
int S = sz;
int M = P.sz;
double* a = new double[M];
for (int i = 0; i < P.sz; i++)
a[i] = P.zn[i];
for (int i = S - 1; i >= 0; i--)
a[M - S + i] += zn[i];
Polinom A(M, a);
return A;
}
else
{
int S = P.sz;
int M = sz;
double* a = new double[M];
for (int i = 0; i < sz; i++)
a[i] = zn[i];
for (int i = S - 1; i >= 0; i--)
a[M - S + i] += P.zn[i];
Polinom A(M, a);
return A;
}
}
Polinom MnCh(double Ch)
{
int size = sz;
double* a = new double[size];
for (int i = 0; i < sz; i++)
a[i] = zn[i];
for (int i = 0; i < sz; i++)
a[i] *= Ch;
Polinom A(sz, a);
return A;
}
Polinom DobCh(double Ch)
{
int size = sz;
double* a = new double[size];
for (int i = 0; i < sz; i++)
a[i] = zn[i];
a[size - 1] += Ch;
Polinom A(sz, a);
return A;
}
Polinom MinP(Polinom P)
{
int size = sz;
double* a = new double[size];
for (int i = 0; i < sz; i++)
a[i] = zn[i];
Polinom A(size, a);
Polinom P1 = P.MnCh(-1);
Polinom B = A.AddP(P1);
return B;
}
double Vch(double b)
{
double a = 0;
for (int i = 0; i < sz; i++)
{
a += zn[i] * pow(b, sz - 1 - i);
}
return a;
}
Polinom Pr(Polinom P)
{
int S = sz + P.sz - 1;
double* a = new double[S];
for (int i = 0; i < S; i++)
{
a[i] = 0;
for (int j = 0; j < sz; j++)
for (int k = 0; k < P.sz; k++)
if (j + k == i) a[i] += zn[j] * P.zn[k];
}
Polinom A(S, a);
return A;
}
bool IsEqual(Polinom P)
{
if (P.sz == sz)
{
bool T = true;
for (int i = 0; i < sz; i++)
if (P.zn[i] != zn[i]) T = false;
return T;
}
else return false;
}
};
int main()
{
system("color F0");
Polinom A, B, C;
A.In();
B.In();
C.In();
cout << "A:"; A.Out();
cout << "B:"; B.Out();
cout << "C:"; C.Out();
cout << A.IsEqual(B) << endl;
Polinom D = A.AddP(B);
cout << "D=A+B:"; D.Out();
Polinom E = C.MinP(B);
cout << "E=C-B:"; E.Out();
Polinom F = A.DobCh(4);
cout << "F=A+4:"; F.Out();
Polinom G = C.MnCh(2);
cout << "G=C*2:"; G.Out();
cout << "B(3):" << B.Vch(3) << endl;
Polinom H = A.Pr(C);
cout << "H=A*C:"; H.Out();
}
33.«Полином от одной переменной» (перемножение полиномов)
#include <iostream>
#include <math.h>
using namespace std;
class Polinom
{
private:
int sz;
double* zn;
public:
// конструктор по умолчанию
Polinom() {
sz = 1;
zn = new double[1];
}
// конструктор копирования
Polinom(const Polinom& objrect) {
sz = objrect.sz;
zn = new double[sz];
for (int i = 0; i < sz; i++) {
zn[i] = objrect.zn[i];
}
}
// конструктор перемещения
Polinom(Polinom&& objrect) noexcept {
sz = objrect.sz;
zn = new double[sz];
for (int i = 0; i < sz; i++) {
zn[i] = objrect.zn[i];
}
}
// деструктор
~Polinom() {
delete[] zn;
}
// параметрический конструктор
Polinom(int sz, double* zn) {
this->sz = sz;
this->zn = zn;
}
void In()
{
cin >> sz;
double* a = new double[sz];
for (int i = 0; i < sz; i++)
cin >> a[i];
zn = a;
}
void Out()
{
for (int i = 0; i < sz; i++)
{
if (zn[i] != 0) {
if (i == sz - 1 and zn[i] > 0) cout << zn[i]; else
if (i == sz - 1 and zn[i] < 0) cout << "\b" << zn[i]; else
if (zn[i] > 0) cout << zn[i] << "x^" << sz - 1 - i << "+"; else
if (zn[i] < 0) cout << "\b" << zn[i] << "x^" << sz - 1 - i << "+";
}
}
cout << endl;
}
Polinom AddP(Polinom P)
{
if (sz <= P.sz)
{
int S = sz;
int M = P.sz;
double* a = new double[M];
for (int i = 0; i < P.sz; i++)
a[i] = P.zn[i];
for (int i = S - 1; i >= 0; i--)
a[M - S + i] += zn[i];
Polinom A(M, a);
return A;
}
else
{
int S = P.sz;
int M = sz;
double* a = new double[M];
for (int i = 0; i < sz; i++)
a[i] = zn[i];
for (int i = S - 1; i >= 0; i--)
a[M - S + i] += P.zn[i];
Polinom A(M, a);
return A;
}
}
Polinom MnCh(double Ch)
{
int size = sz;
double* a = new double[size];
for (int i = 0; i < sz; i++)
a[i] = zn[i];
for (int i = 0; i < sz; i++)
a[i] *= Ch;
Polinom A(sz, a);
return A;
}
Polinom DobCh(double Ch)
{
int size = sz;
double* a = new double[size];
for (int i = 0; i < sz; i++)
a[i] = zn[i];
a[size - 1] += Ch;
Polinom A(sz, a);
return A;
}
Polinom MinP(Polinom P)
{
int size = sz;
double* a = new double[size];
for (int i = 0; i < sz; i++)
a[i] = zn[i];
Polinom A(size, a);
Polinom P1 = P.MnCh(-1);
Polinom B = A.AddP(P1);
return B;
}
double Vch(double b)
{
double a = 0;
for (int i = 0; i < sz; i++)
{
a += zn[i] * pow(b, sz - 1 - i);
}
return a;
}
Polinom Multiplication(Polinom P)
{
int S = sz + P.sz - 1;
double* a = new double[S];
for (int i = 0; i < S; i++)
{
a[i] = 0;
for (int j = 0; j < sz; j++)
a[i + j] += zn[i] * P.zn[j];
}
Polinom A(S, a);
return A;
}
bool IsEqual(Polinom P)
{
if (P.sz == sz)
{
bool T = true;
for (int i = 0; i < sz; i++)
if (P.zn[i] != zn[i]) T = false;
return T;
}
else return false;
}
};
int main()
{
system("color F0");
Polinom A, B, C;
A.In();
B.In();
C.In();
cout << "A:"; A.Out();
cout << "B:"; B.Out();
cout << "C:"; C.Out();
cout << A.IsEqual(B) << endl;
Polinom D = A.AddP(B);
cout << "D=A+B:"; D.Out();
Polinom E = C.MinP(B);
cout << "E=C-B:"; E.Out();
Polinom F = A.DobCh(4);
cout << "F=A+4:"; F.Out();
Polinom G = C.MnCh(2);
cout << "G=C*2:"; G.Out();
cout << "B(3):" << B.Vch(3) << endl;
Polinom H = A.Multiplication(C);
cout << "H=A*C:"; H.Out();
}
34.«Матрица произвольной размерности» (вычисление
определителя).
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class Matrix {
private:
int line;
int column;
int** array;
void getNewMatrix(int** arr, int** temp, int i, int j, int n) {
int indexLine = 0, indexCol = 0;
for (int i1 = 0; i1 < n - 1; i1++) {
if (i1 == i) indexLine = 1;
for (int j1 = 0; j1 < n - 1; j1++) {
if (j1 == j) indexCol = 1;
temp[i1][j1] = arr[i1 + indexLine][j1 + indexCol];
}
}
}
int detExecute(int** arr, int n) {
int res = 0, k = 1;
int** temp = new int* [n];
for (int i = 0; i < n; i++)
temp[i] = new int[n];
if (n == 1) {
res = arr[0][0];
return(res);
}
if (n == 2) {
res = arr[0][0] * arr[1][1] - (arr[1][0] * arr[0][1]);
return(res);
}
if (n > 2) {
for (int i = 0; i < n; i++) {
getNewMatrix(arr, temp, i, 0, n);
res = res + k * arr[i][0] * detExecute(temp, n - 1);
k = -k;
}
}
}
public:
Matrix() {
line = 0;
column = 0;
array = nullptr;
}
Matrix(int line, int column) {
srand(time(nullptr));
this->line = line;
this->column = column;
array = new int* [line];
for (int i = 0; i < line; i++)
array[i] = new int[column];
for (int i = 0; i < line; i++)
for (int j = 0; j < column; j++)
array[i][j] = -3 + rand() % 7;
}
Matrix(int line, int column, int** arr) {
this->line = line;
this->column = column;
array = arr;
}
void print() {
if (column == 0 || line == 0)
cout << "Matrix is empty";
else {
for (int i = 0; i < line; i++) {
for (int j = 0; j < column; j++)
cout << array[i][j] << ' ';
cout << endl;
}
cout << endl;
}
}
~Matrix() {
if (line != 0) {
for (int i = 0; i < line; i++)
delete[] array[i];
delete[] array;
}
column = 0;
line = 0;
}
Matrix(const Matrix& a) {
line = a.line;
column = a.column;
array = new int* [line];
for (int i = 0; i < line; i++)
array[i] = new int[column];
for (int i = 0; i < line; i++)
for (int j = 0; j < column; j++)
array[i][j] = a.array[i][j];
}
Matrix(Matrix&& a) noexcept {
line = a.line;
column = a.column;
array = new int* [line];
for (int i = 0; i < line; i++)
array[i] = new int[column];
for (int i = 0; i < line; i++)
for (int j = 0; j < column; j++)
array[i][j] = a.array[i][j];
for (int i = 0; i < line; i++)
delete[] a.array[i];
delete[] a.array;
a.column = 0;
a.line = 0;
}
Matrix sum(const Matrix& a) {
if (column != a.column && line != a.line)
abort();
int** tempArray = new int* [line];
for (int i = 0; i < line; i++)
tempArray[i] = new int[column];
for (int i = 0; i < line; i++)
for (int j = 0; j < column; j++)
tempArray[i][j] = a.array[i][j] + array[i][j];
Matrix temp = Matrix(line, column, tempArray);
return temp;
}
Matrix multiplication(const Matrix& a) {
if (column != a.line)
abort();
int** tempArray = new int* [line];
for (int i = 0; i < line; i++)
{
tempArray[i] = new int[a.column];
for (int j = 0; j < a.column; j++)
{
tempArray[i][j] = 0;
for (int k = 0; k < column; k++) {
tempArray[i][j] += array[i][k] * a.array[k][j];
}
}
}
Matrix temp(line, a.column, tempArray);
return temp;
}
Matrix multiplicationOnNumber(const int a) {
int** tempArray = new int* [line];
for (int i = 0; i < line; i++)
tempArray[i] = new int[column];
for (int i = 0; i < line; i++)
for (int j = 0; j < column; j++)
tempArray[i][j] = array[i][j] * a;
Matrix temp = Matrix(line, column, tempArray);
return temp;
}
int determinant() {
if (line != column)
abort();
int res = detExecute(array, line);
return res;
}
};
35. «Матрица произвольной размерности» (транспонирование
матрицы).