Program się zawiesza. Proszę o pomoc!

0

Witam, napisałem taki program, który ma liczyć wyznacznik za pomocą metody Gaussa.

Problem w tym, że czasami się zawiesza jak wpisuje różne rozmiary macierzy np. raz 3, raz 9, 5 itd, a następnie wypełniam macierz losowo..

nie wiem dlaczego tak się dzieje mógłby ktoś mi pomóc w rozwiązaniu tego problemu?

#include <iostream>
#include <cstdlib>
using namespace std;

void wypelnij_sam(int **t, int m)
{//funkcja wypełniająca macierz t i t2 elementami podanymi przez użytkownika z klawiatury.
    for(int i=0;i<m;i++)
    for(int j=0;j<m;j++)
    {
        cout<<"Podaj element ["<<i<<"] ["<<j<<"] macierzy:";
        cin>>t[i][j];
    }
}

void wypelnij_losowo(int **t, int m)
{
    int liczba;
    srand(time(0));
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<m;j++)
        {
            liczba=(rand() % 7) - 3;
            t[i][j]=liczba;
        }
    }
}

void wyswietl_macierz(int **t, int m)
{//funkcja wyświetlająca macierze t i t2 po wypełnieniu ich przez użytkownika.
    for(int i=0;i<m;i++)
    {
        cout<<endl;
        for(int j=0;j<m;j++)
        {
            cout.width(3);
            cout<<t[i][j]<<" ";
        }
    }
    cout<<endl<<endl;
}

double wyznacznik_macierzy(int **t, int **t2, int m, double det)
{//funkcja licząca wyznacznik z pierwszej macierzy.

    for(int i=0;i<m;i++)
        for(int j=0;j<m;j++)
            t2[i][j]=t[i][j];

    for (int k=0; k<m; k++)
    {
        for (int i=k+1; i<m; i++)
            for (int j=m-1; j>=k; j--)
                t2[i][j] = t2[i][j] - t2[i][k]*t2[k][j]/t2[k][k];
    }  

    cout<<"Macierz schodkowa: \n";
    for(int i=0;i<m;i++)
    {
        cout<<endl;
        for(int j=0;j<m;j++)
        {
            cout.width(3);
            cout<<t2[i][j]<<" ";
        }
    }

    for(int i=0;i<m;i++)
        det = det * t2[i][i];

    cout<<endl<<"Wyznacznik macierzy wynosi  "<<det<<endl;
}

int main()
{
    int m;
    double det=1;
    cout<<"Podaj rozmiar macierzy: ";
    cin>>m;
    if(m<=0)
    cout<<"\nMacierz nie moze byc ujemnych rozmiarow!!!\n\n";
    int **t=new int*[m];
       for(int i=0;i<m;i++)
               t[i]=new int[m];
    int **t2=new int*[m];
       for(int i=0;i<m;i++)
               t2[i]=new int[m];

    int wybor;
    cout<<"1. Wypelnij macierz elementami losowymi z przedzialu <-3,3>\n";
    cout<<"2. Wypelnij macierz elementami z klawiatury";
    cin>>wybor;
    switch(wybor)
    {
        case 1:
            wypelnij_losowo(t,m);
            break;
        case 2: 
            wypelnij_sam(t,m);
            break;
        default: 
            break;
    }
    wyswietl_macierz(t,m);
    wyznacznik_macierzy(t,t2,m,det);
    for(int i=0;i<m;i++)
    {
        delete [] t[i];
        delete [] t2[i];
    }
    delete [] t;
    delete [] t2;
    system("Pause");
}
0

Wiesz, po dokładnie którym momencie się zawiesza? I czasami? Tzn. kiedy?

0

Po wpisaniu rozmiaru tablicy i wypełnieniu jej losowymi elementami, czasami ponieważ raz wszystko zadziała, wypełni tablicę i obliczy wyznacznik, a czasami się zawiesza szczególnie wtedy gdy odpalę 2 raz program i chce inny rozmiar tablicy podać.

0

Mi wywala błąd:

Unhandled exception at 0x00101a21 in Test.exe: 0xC0000094: Integer division by zero.

Błąd wskazuje w lini:

for (int k=0; k<m; k++)
{
for (int i=k+1; i<m; i++)
for (int j=m-1; j>=k; j--)

t2[i][j] = t2[i][j] - t2[i][k]*t2[k][j]/t2[k][k];

}

0

A jak zrobić żeby losował liczby z przedziału <-3,3> bez 0? żeby nie było przypadku dzielenia przez 0.

0

Losujesz z przedziału i sprawdzasz czy równa się 0, jak tak to powtórz losowanie aż do skutku, tak najprościej.

0
liczba=(rand() % 7) - 3;
            if(liczba!=0)
            t[i][j]=liczba;
            else break; 

zrobiłem coś takiego, ale teraz mi jakieś kosmiczne liczby w niektórych polach macierzy losuje.

0
            do
            {
            liczba=(rand() % 7) - 3;
            if(liczba!=0)
            t[i][j]=liczba;
            }while(liczba==0); 

Dodałem jeszcze pętle while i losuje bez 0, ale dalej się zawiesza.. ;/

0
liczba=rand()%6-3;
liczba+=(liczba>=0);

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