Матрицы

  • Автор темы Alston
  • Дата начала

DarkKnight

Well-known member
01.08.2010
653
0
#2
А сделать то что нужно??? :)))))
Задание бы хоть напечатал ;))))
 
A

Alston

#3
С клавиатури задание матрицы A[n][n] B[n][n]. Вычеслить С.
 

DarkKnight

Well-known member
01.08.2010
653
0
#6
Ок... Alston... Щас синий в хламину... Завтра напишу обязательньо....
Так что зайти через часов 12-15 все будет... Обещаю... Если конечно кто-нить другой не навояет....
 

DarkKnight

Well-known member
01.08.2010
653
0
#8
Ну вот так как то это будет выглядить..
Коментировать особо времени не было, если что не понятно будет пиши....
Ну и реализацию функций-членов_класса писал прямо в классе, немного плохо читаемо

C++:
#include <iostream>
using namespace std;

class TMatrix //Класс Матрица (квадратная)
{
public:
int Size; //размер матрицы
int **Value; //Значения матрицы


TMatrix (int n,int def = 0) //Конструктор n- размер, def - значение всех элементов по умолчанию
{
Size = n;
Value = new int*[n];
for (int i = 0; i<n;i++)
{
Value[i] = new int[n];
for (int j=0; j<n; j++)
{
Value[i][j]=def;
}
}
}

TMatrix Transp() //Функция транспонирования матрицы
{
TMatrix Temp(this->Size);
Temp = *this;
for (int i = 0; i < Size; i++)
{
for (int j=0; j < Size; j++)
{
Temp.Value[j][i] = this->Value[i][j];
}
}
return Temp;
}
friend ostream& operator << (ostream& out, const TMatrix &Matrix) //Дружественная перегруженная функция ostream, для вывода на экран
{
for (int i=0; i<Matrix.Size; i++)
{
for (int j=0; j<Matrix.Size; j++)
{
out<<Matrix.Value[i][j];
out<<'\t';
}
out<<endl;
}
return out;
}

friend istream& operator >> (istream& in, const TMatrix &Matrix) //Дружественная перегруженная функция istream, для ввода с клавиатуры
{
cout<<"Input Matrix["<<Matrix.Size<<","<<Matrix.Size<<"] :"<<endl;
for (int i=0; i<Matrix.Size; i++)
{
for (int j=0; j<Matrix.Size; j++)
{
cout<<"Matrix["<<i<<","<<j<<"] = ";
in>>Matrix.Value[i][j];
}

}
return in;
}

TMatrix& operator = (TMatrix& A) //Перегруженный оператор присваивания
{
for (int i = 0; i < this->Size; i++)
{
delete[] this->Value[i];
}
delete[] this->Value;

this->Value = new int*[A.Size];
for (int i =0; i<A.Size; i++)
{
this->Value[i] = new int[A.Size];
for (int j=0; j<A.Size; j++)
{
this->Value[i][j] = A.Value[i][j];
}
}
this->Size = A.Size;

return *this;
}


friend TMatrix& operator * (int A, TMatrix& B) //Перегруженный оператор произведения (int)*(TMatrix)
{
for (int i=0; i < B.Size; i++)
{
for (int j=0; j < B.Size; j++)
{
B.Value[i][j] = B.Value[i][j] * A;
}
}

return B;
}

friend TMatrix& operator * (TMatrix& B, int A) //Перегруженный оператор произведения (TMatrix) * (int) 
{
return A*B;
}

TMatrix& operator * (TMatrix& A) //Перегруженный оператор произведения двух матриц
{
TMatrix *Error = new TMatrix(0);
if (A.Size != this->Size) 
{
cout<<"Error! Size not eq";
return *Error;
}

TMatrix *Result = new TMatrix(this->Size);

for (int i =0; i < this->Size; i++)
{
for (int j=0; j < this->Size; j++)
{
int Sum = 0;
for (int z = 0; z < this ->Size; z++)
{
Sum += this->Value[i][z] * A.Value[z][j];
}

Result->Value[i][j] = Sum;
}
}

return *Result;
}

TMatrix& operator - (TMatrix& A) //Перегруженный оператор разности матриц
{
TMatrix *Error = new TMatrix(0);
if (A.Size != this->Size) 
{
cout<<"Error! Size not eq";
return *Error;
}

TMatrix *Result = new TMatrix(this->Size);

for (int i =0; i < this->Size; i++)
{
for (int j=0; j < this->Size; j++)
{			
Result->Value[i][j] = this->Value[i][j] - A.Value[i][j];
}
}

return *Result;
}

TMatrix Sqr(void)
{
return (*this * *this);
}


};


