Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: Помогите решить
Показать сообщение отдельно

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Таки решил, посмотрите пожалуйста код и расскритикуйте...
Код: Выделить весь код
//3-я Задача... Создать два класса Матрица и Вектор.
// Определить конструкторы, деструкторы.
// Определить функцию умножения вектора на матрицу как дружескую.
// Определить дружескую функцию умножения матрицы на матрицу.
// Определить дружескую функцию умножения числа на матрицу.
// Продемонстрировать работу функций в програме.
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

#include <iomanip.h>
using std::setw;

//******************************Класс Вектор***********************************/
class Vector{ // Класс Вектор
   friend class Matrix; // класс Вектор друг класса Матрица
   // Дружеская функция умножения Вектора на Матрицу. Принимает Матрицу, Вектор
   // на который умножается и Вектор, где будет храниться результат умножения
   friend void MultiplyVectorMatrix(Matrix &mMatrix, Vector &Vec2, Vector &Vec1);
public:
   Vector(int size = 1);      // конструктор по умолчанию
   void setSizeVector(int size); // Установка размера Вектора
   void setOrientationVector(); // Установка Вектора-столбца или Вектора-Строки. В столбец или в строку...
   void UserFromKeyboardsVector(); // Ввод значений Вектора с клавиатуры   
   bool getOrientationVector() { return Orient; }; // Возвращение ориентации Вектора
   int getSizeVector() { return SizeVector; }; // Возвращение размера Вектора   
   int &elementVector(int index) { return Vector[index]; } // Индексация. Для доступа к элементу Вектора
   void PrintVector(); // Печать значений Вектора
   ~Vector();        // деструктор
private:
   int *Vector;      // Указатель на целое.
   int  SizeVector;  // Размер Вектора
   bool Orient;      // Ориентация Вектора. true - Вертикально, false - Горизонатально...
};
//*******************************Класс Матрица*********************************/
class Matrix{ // Класс Matrix
   // Дружеская функция умножения Матрицы на Матрицу
   friend void MultiplicationMatrix(Matrix &mMatrix1, Matrix &mMatrix2, Matrix &mMatrix3);
   // Дружеская функция умножения Матрицы на Число
   friend void NumberMultiplicationMatrix(Matrix &mMatrix3, Matrix &mMatrix, int);
public:
   Matrix(int height = 1, int width = 1); // Конструктор с аргументами по умолчанию
   void setMatrix(int height, int width); // Установка размера матрицы
   void UserFromKeyboardsMatrix(); // Ввод данных Матрицы с клавиатуры
   int &elementMatrix(int index) { return Matrix[index]; } // Индексация. Для доступа к элементу Матрицы
   int getSizeMatrix() { return SizeMatrix; }; // Получить размер Матрицы
   int getSizeRow()    { return row; };  // Получить количество строк Матрицы
   int getSizeColumn() { return column; }; // Получить количество столбцов Матрицы
   void PrintMatrix(); // Печать Значений Матриц
   ~Matrix(); // Деструктор
private:
   int *Matrix; // Указатель на целое
   int SizeMatrix; // Размер Матрицы
   int row; // Сколько строк в Матрице
   int column;  // Сколько столбцов в Матрице
};
/*****************************************************************************/
// РЕАЛИЗАЦИЯ КЛАССА Matrix
/*****************************************************************************/
// Конструктор Матрицы--------------------------------------------------------
Matrix::Matrix(int height, int width)
{
   setMatrix(height, width);
}
// Установка размера Матрицы--------------------------------------------------
void Matrix::setMatrix(int h, int w)
{
   SizeMatrix = h * w;
   row = h;
   column = w;

   Matrix = new int [SizeMatrix];
   // Инициализация Матрицы нулями
   for(int i = 0; i < SizeMatrix; i++)
      Matrix[i] = 0;
}
// Ввод данных с клавиатуры, для Матрицы--------------------------------------
void Matrix::UserFromKeyboardsMatrix()
{
   int counter = 1; // Счётчик вводимого элемента Матрицы...
   static int countMatrix = 1;

   // Циклический ввод в Матрицу
   for(int i = 0; i < SizeMatrix; i++){
      cout<<" Enter value in "<<countMatrix<<" 'Matrix', position "<<counter++<<" Value: ";
      cin>>Matrix[i];
    }
    countMatrix++;
}
// Вывод элементов Матрицы на экран-------------------------------------------
void Matrix::PrintMatrix()
{
   int control = 0, // Для вывода знака '|' в начале Матрицы
       counColumn = column - 1; // Для вывода знака '|' в конце Матрицы

   cout<<"\n";  // Пару пустых строк (для читабельности)

   // Вывод на экран Матрицы
   for(int j = 0; j < SizeMatrix; j++){
      if(control == 0){
        cout<<'|';
        control++;
      }
      cout<<setw(7)<<Matrix[j];
      if(j == counColumn){
        counColumn += column;
        cout<<'|';
        control = 0;
        cout<<endl;
      }
    }
   // Вывод на экран символа '-' на всю ширину консоли, для читабельности...
   for(int i = 0; i < 80; i++)
      cout<<'-';
}
// Деструктор Матрицы---------------------------------------------------------
Matrix::~Matrix()
{
  delete[] Matrix;
  cout<<"Destructor"<<endl;
}
// Дружеская функция класса Matrix, умножения Матрицы на Матрицу. В качестве--
// хранения результатов используется 3-я Матрица------------------------------
void MultiplicationMatrix(Matrix &mMatrix1, Matrix &mMatrix2, Matrix &mMatrix3)
{
   // Умножение Матрицы на Матрицу.
   // Циклическое умножение элемента 1-й Матрицы на элемент 2-й Матрицы
   for(int i = 0; i < mMatrix3.getSizeMatrix(); i++)
      mMatrix3.Matrix[i] = mMatrix1.Matrix[i] * mMatrix2.Matrix[i];

   cout<<"\n Result Multiplication...\n";
}
// Дружеская функция класса Matrix, умножения Матрицы на Число. В качестве----
// хранения результатов используется 3-я Матрица------------------------------
void NumberMultiplicationMatrix(Matrix &mMatrix3, Matrix &mMatrix, int number)
{
   // Умножение Матрицы на Число.
   // Циклическое умножение элемента 1-й Матрицы на элемент 2-й Матрицы
   for(int i = 0; i < mMatrix3.getSizeMatrix(); i++)
      mMatrix3.Matrix[i] = number * mMatrix.Matrix[i];

   cout<<"\n Result Multiplication Number "<<"'"<<number<<"' to"<<" 'Matrix'\n";
}
/*****************************************************************************/
/*****************************************************************************/
// РЕАЛИЗАЦИЯ КЛАССА Vector  
/*****************************************************************************/
/*****************************************************************************/
// Дружеская функция класса Vector, умножения Матрицы на Вектор. В качестве---
// хранения результатов используется 2-ой Вектор------------------------------
void MultiplyVectorMatrix(Matrix &mMatrix1, Vector &Vec2, Vector &Vec1)
{
   int iMat = 0,
       jMat = 0;

   if(Vec1.Orient){ // Умножение Вектора-столбца на Матрицу
     for(int i = 0; i < Vec1.getSizeVector(); i++){
        jMat += mMatrix1.getSizeColumn();
        for(; iMat < jMat; iMat++)
          Vec2.Vector[i] += mMatrix1.elementMatrix(iMat) * Vec1.Vector[i];
       }
     cout<<" Result Multiply Vector-Column to a Matrix..."<<endl;
    }
   else if(!Vec1.Orient){ // Умножение Вектора-строки на Матрицу
     for(int i = 0; i < mMatrix1.getSizeRow(); i++){
        jMat += mMatrix1.getSizeColumn();
        for(int j = 0; iMat < jMat; iMat++, j++)
          Vec2.Vector[i] += mMatrix1.elementMatrix(iMat) * Vec1.Vector[j];
       }
     cout<<" Result Multiply Vector-String to a Matrix..."<<endl;
    }
}
// Деструктор Вектора---------------------------------------------------------
Vector::~Vector()
{
    delete[] Vector;
    cout<<" Dectructor Vector"<<endl;
}
// Ввод данных с клавиатуры для Вектора---------------------------------------
void Vector::UserFromKeyboardsVector()
{
   int counter = 1; // Счётчик вводимого элемента Вектора...

   // Циклический ввод в Вектор
   for(int i = 0; i < SizeVector; i++){
      cout<<" Enter value in 'Vector', position "<<counter++<<" Value: ";
      cin>>Vector[i];
    }
}
// Конструктор Вектора--------------------------------------------------------
Vector::Vector(int size)
{
   setSizeVector(size); // Функция установки размера Вектора
}
// Установка размера Вектора--------------------------------------------------
void Vector::setSizeVector(int size)
{
   SizeVector = (size >= 0) ? size : 1;
   // Выделение Вектора под заданный размер и инициализация нулями...
   Vector = new int[size];
   for(int i = 0; i < size; i++)
      Vector[i] = 0;
}
// Вывод элементов Вектора на экран-------------------------------------------
void Vector::PrintVector()
{
    cout<<"\n";
    if(!getOrientationVector()){
      cout<<"| ";
      for(int a = 0; a < SizeVector; a++){
         cout<<setw(7)<<Vector[a];
         if(a == SizeVector - 1)
            cout<<"|";
        }
      cout<<"\n\n Vector-String"<<endl;
     }
    else if(getOrientationVector()) {
      for(int i = 0; i < SizeVector; i++){
         cout<<"| "<<setw(7)<<Vector[i]<<"|"<<endl;
        }
      cout<<"\n Vector-Column"<<endl;
     }

    for(int j = 0; j < 80; j++)
       cout<<'-';
}
// Установка ориентации Вектора. Вертикаль - true, Горизонталь - false--------
// 1 - Ветрикально, 2 - Горизонтально-----------------------------------------
void Vector::setOrientationVector()
{
    int orientation;
    cout<<" Enter number '1' Vector-Stolbez or number '2' Vector-Stroka [1/2]: ";
    cin>>orientation;
    // Проверка, чтобы введённое число было или 1 или 2...
    while(orientation <= 0 || orientation >= 3){
       cout<<" Enter number '1' Vector-Stolbez or number '2' Vector-Stroka [1/2]: ";
       cin>>orientation;
     }

     if(orientation == 1)
        Orient = true;  // Вертикаль - true
     else if(orientation == 2)
        Orient = false; // Горизонталь - false
}
// Демонстрация программы. Тестирование========================================
int main()
{
  int feature, // Выбор умножаемой Матрицы, 1-я или 2-я
      num,  //  Число, на которое умножается выбранная Матрица
      matrColumn, // Столбцы Матрицы (Ширина)
      matrRow,    // Строки Матрицы (Высота)
      szVector,   // Размер Вектора
      z; // Чтобы окно не закрылось раньше срока...

  Matrix matrx1, // 1-й объект класса Matrix (1-я Матрица)
         matrx2, // 2-й объект класса Matrix (2-я Матрица)
         matrx3; // 3-й объект класса Matrix (3-я Матрица. Используется в качестве хранения результатов расчёта)

  Vector vec1, // 1-й объект класса Vector (1-й Вектор)
         vec2; // 2-й объект класса Vector (2-й Вектор. Используется в качестве хранения результатов расчёта)

  cout<<" Enter size Column: ";
  cin>>matrColumn;                 // Столбцы (Ширина)
  cout<<" Enter size Row: ";
  cin>>matrRow;                    // Строки (Высота)

  matrx1.setMatrix(matrRow, matrColumn); // Установка размера 1-й Матрицы (row * column)
  matrx1.UserFromKeyboardsMatrix();  // Ввод значений в первую Матрицу

  cout<<endl; // Для читабельности, пустая строка...

  matrx2.setMatrix(matrRow, matrColumn); // Установка размера 2-й Матрицы (row * column)
  matrx2.UserFromKeyboardsMatrix();  // Ввод значений во вторую Матрицу

  for(int i = 0; i < 80; i++) // Для читабельности
    cout<<'-';
    
  cout<<"\n Print First (1-st) Matrix"<<endl;
  matrx1.PrintMatrix();    // Печать 1-й Матрицы
  cout<<"\n Print Second (2-nd) Matrix"<<endl;
  matrx2.PrintMatrix();    // Печать 2-й Матрицы

  matrx3.setMatrix(matrRow, matrColumn); // Установка размера 3-й Матрицы (row * column)

  MultiplicationMatrix(matrx1, matrx2, matrx3); // Функция умножения Матрицы на Матрицу

  matrx3.PrintMatrix();  // Печать результата умножения Матрицы на Матрицу

  // Предложение ввести Число на которое будет умножена выбранная Матрица
  cout<<"\n\n Enter Number Multiplication Matrix: ";
  cin>>num;
  cout<<endl;

  // Выбор умножаемой Матрицы [1 - первая Матрица, 2 - вторая Матрица]
  cout<<"  Enter Number Vibor Multiplication Matrix [1/2]: ";
  cin>>feature;
  // Проверка выбора
  while(feature >= 3 || feature <= 0){
    cout<<"  Enter Number Vibor Multiplication Matrix [1/2]: ";
    cin>>feature;
  }
  
  if(feature == 1)       // Если выбрана первая Матрица
    NumberMultiplicationMatrix(matrx3, matrx1, num); // Функция умножения Матрицы на Число
  else if(feature == 2)  // Если выбрана вторая Матрица
    NumberMultiplicationMatrix(matrx3, matrx2, num); // Функция умножения Матрицы на Число

  matrx3.PrintMatrix(); // Печать результата умножения Матрицы на Число

  // Установка ориентации Вектора (Вектор-столбец или Вектор-строка)
  vec1.setOrientationVector();
  // Размер 2-го Вектора должен быть равен кол-ву строк в Матрице
  vec2.setSizeVector(matrRow);

  if(vec1.getOrientationVector()) // Вертикальная ориентация Вектора
     vec1.setSizeVector(matrRow); // Размер должен быть равен кол-ву строк в Матрице
  else if(!vec1.getOrientationVector()) // Горизонтальная ориентация Вектора
     vec1.setSizeVector(matrColumn); // Размер должен быть равен кол-ву столбцов в Матрице

  cout<<"\n\n";   
  vec1.UserFromKeyboardsVector(); // Ввод данных с клавиатуры, для Вектора

  for(int j = 0; j < 80; j++) // Для читабельности, вывод линии...
     cout<<'-';

  cout<<"\n  Print Vector..."<<endl;
  vec1.PrintVector(); // Печать 1-го Вектора

  cout<<"\n Print First (1-st) Matrix"<<endl;
  matrx1.PrintMatrix(); // Печать Матрицы, на которую будет умножаться Вектор...

  MultiplyVectorMatrix(matrx1, vec2, vec1); // Функция умножения Вектора на 1-ю Матрицу

  vec2.PrintVector(); // Печать результата умножения Вектора на Матрицу

  cin>>z;
        return 0;
}
//---------------------------------------------------------------------------
Привет Всем! В общем у меня получился такой "расклад", конечно было бы правильнее перегрузить операцию умножения, только у меня возникли сложности с возвращаемым результатом, не могу понять, для такого выражения:

Код: Выделить весь код
Vec2 = Vec1 * Matrix;
Нужно ли реализовывать операцию присваивания? Или ещё как нужно или можно, подскажите
Правилен ли будет такой вариант:


Код: Выделить весь код
Vector::Vector operator*(Vector &Vec, Matrix &Matr)
{
    Vector tempVec;
    
    ...
    // Здесь алгоритм умножения
    ...
    return tempVec;
}
Или если не будет сложно, опишите как правильно возвратить или перегрузить эту операцию, чтобы во всю ширь использовать перегрузку операций, буду благодарен за любой совет...

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Последний раз редактировалось Drongo, 31-01-2008 в 20:03.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:27, 26-11-2007 | #11

Название темы: Помогите решить