Класс Матрица И Действия Над Ними.

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

artem94

Гость
#1
Описать класс, реализующий тип данных «вещественная матрица» и работу с ними. Класс должен реализовывать следующие операции над матрицами:
• сложение, вычитание, умножение, деление (умножение и деление как на другую матрицу, так и на число);
• комбинированные операции присваивания (+ =, - =, * =, / ==)
• операции сравнения на равенство / неравенство;
• операции вычисления обратной и транспонированной матрицы, операцию возведения в степень;
• методы вычисления детерминанта и нормы;
• методы, реализующие проверку типа матрицы (квадратная, диагональная, нулевая, единичная, симметричная, верхняя треугольная, нижняя треугольная)
• операции ввода / вывода в стандартные потоки.
Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.
Помогите пожалуйста с програмой на С++, буду очень благодарен, если можно в короткие строки.
 
N

NikNik

Гость
#4
Описать класс, реализующий тип данных «вещественная матрица» и работу с ними. Класс должен реализовывать следующие операции над матрицами:
• сложение, вычитание, умножение, деление (умножение и деление как на другую матрицу, так и на число);
• комбинированные операции присваивания (+ =, - =, * =, / ==)
• операции сравнения на равенство / неравенство;
• операции вычисления обратной и транспонированной матрицы, операцию возведения в степень;
• методы вычисления детерминанта и нормы;
• методы, реализующие проверку типа матрицы (квадратная, диагональная, нулевая, единичная, симметричная, верхняя треугольная, нижняя треугольная)
• операции ввода / вывода в стандартные потоки.
Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.
Помогите пожалуйста с програмой на С++, буду очень благодарен, если можно в короткие строки.
Посмотри, может чем поможет
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
int** init_matr (int _n, int _m);
void out_matr (int** _matr, int _n, int _m);
int** sum_matr (int** _matr1, int** _matr2,int _n,int _m);
int** tr_matr (int** _matr,int _n, int _m);
int** umn_matr (int** _matr1, int** matr2, int _n,int _m);

int main ()
{
int n,m;
srand (time(0));
printf ("Vvedite razmer matrizi:\nStroki: ");
scanf ("%d",&n);
printf ("Stolbci:");
scanf ("%d",&m);
printf("\n");
printf(" Matrica 1:\n");
int** matrA=init_matr (n,m);
int** matrB=init_matr (n,m);
int** matr_sum=init_matr(n,m);
int** matr_tr=init_matr(m,n);
out_matr(matrA,n,m);
printf("\n");
printf(" Matrica 2:\n");
//========================== сложение 2х матриц
out_matr (matrB,n,m);
printf("\n");
printf("Summa matric:\n");
matr_sum=sum_matr(matrA, matrB, n, m);
out_matr(matr_sum,n,m);
printf("\n");
//========================= транспонирование =======
printf("Transponirovanie summi matric:\n");
matr_tr=tr_matr(matrA,n,m);
out_matr (matr_tr,m,n);
//==================== умножение ===================
printf("\n");
printf("Umnogenie transponir matr na matr 2:\n");
matr_tr=umn_matr(matr_tr,matrB,n,m);
out_matr (matr_tr,n,m);
free (matrA);
free (matrB);
free (matr_sum);
free (matr_tr);
getch ();
}

int** init_matr (int _n, int _m)
{
int** _mas;
_mas=(int**) malloc(_n*sizeof(int*));
for (int i=0; i<_n ; i++)
{
_mas=(int*) malloc (_m*sizeof (int));
for (int j=0; j<_m; j++)
_mas [j]=rand()%20-10;
}
return _mas;
}

void out_matr (int** _mat, int _n, int _m)
{
for (int i=0; i<_n; i++)
{
for (int j=0; j<_m; j++)
printf ("%4d",_mat[j]);
printf ("\n");
}
}

int** sum_matr (int** _matr1, int** _matr2, int _n, int _m)
{

for ( int i=0; i<_n; i++)
for (int j=0; j<_m; j++)
_matr1[j]=_matr1[j]+_matr2[j];
return _matr1;
}