void main (void)
{
int SizeMatrix;
cout<<"Input Size Matrix = ";
cin>>SizeMatrix;

TMatrix A(SizeMatrix);
cout<<endl<<"Input A: ";
cin>>A;

TMatrix B(SizeMatrix);
cout<<endl<<"Input B: ";
cin>>B;

//А вот реализация твоего примера
TMatrix C(SizeMatrix);
C = (A.Transp()*B - 3*B.Sqr())*B;
cout<<C;

}
 

DarkKnight

Well-known member
01.08.2010
653
0
#9
Так попроще читать
C++:
#include <iostream>
using namespace std;

class TMatrix //Класс Матрица (квадратная)
{
private:
int Size; //размер матрицы
int **Value; //Значения матрицы

public:
TMatrix (int n,int def = 0) //Конструктор n- размер, def - значение всех элементов по умолчанию
{
Size = n;
Value = new int*[n];
for (int i = 0; i<n;i++)
{
Value[i] = new int[n];
for (int j=0; j<n; j++)
{
Value[i][j]=def;
}
}
}

TMatrix Transp(void); //Прототип Функции транспанирования матрицы
friend ostream& operator << (ostream&,const TMatrix&); 
friend istream& operator >> (istream&,const TMatrix&);

TMatrix& operator = (TMatrix&); //Перегруженный оператор присваивания
TMatrix& operator * (TMatrix&); //Перегруженный оператор произведения двух матриц
TMatrix& operator - (TMatrix&); //Перегруженный оператор разности матриц
TMatrix& operator + (TMatrix&); //Перегруженный оператор суммы матриц


friend TMatrix& operator * (int, TMatrix&); //Перегруженный оператор произведения (int)*(TMatrix)
friend TMatrix& operator * (TMatrix&, int); //Перегруженный оператор произведения (TMatrix) * (int) 

TMatrix Sqr(void); //Функция возведения в квадрат матрицы
int GetSize(void); //Функция получения размера матрицы

};

//Функция транспанирования матрицы
TMatrix TMatrix::Transp(void) 
{
TMatrix Temp(this->Size);
Temp = *this;
for (int i = 0; i < Size; i++)
{
for (int j=0; j < Size; j++)
{
Temp.Value[j][i] = this->Value[i][j];
}
}
return Temp;
}

//Перезагруженый оператор потокового вывода
ostream& operator << (ostream& out, const TMatrix &Matrix) //Дружественная перегруженная функция ostream, для вывода на экран
{
for (int i=0; i<Matrix.Size; i++)
{
for (int j=0; j<Matrix.Size; j++)
{
out<<Matrix.Value[i][j];
out<<'\t';
}
out<<endl;
}
return out;
}

//Перезагруженый оператор потокового ввода
istream& operator >> (istream& in, const TMatrix &Matrix) //Дружественная перегруженная функция istream, для ввода с клавиатуры
{
cout<<"Input Matrix["<<Matrix.Size<<","<<Matrix.Size<<"] :"<<endl;
for (int i=0; i<Matrix.Size; i++)
{
for (int j=0; j<Matrix.Size; j++)
{
cout<<"Matrix["<<i<<","<<j<<"] = ";
in>>Matrix.Value[i][j];
}	
}
return in;
}

