Класс множество: трехмерный массив

Уровень сложности:

Написать класс Множество – наследник класса Матрица (множество понимается в привычном cмысле – неупорядоченный набор уникальных элементов известной мощности).

В классе реализовать следующие методы:

  • конструкторы (по умолчанию, с параметрами, копирования);
  • деструктор;
  • ввод с клавиатуры, вывод на экран (в виде методов класса и при помощи перегруженных операций потокового ввода и вывода).

Перегрузить следующие операции:

  • +, += (добавление элемента в множество);
  • +, += (объединение двух множеств);
  • (удаление элемента);
  • (разность множеств);
  • = (присвоение);
  • == (сравнение по элементам).

Операции: +, += (добавление элемента в множество) реализовать как виртуальные функции.

По сути — это класс, описывающий трехмерные массивы или множества. Объект данного класса — множество, которое содержит size матриц. В классе перегружены различные операции для сложения добавления элементов множества и многое другое.

Посмотрите заголовочный файл many.h класса Many. В интерфейсном файле класса можно увидеть, что объявлены две дружественные функции класса, строки 8 — 9. По сути это даже не функции, это перегруженные операции ввода/вывода. Это значит, что объекты класса можно выводить на экран, привычным для нас способом — строка 20 в Файле с функцией main(). Тоже самое относится и к операции ввода — строка 25. В классе есть три конструктора:

  • конструктор по умолчанию;
  • конструктор с параметрами (для создания объекта передаются параметры);
  • конструктор копии (нужен для создания нового объекта, аналогичного копируемому).

Кроме конструктора, есть деструктор и много методов, работа которых описана в коде.

#ifndef MANY_H
#define MANY_H

#include "matrix.h"

class Many : /*virtual*/ public Matrix
{
    friend ostream &operator<< (ostream &, const Many &); // перегруженный оператор вывода
    friend istream &operator>> (istream &, Many &); // перегруженный оператор ввода
private:
    Matrix *ptr; // указатель на массив объектов Matrix
    int size; // количество элементов множества
public:
    Many(); // конструктор по умолчанию
    Many(int, int, int); // конструктор с параметрами
    Many(Many &); // конструктор копии
    ~Many(); // десструктор класса Many

    Matrix &operator[] (int ); // перегруженная операция взятия индекса
    int getSizeMany() const; // возвратить количество объектов типа Matrix
    int getSizeRow() const
    {
        return ptr->getSizeMat();
    }

    int getSizeCol() const
    {
        return ptr->getPtr()->getSize();
    }

    void getMany(); // вывод множества
    void setMany(); // заполнение множества
    const Many &operator= (const Many &); // оператор присваивания
    bool operator== (const Many &right) const;// оператор сравнения
    Many &operator- (/*const int & */); // оператор удаления элемента множества по номеру
    Many operator- (const Many &right);
    Many operator+ (const Many &right); // объединение двух множеств
    Many operator+= (const Many &right); // объединение двух множеств
    virtual Many operator+ (const Matrix &right); // добавление элемента в множество
    virtual Many &operator+= (const Matrix &right); // добавление элемента в множество
};

#endif // MANY_H

Исполняемый файл many.cpp класса Many.

#include "many.h"

#include <iostream>
using std::cout; // пространство имен std для cout
using std::cin; // пространство имен std для cin

#include <iomanip> // для манипулятора setw
using std::setw;   // пространство имен std для setw

#include <cstdlib>

Many::Many() // конструктор по умолчанию
{
    size = 10; // по умолчанию размер множества = 10 объектам типа Matrix
    ptr = new Matrix [size]; // выделить место в памяти для множества
    for (int ix = 0; ix < size; ix++) // обнуляем множество
        for (int jx = 0; jx < getSizeMat(); jx++)
            for (int zx = 0; zx < getPtr()->getSize(); zx++)
                ptr[ix][jx][zx] = 0;
}