int** tr_matr (int** _matr,int _n, int _m)
{
int** _matr_tr=init_matr(_m,_n);
for (int i=0; i<_n; i++)
for ( int j=0; j<_m; j++)
_matr_tr[j]=_matr[j];
return _matr_tr;
}

int** umn_matr (int** _matr1, int** _matr2,int _n,int _m)
{
int** _matr_umn=init_matr(_n,_m);
for (int i=0; i<_m; i++)
for (int j=0; j<_n; j++)
{
int s=0;
for (int k=0; k<_m; k++)
s=s+_matr1[k]*_matr2[j];
_matr_umn[j]=s;
}
return _matr_umn;
}
 
K

koss

Гость
#6
А если денег, как таковых, нет. Можно ли получить помощь по данной задаче? Пожалуйста.

C++:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Matrix{
private:
int n,m;
double **a, **c;
public:
Matrix::Matrix(int n, int m)
{int i,j;
Matrix::n=n;
Matrix::m=m;
a=new double*[n]; 
for(i=0;i<n;i++)
a[i]=new double[m];
c=new double*[n];
for(int i=0; i<n; i++)
c[i]=new double[m];
{puts("\nВведите елементы:");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];}
cout<<endl;}};
Matrix::~Matrix()
{for(int i=0;i<n;i++)
delete []a[i];
delete []a;};

Matrix &Matrix::operator =(const Matrix &A)
{for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
a[i][j]=A.c[i][j];
return *this;}
Matrix & Matrix::operator +(Matrix &A)
{for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
c[i][j]=a[i][j]+A.a[i][j];
return *this;}
Matrix & Matrix::operator -(Matrix &A)
{for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
c[i][j]=a[i][j]-A.a[i][j];
return *this;}
Matrix & Matrix::operator *(Matrix &A)
{
double s=0;
for(int i=0;i<n;i++)
{
int z=0;
while(z<A.m)
{
c[i][z]=0;
for(int j=0;j<m;j++)
{
s=GetI(i,j)*A.GetI(j,z);
c[i][z]+=s;
}
z++;
}
}
return *this;
}
Matrix & Matrix::operator ==(Matrix &A)
{int f=0;
for(int i=0; i<n; i++)
{for(int j=0; j<m; j++)
if(a[i][j]!=A.a[i][j]){ cout<<"\nне равны\n";f=1; break;}
if(f==1) break;}
if(f==0) cout<<"\nравни\n";
return *this;}
void Matrix::Transp()
{c=new double*[m];
for(int i=0;i<m;i++)
c[i]=new double[n];
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
c[j][i]=a[i][j];
for(int i=0;i<n;i++)
delete []a[i];
delete []a;
a=new double*[m];
for(int i=0;i<m;i++)
a[i]=new double[n];
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
a[i][j]=c[i][j];
Matrix::n=m;
Matrix::m=n;
}
;}
void main()
{ Matrix a,b,c;
int x,y,z,p;
cin >> x >>y >>z >>p;
a.Matrix(x, y);
b.Matrix(z, p);
c=a+b;

system("pause"); }
Вот мои наработки, помогите пожалуйста довести до ума.
 
R

rrrFer

Гость
#7
Можно ли получить помощь по данной задаче? Пожалуйста.
конечно можно, пиши конкретный вопрос.

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

Отформатирован код жестко, читать трудно - расставь отступы и переноси фигурные скобки нормально.

