Ciao!
Alcune osservazioni:
- innanzitutto al fine di rendere il codice più chiaro e leggibile ti consiglio di rispettare l'indentazione e la spaziatura;
- sempre per una questione di leggibilità (e non solo), ti consiglio (quando possibile) di dichiarare le variabili del ciclo direttamente all'interno del for;
- evita di utilizzare variabili globali e quando lo fai evita di utilizzare gli stessi identificatori anche per altre variabili locali;
- perché includi la libreria math.h?
- perché utilizzi la funzione srand()?
- sinceramente non capisco l'utilità di calcolare il tempo di esecuzione della funzione eliminazione_gauss(), ma se proprio lo vuoi fare devi togliere le printf() dalla funzione, altrimenti la misurazione risulta falsata;
- relativamente alla funzione validazione_input_intero() ti faccio notare che input come 4a e 0 risultano validi. Inoltre a cosa serve il parametro v che gli passi?
- la parte sulla PRECISIONE la toglierei proprio e mi limiterei ad un semplice
if(m[i][j] != 0)
- per quanto riguarda l'impostazione logica dell'algoritmo di Gauss mi sono un po' perso, ma penso che il tutto possa essere implementato in modo più semplice.
Sulla base dei suddetti suggerimenti io farei qualcosa del genere:
#include <stdio.h>
#define MAX 20
typedef float tMatrice[MAX][MAX];
void stampa_matrice(tMatrice m, unsigned int rig, unsigned int col)
{
for(unsigned int i = 0; i < rig; ++i)
{
for(unsigned int j = 0; j < col; ++j)
{
printf("%.2f\t", m[i][j]);
}
printf("\n");
}
printf("\n");
}
void scambia_righe(tMatrice m, unsigned int col, unsigned int i_1, unsigned int i_2)
{
for(unsigned int j = 0; j < col; ++j)
{
float temp = m[i_1][j];
m[i_1][j] = m[i_2][j];
m[i_2][j] = temp;
}
}
void eliminazione_gauss(tMatrice m, unsigned int rig, unsigned int col, unsigned int *pivot)
{
unsigned int k = 0;
unsigned int min = col;
if(rig < col)
{
min = rig;
}
for(unsigned int j = 0; j < col && k < min; ++j)
{
if(!m[k][j])
{
for(unsigned int i = k + 1; i < rig; ++i)
{
if(m[i][j])
{
scambia_righe(m, col, k, i);
break;
}
}
}
if(m[k][j])
{
for(unsigned int i = k + 1; i < rig; ++i)
{
if(m[i][j])
{
float coeff = m[i][j] / m[k][j];
for(unsigned int j_2 = j; j_2 < col; ++j_2)
{
m[i][j_2] -= coeff * m[k][j_2];
}
}
}
++k;
}
}
*pivot = k;
}
int main()
{
tMatrice m = {{0, 0, 4, 7},
{8, 1, 9, 0},
{3, 5, 7, 5}};
unsigned int rig = 3;
unsigned int col = 4;
unsigned int pivot;
stampa_matrice(m, rig, col);
eliminazione_gauss(m, rig, col, &pivot);
stampa_matrice(m, rig, col);
printf("RANGO = %d\n", pivot);
return 0;
}
Il programma dovrebbe ridurre a scalini qualsiasi tipo di matrice, sia quadrata che rettangolare.
In ogni caso lo sforzo che hai fatto è sicuramente da apprezzare, d'altronde sbatterci la testa risulta fondamentale per assimilare determinati meccanismi!
Se hai qualche dubbio chiedi pure.
P.S.
Per curiosità, cosa intendi con "matrici a L"?