Many::Many(int manySize, int matrixSize, int arraySize) // конструктор с параметрами
{
    size = (manySize > 0 ? manySize : 10); // количество матриц

    ptr = new Matrix [size]; // выделить место в памяти для множества

    for (int ix = 0; ix < size; ix++) // перераспределяем выделенную память
        ptr[ix].setSize(matrixSize > 0 ? matrixSize : 10, arraySize > 0 ? arraySize : 10); // количество столбцов
//cout << size << "  " << ptr->getSize() << "  " << ptr->getPtr()->getSize() << std::endl;
    for (int ix = 0; ix < size; ix++) // обнуляем множество
        for (int jx = 0; jx < ptr->getSizeMat(); jx++)
            for (int zx = 0; zx < ptr->getPtr()->getSize(); zx++)
                ptr[ix][jx][zx] = 0;
//    cout << size << "  " << ptr->getSize() << "  " << ptr->getPtr()->getSize() << std::endl;

}

Many::Many(Many &manyToCopy ) // конструктор копии
    :size(manyToCopy.size)              // инициализатор размера множества
{
//    cout << size << "  " << manyToCopy.getSize() << "  " << manyToCopy.getPtr()->getSize() << std::endl;
    ptr = new Matrix [size]; // выделить место в памяти для матрицы

    for (int ix = 0; ix < size; ix++) // перераспределяем выделенную память
        ptr[ix].setSize(manyToCopy.getSizeRow(), manyToCopy.getSizeCol()); // количество строк и столбцов

    for (int ix = 0; ix < size; ix++) // обнуляем множество
        for (int jx = 0; jx < ptr->getSizeMat(); jx++)
            for (int zx = 0; zx < ptr->getPtr()->getSize(); zx++)
                ptr[ix][jx][zx] = manyToCopy[ix][jx][zx];// заполняем множество
}

Many::~Many() // десструктор класса Many
{
   delete  [] ptr; // освободить память, удалив матрицу
}

// перегруженный оператор вывода для класса Matrix (вывод элементов массива на экран)
ostream &operator<< (ostream &output, const Many &obj)
{
    if (obj.getSizeMany() == 0)
        cout << "Множество пустое!\n";

    for (int ix = 0; ix < obj.getSizeMany(); ix++)
    {
        for (int jx = 0; jx < obj.getSizeRow(); jx++)
        {
            for (int zx = 0; zx < obj.getSizeCol(); zx++)
            {
                output << setw(5) // под каждое число выделяется 5 позиций
                       << obj.ptr[ix][jx][zx];
            }
            cout << std::endl;
        }
        cout << std::endl << "----------------------------------------------------------------------\n";
    }

    output << std::endl; // перенос маркера на новую строку

    return output; // позволяет множественный вывод, типа cout << x << y << z << ...
}

// перегруженный оператор ввода, для заполнения матрицы с клавиатуры
istream &operator>> (istream & input, Many &obj)
{
    for (int ix = 0; ix < obj.size; ix++)
        for (int jx = 0; jx < obj.getSizeRow(); jx++)
            for (int zx = 0; zx < obj.getSizeCol(); zx++)
                input >> obj.ptr[ix][jx][zx]; // заполняем множество

    return input; // позволяет множественный ввод, типа cin >> x >> y >> z >> ...
}

// перегруженный оператор взятия индекса
Matrix &Many::operator[] (int subscript)
{
    if(subscript < 0 || subscript >= size)
    {
        std::cerr << "\n Ошибка индекса2: " << subscript << std::endl;
        exit(1); // завершить работу программы, неправильный индекс
    }
    return ptr[subscript]; // возврат ссылки на элемент массива
}

int Many::getSizeMany() const // возвратить количество элементов множества
{
    return size;
}

void Many::getMany() // вывод массива
{
    for (int ix = 0; ix < getSizeMany(); ix++)
    {
        for (int jx = 0; jx < getSizeRow(); jx++)
        {
            for (int zx = 0; zx < getSizeCol(); zx++)
            {
                cout << setw(5) // под каждое число выделяется 5 позиций
                       << ptr[ix][jx][zx];
            }
            cout << std::endl;
        }
        cout << std::endl << "----------------------------------------------------------------------\n";
    }

    cout << std::endl; // новая строка
}

