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

Тема в разделе "C/C++/C#", создана пользователем artem94, 27 ноя 2012.

  1. artem94

    artem94 Гость

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    сколько платишь?
     
  3. artem94

    artem94 Гость

    сколько возьмёш за роботу???
     
  4. NikNik

    NikNik Гость

    Посмотри, может чем поможет
    #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;
    }
     
  5. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
  6. koss

    koss Гость

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

    Код (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"); }
    Вот мои наработки, помогите пожалуйста довести до ума.
     
  7. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    конечно можно, пиши конкретный вопрос.

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

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

    то ты пишешь фигурную скобку на отдельной строке:
    то начинаешь на той же строке писать код:
    аналогично с закрывающими скобками:
    вынеси реализацию методов из класса, очень трудно прочитать интерфейс, я не всматривался поэтому, но подозреваю что где-то течет память.
     
  8. koss

    koss Гость

    Вот, немного отформатировал:
    Код (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;}
    Не могли бы вы доделать этот код до работоспособного состояния или хотя бы подсказать что как сделать и в чем ошибка? Буду очень благодарен за помощь в этом вопросе, а то я уже совсем запутался, да и сроки сдачи поджимают, буду очень благодарен.
     
  9. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

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

    ты скажи что в нем неработает и почему ты считаешь что он неработоспособный, мы, может быть, скажем почему.
     
  10. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    я бегло просмотрел код вот замечания

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

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

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

    реализуй методы класса в отдельном файле(а можно и весь класс)
     
Загрузка...
Похожие Темы - Класс Матрица Действия
  1. swyatogor
    Ответов:
    0
    Просмотров:
    65
  2. Corexis
    Ответов:
    0
    Просмотров:
    74
  3. rrrFer
    Ответов:
    0
    Просмотров:
    131
  4. Sander
    Ответов:
    1
    Просмотров:
    510
  5. Искушенный
    Ответов:
    0
    Просмотров:
    432

Поделиться этой страницей