abramodj Inviato 7 Febbraio 2008 Segnala Condividi Inviato 7 Febbraio 2008 Ciao a tutti! All'università sto seguendo un corso di C, e mi sono appassionato alla cosa. Così ho iniziato a scrivere un programmino in grado di sommare, moltiplicare ed elevare a potenza matrici quadrate di qualsiasi ordine. Fin qui tutto bene! Ora però vorrei aggiungere il calcolo del determinante. L'idea è semplice: una funzione ricorsiva sfruttando gli sviluppi di Laplace. In pratica ci sono 2 funzioni: una funzione "determinante" ed una "riduci". La matrice A passata alla funzione "determinante" viene sviluppta tramite un ciclo for sulla prima riga. Per ogni elemento di essa la matrice viene mandata alla funzione "riduci" che elimina la prima riga e la i-esima colonna (sembra complicato ma se conoscete gli sviluppi di Laplace non c'è nulla di diverso!). Ora ogni matrice ridotta viene passata di nuovo a "determinante" (ecco la ricorsione). Il mio problema è che la matrice ridotta quando viene passata alla funz "determinante" si distrugge, non è più lei. Ovviamente il determinante finale risulta errato. Vengono aggiunti numeri tipo 8045 o numeri giganti che non centrano nulla con la vera matrice. Daltraparte se si prova a calcolare il det di una seconda matrice B, dopo aver calcolato il det di A, la matrice B passata a "determinante" viene letta dalla funzione in maniera corretta, per poi degenerare allo stesso modo di A. Non so più come fare... mi date una mano? Vi prego sto impazzendo!!! Ecco la parte di codice relativa al calcolo del determinante (per comodità viene inserita in automatico due matrice identiche 3X3 di cui vengono calcolati i determinanti (che dovrebbero essere 1)): #include <stdio.h> #include<math.h> int n=3; int m=3; int i, j, l, k, z, r, e, x, c; char y; void print (int [n][n], char, int, int); int determinante(int mat[n][n], int); void riduci(int maz[n][n], int n, int i, int ridotta[n-1][n-1]); main() { //Creiamo 2 matrici A e B identiche di ordine 3: int A[n][n]; for (i=0; i<n; i++) { for (j=0; j<n; j++) { if (i==j) A[i][j] = 1; else A[i][j] = 0; } } int B[m][m]; for (i=0; i<m; i++) { for (j=0; j<m; j++) { if (i==j) B[i][j] = 1; else B[i][j] = 0; } } print(A, 'A', n, 1); print(B, 'B', m, 0); printf ("\n\nPremi INVIO per continuare..."); scanf("%c", &y); block: { if (getchar() == '\n') { system("clear"); } else goto block; } // E calcoliamone il determinante.... (magari!) int detA = 0; detA = determinante(A, n); printf("Il determinante di A è %d\n\n\n\nPassiamo a B:\n\n\n", detA); int detB = determinante(B, m); printf("Il determinante di B è %d\n\n\n\n", detB); } // Funzione print che stampa una matrice, nessun problema qui.... void print(int C[n][n], char x, int d, int c) { if (c==1) { system("clear"); } printf("La matrice %c è:\n\n", x); for (i=0; i<d; i++) { for (k=0; k<d; k++) { printf(" %d ", C[i][k]); } printf("\n"); } ; printf("\n"); } // Funzione determinante, la bastarda infame int determinante(int mat[n][n], int n) { int i; int ris=0; //************************************************* //Ho inserito questo printf per evidenziare in output come la matrice venga modificata senza apparente motivo printf("La matrice mat ora è:\n\n", n, n); for (j=0; j<n; j++) { for (k=0; k<n; k++) { printf(" %d ", mat[j][k]); } printf("\n"); } printf("\n\n"); //************************************************** if(n > 2) { for(i=0; i<n; i++) { int temp [n-1][n-1]; riduci(mat, n, i, temp); //************************************ // Altro printf in più che ci fa notare come la matrice restituita dalla funzione "riduci" sia corretta printf("i = %d. La matrice temp è:\n\n", i); for (j=0; j<n-1; j++) { for (k=0; k<n-1; k++) { printf("% 5d", temp[j][k]); } printf("\n"); } printf("\n\n"); //************************************ ris += ( 1 - 2 * (i % 2)) * mat[0][i] * determinante(temp, n-1); // Ecco Laplace } } //Se la matrice è 2X2 viene utilizzata la formula det = ad-bc else { ris = ((mat[0][0]) * (mat[1][1])) - ((mat[0][1]) * (mat[1][0])); printf("determinante 2X2 = %d\n\n", ris); } return(ris); } // Funzione che elimina riga zero e colonna i (questa sembra funzionare correttamente) void riduci(maz, n, i, ridotta) int n, i; int maz[n][n]; int ridotta[n-1][n-1]; { int j, l; for(j=0; j<n-1; j++) { for(l=0; l<n-1; l++) { if (l<i) { ridotta[j][l] = maz[j+1][l]; } else { ridotta[j][l] = maz[j+1][l+1]; } } } } Ecco l'output del programma: La matrice A è: 1 0 0 0 1 0 0 0 1 La matrice B è: 1 0 0 0 1 0 0 0 1 Premi INVIO per continuare... La matrice mat ora è: 1 0 0 0 1 0 0 0 1 i = 0. La matrice temp è: 1 0 0 1 La matrice mat ora è: 1 0 1 8129 determinante 2X2 = 8129 i = 1. La matrice temp è: 0 0 0 1 La matrice mat ora è: 0 0 1 8129 determinante 2X2 = 0 i = 2. La matrice temp è: 0 1 0 0 La matrice mat ora è: 0 1 0 8129 determinante 2X2 = 0 Il determinante di A è 8129 Passiamo a B: La matrice mat ora è: 1 0 0 0 1 0 0 0 1 i = 0. La matrice temp è: 1 0 0 1 La matrice mat ora è: 1 0 1 8129 determinante 2X2 = 8129 i = 1. La matrice temp è: 0 0 0 1 La matrice mat ora è: 0 0 1 8129 determinante 2X2 = 0 i = 2. La matrice temp è: 0 1 0 0 La matrice mat ora è: 0 1 0 8129 determinante 2X2 = 0 Il determinante di B è 8129 Share share share! Share your experiences Link al commento Condividi su altri siti Altre opzioni di condivisione...
abramodj Inviato 7 Febbraio 2008 Autore Segnala Condividi Inviato 7 Febbraio 2008 Risolto finalmente!!!! Bastava modificare la dichiarazione della funzione determinante (non chiedetemi perchè!!!) in questo modo: int determinante(mat, n) int n; int mat[n][n]; Prima era (questa NON funziona): int determinante(int mat[n][n], int n) Share share share! Share your experiences Link al commento Condividi su altri siti Altre opzioni di condivisione...
mutaforme Inviato 7 Febbraio 2008 Segnala Condividi Inviato 7 Febbraio 2008 Giuro che era un quarto d'ora che stavo guardando il codice senza capire...e tu già avevi postato la risposta Non mi ricordo poi che significa la dichiarazione dopo le tonde (in genere non la uso), ma di sicuro il nome del vettore (o matrice) è l'indirizzo del vettore, non una sua copia. Magari era questo che dava problemi. Pancho was a bandit boy, his horse was fast as polished steel He wore his gun outside his pants ----- Il Principe diventa Re, nella notte di Madrid. Link al commento Condividi su altri siti Altre opzioni di condivisione...
abramodj Inviato 7 Febbraio 2008 Autore Segnala Condividi Inviato 7 Febbraio 2008 Guarda non ho ben capito dov'era l'errore in realtà .... :-) Share share share! Share your experiences Link al commento Condividi su altri siti Altre opzioni di condivisione...
abramodj Inviato 7 Febbraio 2008 Autore Segnala Condividi Inviato 7 Febbraio 2008 Ma se ora io volessi creare una veste grafica x questo programmino? Sarebbe molto lungo portarlo in cocoa? Share share share! Share your experiences Link al commento Condividi su altri siti Altre opzioni di condivisione...
Messaggi raccomandati
Archiviato
Questa discussione è archiviata e chiusa a future risposte.