void Many::setMany() // заполнение массива
{
    for (int ix = 0; ix < getSizeMany(); ix++)
        for (int jx = 0; jx < getSizeRow(); jx++)
            for (int zx = 0; zx < getSizeCol(); zx++)
                cin >> ptr[ix][jx][zx];       // ввод элементов множества с клавиатуры
}

 const Many &Many::operator= (const Many &right) // оператор присваивания
{
    if (&right != this) // чтобы не выполнялось самоприсваивание
    {
        if (size != right.getSizeMany() ||
            getSizeRow() != right.getSizeRow() || getSizeCol() != right.getSizeCol())
        {
            delete [] ptr; // освободить пространство
            size = right.getSizeMany(); // установить нужный размер множества
            ptr = new Matrix [size]; // выделить память под копируемое множество

            for (int ix = 0; ix < size; ix++) // перераспределяем выделенную память
                ptr[ix].setSize(right.getSizeRow(), right.getSizeCol());
        }

        for (int ix = 0; ix < size; ix++)
            for (int jx = 0; jx < ptr->getSizeMat(); jx++)
                for (int zx = 0; zx < ptr->getPtr()->getSize(); zx++)
                    ptr[ix][jx][zx] = right.ptr[ix][jx][zx]; // скопировать массив
    }

    return *this; // разрешает множественное присваивание, например x = t = e
}

 bool Many::operator== (const Many &right) const// оператор сравнения
 {
     if (size != right.getSizeMany() ||
         getSizeRow() != right.getSizeRow() || getSizeCol() != right.getSizeCol())
         return false; // матрицы с разным количеством элементов

     for (int ix = 0; ix < size; ix++)
         for (int jx = 0; jx < ptr->getSizeMat(); jx++)
             for (int zx = 0; zx < ptr->getPtr()->getSize(); zx++)
                 if (ptr[ix][jx][zx] != right.ptr[ix][jx][zx])
                     return false; // матрицы не равны

     return true; // матрицы равны
 }

 Many &Many::operator- (void) // оператор удаления элемента по номеру
 {
         Many temp(*this); // временно сохраняем текущее множество

         delete [] ptr; // удаляем старое множество
         size -= 1; // изменяем текущий размер

         ptr = new Matrix [size]; // выделить место в памяти для множества

         for (int ix = 0; ix < size; ix++) // перераспределяем выделенную память
             ptr[ix].setSize(temp.getSizeRow(), temp.getSizeCol()); // количество строк и столбцов

         for (int ix = 0; ix < size; ix++)
         {
             for (int jx = 0; jx < temp.getSizeRow(); jx++)
                 for (int zx = 0; zx < temp.getSizeCol(); zx++)
                     ptr[ix][jx][zx] = temp[ix][jx][zx];// заполняем множество
         } //конец for

     return *this;
 }

 Many Many::operator- (const Many &right) // разница двух множеств
 {
     if (size != right.getSizeMany() ||
         getSizeRow() != right.getSizeRow() || getSizeCol() != right.getSizeCol())
     {
         cout << "Множества разного размера!\n";
         exit(1); // завершить работу программы
     }

     Many result(*this);
     for (int ix = 0; ix < result.getSizeMany(); ix++)
         for (int jx = 0; jx < result.getSizeRow(); jx++)
             for (int zx = 0; zx < result.getSizeCol(); zx++)
                 result.ptr[ix][jx][zx] = ptr[ix][jx][zx] - right.ptr[ix][jx][zx];

     return result; // вернуть сумму
 }

 Many Many::operator+ (const Many &right) // объединение двух множеств
 {
     if (getSizeRow() != right.getSizeRow() || getSizeCol() != right.getSizeCol())
     {
         cout << "Множества разного размера!\n";
         exit(1); // завершить работу программы
     }

     int num = size + right.getSizeMany(); // количество элементов нового множества

     Many result(num, right.getSizeRow(), right.getSizeCol() );

     for (int ix = 0; ix < getSizeMany(); ix++)
         for (int jx = 0; jx < getSizeRow(); jx++)
             for (int zx = 0; zx < getSizeCol(); zx++)
                 result.ptr[ix][jx][zx] = ptr[ix][jx][zx];

     int ctr = 0;
     for (int ix = getSizeMany(); ix < result.getSizeMany(); ix++)
     {
         for (int jx = 0; jx < result.getSizeRow(); jx++)
             for (int zx = 0; zx < result.getSizeCol(); zx++)
                 result.ptr[ix][jx][zx] = right.ptr[ctr][jx][zx];
         ctr++;
     }

     return result; // вернуть объединенные множества
 }

 Many Many::operator+= (const Many &right) // объединение двух множеств
 {
     if (getSizeRow() != right.getSizeRow() || getSizeCol() != right.getSizeCol())
     {
         cout << "Множества разного размера!\n";
         exit(1); // завершить работу программы
     }
     Many temp(*this);
     delete [] ptr;

     size += right.getSizeMany(); // количество элементов нового множества

     ptr = new Matrix [size];

     for (int ix = 0; ix < size; ix++) // перераспределяем выделенную память
         ptr[ix].setSize(temp.getSizeRow(), temp.getSizeCol()); // количество строк и столбцов

     for (int ix = 0; ix < temp.getSizeMany(); ix++)
         for (int jx = 0; jx < temp.getSizeRow(); jx++)
             for (int zx = 0; zx < temp.getSizeCol(); zx++)
                 ptr[ix][jx][zx] = temp.ptr[ix][jx][zx];

     int ctr = 0;
     for (int ix = temp.getSizeMany(); ix < temp.getSizeMany(); ix++)
     {
         for (int jx = 0; jx < temp.getSizeRow(); jx++)
             for (int zx = 0; zx < temp.getSizeCol(); zx++)
                 ptr[ix][jx][zx] = right.ptr[ctr][jx][zx];
         ctr++;
     }

     return *this; // вернуть объединенные множества
 }

 Many Many::operator+ (const Matrix &right) // добавление элемента в множество
 {
     if (getSizeRow() != right.getSizeMat() || getSizeCol() != right.getPtr()->getSize())
     {
         cout << "Множества разного размера!\n";
         exit(1); // завершить работу программы
     }

//     int num = size + right.getSizeMany(); // количество элементов нового множества

     Many result(size + 1, right.getSizeMat(), right.getPtr()->getSize() );

     for (int ix = 0; ix < result.getSizeMany() - 1; ix++)
         for (int jx = 0; jx < result.getSizeRow(); jx++)
             for (int zx = 0; zx < result.getSizeCol(); zx++)
                 result.ptr[ix][jx][zx] = ptr[ix][jx][zx];

         for (int jx = 0; jx < result.getSizeRow(); jx++)
             for (int zx = 0; zx < result.getSizeCol(); zx++)
                 result.ptr[result.getSizeMany() - 1][jx][zx] = right.getPtr()[jx][zx];

     return result; // вернуть объединенные множества
 }

 Many &Many::operator+= (const Matrix &right) // добавление элемента в множество
 {
     if (getSizeRow() != right.getSizeMat() || getSizeCol() != right.getPtr()->getSize())
     {
         cout << "Множества разного размера!\n";
         exit(1); // завершить работу программы
     }
     Many temp(*this);
     delete [] ptr;

     size += 1; // количество элементов нового множества

     ptr = new Matrix [size];

     for (int ix = 0; ix < size; ix++) // перераспределяем выделенную память
         ptr[ix].setSize(temp.getSizeRow(), temp.getSizeCol()); // количество строк и столбцов

     for (int ix = 0; ix < temp.getSizeMany(); ix++)
         for (int jx = 0; jx < temp.getSizeRow(); jx++)
             for (int zx = 0; zx < temp.getSizeCol(); zx++)
                 ptr[ix][jx][zx] = temp.ptr[ix][jx][zx];

         for (int jx = 0; jx < getSizeRow(); jx++)
             for (int zx = 0; zx < getSizeCol(); zx++)
                 ptr[getSizeMany() - 1][jx][zx] = right.getPtr()[jx][zx];

     return *this; // вернуть объединенные множества
 }