то ты пишешь фигурную скобку на отдельной строке:
Код:
Matrix & Matrix::operator *(Matrix &A)
{
double s=0;
то начинаешь на той же строке писать код:
Код:
Matrix::~Matrix()
{for(int i=0;i<n;i++)
аналогично с закрывающими скобками:
Код:
{for(int i=0;i<n;i++)
delete []a[i];
delete []a;};
вынеси реализацию методов из класса, очень трудно прочитать интерфейс, я не всматривался поэтому, но подозреваю что где-то течет память.
 
K

koss

Гость
#8
Вот, немного отформатировал:
C++:
#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;

//-------------------class;
class matrix{
public:
int i,j,n,m,**mat,**mat1;
int get_rc(int x, int y);
int init(int n,int m);
matrix operator=(const matrix &A);
matrix operator+(matrix &A);
matrix operator==(matrix &A);
matrix operator-(matrix &A);
matrix operator*(matrix &A);
matrix(const matrix &Copy);
void transp();
void show_mat(){
for(i=0; i<n; i++){
for(j=0; j<m; j++){
cout << setw(4) << mat[i][j];}
cout << endl;}};
}; 
//-------------------functions;


int matrix::init(int n, int m){
mat=new int*[n];
for (int i=0; i<n; i++){
mat[i]=new int[m];
for (int j=0; j<m; j++)
cin >>mat [i][j];}}


int matrix::get_rc(int x, int y){
n = x;
m = y;}

matrix matrix::operator=(const matrix &A){
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
mat[i][j]=A.mat[i][j];
return *this;}


matrix matrix::operator+(matrix &A){
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
mat[i][j]=mat[i][j]+A.mat[i][j];
return *this;}

matrix matrix::operator-(matrix &A){
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
mat[i][j]=mat[i][j]-A.mat[i][j];
return *this;}

matrix::matrix(const matrix &Copy){
mat=new int*[n];
for (int i=0; i<n; i++)
mat[i]=new int[m];
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
mat[i][j]=Copy.mat[i][j];
}

matrix matrix::operator*(matrix &A){
int s=0;
for(int i=0;i<n;i++){
int z=0;
while(z<A.m){
mat[i][z]=0;
for(int j=0;j<m;j++){
mat[i][z]+=s;}
z++;}}
return *this;}

matrix matrix::operator ==(matrix &A){
int f=0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++)
if(mat[i][j]!=A.mat[i][j]){ cout<<"\nÌàòðèöû íå ðàâíû\n";f=1; break;}
if(f==1) break;}
if(f==0) cout<<"\nÌàòðèöû ðàâíû\n";
return *this;}


void matrix::transp(){
mat1=new int*[m];
for(int i=0;i<m;i++)
mat1[i]=new int[n];

for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
mat1[j][i]=mat[i][j];

for(int i=0;i<n;i++)
delete []mat[i];
delete []mat;

mat=new int*[m];
for(int i=0;i<m;i++)
mat[i]=new int[n];

for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
mat[i][j]=mat1[i][j];};}



//--------------------main

int main(){		 
int x,y,z,p;
matrix obj1,obj2,obj3;

cout << "vvedit rozmiri matric : ";
cin >>x >> y >> z >> p;
cout << "vvedit elementy matrici : \n";
obj1.init(x , y);
obj2.init(z , p);
obj3=obj1+obj2;
obj3.show_mat();
obj3=obj1*obj2;
obj3.show_mat();
obj1==obj2;
obj1.transp();
obj1.show_mat();

system("pause");
return 0;}
Не могли бы вы доделать этот код до работоспособного состояния или хотя бы подсказать что как сделать и в чем ошибка? Буду очень благодарен за помощь в этом вопросе, а то я уже совсем запутался, да и сроки сдачи поджимают, буду очень благодарен.
 
R

rrrFer

Гость
#9
Вот, немного отформатировал:
Код:
	for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
mat[i][j]=mat1[i][j];};}
плохо отформатировал, ужасно, читать стало еще труднее. Установи нетбинс, там есть штуки для автоматического форматирования кода.

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

Whatka

Well-Known Member
09.10.2011
428
4
24
Минск
#10
я бегло просмотрел код вот замечания

конструкторы сделай(зачем функция инит?)

зачем поля класса i,j я не знаю. где ты их используешь?

функция транспонирования вообще страх(пишется в 2 цикла на самом деле)
,а у тебя ещё для неё и массив указателей отдельныйкак поле класса

реализуй методы класса в отдельном файле(а можно и весь класс)