Problema matrice [C]
Ciao...ho scritto questo programma in cui la funzione scrivi_matrice_B deve sommare ogni riga della matrice A che le viene passata. Se la somma è compresa nell'intervallo t, -t, allora la riga della matrice viene ricopiata nella matrice A.
Il programma funziona con la prima riga della matrice, ma mi sono accorta che nel passaggio della matrice A alla funzione viene passata correttamente solo la prima riga della matrice, le restanti invece vengono passate con valori nulli o altissimi.
per testare il programma ho usato la matrice
2 0 3 6
3 -5 7 -2
-4 1 0 5
grazie!
Il programma funziona con la prima riga della matrice, ma mi sono accorta che nel passaggio della matrice A alla funzione viene passata correttamente solo la prima riga della matrice, le restanti invece vengono passate con valori nulli o altissimi.
per testare il programma ho usato la matrice
2 0 3 6
3 -5 7 -2
-4 1 0 5
grazie!
#include <stdio.h> #include <stdlib.h> #define MAXDIM 100 int scrivi_matrice_B (int matriceA[][MAXDIM], int n, int m, int t, int matriceB[][MAXDIM]); int main(int argc, char *argv[]) { int n; int m; int t; int i, j; int numero_righeB; if (argc != 4) { printf ("Uso: somma_matrice <nr_righe> <nr_colonne> <valore_assoluto_intervallo>\n"); exit (EXIT_FAILURE); } n = atoi(argv[1]); m = atoi (argv[2]); t = atoi (argv[3]); int matriceA[n][m]; int matriceB[n][m]; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { printf ("inizializza matrice[%d][%d]: \n", i, j); scanf ("%d", &matriceA[i][j]); } } for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { printf ("%d ", matriceA[i][j]); } printf ("\n"); } numero_righeB = scrivi_matrice_B (matriceA, n, m, t, matriceB); printf ("Il numero totale di righe di B è: %d\n", numero_righeB); for (i = 0; i < numero_righeB; i++) { for (j = 0; j < m; j++) { printf ("%d ", matriceB[i][j]); } printf ("\n"); } return EXIT_SUCCESS; } int scrivi_matrice_B (int matriceA[][MAXDIM], int n, int m, int t, int matriceB[][MAXDIM]) { int i, j; int k; int somma; int nr_righe; nr_righe = 0; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { printf ("%d ", matriceA[i][j]); } printf ("\n"); } for (i = 0; i < n; i++) { somma = 0; for (j = 0; j < m; j++) { somma = somma + matriceA[i][j]; } printf ("la somma della riga %d è %d\n", i, somma); if (somma <= t && somma >= (t * (-1))) { for (k = 0; k < m; k++) { matriceB[nr_righe][k] = matriceA[i][k]; } nr_righe++; } } return nr_righe; }
Risposte
La definizione di matriceA e matriceB sono possibili solo con lo standard c99 oppure usando le estensioni di GCC. L'uso dei variabile lenght array in modo inconsapevole è una pratica discutibile. Sarebbe meglio usassi una normale allocazione statica o una allocazione dinamica esplicita.
Inoltre dimostri di non aver capito minimamente il modo in cui gli array e i puntatori sono gestiti in c. La funzione si aspetta una matrice con 100 colonne ed interpreta ciò che gli arriva come se ne avesse 100. Nella pratica il tuo ciclo for legge elementi diversi da quelli che immagini (prima riga a parte).
Inoltre dimostri di non aver capito minimamente il modo in cui gli array e i puntatori sono gestiti in c. La funzione si aspetta una matrice con 100 colonne ed interpreta ciò che gli arriva come se ne avesse 100. Nella pratica il tuo ciclo for legge elementi diversi da quelli che immagini (prima riga a parte).
"vict85":Quindi come posso definire le matrici in C??
La definizione di matriceA e matriceB sono possibili solo con lo standard c99 oppure usando le estensioni di GCC.
"vict85":
La funzione si aspetta una matrice con 100 colonne ed interpreta ciò che gli arriva come se ne avesse 100
Come faccio a dire alla funzione di aspettarsi una matrice con m colonne invece che con MAXDIM colonne?
Ecco il testo dell'esercizio:
Si scriva una funzione in linguaggio C che riceva come argomenti una matrice di interi A, le sue dimensioni n e m, una
matrice di interi B (che conterrà il risultato dell'operazione e la cui dimensione è pari a quella di A) ed un intero t. La
funzione deve riempire la matrice B con le righe della matrice A per le quali la somma degli elementi è compresa
tra -t e t. La funzione, inoltre, dovrà restituire un intero corrispondente al numero di righe di A che sono state copiate in
B.
Per la funzione è sufficiente usare un puntatore a int e accedere agli elementi usando il fatto che il C scrive i vettori multidimensionali in row-major http://en.wikipedia.org/wiki/Row-major_order
Per quanto riguarda l'allocazione della matrice, usa malloc oppure alloca staticamente una matrice MAXDIM x MAXDIM.
Per quanto riguarda l'allocazione della matrice, usa malloc oppure alloca staticamente una matrice MAXDIM x MAXDIM.