Problema matrice che copia sempre gli stessi valori

di il
5 risposte

Problema matrice che copia sempre gli stessi valori

Ciao a tutti, ho provato a scrivere un programma che calcolasse il prodotto tra due matrici, con richiesta all'utente di specificare le dimensioni delle matrici e con il controllo della correttezza delle dimensioni inserite. Il problema è che dopo l'inserimento dei valori delle matrici, il programma mi stampa solo l'ultima riga delle matrici, utilizzandola anche per tutte le altre righe. Ad esempio se inserisco una matrice di due righe, mi copia i valori della seconda riga anche nella prima e non riesco a capire quale sia il problema. Aggiungo che sono autodidatta quindi perdonatemi se sono un poco ''rudimentale''
 #include <stdio.h>
#include <math.h>

/* Modificare il programma che calcola il prodotto tra due matrici bidimensionali in modo che sia
l'utente a scegliere le dimensioni degli array. Il programma deve verificare la correttezza delle dimensioni inserite */

int main(){

int p=0, k=0, s=0, z=0, i=0, j=0, c=0;
int mat1[p][k], mat2[s][z], pmat[p][z];

/* Richiesta all'utente delle dimensioni degli array */
do { printf("Inserisci righe prima matrice: ");
scanf("%d", &p);
printf("Inserisci colonne prima matrice: ");
scanf("%d", &k);
printf("Inserisci righe seconda matrice: ");
scanf("%d", &s);
printf("Inserisci colonne seconda matrice: ");
scanf("%d", &z);
if((k!=s))
    printf("I valori inseriti non sono corretti. Inserire nuovamente i valori delle matrici \n");
}
while((k!=s));

printf("Valori inseriti correttamente\n");

printf("\n");

/* Caricamento matrice 1 */
for(i=0; i<p; i++){
    for(j=0; j<k; j++){
        printf("Inserisci valore matrice 1, riga %d, colonna %d: ", i, j);
        scanf("%d", &mat1[i][j]);}

}

/* Caricamento matrice 2 */
for(i=0; i<s; i++){
    for(j=0; j<z; j++){
        printf("Inserisci valore matrice 2, riga %d, colonna %d: ", i, j);
        scanf("%d", &mat2[i][j]);
    }
}

/* Calcolo prodotto matrici */
for(i=0; i<p; i++){
    for(j=0; j<z; j++){
        pmat[i][j]=0;
        for(c=0; c<k; c++){
            pmat[i][j]=pmat[i][j] + mat1[i][c]*mat2[c][j];
        }
    }
}

/* Visualizzazione matrice 1 */
printf("MATRICE N.1: \n");
for(i=0; i<p; i++){
    printf("\n");
    for(j=0; j<k; j++){
        printf("%d ", mat1[i][j]);
    }
}
printf("\n");

/* Visualizzazione matrice 2 */
printf("MATRICE N.2: \n");
for(i=0; i<s; i++){
    printf("\n");
    for(j=0; j<z; j++){
        printf("%d ", mat2[i][j]);
    }
}
printf("\n");

/* Visualizzazione matrice prodotto */
printf("MATRICE PRODOTTO: \n");
for(i=0; i<p; i++){
    printf("\n");
    for(j=0; j<z; j++){
        printf("%d ", pmat[i][j]);
    }
}

return 0;

}

