problem macierz

0

Witam. Mam problem i to spory. Na zaliczenie programowania musze napisac projekt:
Macierze
Klasa reprezentująca dwuwymiarowe macierze (nad liczbami rzeczywistymi). Klasa powinna zawierać metody umożliwiające wczytanie i wydrukowanie obiektów oraz realizację podstawowych działań na macierzach takich jak: dodawanie, odejmowanie, mnożenie (uwaga na zgodność wymiarów). Dodatkowym atutem projektu będzie dostępność bardziej zaawansowanych operacji, np. eliminacja Gaussa, szukanie macierzy odwrotnej, itp.

O programowaniu mam bardzo male pojecie jednak musze to zrobic. Jak na razie nie chce zaczynac od klas, poniewaz nie moge poradzic sb z wypelnieniem macierzy. Umiem jedynie zrobic tylko to:

#include <iostream>
#include <cstdio>

using namespace std;

int lm,rx,ry,**tab;
int main()
{
   cout << "Podaj ilosc wierszy:";
   cin >> ry;
   tab=new int *[ry];
   cout << "Podaj ilosc kolumn:";
   cin >> rx;

   for(int i=0; i<ry; i++)
   {
      tab[i]= new int [rx];

      for(int x=0; x<rx; x++)
      {
         tab[i][x]= 1;
         cout << tab[i][x] << " ";
      }
      cout << endl;
   }
   return (0);
}

gdzie tab[i][x]= 1; po prostu wpisuje jaka ma byc liczba. I moje pyt jak mam zrobic aby program zapytal o liczby pozniej je zapamietal i wypisal.

0

zrobilem juz jakas czesc tylko sa tu bledy
Mnożenie wychodzi tylko wtedy, gdy jedna z macierzy jest kwadratowa, oraz gdy 2 macierz ma najwyżej o jedną kolumnę więcej, tzn. mnoży np macierze 2x2 X 2x3, a np. 2x2 X 2x4 już nie.
Wyznacznik jest funkcją, która jest w klasie macierz_k. Problem jest taki, że wyznacznik moge policzyć tylko o takich wymiarach, jakie miala pierwsza macierz którą mnożyłem. A to kod

#include <iostream>
#include <conio.h>
#include <stdio.h>

using namespace std;

class macierz2d
{

    int w;
    int k;

public:

    void wyswietl (int w, int k, double **tab);
    void wyswietl2(int w, int k, double **M);
    void usun(int w, int k, double **tab);
    void wprowadz(int w, int k, double **tab);
    void mnozenie(int w, int k, double **A, double **T, double **C);
    void transponowanie(int w, int k, double **C, double **M);
};

class macierz_k : public macierz2d
{
    int w;
    int k;

public:

    void wyznacznik(double **t, int w, int k);

};

void macierz2d::wyswietl(int w, int k, double **tab)

{
    for (int i=0; i<w; i++)
    {
        for (int j=0; j<k; j++)
        {
            cout <<""<< tab[i][j] << " " ;
        }
        cout << "\n" << endl;
    }
}

void macierz2d::wyswietl2(int w, int k, double **M)

{
    for (int i=0; i<k; i++)
    {
        for (int j=0; j<w; j++)
        {
            cout <<""<< M[j][i] << " " ;
        }
        cout << "\n" << endl;
    }
}

void macierz2d::usun(int w, int k, double **tab)

{
    for (int i=0; i<w; i++)
        delete [] tab[i];
    delete [] tab;
}

void macierz2d::wprowadz(int w, int k, double **tab)

{
    for(int i=0; i<w; i++)
    {
        cout << "Wiersz " << 1+i << ": " << endl;
        for(int j=0; j<k; j++)
        {
            cin >> tab[i][j];
        }
    }
}

void macierz2d::mnozenie(int w, int k, double **A, double **T, double **C)

{
    for(int i = 0; i < w; i++)
        for(int j = 0; j < k; j++)
            C[i][j] = 0;
    for(int i = 0; i < w; i++)
        for(int j = 0; j < k; j++)
            for(int p=0; p<k; p++)
                for(int z=0 ; z<w ; z++)
                    C[i][j]=C[i][j] + A[i][p] * T[z][j];
}

