[C] Prodotto tra matrici
Buonasera, sto creando un programma che chiede all'utente di inserire due matrici e ne calcoli il prodotto.
Fin quando inserisco le matrici tutto ok, ma ho qualche problema sul punto in cui calcola il prodotto perché il risultato (qualunque siano le matrici) è sempre la matrice nulla. Qualcuno può dirmi dove sbaglio?
Non ho mai programmato fino ad ora e lo sto facendo perchè ho l'esame di informatica quindi ho qualche difficolta.. Ecco il mio codice
#include
#include
#define maxrighe 100
#define maxcolonne 100
int main () {
int i, j, righea, colonnea;
int r, c, righeb, colonneb;
int a[maxrighe][maxcolonne];
int b[maxrighe][maxcolonne];
int pr[maxrighe][maxcolonne];
int m, t, h;
printf ("Inserisci il numero di righe e di colonne di A\n");
scanf ("%i%i", &righea, &colonnea);
printf ("Inserisci il numero di righe e di colonne di B\n");
scanf ("%i%i", &righeb, &colonneb);
if (righea != colonneb) {
printf ("Errore: Il numero di righe di A deve essere uguale al numero di colonne di B\n");
}
else {
printf ("Inserisci gli elementi della matrice A\n");
for ( i = 0; i < righea; i++) {
for (j = 0; j < colonnea; j++){
scanf ("%i", &a[j]);
}}
printf ("La matrice A e':\n");
for (i = 0; i < righea; i++){
for (j = 0; j < colonnea; j++) {
printf ("%2i", a[j]);
}
printf ("\n");
}
printf (" Inserisci gli elementi della matrice B\n");
for ( r = 0; r < righeb; r++){
for ( c = 0; c < colonneb; c++) {
scanf ("%i", &b[r][c]);
}}
printf ("La matrice B e':\n");
for (r = 0; r < righeb; r++){
for (c = 0; c < colonneb; c++) {
printf ("%2i", b[r][c]);
}
printf ("\n");
}
printf ("Il prodotto di A e B e' C = \n");
pr[maxrighe][maxcolonne] = pr[righea][colonneb];
for ( m = 0; m < righea; m++)
for ( t = 0; t < colonneb; t++) {
a[m][t] = 0;
};
for ( m = 0; m < righea; m++)
for ( t = 0; t < colonneb; t++)
for ( h = 0; h < colonnea; h++) {
pr[m][t] += a[j] * b[r][c];
}
for (m = 0; m < righea; m++) {
for ( t = 0; t < colonneb; t++) {
printf ("%2i", pr[m][t]);
}
printf ("\n");
}
}
return 0;
}
Fin quando inserisco le matrici tutto ok, ma ho qualche problema sul punto in cui calcola il prodotto perché il risultato (qualunque siano le matrici) è sempre la matrice nulla. Qualcuno può dirmi dove sbaglio?
Non ho mai programmato fino ad ora e lo sto facendo perchè ho l'esame di informatica quindi ho qualche difficolta.. Ecco il mio codice
#include
#include
#define maxrighe 100
#define maxcolonne 100
int main () {
int i, j, righea, colonnea;
int r, c, righeb, colonneb;
int a[maxrighe][maxcolonne];
int b[maxrighe][maxcolonne];
int pr[maxrighe][maxcolonne];
int m, t, h;
printf ("Inserisci il numero di righe e di colonne di A\n");
scanf ("%i%i", &righea, &colonnea);
printf ("Inserisci il numero di righe e di colonne di B\n");
scanf ("%i%i", &righeb, &colonneb);
if (righea != colonneb) {
printf ("Errore: Il numero di righe di A deve essere uguale al numero di colonne di B\n");
}
else {
printf ("Inserisci gli elementi della matrice A\n");
for ( i = 0; i < righea; i++) {
for (j = 0; j < colonnea; j++){
scanf ("%i", &a[j]);
}}
printf ("La matrice A e':\n");
for (i = 0; i < righea; i++){
for (j = 0; j < colonnea; j++) {
printf ("%2i", a[j]);
}
printf ("\n");
}
printf (" Inserisci gli elementi della matrice B\n");
for ( r = 0; r < righeb; r++){
for ( c = 0; c < colonneb; c++) {
scanf ("%i", &b[r][c]);
}}
printf ("La matrice B e':\n");
for (r = 0; r < righeb; r++){
for (c = 0; c < colonneb; c++) {
printf ("%2i", b[r][c]);
}
printf ("\n");
}
printf ("Il prodotto di A e B e' C = \n");
pr[maxrighe][maxcolonne] = pr[righea][colonneb];
for ( m = 0; m < righea; m++)
for ( t = 0; t < colonneb; t++) {
a[m][t] = 0;
};
for ( m = 0; m < righea; m++)
for ( t = 0; t < colonneb; t++)
for ( h = 0; h < colonnea; h++) {
pr[m][t] += a[j] * b[r][c];
}
for (m = 0; m < righea; m++) {
for ( t = 0; t < colonneb; t++) {
printf ("%2i", pr[m][t]);
}
printf ("\n");
}
}
return 0;
}
Risposte
Immagino che nei cicli precedenti al calcolo del prodotto volessi inizializzare pr e non settare tutti i valori della matrice a a zero.
si.. ma ho sbagliato qualcosa
Le righe sbagliate sono fondamentalmente due e riguardano il calcolo della matrice $ C = AB $, in particolare è sbagliata l'inizializazione ( come già detto da apatriarca) e il calcolo di pr[m][t]
Ecco una possibile soluzione:
Ecco una possibile soluzione:
for ( m = 0; m < righea; m++){ for ( t = 0; t < colonneb; t++){ pr[m][t] = 0; for ( h = 0; h < colonnea; h++) { pr[m][t] += a[m][h] * b[h][t]; } } }
Poi non dovrebbe essere:
Tra l'altro è possibile fare una cosa del genere per inizializzare a 0 la matrice prodotto:
if(colonne_a != righe_b) { printf ("Errore: Il numero di righe di A deve essere uguale al numero di colonne di B\n"); }
Tra l'altro è possibile fare una cosa del genere per inizializzare a 0 la matrice prodotto:
int pr[MAX_RIGHE][MAX_COLONNE] = { 0 };
Per niccoset : Grazie adesso funziona bene! 
Per Obidream: nel codice avevo scritto
if (righea != colonneb) {
printf ("Errore: Il numero di righe di A deve essere uguale al numero di colonne di B\n");
}
Grazie per l'alternativa che mi hai proposto comunque