Файл с функцией main(). В этом файле я постарался протестировать все возможности класса Many.

#include <iostream>
using namespace std;

#include "many.h"

#include <cstdlib>

int main()
{
    srand(time(NULL));

    Many tg1(4, 3, 4); // конструктор с параметрами

    // заполнение множества
    for (int ix = 0; ix < tg1.getSizeMany(); ix++)
        for (int jx = 0; jx < tg1.getSizeRow(); jx++)
            for (int zx = 0; zx < tg1.getSizeCol(); zx++)
                tg1[ix][jx][zx] = rand() % 100;

    cout << "перегруженный оператор вывода:\n" << tg1; // перегруженный оператор вывода

    Many tg2(tg1); // конструктор копирования
    cout << "Конструктор копирования Many tg2(tg1);:\n" << tg2;

//    cin >> tg2; // перегруженный оператор ввода
    cout << "Вывод множества с помощщью метода класса Many\n";
    tg2.getMany(); // вывод множества с помощщью метода класса Many
//    tg2.setMany(); // заполнение множества с помощщью метода класса Many
//    cout << tg2;
    Many tg3 = tg2; // перегруженный оператор присваивания (коснтруктор по умолчанию)

        cout << "Перегруженный оператор присваивания Many tg3 = tg2;\n"<< tg3;

        if (tg3 == tg2)
            cout << "Множества tg3 и tg2 равны!\n";
        cout << "Удаление всех элементов множества tg2\n" << -(-(-(-tg2))); // перегруженный оператор минус (удаление последнего элемента множества)

    cout << "Разность множеств (tg3 - tg3)\n" << (tg3 - tg3); // перегруженная операция минус (разность множеств)

    cout << "Объединение множеств: (tg3 + tg1)\n" << (tg3 + tg1) ; // перегруженная операция плюс (объединение множеств)

    tg1 +=tg3;
    cout << "Объединение множеств tg1 +=tg3;:\n" << tg1;

    Matrix mt1(3,4);

    // заполнение матрицы mt1
     for (int ix = 0; ix < mt1.getSizeMat(); ix++)
         for (int jx = 0; jx < mt1.getPtr()->getSize(); jx++)
             mt1[ix][jx] = 1; // единичная матрица

    cout << "tg1 + mt1\n" << (tg1 + mt1); // добавление элемента типа Matrix к множеству типа Many

    (tg1+=mt1)+=mt1; // перегрузка оператора сложение-присвоение

    cout << "Добавление элемента типа Matrix к множеству типа Many:\n" << tg1;

    return 0;
}