void macierz2d::transponowanie(int w, int k, double **C, double **M)
{
    for(int i=0 ; i<w; i++)
        for(int j=0; j<k; j++)
            M[j][i]=C[i][j];
}

void macierz_k::wyznacznik(double **t, int w, int k)
{
    double det= 0;
    double p=1;
    if(k==1)
    {
        det = t[0][0];
    }
    else
    {
        if(k==2)
        {
            det = (t[0][0]*t[1][1] - t[1][0]*t[0][1]);
            cout << "wyznacznik: " << det << endl;
        }
        else
        {
            if(k==3)
            {
                det = (t[0][0]*t[1][1]*t[2][2] + t[0][1]*t[1][2]*t[2][0] + t[0][2]*t[1][0]*t[2][1] - t[0][2]*t[1][1]*t[2][0] - t[0][0]*t[1][2]*t[2][1] - t[0][1]*t[1][0]*t[2][2]);
                cout << "wyznacznik: " << det << endl;
            }
        }

        for(int i=0; i<w; i++)
            delete[] t[i] ;
        delete[] t;
    }
}
int main()

{
    macierz2d matrix1, matrix2, wynik;
    macierz_k wyzn;
    int w;
    int k;
    int i;
    int j;
    double **A;
    double **T;
    double **C;
    double **M;
    double **t;
    double **tab;
    cout << "\t\tWartosci wprowadzasz wierszami, zaczynajac od lewej strony!!\n" << endl;
    cout << "\nIle wierszy ma byc? ";
    cin >> w;
    cout << "Ile kolumn ma byc? ";
    cin >> k;

    A=new double*[w];
    for (int i=0; i<w; i++)
        A[i]=new double [k];
    for (int i=0; i<w; i++)
        for (int j=0; j<k; j++)
            A[i][j] = i + j;

    cout << "Macierz nr 1" << endl;
    matrix1.wprowadz(w,k,A);
    cout << "Macierz nr 1" << endl;
    matrix1.wyswietl(w,k,A);

    cout << "\nIle wierszy ma byc? ";
    cin >> w;
    cout << "Ile kolumn ma byc? ";
    cin >> k;

    T=new double*[w];
    for (int i=0; i<w; i++)
        T[i]=new double [k];
    for (int i=0; i<w; i++)
        for (int j=0; j<k; j++)
            T[i][j] = i + j;

    cout << "Macierz nr 2" << endl;
    matrix2.wprowadz(w,k,T);
    cout << "Macierz nr 2" << endl;
    matrix2.wyswietl(w,k,T);

    C=new double*[w];
    for (int i=0; i<w; i++)
        C[i]=new double [k];
    for (int i=0; i<w; i++)
        for (int j=0; j<k; j++)
            C[i][j] = i + j;

    wynik.mnozenie(w,k,A,T,C);
    cout << "Wynik Mnozenia:" << endl;
    wynik.wyswietl(w,k,C);

    M=new double*[k];
    for (int j=0; j<k; j++)
        M[j]=new double [w];
    for (int j=0; j<k; j++)
        for (int i=0; i<w; i++)
            M[j][i] = j + i;

    wynik.transponowanie(w,k,C,M);
    cout << "Wynik Transponowania:" << endl;
    wynik.wyswietl2(w,k,C);

    cout << "\nIle wierszy ma byc? ";
    cin >> w;
    cout << "Ile kolumn ma byc? ";
    cin >> k;

    t=new double*[w];
    for (int i=0; i<w; i++)
        t[i]=new double [k];
    for (int i=0; i<w; i++)
        for (int j=0; j<k; j++)
            t[i][j] = i + j;

    cout << "Macierz wyzn" << endl;
    wyzn.wprowadz(w,k,t);
    cout << "Macierz wyzn:" << endl;
    wyzn.wyswietl(w,k,t);
    wyzn.wyznacznik(t,w,k);
    matrix1.usun(w,k,A);
    matrix2.usun(w,k,T);
    wynik.usun(w,k,C);
    _getch();
    return 0;
}
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1