5 Risposte

  • Re: Problema matrice che copia sempre gli stessi valori

    Alcune considerazioni:
    - la libreria math non serve;
    - per questioni di maggior chiarezza e leggibilità ti consiglio di scrivere codice in modo indentato, di rispettare la spaziatura, di dare alle variabili nomi significativi (nel caso specifico al posto di p, q, s, z avresti potuto usare r1, c1, r2, c2), di scrivere una sola istruzione per riga e di racchiudere sempre il corpo (anche se costituito da una sola riga di codice) di un'istruzione di controllo (if, for, while, ...) all'interno di parentesi graffe;
    - allo scopo di non avere un codice tanto ridondante potresti prevedere delle funzioni (se sai cosa sono) che si occupino dell'inserimento e della stampa di una matrice.

    Piccola parentesi... gli array statici sono array la cui dimensione è determinata in fase di compilazione, quindi la loro dimensione deve essere costituita da un'espressione costante e non da una variabile. Questo significa che quelli che tu utilizzi non sono array statici, ma VLA (variable-length array), la cui dimensione è determinata in fase di esecuzione e quindi la loro dimensione sarà costituita da una variabile. Il C++ non supporta i VLA, invece il C (C99) sì... premesso che per il tuo programma non dovresti avere problemi con i VLA, va detto che in ogni caso ci sono pro e contro nel loro utilizzo, se ti interessa l'argomento fai qualche ricerca su google.

    Detto questo il problema è qui:
    int p=0;
    int q=0;
    int mat[p][q];
    Stai creando una matrice di 0 righe e 0 colonne. Forse la riga "int mat[p][q]" va messa altrove.
  • Re: Problema matrice che copia sempre gli stessi valori

    Nippolo ha scritto:


    Alcune considerazioni:
    - la libreria math non serve;
    - per questioni di maggior chiarezza e leggibilità ti consiglio di scrivere codice in modo indentato, di rispettare la spaziatura, di dare alle variabili nomi significativi (nel caso specifico al posto di p, q, s, z avresti potuto usare r1, c1, r2, c2), di scrivere una sola istruzione per riga e di racchiudere sempre il corpo (anche se costituito da una sola riga di codice) di un'istruzione di controllo (if, for, while, ...) all'interno di parentesi graffe;
    - allo scopo di non avere un codice tanto ridondante potresti prevedere delle funzioni (se sai cosa sono) che si occupino dell'inserimento e della stampa di una matrice.

    Piccola parentesi... gli array statici sono array la cui dimensione è determinata in fase di compilazione, quindi la loro dimensione deve essere costituita da un'espressione costante e non da una variabile. Questo significa che quelli che tu utilizzi non sono array statici, ma VLA (variable-length array), la cui dimensione è determinata in fase di esecuzione e quindi la loro dimensione sarà costituita da una variabile. Il C++ non supporta i VLA, invece il C (C99) sì... premesso che per il tuo programma non dovresti avere problemi con i VLA, va detto che in ogni caso ci sono pro e contro nel loro utilizzo, se ti interessa l'argomento fai qualche ricerca su google.

    Detto questo il problema è qui:
    int p=0;
    int q=0;
    int mat[p][q];
    Stai creando una matrice di 0 righe e 0 colonne. Forse la riga "int mat[p][q]" va messa altrove.
    Intanto grazie per le considerazioni, sei il primo in assoluto che mi corregge un esercizio, terrò a mente i tuoi consigli
    Pare comunque che si sia risolto il problema, ho usato delle costanti per dichiarare le dimensioni delle matrici e poi ho usato le variabili solo nel resto del programma e funziona, spero di aver interpretato bene ciò che hai detto. Per funzioni intendi quelle esterne al main? Ho visto qualcosa in merito su internet ma non le ho ancora mai usate... Grazie ancora comunque
  • Re: Problema matrice che copia sempre gli stessi valori

    Comunque avevo scritto un programma identico 5 topic più sotto, in risposta ad un ragazzo che aveva chiesto lo stesso esercizio.. vaa beh
  • Re: Problema matrice che copia sempre gli stessi valori

    Intanto grazie per le considerazioni, sei il primo in assoluto che mi corregge un esercizio, terrò a mente i tuoi consigli
    Pare comunque che si sia risolto il problema, ho usato delle costanti per dichiarare le dimensioni delle matrici e poi ho usato le variabili solo nel resto del programma e funziona, spero di aver interpretato bene ciò che hai detto. Per funzioni intendi quelle esterne al main? Ho visto qualcosa in merito su internet ma non le ho ancora mai usate... Grazie ancora comunque
    Di niente!
    Se ho capito bene alla fine hai risolto utilizzando degli array statici. Se volevi continuare ad usare i VLA bastava dichiarare le matrici dopo aver inserito i valori delle righe e delle colonne da tastiera.
    Comunque avevo scritto un programma identico 5 topic più sotto, in risposta ad un ragazzo che aveva chiesto lo stesso esercizio.. vaa beh
    Complimenti, hai colto in pieno lo spirito del forum!
  • Re: Problema matrice che copia sempre gli stessi valori

    brugne92 ha scritto:


    Comunque avevo scritto un programma identico 5 topic più sotto, in risposta ad un ragazzo che aveva chiesto lo stesso esercizio.. vaa beh
    Pardon, sono nuovissima (era il mio primo post) e non mi oriento ancora bene, la prossima volta controllerò meglio Grazie
Devi accedere o registrarti per scrivere nel forum
5 risposte