Per Obidream: nel codice avevo scritto
if (righea != colonneb) {
printf ("Errore: Il numero di righe di A deve essere uguale al numero di colonne di B\n");
}
Grazie per l'alternativa che mi hai proposto comunque
printf("Il prodotto di A e B e' C = \n");
Dalla precedente riga di codice presumo che C=A*B, giusto?
Se è così e se stiamo parlando di prodotto riga-colonna, allora quanto detto da Obidream (mi riferisco alla condizione dell'if e non al messaggio della printf che andrebbe invece corretto) non è un'alternativa, ma il modo corretto di impostare il programma. Il prodotto riga-colonna tra due matrici non è commutativo e affinché l'operazione A*B sia possibile, le colonne di A devono essere uguali alle righe di B.
Cosa stai cercando di fare con la seguente riga di codice?
pr[maxrighe][maxcolonne] = pr[righea][colonneb];
Un paio di considerazioni:
- stai usando molte più variabili di quelle effettivamente necessarie per svolgere l'esercizio;
- una volta definite maxrighe e maxcolonne dovresti controllare che i valori inseriti dall'utente siano <= 100.
Per niccoset : Grazie adesso funziona bene!
In base alle considerazioni appena fatte ho i miei dubbi al riguardo, magari posta il codice aggiornato.