C++ problem z czasem i nie tylko

0

Witam Serdecznie
Piszę do was ponieważ mam pewien problem ze zliczaniem czasu wykonania algorytmu wyliczania wyznacznika, mianowicie czas ten podawany jest w postaci 0 1 2 3 a chciałbym żeby był np 0.128s.
Drugi problem to rozmiar tablicy w której wyznaczany jest wyznacznik, macierz powyżej 5x5 wyświetla błąd w postaci Floating point expection chodź nie raz błąd ten pojawia się dopiero przy macierzy 10x10. Czym to jest spowodowane?

Zamieszczam kod:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <stdio.h>
using namespace std;

//Deklaracje funkcji
void utworz(int **&tab,int n); //tworzenie macierzy
void zeruj(int **&tab,int n); //zerowanie macierzy
void wypelnij(int **&tab,int n); //wypelnienie z klawiatury
void wypelnijrand(int **&tab,int n);//wypelnienie rand() od 1 do 5
void wyswietl(int **tab,int n); // wyswietlenie macierzy
void zwolnij(int **tab,int n); //zwolnienie pamieci
long double wyznacznik(int **&a,int**&b,int n); //obliczenie wyznacznika


//Główna funkcja
int main(){
	
	int w,n;
	int **a,**b;
	cout<<"*****Obliczanie wyznacznika****"<<endl;
	cout<<"Podaj czy macierz ma być wypełniona ręcznie czy losowo"<<endl;
	cout<<"1-recznie\n"<<"2-losowo"<<endl;
	cin>>w;
	switch(w)	
	{
		case 1:
		{
			srand(time(NULL));
			cout.setf(ios::fixed);
			double difference;
			time_t start, end;
			start=time(NULL);
			cout<<"Podaj rozmiar macierzy n x n"<<endl;
			cin>>n;
			utworz(a,n);
			utworz(b,n);
			zeruj(a,n);
			zeruj(b,n);
			wypelnij(a,n);
			cout<<"Wypełniona macierz :"<<endl;
			wyswietl(a,n);
			cout<<"Wyznacznik = "<<wyznacznik(a,b,n)<<endl;
			zwolnij(a,n);
			zwolnij(b,n);
			end=time(NULL);
			difference = (double)(end - start);
			cout<<"Czas wykonania algorytmu (wszystkie operacje) ="<<difference<<"s"<<endl;
			break;
		}
		case 2:
		{
			
			srand(time(NULL));
			cout.setf(ios::fixed);
			double difference;
			time_t start, end;
			start=time(NULL);
			cout<<"Podaj rozmiar macierzy n x n"<<endl;
			cin>>n;
			utworz(a,n);
			utworz(b,n);
			zeruj(a,n);
			zeruj(b,n);
			wypelnijrand(a,n);
			cout<<"Wypełniona macierz :"<<endl;
			wyswietl(a,n);
			cout<<"Wyznacznik = "<<wyznacznik(a,b,n)<<endl;
			zwolnij(a,n);
			zwolnij(b,n);
			end=time(NULL);
			difference = (double)(end - start);
			cout<<"Czas wykonania algorytmu (wszystkie operacje) ="<<difference<<"s"<<endl;
			
			break;
		}
		default:
		{
			cout<<"Podałeś złą operację uruchom ponownie program"<<endl;
			return -1;
		}
			
	}
return 0;
}

//Definicje funkcji
void utworz(int **&tab,int n)
{
	tab=new int * [n];
	for(int i=0;i<n;i++)
	{
		tab[i]=new int [n];
	}
}

void zeruj(int **&tab,int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			tab[i][j]=0;
		}
	}
}

void wypelnij(int **&tab,int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin>>tab[i][j];
		}
	}
}

void wypelnijrand(int **&tab,int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			tab[i][j]=rand()%5+1;
		}
	}
}


void wyswietl(int **tab,int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cout<<tab[i][j]<<" ";
		}
		cout<<endl;
	}
}

void zwolnij(int **tab,int n)
{
	for(int i=0;i<n;i++)
	{
		delete tab[i];
	}
	delete [] tab;
}

long double  wyznacznik(int** &a, int **&b, int n) 
{
	
	double wyz=a[0][0];
	for(int s=0;s<(n-1);s++)
		{
			for(int j=s+1;j<n;j++)
				{ 
					b[s][j]=a[s][j]/a[s][s];
		}
	for(int i=s+1;i<n;i++)
	{
		for(int j=s+1;j<n;j++)
		{
			 a[i][j]=a[i][j]-a[i][s]*b[s][j];
		}
	}
	wyz=wyz*a[s+1][s+1];
} 
return wyz;
}
 
0

Jeżeli chodzi o FPE to pewnie gdzieś dzielisz przez 0

0

Metoda eliminacji Gaussa to beznadziejny wybór dla liczb całkowitych! Nie mówiąc już o tym, że ludzie zapominają o możliwości natrafienia na zero.
Zdajesz sobie sprawę, że robisz dzielenie całkowite (z resztami), co w tym wypadku jest bezsensu.
Lepiej było zastosować metodę Laplace'a.

0

Dzięki za podpowiedzi z samym obliczaniem wyznacznika sobie już prawie poradziłem.
Niestety dalej mam problem z wyświetlaniem czasu w postaci np 0,123s zamiast 0s

0

Pomiar czasu powinieneś robić tak:

clock_t start = clock();
// Dlugo trwajaca operacja
// ...
clock_t stop = clock();
double time_diff = (stop - start) / static_cast<double>(CLOCKS_PER_SEC);

Taki pomiar jest raczej niedokładny. Żeby trochę to poprawić wykonuj "długo trwające operacje" w pętli np. 10000 razy i wyświetl średni czas iteracji.

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