Salve,
ho scritto il seguente programma per implementare il metodo di eliminazione di Gauss su matrici con un procedimento iterativo senza ricorrere alla ricorsione.
Viene compilato correttamente ma mi restituisce il codice 139, ossia Segmentation fault (core dumped).
Qualcuno di voi riesce a capire il motivo?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define MAX 20
typedef float tMatrice[MAX][MAX];
int validazione_input_intero ( int );
int conta_gradini ( tMatrice, int, int );
void stampa_matrice ( tMatrice, int, int );
void eliminazione_gauss ( tMatrice, int, int);
int main()
{
int i, j, m, n, p, v;
double t;
tMatrice M;
printf ("\nInserisci il numero di righe della matrice: ");
m = validazione_input_intero (v);
printf ("\nInserisci il numero di colonne della matrice: ");
n = validazione_input_intero (v);
printf("\nInserisci i valori della matrice da sx a dx in ordine di riga:\n");
for (i=0; i<m; i++) {
for (j=0; j<n; j++) {
scanf("%f", &M[i][j]) ; }
printf ("\n"); }
stampa_matrice (M, m, n);
srand(time(NULL));
clock_t start=clock();
eliminazione_gauss ( M, m, n );
clock_t end=clock();
t=((double)(end-start)) / CLOCKS_PER_SEC;
printf("\nTempo di esecuzione = %f secondi\n", t) ;
return 0;
}
int validazione_input_intero ( int v )
{
int c;
do
{ c=scanf("%d", &v);
if (c==0)
{
scanf ("%*[^\n]");
printf ("Attenzione: input non valido. Inserire input valido: ");
}
} while (c==0);
if (v<=0)
{ v=-v;
printf ("%d", v);
}
else
{ if(v>MAX)
{ printf ("%d", v);
printf(" viene scalato a %d", MAX);
v=MAX;
}
else
{ printf("%d", v); }
}
return v;
}
int conta_gradini ( tMatrice M, int m, int n)
{
int i, j = 0;
int zeri = 0, k = 0;
int zericolonnapreced;
for ( i = m-1; i >= 0; i--) {
if ( M[i][j] == 0) { zeri++; }
else {
i = -1;
zericolonnapreced = zeri;
zeri = 0; } }
for (j = 1; j < n; j++) {
for (i = m-1; i >= 0; i--) {
if (M[i][j] == 0) { zeri++; }
else {
i = -1;
if ( zeri < zericolonnapreced ) { k++; }
zericolonnapreced = zeri;
zeri = 0; } } }
return k;
}
void stampa_matrice ( tMatrice M, int m, int n )
{
int i, j;
for ( i=0; i<m; i++ ) {
for ( j=0; j<n; j++ ) {
printf ("%.2f\t", M[i][j]); }
printf ("\n"); }
}
void eliminazione_gauss ( tMatrice M, int m, int n )
{
int i, j, r, s, k, iterazione = 0;
tMatrice T;
k = conta_gradini ( M, m, n );
printf ("\ngradini = %d", k);
printf ("\n");
if ( m >= n ) { r = n - 1; }
else { r = m - 1; }
while ( k <= r ) {
for ( j = iterazione; j < n; j++ ) {
s = 0;
for ( i = iterazione; i < m; i++ ) {
if ( (int)M[i][j] == 0 ) { s = i+1; }
else {
i = m;
j = n; } } }
printf ("\ns = %d", s);
printf ("\n");
for ( i = 0; i < MAX; i++ ) {
for ( j = 0; j < MAX; j++ ) {
T[i][j] = 0; } }
if ( (int)M[iterazione][iterazione] == 0 ) {
for ( j = iterazione; j < n; j++ ) {
T[s][j] = M[s][j];
M[s][j] = M[iterazione][j];
M[iterazione][j] = T[s][j]; } }
else {
for ( i = iterazione+1; i < m; i++ ) {
for ( j = iterazione; j < n; j++ ) {
T[i][j] = M[i][j] - M[iterazione][j] * ( M[i][iterazione] / M[iterazione][iterazione] ) ; } }
for ( i = iterazione+1; i < m; i++ ) {
for ( j = iterazione; j < n; j++ ) {
M[i][j] = T[i][j]; } } }
stampa_matrice (M, m, n);
iterazione++;
k = conta_gradini ( M, m, n );
printf ("\ngradini = %d", k);
printf ("\n"); }
}