Problem z działaniem programu (macierz odwrotna)

0

Witam, poniższy program był prezentowany w prezentacji na zajęciach. Wedle owej prezentacji program działał, natomiast gdy chciałem go przepisać aby sprawdzić samemu jak działa to wyskoczyły błędy które umieszczę pod kodem. W skrócie dotyczą one funkcji 'wyswietl' oraz bledy 'ISO C++'. Z góry dziękuję za wszelką pomoc.

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>

using namespace std;

int n;

double **stworz()
{
    int n;
    double **macierz=new double *[n];
    for(int i=0;i<n;i++)
    {
        macierz[i]=new double[n*n];
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            macierz[i][j]=0;
        }
    }
    return macierz;
}

void wyswietl(double**&macierz,int *n)
{
    for(int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++)
        {
            cout<<setprecision(2)<<macierz[i][j]<<'\t';
        }
        cout<<endl;
    }
}
void kasuj(double **&macierz)
{
    for(int i=0;i<n;i++)
    {
        delete[]macierz[i];
    }
    delete[]macierz;
}

void wypelnij(double **&macierz)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cout<<"Podaj wartosci macierzy [" <<i+1 <<","<<j+1<<"]: ";
            cin>>macierz[i][j];
        }
    }
}

void wypelnij_losowo(double **&macierz)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            macierz[i][j]=rand()%20-10;
        }
    }
}
double det_2stopien(double **&macierz)
{
    double det;
    det = macierz[0][0]*macierz[1][1] - macierz[0][1]*macierz[1][0];
    return det;
}

double **transponowanie(double **&macierz)
{
    double **t=stworz();
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            t[i][j] = macierz[j][i];
        }
    }
    return t;
}

double **dopelnienia(double **&macierz)
{
    double **d=stworz();
    d[0][0]=macierz[1][1];
    d[0][1]=macierz[1][0];
    d[1][0]=macierz[0][1];
    d[1][1]=macierz[0][0];
    return d;
}

double **odwrotna_wzor(double **&macierz)
{
    double det = det_2stopien(macierz);
    cout<<endl;
    cout<<"Wyznacznik macierzy docelowej: "<<det<<endl;
    double **wynik=stworz();
    cout<<endl;
    wynik=dopelnienia(macierz);
    cout<<"DOPELNIENIA"<<endl;
    wyswietl(wynik);
    cout<<endl;
    wynik=transponowanie(wynik);
    cout<<"TRANSPONOWANA DOPELNIENIA"<<endl;
    wyswietl(wynik);
    cout<<endl;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            wynik[i][j]/=det;
        }

    }
    return wynik;

}

void jednostkowa(double **&macierz)
{
    for(int i=0;i<n;i++)
    {
        for(int j=n;j<n*n;j++)
        {
            macierz[i][j]=0;
        }
    }
    for(int i=0;i<n;i++)
    {
        macierz[i][i+2]-1;
    }
}

void metoda_gaussa(double **&macierz)
{
    double c,d;
    for(int i=0;i<n;i++)
    {
        c = macierz[i][i];
        macierz[i][i]=macierz[i][i]-1;
        for(int j=i+1;j<n*n;j++)
        {
            if(c==0)
            {
                d=0;
            }
            else
            {
                d = macierz[i][j]/c;
            }
            for(int k=0;k<n;k++)
            {
                macierz[k][j]=macierz[k][j]-d*macierz[k][i];
            }
        }
    }
}

void wyswietlodwrotna(double **&macierz)
{
    for(int i=0;i<n;i++)
    {
        for(int j=n;j<n*n;j++)
        {
            cout<<setprecision(2)<<macierz[i][j]<<'\t';
        }
        cout<<endl;
    }
}

int main()
{
    int n;
    srand(time(NULL));
    int wybor_macierzy;
    int wybor_sposobu;
    double **macierz=stworz();

    cout <<"wybierz sposob tworzenia macierzy:\n1.wypisz z klawy \n2.liczby pseudokodowe"<<endl;
    cin>>wybor_macierzy;
    cout<<endl;
    switch(wybor_macierzy)
    {
    case 1:
        {
            wypelnij(macierz);
            cout<<endl;
            cout<<"Twoja macierz: "<<endl;
            wyswietl(macierz);
            cout<<endl;
            if(det_2stopien(macierz)==0)
            {
                cout<<"Wyznacznik Twojej macierzy wynosi 0. Nie mozna policzyc macierzy odwrotnej."<<endl;

                exit(0);
            }
            break;
            cout<<endl;
        }
    case 2:
        {
            wypelnij_losowo(macierz);
            cout<<"Twoja macierz: " << endl;
            wyswietl(macierz);
                        if(det_2stopien(macierz)==0)
            {
                cout<<"Wyznacznik Twojej macierzy wynosi 0. Nie mozna policzyc macierzy odwrotnej."<<endl;

                exit(0);
            }
            break;
            cout<<endl;
        }
    default:
        {
            cout<<"Niepoprawny wybor!"<<endl;
            exit(0);
            break;
        }
    }

    cout << "\nWybierz sposob liczeia macierzy odwrotnej:\n1.Macierz odwrotna ze wzoru\2."<<endl;
    cin>>wybor_sposobu;
    switch(wybor_sposobu)
    {
    case 1:
        {
            double **odwrotna=odwrotna_wzor(macierz);
            cout<<"MACIERZ ODWROTNA: "<<endl;
            wyswietl(odwrotna);
            break;
        }
    case 2:
        {
            jednostkowa(macierz);
            metoda_gaussa(macierz);
            cout<<"MACIERZ ODWROTNA: "<<endl;
            wyswietlodwrotna(macierz);
            break;
        }
    default:
        {
            cout<<"Niepoprawny wybor!"<<endl;
            exit(0);
            break;
        }
    }
    return 0;
}

Błędy które napotkałem:

obraz_2021-03-12_123924.png

2

@Pawelczak: Masz bardzo wyraźnie napisane wszystkie błędy, ciężko pomóc bardziej, niż zrobił to kompilator.

4

Mam nadzieję, że ten program był pokazywany jako antyprzykład? Kod jest błędny, przestarzały, ale nawet w latach 90 byłby okropny. Np. (zbędna) non-const referencja do wskaźnika na wskaźnik? WTF.

W samej funkcji brakuje dereferencji (a raczej poprawnych praktyk kodowania) wskaźnika n. Ale ogólnie ten kod nadaje się tylko do nauki jak nie kodować w C++.

PS: niżej wywołujesz funkcję ze złą liczbą argumentów.

Polecam próbę zrozumienia komunikatów kompilatora, one naprawdę dużo mówią jak się skupisz na znaczących słowach, a nie "warning" czy "error".

2

Eliminacja Gaussa, którą jakiś czas temu napisałem w C
https://wandbox.org/permlink/ktsqg27KDrddnreY

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