//Перезагруженый оператор присваивания Матрица = Матрица
TMatrix& TMatrix::operator = (TMatrix& A) //Перегруженный оператор присваивания
{
for (int i = 0; i < this->Size; i++)
{
delete[] this->Value[i];
}
delete[] this->Value;
this->Value = new int*[A.Size];
for (int i =0; i<A.Size; i++)
{
this->Value[i] = new int[A.Size];
for (int j=0; j<A.Size; j++)
{
this->Value[i][j] = A.Value[i][j];
}
}
this->Size = A.Size;
return *this;
}

//Перегруженный оператор произведения (int)*(TMatrix)
TMatrix& operator * (int A, TMatrix& B) 
{
for (int i=0; i < B.Size; i++)
{
for (int j=0; j < B.Size; j++)
{
B.Value[i][j] = B.Value[i][j] * A;
}
}
return B;
}

//Перегруженный оператор произведения (TMatrix) * (int) 
TMatrix& operator * (TMatrix& B, int A) 
{
return A*B;
}

//Перегруженный оператор произведения двух матриц
TMatrix& TMatrix::operator * (TMatrix& A) //Перегруженный оператор произведения двух матриц
{
TMatrix *Error = new TMatrix(0);
if (A.Size != this->Size) 
{
cout<<"Error! Size not eq";
return *Error;
}

TMatrix *Result = new TMatrix(this->Size);
for (int i =0; i < this->Size; i++)
{
for (int j=0; j < this->Size; j++)
{
int Sum = 0;
for (int z = 0; z < this ->Size; z++)
{
Sum += this->Value[i][z] * A.Value[z][j];
}
Result->Value[i][j] = Sum;
}
}
return *Result;
}

//Перегруженный оператор разности матриц
TMatrix& TMatrix::operator - (TMatrix& A) //Перегруженный оператор разности матриц
{
TMatrix *Error = new TMatrix(0);
if (A.Size != this->Size) 
{
cout<<"Error! Size not eq";
return *Error;
}

TMatrix *Result = new TMatrix(this->Size);

for (int i =0; i < this->Size; i++)
{
for (int j=0; j < this->Size; j++)
{			
Result->Value[i][j] = this->Value[i][j] - A.Value[i][j];
}
}
return *Result;
}

//Перегруженный оператор суммы матриц
TMatrix& TMatrix::operator + (TMatrix& A) //Перегруженный оператор суммы матриц
{
TMatrix *Error = new TMatrix(0);
if (A.Size != this->Size) 
{
cout<<"Error! Size not eq";
return *Error;
}

TMatrix *Result = new TMatrix(this->Size);

for (int i =0; i < this->Size; i++)
{
for (int j=0; j < this->Size; j++)
{			
Result->Value[i][j] = this->Value[i][j] + A.Value[i][j];
}
}
return *Result;
}

//Функция возведения в квадрат матрицы 
TMatrix TMatrix::Sqr(void) //Функция квадрата матрицы
{
return (*this * *this);
}

//Функция получения размера квадратной матрицы
int TMatrix::GetSize(void)
{
return this->Size;
}


//Главная функция программы
void main (void)
{
int SizeMatrix; //Переменная размера матриц с которыми будем работать
cout<<"Input Size Matrix = "; 
cin>>SizeMatrix; //Введем эту переменную

TMatrix A(SizeMatrix); //Создадим объект-класса
cout<<endl<<"Input A: "; 
cin>>A; //Заполним его с клавиатуры

TMatrix B(SizeMatrix); //Создадим еще один объект-класса
cout<<endl<<"Input B: ";
cin>>B; //Так же заполним

//А вот реализация твоего примера
TMatrix C(SizeMatrix); //Создадим третий объект-класса в который и поместим результат
C = (A.Transp()*B - 3*B.Sqr())*B;
cout<<C; //Выведим результат в консоль

}
 

DarkKnight

Well-known member
01.08.2010
653
0
#10
Если будешь использовать оконный вариант...
Например матрицу заполнять в TGrid
то добавишь в класс функцию примерно такую
int& TMatrix::SetValue(int i, int j)
{
return this->Value[j];
}
и можешь заполнять тогда элементы так
TMatrix A(5);
A.SetValue(1,2) = StrToInt(StringGrid1->Cells[1][2]);