Следующие статьи помогут вам в решении данной задачи:
Автор: Marienko L.
Дата: 13.11.2012
Поделиться:

Комментарии

  1. Arthur

    Здравствуйте. Пишите здесь или мне в вк.

  2. Arthur

    #ifndef MASSIV3_H
    #define MASSIV3_H
    #include<iostream>
    
    using namespace std;
    #include "massiv2.h"
    
    class Massiv3:public Massiv2
    {
    private:
        Massiv2* mass3;
        int mass_size3;
    public:
        Massiv3();                        //конструктор без параметров
        Massiv3(int d, int m, int n);     //конструктор с тремя параметрами
        Massiv3(Massiv3& cop);            //консруктор копирования
       ~Massiv3();                        //деструктор
        void setMass3();                  //ввод элементов массива
        void setSize(int , int , int );   //создание массива по заданным размерам
        void getMass3();                  //показать массив
        int getSizeS1();                  //вернуть первый размер массива
        int getSizeS2();                  //вернуть второй размер массива
        int getSizeS3();                  //вернуть третий размер массива
        Massiv3  operator+(Massiv3& );
        Massiv3& operator+=(Massiv3& );
        Massiv3& operator+=(Massiv2& );
        Massiv3  operator+(Massiv2& );
        Massiv3& operator=(const Massiv3& );
        Massiv3  operator-(Massiv3& );
        Massiv3& operator-(int );
        bool operator==(Massiv3& );
        Massiv2 operator[](int m);
       friend ostream& operator<<(ostream& , Massiv3& );
       friend istream& operator>>(istream& , Massiv3& );
    };
    #endif // MASSIV3_H
  3. Arthur

    #include "massiv3.h"
    #include<iostream>
    #include<cstdlib>
    #include<iomanip>
    using namespace std;
    
       Massiv3::Massiv3()                    //конструктор без параметров
        {
            mass3 = NULL;
            mass_size3 = 0;
        }
    //-----------------------------------------------------
        Massiv3::Massiv3(int d, int m, int n)  //конструктор с тремя параметрами
        {
            mass_size3 = d;
            mass3 = new Massiv2[d];
            for(int x = 0; x<mass_size3; x++)
                mass3[x] = Massiv2(m, n);
        }
    //---------------------------------------------------------
        Massiv3::Massiv3(Massiv3& cop)    //консруктор копирования
        {
            mass_size3 = cop.mass_size3;
            mass3 = cop.mass3;
        }
    //------------------------------------------------------
        Massiv3::~Massiv3()           //деструктор
        {
          delete[]mass3;
        }
    //------------------------------------------------------
       void Massiv3::setSize(int d, int m, int n)   //создание массива по заданным размерам
        {
            mass_size3 = d;
            mass3 = new Massiv2[d];
            for(int x = 0; x<mass_size3; x++)
                mass3[x].setSize(m, n);
        }
    //------------------------------------------------------
        void Massiv3::setMass3()        //ввод элементов массива
        {
         for(int x = 0; x<mass_size3; x++)
             mass3[x].setMass2();
        }
    //----------------------------------------------------
        void Massiv3::getMass3()
        {
          for(int x= 0; x<mass_size3; x++)
             {
               mass3[x].getMass2();
               cout<<"\n\n";
             }
        }
    //-----------------------------------------------------------------
         int Massiv3::getSizeS1()
         {
           return mass_size3;
         }
    //----------------------------------------------------------------
         int Massiv3::getSizeS2()
         {
             return (mass3 ->getSizeStr());
         }
    //--------------------------------------------------------------
        int Massiv3::getSizeS3()
         {
             return (mass3 ->getSizeStl());
         }
    //----------------------------------------------------------------------
        Massiv3 Massiv3::operator+(Massiv3& ms)
        {
    
          if(mass_size3 == ms.mass_size3)
           {
            Massiv3 rezult( mass_size3, mass3->getSizeStr(), mass3->getSizeStl() );
    
            for(int x = 0; x<mass_size3; x++)
            rezult.mass3[x] = mass3[x] + ms.mass3[x];
            return rezult;
           }
            else
            cout<<"\nМатрицы имеют разные размеры!\n";
            exit(1);
        }
    //-----------------------------------------------------------------
     Massiv3& Massiv3::operator+=(Massiv3& ms)
        {
           if(mass_size3 == ms.mass_size3)
           {
            for(int x = 0; x<mass_size3; x++)
                mass3[x] += ms.mass3[x];
            return *this;
           }
            else
            cout<<"\nМатрицы имеют разные размеры!\n";
            exit(1);
        }
    //-----------------------------------------------------------------
       Massiv3& Massiv3::operator+=(Massiv2& ms)//перегрузка оператора+=
        {
          if(ms.getSizeStr() == getSizeS2() && ms.getSizeStl() == getSizeS3())
          {
            Massiv3 temp(*this);    //создание временного массива
    
           delete []mass3;
    
           mass_size3 = temp.mass_size3+1;
           mass3 = new Massiv2[mass_size3];
    
           for(int x = 0; x<mass_size3-1; x++)
            mass3[x] = temp.mass3[x];
           mass3[mass_size3-1] = ms;
          return *this;
          }
           else
            cout<<"\nМатрицы имеют разные размеры!\n";
            exit(1);
    
        }
    //-------------------------------------------------------------
     Massiv3 Massiv3::operator+(Massiv2& ms)//перегрузка оператора+
        {
          if(ms.getSizeStr() == getSizeS2() && ms.getSizeStl() == getSizeS3())
          {
          Massiv3 rezult(mass_size3+1, ms.getSizeStr(), ms.getSizeStl() );
    
          for(int x = 0; x<mass_size3; x++)
              rezult.mass3[x] = mass3[x];
    
          rezult.mass3[mass_size3] = ms;
          return rezult;
          }
          else
            cout<<"\nМатрицы имеют разные размеры!\n";
            exit(1);
    
        }
    //-------------------------------------------------------------------
     Massiv3& Massiv3::operator=(const Massiv3& ms) //перегрузка оператора =
        {
            if(this == &ms)
                return *this;
            if(mass3)
                delete[]mass3;
    
            mass3 = ms.mass3;
            mass_size3 = ms.mass_size3;
            return *this;
        }
    //---------------------------------------------------------------
     Massiv3 Massiv3::operator-(Massiv3& ms)
        {
            if(mass_size3 == ms.mass_size3)
            {
             Massiv3 rezult( mass_size3, mass3->getSizeStr(), mass3->getSizeStl() );
    
             for(int x = 0; x<mass_size3; x++)
                rezult.mass3[x] = mass3[x] - ms.mass3[x];
             return rezult;
            }
            else
            cout<<"\nМатрицы имеют разные размеры!\n";
            exit(1);
        }
    //-------------------------------------------------------------
     Massiv3& Massiv3::operator-(int n)//удаление элемента массива
        {
         if(n >=0 && n<mass_size3)
           {
              Massiv3 temp(*this);
    
         delete[]mass3;
    
         mass_size3 = temp.mass_size3 - 1;
         mass3 = new Massiv2[mass_size3];
    
         for(int x = 0, y = 0; x<mass_size3; y++ )
             if(y != n)
               {
                  mass3[x] = temp.mass3[y];
                  x++;
               }
    
         return *this;
            }
         return *this;
    
        }
     //-------------------------------------------------------------
     bool Massiv3::operator==(Massiv3& ms)
        {
            if(mass_size3 != ms.mass_size3)
                return false;
            for(int x = 0; x<mass_size3; x++)
                if(!(mass3[x] == ms.mass3[x]))
                  return false;
            return true;
        }
    //-------------------------------------------------------------
     Massiv2 Massiv3::operator[](int m)
        {
           if(m<0 || m>=mass_size3)
             exit(1);
           return mass3[m];
        }
    //-------------------------------------------------------------
    ostream& operator<<(ostream& s, Massiv3& ms)
    {
       for(int x = 0; x<ms.mass_size3; x++)
            s<<ms.mass3[x]<<"\n\n";
        return s;
    }
    //---------------------------------------------------------------
    istream& operator>>(istream& s, Massiv3& ms)
    {
         for(int x = 0; x<ms.mass_size3; x++)
            s>>ms.mass3[x];
    
        return s;
    }
  4. Arthur

    #include<iostream>
    #include<iomanip>
    #include<cstdlib>
    #include<ctime>
    #include"massiv3.h"
    using namespace std;
    
    
    const int MAX = 20; //максимальная длина массива
    
    void setRand(Massiv3& mas);
    void setRand(Massiv2& mas);
    int main()
    {
        setlocale(LC_CTYPE,"rus");
        cin.unsetf(ios::skipws); //не игнорировать разделители
    
        int d, m, n; //стороны матрицы
    
        cout<<"Введите размеры матрицы"<<endl;
         while(true)
          {
          cout<<"\nВведите 1-е измерение матрицы(1-20): "; cin>>d;
          if(cin.good() && (d<1 || d>MAX))
            {
              cout<<"\nНедопустимый размер матрицы.\n";
              cin.sync();
              continue;
            }
    
          if(cin.good())
            {
              cin.sync();
              break;
            }
          cout<<"\nНеправильный ввод данных"<<endl;
          cin.clear();
          cin.sync();
          }
    
           while(true)
          {
          cout<<"\nВведите 2-е измерение матрицы(1-20): "; cin>>m;
          if(cin.good() && (m<1 || m>MAX))
            {
              cout<<"\nНедопустимый размер матрицы.\n";
              cin.sync();
              continue;
            }
    
          if(cin.good())
            {
              cin.sync();
              break;
            }
          cout<<"\nНеправильный ввод данных"<<endl;
          cin.clear();
          cin.sync();
          }
    
           while(true)
          {
          cout<<"\nВведите 3-е измерение матрицы(1-20): "; cin>>n;
          if(cin.good() && (n<1 || n>MAX))
            {
              cout<<"\nНедопустимый размер матрицы.\n";
              cin.sync();
              continue;
            }
    
          if(cin.good())
            {
              cin.sync();
              break;
            }
          cout<<"\nНеправильный ввод данных"<<endl;
          cin.clear();
          cin.sync();
          }
    
        Massiv3 massiv;
        massiv.setSize(d, m, n);
        setRand(massiv);
    
        cout<<"\nМатрица:\n\n"<<massiv;
    
        char menu;
        Massiv3 rezult;
       while(true)
        {
        if(massiv.getSizeS1() == 0)
                    massiv.setSize(d, m ,n);
        cin.sync();
        cout<<"\nВыберите действие:"
            <<"\n1 - сложение матриц"// присвоение
            <<"\n2 - инкреминировать матрицу"
            <<"\n3 - добавить элемент в матрицу"
            <<"\n4 - объеденить элемент с матрицей"
            <<"\n5 - найти разность матриц"
            <<"\n6 - удалить элемент"
            <<"\n7 - сравнить по элементам"
            <<"\n0 - Выход"
            <<"\n>> ";
            cin>>menu;
            cin.sync();
         switch(menu)
         {
         case '1':
            {
                Massiv3 massiv2(massiv.getSizeS1(), massiv.getSizeS2(), massiv.getSizeS3());  //формирование второго массива
                setRand(massiv2);                                                             //заполнение массива
                cout<<"\nВторая матрица:\n\n"<<massiv2;
                rezult = massiv + massiv2;
                cout<<"Результат сложения матриц:\n\n"<<rezult;
                break;
            }
           case '2':
            {
                Massiv3 massiv2(massiv.getSizeS1(), massiv.getSizeS2(), massiv.getSizeS3()); //использование конструктора с двумя параметроми
                setRand(massiv2);
                cout<<"\nВторая матрица:\n\n"<<massiv2;
                massiv += massiv2;
                cout<<"Результат инкреминирования матрицы:\n\n"<<massiv;
                break;
            }
           case '3':
            {
               if(massiv.getSizeS1()>=MAX)
                {
                  cout<<"\nПревышен допустимый размер массива";
                  break;
                }
               Massiv2 massiv2( massiv.getSizeS2(), massiv.getSizeS3());
               setRand(massiv2);
               massiv += massiv2;
               cout<<"\nМатрица с добавленным элементом\n\n"<<massiv;
               break;
            }
           case '4':
            {
               Massiv2 massiv2( massiv.getSizeS2(), massiv.getSizeS3());
               setRand(massiv2);
               rezult = massiv + massiv2;
               cout<<"\nРезультат объединения матрицы с новым элементом\n\n"<<rezult;
               break;
            }
          case '5':
            {
                Massiv3 massiv2(massiv.getSizeS1(), massiv.getSizeS2(), massiv.getSizeS3());  //использование конструктора с одним параметром
                setRand(massiv2);
                cout<<"\nВторая матрица:\n\n"<<massiv2;
                rezult = massiv - massiv2;
                cout<<"Результат вычитания матриц:\n\n"<<rezult;
                break;
            }
          case '6':
            {
                int n;
    
                while(true)
                {
                  cout<<"\nВведите номер элемента который хотите удалить(0 - "<<massiv.getSizeS1()-1<<"):";
                  cin>>n;
                 if(cin.good() && (n>=0 && n<massiv.getSizeS1())  )
                    break;
                 cout<<"\nНедопустимый ввод\n";
                 cin.clear();
                 cin.sync();
                }
                cout<<"\nМатрица с удаленным элементом:\n\n"<<( massiv-n );
                break;
            }
          case '7':
            {
              Massiv3 massiv2(massiv.getSizeS1(), massiv.getSizeS2(), massiv.getSizeS3());
             cout<<"\nВведите вторую матрицу для сравнения:\n";
             cin>>massiv2;
             cout<<massiv2;
    
              if(massiv == massiv2)
                cout<<"\nМатрицы равны"<<endl;
              else
                cout<<"\nМатрицы не равны"<<endl;
                break;
            }
         case '0':
            {
              return 0;
            }
         default: cout<<"Недопустимый ввод!";
         }
        }
    return 0;
    }
    
    void setRand(Massiv3& mas)
    {
       srand( time(0) );
       for(int x = 0; x<mas.getSizeS1(); x++)
          for(int y = 0; y<mas.getSizeS2(); y++)
              for(int z = 0; z<mas.getSizeS3(); z++)
                  mas[x][y][z] = rand()%100;
    }
    void setRand(Massiv2& mas)
    {
       srand( time(0) );
       for(int x = 0; x<mas.getSizeStr(); x++)
          for(int y = 0; y<mas.getSizeStl(); y++)
               mas[x][y] = rand()%100;
    }

Оставить комментарий

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