Prodotto matrici, C

di il
4 risposte

Prodotto matrici, C

Ciao a tutti! Devo svolgere un esercizio che richiede il prodotto tra due matrici, allocandole in maniera dinamica. Ho scritto il codice in questo modo, ma mi dà un [build error] ed un errore di sintassi all'ultima linea in fase di compilazione. Come mai? Qualcuno può aiutarmi?
#include <stdio.h>
#include <stdlib.h>

void acquisizionematrice(int *matrice, int righe, int colonne); /*prototipo funzione*/
void stampamatrice(int *matrice, int righe, int colonne); /*prototipo funzione*/
void prodottomatrici(int *matrice1, int *matrice2, int *matriceprodotto, int righe, int colrig, int colonne); /*prototipo funzione*/

int main()
{
    int *A; /*puntatore alla matrice A*/
    int *B; /*puntatore alla matrice B*/
    int *C; /*puntatore alla matrice C prodotto di A e B*/
    int n; /*righe di A*/
    int p; /*colonne di A*/
    int q; /*righe di B*/
    int m; /*colonne di B*/
    
    printf("Inserisci il numero di righe e di colonne della matrice A.\n");
    scanf("%d", &n);
    scanf("%d", &p);
    
    printf("Inserisci il numero di righe e di colonne della matrice B.\n");
    scanf("%d", &q);
    scanf("%d", &m);
    
    if (p!=q){  /*Controllo eseguibilità del prodotto*/
    printf("Il prodotto righe per colonne tra A e B non è eseguibile.\n");  } 
    else {
         A=(int*)malloc(n*p*sizeof(int));
         acquisizionematrice(A, n, p); /*chiamata alla funzione che acquisisce la matrice*/
         printf("La matrice A è:\n");
         stampamatrice(A, n, p); /*chiamata alla funzione che stampa la matrice*/
         
         B=(int*)malloc(q*m*sizeof(int));
         acquisizionematrice(B, q, m); /*chiamata alla funzione che acquisisce la matrice*/
         printf("La matrice B è:\n");
         stampamatrice(B, q, m); /*chiamata alla funzione che stampa la matrice*/
         
         C=(int*)malloc(n*m*sizeof(int));
         printf("La matrice prodotto tra A e B è:\n");
         prodottomatrici(A, B, C, n, p, m); /*Chiamata alla funzione che effettua il prodotto righe per colonne tra A e B*/
 
  system("PAUSE");	
  return 0;
} /*Fine main*/

/*definizione funzione*/
void acquisizionematrice(int *matrice, int righe, int colonne); 
{
     int righe;
     int colonne;
     int *matrice;
     int i;
     int j;
     
     matrice=(int*)malloc(righe*colonne*sizeof(int));
     
     {for(i=0;i<righe;i++)
     {for(j=0;j<colonne;j++){
                             printf("Inserisci l'elemento di posto %d,%d della matrice\n", righe, colonne);
                             scanf("%d", &matrice[i*righe+j]); }
     }
     }
}

/*definizione funzione*/
void stampamatrice(int *matrice, int righe, int colonne);
{  
     int righe;
     int colonne;
     int *matrice;
     int i;
     int j;
     
     matrice=(int*)malloc(righe*colonne*sizeof(int));
     
     {for(i=0;i<righe;i++)
     {for(j=0;j<colonne;j++){
                             printf("%d", &matrice[i*righe+j]); }
     }
     }
}

/*definizione funzione*/
void prodottomatrici(int *matrice1, int *matrice2, int *matriceprodotto, int righe, int colrig, int colonne); 
{ 
     int *matrice1;
     int *matrice2;
     int *matriceprodotto;
     int righe;
     int colrig;
     int colonne;
     int i;
     int j;
     int k;
     
     matrice1=(int*)malloc(righe*colrig*sizeof(int));
     matrice2=(int*)malloc(colrig*colonne*sizeof(int));
     matriceprodotto=(int*)malloc(righe*colonne*sizeof(int));
     
     {for(i=0;i<righe;i++)
     {for(j=0;j<colonne;j++)
     {for(k=0;k<colrig;k++)
     { matriceprodotto[i*righe+j] += matrice1[i*righe+k]*matrice2[k*colrig+j];
                             }
                             }
     }
     }
     stampamatrice(matriceprodotto, righe, colonne);}



4 Risposte

  • Re: Prodotto matrici, C

    Ovvero in quale riga?
  • Re: Prodotto matrici, C

    A=(int*)malloc(n*p*sizeof(int));
    matrice=(int*)malloc(righe*colonne*sizeof(int));
    Ogni volta che allochi nuovo spazio x la matrice (che l'hai rappresentato come vettore) perdi ciò che hai allocato in precedenza
  • Re: Prodotto matrici, C

    skynet ha scritto:


    Ogni volta che allochi nuovo spazio x la matrice (che l'hai rappresentato come vettore) perdi ciò che hai allocato in precedenza
    Quindi come devo modificarlo per fa sì che non succeda? Sono alle prime armi e non me la cavo ancora bene con il C
  • Re: Prodotto matrici, C

    Ciao,
    ho corretto gran parte del codice. C'è comunque un errore nella funzione che si occupa di fare il prodotto vero e proprio tra le matrici. Quello lo lascio a te...
    
    #include <stdio.h>
    #include <stdlib.h>
    
    void acquisizionematrice(int *matrice, int righe, int colonne); /*prototipo funzione*/
    void stampamatrice(int *matrice, int righe, int colonne); /*prototipo funzione*/
    void prodottomatrici(int *matrice1, int *matrice2, int *matriceprodotto, int righe, int colrig, int colonne); /*prototipo funzione*/
    
    int main()
    {
        int *A; /*puntatore alla matrice A*/
        int *B; /*puntatore alla matrice B*/
        int *C; /*puntatore alla matrice C prodotto di A e B*/
        int n; /*righe di A*/
        int p; /*colonne di A*/
        int q; /*righe di B*/
        int m; /*colonne di B*/
    
        printf("Inserisci il numero di righe e di colonne della matrice A.\n");
        scanf("%d", &n);
        scanf("%d", &p);
    
        printf("Inserisci il numero di righe e di colonne della matrice B.\n");
        scanf("%d", &q);
        scanf("%d", &m);
    
        if (p!=q)   /*Controllo eseguibilità del prodotto*/
        {
            printf("Il prodotto righe per colonne tra A e B non è eseguibile.\n");
        }
        else
        {
            A=(int*)malloc(n*p*sizeof(int));
            acquisizionematrice(A, n, p); /*chiamata alla funzione che acquisisce la matrice*/
            printf("La matrice A e':\n");
            stampamatrice(A, n, p); /*chiamata alla funzione che stampa la matrice*/
    
            B=(int*)malloc(q*m*sizeof(int));
            acquisizionematrice(B, q, m); /*chiamata alla funzione che acquisisce la matrice*/
            printf("La matrice B e':\n");
            stampamatrice(B, q, m); /*chiamata alla funzione che stampa la matrice*/
    
            C=(int*)malloc(n*m*sizeof(int));
            printf("La matrice prodotto tra A e B e':\n");
            prodottomatrici(A, B, C, n, p, m); /*Chiamata alla funzione che effettua il prodotto righe per colonne tra A e B*/
        }
    
        system("PAUSE");
        return 0;
    } /*Fine main*/
    
    /*definizione funzione*/
    void acquisizionematrice(int *matrice, int righe, int colonne)
    {
        int i;
        int j;
    
        {
            for(i=0; i<righe; i++)
            {
                for(j=0; j<colonne; j++)
                {
                    printf("Inserisci l'elemento di posto %d,%d della matrice\n", i, j);
                    scanf("%d", &matrice[i*righe+j]);
                }
            }
        }
    }
    
    /*definizione funzione*/
    void stampamatrice(int *matrice, int righe, int colonne)
    {
        int i;
        int j;
    
        {
            for(i=0; i<righe; i++)
            {
                for(j=0; j<colonne; j++)
                {
                    printf("%d  ", matrice[i*righe+j]);
                }
                printf("\n");
            }
        }
    }
    
    /*definizione funzione*/
    /* SBAGLIATA */
    void prodottomatrici(int *matrice1, int *matrice2, int *matriceprodotto, int righe, int colrig, int colonne)
    {
        int i;
        int j;
        int k;
    
        {
            for(i=0; i<righe; i++)
            {
                for(j=0; j<colonne; j++)
                {
                    for(k=0; k<colrig; k++)
                    {
                        matriceprodotto[i*righe+j] += matrice1[i*righe+k]*matrice2[k*colrig+j];
                    }
                }
            }
        }
        stampamatrice(matriceprodotto, righe, colonne);
    }
    
    P.S. Ci sono anche parecchie parentesi graffe inutili ma quelle le ho lasciate... Non fanno danni ma sono comunque inutili e possono complicare la lettura del codice.
Devi accedere o registrarti per scrivere nel forum
4 risposte