MEGA Funzioni di Matrici

di il
51 risposte

MEGA Funzioni di Matrici

Salve a tutti... Ho svolto questo esercizio e non funziona nulla. Queste funzioni mi stanno facendo impazzire Davvero non comprendo cosa sbaglio.

/*Scrivere un programma che utilizzando le funzioni che sono fornite effettui le
seguenti operazioni:
1) Inizializzazione e stampa di una matrice (m1)
2) Inizializzazione e stampa di una matrice (m2)
3) Calcola e visualizza a video i valori delle tracce delle due matrici
4) Traspone la matrice caratterizzata dalla traccia maggiore; nel caso le
tracce delle due matrici coincidano traspone entrambe le matrici. Nel caso
una matrice sia stata trasposta, deve essere visualizzata nuovamente a video
5) Calcola (in m3) la somma delle due matrici e ne effettua la stampa
6) Calcola (in m4) il prodotto di due matrici (m1 e m2) e ne effettua la stampa*/

#include <stdio.h>
#include <stdlib.h>
#define RIG 50
#define COL 50

/*Definizione dei prototipi*/
void matrice1 (int m1[][COL],int R,int C);
void matrice2 (int m2[][COL], int R, int C);
void leggi_matrice1 (int m1[][COL],int R, int C);
void leggi_matrice2 (int m2[][COL],int R, int C);
void trasposta_matrice (int m1[][COL],int m2[][COL],int R, int C);
void matrice3 (int m1[][COL],int m2[][COL], int R, int C);
void matrice4 (int m1[][COL],int m2[][COL], int R, int C);

int main() {
    int M[RIG][COL],M2[RIG][COL],M3[RIG][COL],M4[RIG][COL],M1T[RIG][COL],M2T[RIG][COL];R,C,i,j;
    
    do{
        printf("Inserire il numero di righe: ");
        scanf("%d",&R);
    }while((R>RIG) || (R<1));
    
    do{
        printf("Inserire il numero di colonne: ");
        scanf("%d",&C);
    }while((C>COL) || (C<1));
    
    printf("Visualizzare la prima matrice\n");
    void matrice1(M[RIG][COL],R,C);
    
    printf("Visualizzare la seconda matrice\n");
    void matrice2(M2[RIG][COL],R,C);
    
    printf("Visualizzare la matrice trasposta\n");
    void trasposta_matrice (int M1[RIG][COL],int M2[RIG][COL],int R, int C);
    
    printf("Visualizzare la somma delle due matrici\n");
    void matrice3(M[RIG][COL],M2[RIG][COL],R,C);
    
    printf("Visualizzare il prodotto delle due matrici\n");
    void matrice4(M[RIG][COL],M2[RIG][COL],R,C);
    
    return 0;
}

void matrice1 (int m1[][COL],int R,int C){
    int i,j;
    
    printf("Inserire i dati nella prima matrice \n");
    for(i=0;i<R;i++){
        for(j=0;j<C;j++){
            printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
            scanf("%d",&m1[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    
    for(i=0;i<R;i++){
        for(j=0;j<C;j++){
            printf("\t%d",m1[i][j]) ;
        }
    }
    
}

void matrice2 (int m2 [][],int R,int C){
    int i,j;
    
    printf("Inserire i dati nella seconda matrice \n");
    for(i=0;i<R;i++){
        for(j=0;j<C;j++){
            printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
            scanf("%d",&m2[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    
    for(i=0;i<R;i++){
        for(j=0;j<C;j++){
            printf("\t%d",m2[i][j]) ;
        }
    }

}

void leggi_matrice1 (int m1[][COL],int R, int C){
    int i,j;
    
    for( i=0 ; i<R ; i++ ){
        printf("Immettere la %d^ riga (separare ogni elemento con uno spazio): ", i+1);
        for( j=0 ; j<C ; j++ ){
            scanf("%d", &m1[i][j]);
        }            
    }
    
}

void leggi_matrice2 (int m2[][COL],int R, int C){
    int i,j;
    
    for( i=0 ; i<R ; i++ ){
        printf("Immettere la %d^ riga (separare ogni elemento con uno spazio): ", i+1);
        for( j=0 ; j<C ; j++ ){
            scanf("%d", &m2[i][j]);
        }            
    }
    
}

void trasposta_matrice (int m1[][COL],int m2[][COL],int R, int C){
    int i,j,m1t[RIG][COL],m2t[RIG][COL];
     
    if (m1[][COL]>m2[][COL]){
    printf("\nCalcoliamo la prima matrice trasposta \n");
 for (i=0;i<R;i++)
    for(j=0;j<C;j++) {
        m1t[j][i]=m1[i][j];
    }

 printf("\nStampiamo i dati della matrice \n");
 for (i=0;i<R;i++) {
    printf("\n");
    for(j=0;j<C;j++) 
        printf("\t%d", m1[i][j]);                
    }   

 printf("\nStampiamo i dati della matrice trasposta \n");
 for (i=0;i<R;i++) {
    printf("\n");
    for(j=0;j<C;j++) 
        printf("\t%d", m1t[j][i]);                
    }  
    
 else printf("\nCalcoliamo la seconda matrice trasposta \n");
 for (i=0;i<R;i++)
    for(j=0;j<C;j++) {
        m2t[j][i]=m2[i][j];
    }

 printf("\nStampiamo i dati della matrice \n");
 for (i=0;i<R;i++) {
    printf("\n");
    for(j=0;j<C;j++) 
        printf("\t%d", m2[i][j]);                
    }   

 printf("\nStampiamo i dati della matrice trasposta \n");
 for (i=0;i<R;i++) {
    printf("\n");
    for(j=0;j<C;j++) 
        printf("\t%d", m2t[j][i]);                
    }  
}
}

void matrice3 (int m1[][COL],int m2[][COL],int R, int C){
    int i,j,m3[RIG][COL];
    
    printf("Somma delle due matrici\n");
    for (i=0;i<R;i++) {
        for (j=0;j<C;j++){
            m3[i][j]=m1[i][j]+m2[i][j];
        }       
        }

 printf("\nStampiamo i dati della matrice somma\n");
 for (i=0;i<R;i++) {
    for(j=0;j<C;j++){
        printf("\t%d", m3[i][j]);                
    }
    printf("\n");
        }
}

void matrice4 (int m1[][COL],int m2[][COL],int R,int C){
    int i,j,m4[RIG][COL];
    
    printf("Prodotto delle due matrici\n");
    for (i=0;i<R;i++) {
        for (j=0;j<C;j++){
            m4[i][j]=m1[i][j]*m2[i][j];
        }       
        }

 printf("\nStampiamo i dati della matrice somma\n");
 for (i=0;i<R;i++) {
    for(j=0;j<C;j++){
        printf("\t%d", m4[i][j]);                
    }
    printf("\n");
        }
}

51 Risposte

  • Re: MEGA Funzioni di Matrici

    Ma non devi fare una funzione per ogni matrice ...

    Per inizializzare una matrice scrivi una funzione

    InizializzaMatrice( .... )

    e tra gli argomenti passa la matrice da inizializzare ... e così per la stampa, la lettura
  • Re: MEGA Funzioni di Matrici

    Ecco il codice
    #include <stdio.h>
    #include <stdlib.h>
    #define RIG 50
    #define COL 50
    
    /*Definizione dei prototipi*/
    void Inizializzazione_Matrice (int M[][COL],int R, int C);
    void Stampa_Matrice (int M[][COL],int R, int C);
    void leggi_matrice (int M[][COL],int R,int C);
    void trasposta_matrice (int M[][COL],int M2[][COL],int R,int C);
    void somma_matrici (int M[][COL],int M2[][COL],int R,int C);
    void prodotto_matrici (int M[][COL],int M2[][COL],int R,int C);
    
    int main (){
        int R,C;
        int M[RIG][COL],M2[RIG][COL];
        
          do{
            printf("Inserire il numero di righe: ");
            scanf("%d",&R);
        }while((R>RIG) || (R<1));
        
        do{
            printf("Inserire il numero di colonne: ");
            scanf("%d",&C);
        }while((C>COL) || (C<1));
        
        printf("Visualizzare la prima matrice\n");
        void Inizializzazione_Matrice(M[RIG][COL],R,C);
        void Stampa_Matrice (M[RIG][COL],R,C);
    
        printf("Visualizzare la seconda matrice\n");
        void Inizializzazione_Matrice(M2[RIG][COL],R,C);
        void Stampa_Matrice (M2[RIG][COL],R,C);
        
        printf("Calcolare e visualizzare a video i valori delle tracce delle due matrici\n");
        void leggi_matrice (M[RIG][COL],R,C);
        void leggi_matrice (M2[RIG][COL],R,C);
    
        printf("Visualizzare la matrice trasposta\n");
        void trasposta_matrice (M[RIG][COL],M2[RIG][COL],R,C);
        
        printf("Visualizzare la somma delle due matrici\n");
        void somma_matrici (M[RIG][COL],M2[RIG][COL],R,C);
        
        printf("Visualizzare il prodotto delle due matrici\n");
        void prodotto_matrici (M[RIG][COL],M2[RIG][COL],R,C);
    
    }
    
    void Inizializzazione_Matrice (int M[][COL],int R, int C){
        int i,j;
        
        for(i=0;i<R;i++){
            for(j=0;j<C;j++){
                printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
                scanf("%d",&M[i][j]);
            }
            printf("\n");
        }
        printf("\n");
    }
    
    void Stampa_Matrice (int M[][COL],int R, int C){
        int i,j;
        
            for(i=0;i<R;i++){
            for(j=0;j<C;j++){
                printf("\t%d",M[i][j]) ;
            }
        }
    }
    
    void trasposta_matrice (int M[][COL],int M2[][COL],int R,int C){
        int i,j,MT[RIG][COL],M2T[RIG][COL];
        
        if(M[][COL]>M2[][COL]){
            printf("\nCalcolare la prima matrice trasposta \n");
            for (i=0;i<R;i++){
                for(j=0;j<C;j++){
                    MT[j][i]=M[i][j];
                }
            }
            printf("\nStampare i dati della matrice \n");
            for(i=0;i<R;i++){
                for(j=0;j<C;j++){
                    printf("\t%d,M[i][j]");
                }
            }
            
            printf("\nStampare i dati della matrice trasposta\n");
            for(i=0;i<R;i++){
                printf("\n");
                for(j=0;j<C;j++){
                    printf("\t%d,MT[i][j]");
                }
            }
            else if (M[][COL]==M2[][COL]){
                printf("\nCalcolare la prima matrice trasposta \n");
            for (i=0;i<R;i++){
                for(j=0;j<C;j++){
                    MT[j][i]=M[i][j];
                }
            }
            printf("\nStampare i dati della matrice \n");
            for(i=0;i<R;i++){
                for(j=0;j<C;j++){
                    printf("\t%d,M[i][j]");
                }
            }
            
            printf("\nStampare i dati della matrice trasposta\n");
            for(i=0;i<R;i++){
                printf("\n");
                for(j=0;j<C;j++){
                    printf("\t%d,MT[i][j]");
                }
                printf("\nCalcolare la seconda matrice trasposta \n");
            for (i=0;i<R;i++){
                for(j=0;j<C;j++){
                    MT[j][i]=M2[i][j];
                }
            }
            printf("\nStampare i dati della matrice \n");
            for(i=0;i<R;i++){
                for(j=0;j<C;j++){
                    printf("\t%d,M2[i][j]");
                }
            }
            
            printf("\nStampare i dati della matrice trasposta\n");
            for(i=0;i<R;i++){
                printf("\n");
                for(j=0;j<C;j++){
                    printf("\t%d,M2T[i][j]");
                }
            }
        }
    }
            else printf("\nCalcolare la matrice trasposta \n");
            for (i=0;i<R;i++){
                for(j=0;j<C;j++){
                    MT[j][i]=M2[i][j];
                }
            }
            printf("\nStampare i dati della matrice \n");
            for(i=0;i<R;i++){
                for(j=0;j<C;j++){
                    printf("\t%d,M2[i][j]");
                }
            }
            
            printf("\nStampare i dati della matrice trasposta\n");
            for(i=0;i<R;i++){
                printf("\n");
                for(j=0;j<C;j++){
                    printf("\t%d,M2T[i][j]");
                }
            }
        }
        
        void somma_matrici (int M[][COL],int M2[][COL],int R,int C){
            int i,j,M3[RIG][COL];
            
            printf("Somma delle due matrici\n");
            for (i=0;i<R;i++) {
            for (j=0;j<C;j++){
                M3[i][j]=M[i][j]+M2[i][j];
            }       
            }
    
     printf("\nStampiamo i dati della matrice somma\n");
     for (i=0;i<R;i++) {
        for(j=0;j<C;j++){
            printf("\t%d", M3[i][j]);                
        }
        printf("\n");
            }
        }
    
    void prodotto_matrici (int M[][COL],int M2[][COL],int R,int C){
        int i,j,M4[RIG][COL];
        
        printf("Prodotto delle due matrici\n");
        for (i=0;i<R;i++) {
            for (j=0;j<C;j++){
                M4[i][j]=M[i][j]*M2[i][j];
            }       
            }
    
     printf("\nStampiamo i dati della matrice somma\n");
     for (i=0;i<R;i++) {
        for(j=0;j<C;j++){
            printf("\t%d", M4[i][j]);                
        }
        printf("\n");
            }
    }
    
    
  • Re: MEGA Funzioni di Matrici

    Cosi il programma non funziona, sei riuscito a risolvere?
  • Re: MEGA Funzioni di Matrici

    #include <stdio.h>
    #include <stdlib.h>
    #define RIG 100
    #define COL 100
    
    /*Definizione dei prototipi*/
    void Inizializzazione_Matrice (int m[][COL],int r,int c);
    void Stampa_Matrice (int m[][COL],int r,int c);
    void Trasposta_Matrice (int m[][COL],int m2[][COL],int r,int c);
    void Somma_Matrice (int m[][COL],int m2[][COL],int m3[][COL],int r,int c);
    void Prodotto_Matrice (int m[][COL],int m2[][COL],int m4[][COL],int r,int c);
    
    int main() {
        int M[RIG][COL],M2[RIG][COL], M3[RIG][COL],M4[RIG][COL],R,C;
        
        do{
            printf("Inserire il numero di righe: ");
            scanf("%d",&R);
        }while ((R>RIG)||(R<1));
        
        do{
            printf("Inserire il numero di colonne: ");
            scanf("%d",&C);
        }while ((C>COL)||(C<1));
    
        printf("Visualizzare la prima matrice\n");
        Inizializzazione_Matrice(M,R,C);
        Stampa_Matrice(M,R,C);
    
        printf("Visualizzare la seconda matrice\n");
        Inizializzazione_Matrice(M2,R,C);
        Stampa_Matrice(M2,R,C);
        
        printf("Visualizzare la matrice trasposta\n");
        Trasposta_Matrice (M,M2,R,C);
        
        printf("Visualizzare la somma delle due matrici\n");
        Somma_Matrice(M,M2,M3,R,C);
        
        printf("Visualizzare il prodotto delle due matrici\n");
        Prodotto_Matrice(M,M2,M4,R,C);
    
        return 0;
    }
    
    /*Definizione della funzione Inizializza_Matrice*/
    void Inizializzazione_Matrice (int m[][COL],int r,int c){
        int i,j;
        
        for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
                scanf("%d",&m[i][j]);
            }
            printf("\n");
        }
    }
    
    /*Definizione della funzione Stampa_Matrice*/
    void Stampa_Matrice (int m[][COL],int r,int c){
        int i,j;
        
        for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",m[i][j]);
            }
            printf("\n");
        } 
    }
    
    /*Definizione della funzione Trasposta_Matrice*/
    void Trasposta_Matrice (int m[][COL],int m2[][COL],int r,int c){
        int i,j,MT[RIG][COL],M2T[RIG][COL];
       
        /*Definizione della funzione Somma_Matrice*/
    void Somma_Matrice (int m[][COL],int m2[][COL],int m3[][COL],int r,int c){
            int i,j;
            
            printf("Somma delle due matrici\n");
            for(i=0;i<r;i++){
                m3[i][j]=0;
                for(j=0;j<c;j++){
                    m3[i][j]=m[i][j]+m2[i][j];
                }
                }
            printf("\nStampiamo i dati della matrice somma\n");
            for(i=0;i<r;i++){
                for(j=0;j<c;j++){
                    printf("\t%d",m3[i][j]);
                }
                printf("\n");
                }
            }
    
     /*Definizione della funzione Prodotto_Matrice*/
    void Prodotto_Matrice (int m[][COL],int m2[][COL],int m4[][COL],int r,int c){
            int i,j;
            
            printf("Prodotto delle due matrici\n");
            for(i=0;i<r;i++){
                m4[i][j]=0;
                for(j=0;j<c;j++){
                    m4[i][j]=m[i][j]+m2[i][j];
                }
                }
            printf("\nStampiamo i dati della matrice prodotto\n");
            for(i=0;i<r;i++){
                for(j=0;j<c;j++){
                    printf("\t%d",m4[i][j]);
                }
                printf("\n");
                }
            }
  • Re: MEGA Funzioni di Matrici

    Ho soltanto dei problemi riguardante la somma ed il prodotto delle matrici, il compilatore assegna l'errore alla matrice3 e matrice 4 ma non capisco il motivo poiché le ho definite :/
  • Re: MEGA Funzioni di Matrici

    Oltre a questi problemi, devo capire come confrontare le matrici per permettermi di eseguire la matrice trasposta
  • Re: MEGA Funzioni di Matrici

    Il programma funziona sei tu che hai fatto due errori:

    1) riga 72 il prototipo di funzione non ha la parentesi } di chiusura quindi automaticamente ti invalida la funzione somma e prodotto che stanno sotto a lei
    2) riga 103 nella funzione per il prodotto della matrice hai messo + invece di mettere * per moltiplicare i valori

    ecco il codice ricorretto la funzione "trasposta_matrice" è messa in pausa devi continuare te il programma saluti..
     #include <stdio.h>
    #include <stdlib.h>
    #define RIG 100
    #define COL 100
    
    /*Definizione dei prototipi*/
    void Inizializzazione_Matrice (int m[][COL],int r,int c);
    void Stampa_Matrice (int m[][COL],int r,int c);
    //void Trasposta_Matrice (int m[][COL],int m2[][COL],int r,int c);
    void Somma_Matrice (int m[][COL],int m2[][COL],int m3[][COL],int r,int c);
    void Prodotto_Matrice (int m[][COL],int m2[][COL],int m4[][COL],int r,int c);
    
    int main() {
        int M[RIG][COL],M2[RIG][COL], M3[RIG][COL],M4[RIG][COL],R,C;
    
        do{
            printf("Inserire il numero di righe: ");
            scanf("%d",&R);
        }while ((R>RIG)||(R<1));
    
        do{
            printf("Inserire il numero di colonne: ");
            scanf("%d",&C);
        }while ((C>COL)||(C<1));
    
        printf("Visualizzare la prima matrice\n");
        Inizializzazione_Matrice(M,R,C);
        Stampa_Matrice(M,R,C);
    
        printf("Visualizzare la seconda matrice\n");
        Inizializzazione_Matrice(M2,R,C);
        Stampa_Matrice(M2,R,C);
    
        //printf("Visualizzare la matrice trasposta\n");
        //Trasposta_Matrice (M,M2,R,C);
    
        printf("Visualizzare la somma delle due matrici\n");
        Somma_Matrice(M,M2,M3,R,C);
    
        printf("Visualizzare il prodotto delle due matrici\n");
        Prodotto_Matrice(M,M2,M4,R,C);
    
        return 0;
    }
    
    /*Definizione della funzione Inizializza_Matrice*/
    void Inizializzazione_Matrice (int m[][COL],int r,int c){
        int i,j;
    
        for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
                scanf("%d",&m[i][j]);
            }
            printf("\n");
        }
    }
    
    /*Definizione della funzione Stampa_Matrice*/
    void Stampa_Matrice (int m[][COL],int r,int c){
        int i,j;
    
        for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",m[i][j]);
            }
            printf("\n");
        }
    }
    
    /*Definizione della funzione Trasposta_Matrice*//*
    void Trasposta_Matrice (int m[][COL],int m2[][COL],int r,int c){
        int i,j,MT[RIG][COL],M2T[RIG][COL];
    }*/
        /*Definizione della funzione Somma_Matrice*/
    void Somma_Matrice (int m[][COL],int m2[][COL],int m3[][COL],int r,int c){
            int i,j;
    
            printf("Somma delle due matrici\n");
            for(i=0;i<r;i++){
                m3[i][j]=0;
                for(j=0;j<c;j++){
                    m3[i][j]=m[i][j]+m2[i][j];
                }
                }
            printf("\nStampiamo i dati della matrice somma\n");
            for(i=0;i<r;i++){
                for(j=0;j<c;j++){
                    printf("\t%d",m3[i][j]);
                }
                printf("\n");
                }
            }
    
     /*Definizione della funzione Prodotto_Matrice*/
    void Prodotto_Matrice (int m[][COL],int m2[][COL],int m4[][COL],int r,int c){
            int i,j;
    
            printf("Prodotto delle due matrici\n");
            for(i=0;i<r;i++){
                m4[i][j]=0;
                for(j=0;j<c;j++){
                    m4[i][j]=m[i][j] * m2[i][j];
                }
                }
            printf("\nStampiamo i dati della matrice prodotto\n");
            for(i=0;i<r;i++){
                for(j=0;j<c;j++){
                    printf("\t%d",m4[i][j]);
                }
                printf("\n");
                }
    }
     
  • Re: MEGA Funzioni di Matrici

    Grazie per questi accorgimenti Mentre per il confronto tra matrici bisogna usare i due cicli for e comparare riga con riga e colonna con colonna, giusto?
  • Re: MEGA Funzioni di Matrici

    Però dovrei usare anche un ciclo if,else if per stampare la matrice trasposta più grande o eventuale tutte e due?
  • Re: MEGA Funzioni di Matrici

    Beh, posso mostrare come ho fatto io, tempo fa?

    premesso che io programmo un poco il C, ma non il C++, per prima cosa mi sono creato un tipo "matrice" usando una struct
    
    // gestione delle matrici come strutture
    
    typedef struct
    {
       int * dati;
       int righe;
       int colonne;
    } matrix;
    
    dove i dati sono contenuti in un unico vettore puntato dal membro dati
    mentre quante righe e quante colonne sono scritte esplicite

    poi mi sono "inventato" come "creare" variabili matrix
    sia con allocazione statica:
    
    int vettore[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    matrix M1 = {vettore, 2, 5};
    
    dove alloco un vettore statico e lo uso come puntatore da scrivere nella struttura

    anche per matrici vuote (intese come non inizializzate, non con tutti gli elementi a zero)
    
    matrix vuota={0,0,0};
    
    dove il primo zero rappresenta il puntatore nullo (zero binario in C)

    sia in allocazione dinamica:
    
    matrix creamatrice(int righe, int colonne)
    {
       // restituisce una matrice (nulla nel senso che l'area è inizializzata a zero binario) creata in allocazione dinamica
       matrix matrice;
       matrice.dati = calloc(sizeof(int), righe * colonne);
    
       // giusta regola dovrei controllare che il puntatore restituito sia valido
    
       if(!matrice.dati)
       {
          matrix vuota = {0, 0, 0};
          printf("Matrice non allocata\n");
          return vuota;
       }
    
       matrice.righe = righe;
       matrice.colonne = colonne;
       return matrice;
    }
    
    poi visto che create le avevo, ho cercato di stamparle:
    
    void stampamatrice(matrix matrice)
    {
       printf("\n\nStampo una matrice di %d righe e %d colonne\n", matrice.righe, matrice.colonne);
       typedef typeof(int [matrice.righe][matrice.colonne]) matriP;
       matriP * matr = (matriP *) matrice.dati;
    
       for(int i = 0; i < matrice.righe; i++)
       {
          for(int j = 0; j < matrice.colonne; j++)
          {
             printf("%d\t", (* matr)[i][j]);
          }
    
          printf("\n");
       }
    }
    
    dove passo per un casting dopo una definizione di tipo di un casting esplicito per "ricostruire" il tipo matrice bidimensionale di C a partire dal puntatore ad array lineare membro della struttura

    e poi mi è venuto in mente che non serve tutto il circo del typedef di un typeof di un casting esplicito
    basta fare così:
    
    void stampamatrix(matrix matrice)
    {
       printf("\n\nStampo una matrice (come array lineare) di %d righe e %d colonne\n", matrice.righe, matrice.colonne);
    
       for(int i = 0; i < matrice.righe; i++)
       {
          for(int j = 0; j < matrice.colonne; j++)
          {
             printf("%d\t", matrice.dati[i * matrice.colonne + j]);
          }
    
          printf("\n");
       }
    }
    
    nel frattempo però mi ero scritto anche la funzione che crea la trasposta della matrice
    
    matrix trasposta(matrix matrice)
    {
       matrix uscita = creamatrice(matrice.colonne, matrice.righe);
       typedef typeof(int [matrice.righe][matrice.colonne]) matriP;
       typedef typeof(int [uscita.righe][uscita.colonne]) matriQ;
       matriP * p  = (matriP *) matrice.dati;
       matriQ * q  = (matriQ *) uscita.dati;
    
       for(int i = 0; i < matrice.righe; i++)
       {
          for(int j = 0; j < matrice.colonne; j++)
          {
             (*  q)[j][i] = (* p)[i][j];
          }
       }
    
       return uscita;
    }
    

    credo che da qui, il resto sia banale


    spero MarcoTopone che ti possa essere di ispirazione
  • Re: MEGA Funzioni di Matrici

    Ho pensato di fare la somma totale delle righe e confrontarle in modo tale da capire quale tra le due matrici sia la maggiore e poi ho costruito un ciclo if_else if_else per stampare la matrice maggiore o eventuale le medesime matrici... Il codice non evidenzia nessun errore però non so se e' corretto semanticamente parlando.
    #include <stdio.h>
    #include <stdlib.h>
    #define RIG 100
    #define COL 100
    
    /*Definizione dei prototipi*/
    void Inizializzazione_Matrice (int m[][COL],int r,int c);
    void Stampa_Matrice (int m[][COL],int r,int c);
    void Trasposta_Matrice (int m[][COL],int m2[][COL],int r,int c);
    void Somma_Matrice (int m[][COL],int m2[][COL],int m3[][COL],int r,int c);
    void Prodotto_Matrice (int m[][COL],int m2[][COL],int m4[][COL],int r,int c);
    
    int main() {
        int M[RIG][COL],M2[RIG][COL], M3[RIG][COL],M4[RIG][COL],R,C;
        
        do{
            printf("Inserire il numero di righe: ");
            scanf("%d",&R);
        }while ((R>RIG)||(R<1));
        
        do{
            printf("Inserire il numero di colonne: ");
            scanf("%d",&C);
        }while ((C>COL)||(C<1));
    
        printf("Visualizzare la prima matrice\n");
        Inizializzazione_Matrice(M,R,C);
        Stampa_Matrice(M,R,C);
    
        printf("Visualizzare la seconda matrice\n");
        Inizializzazione_Matrice(M2,R,C);
        Stampa_Matrice(M2,R,C);
        
        printf("Visualizzare la matrice trasposta\n");
        Trasposta_Matrice (M,M2,R,C);
        
        printf("Visualizzare la somma delle due matrici\n");
        Somma_Matrice(M,M2,M3,R,C);
        
        printf("Visualizzare il prodotto delle due matrici\n");
        Prodotto_Matrice(M,M2,M4,R,C);
    
        return 0;
    }
    
    /*Definizione della funzione Inizializza_Matrice*/
    void Inizializzazione_Matrice (int m[][COL],int r,int c){
        int i,j;
        
        for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
                scanf("%d",&m[i][j]);
            }
            printf("\n");
        }
    }
    
    /*Definizione della funzione Stampa_Matrice*/
    void Stampa_Matrice (int m[][COL],int r,int c){
        int i,j;
        
        for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",m[i][j]);
            }
            printf("\n");
        } 
    }
    
    /*Definizione della funzione Trasposta_Matrice*/
    void Trasposta_Matrice (int m[][COL],int m2[][COL],int r,int c){
        int i,j,Somma1=0,Somma2=0,MT[RIG][COL],M2T[RIG][COL];
        
        printf("Confrontare le due matrici\n");
        for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                Somma1=Somma1+m[i][j];
            }
            printf("La somma della %d riga e': %d\n",r,Somma1);
        }
        
            for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                Somma2=Somma2+m2[i][j];
            }
            printf("La somma delle singole righe e': %d",Somma2);
        }
        
        if(Somma1=Somma2){
            printf("Calcolare la trasposta delle singole matrici\n");
            printf("\nCalcoliamo la prima matrice trasposta \n");
            for (i=0;i<r;i++)
                for(j=0;j<c;j++) {
                    MT[j][i]=m[i][j];
        } 
            printf("\nStampiamo i dati della prima matrice traposta\n");
            for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",MT[i][j]);
            }
            printf("\n");
        } 
            
            printf("\nCalcoliamo la seconda matrice trasposta \n");
            for (i=0;i<r;i++)
                for(j=0;j<c;j++) {
                    M2T[j][i]=m2[i][j];
        }
            printf("\nStampiamo i dati della seconda matrice traposta\n");
            for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",M2T[i][j]);
            }
            printf("\n");
        } 
                    
        } else if (Somma1>Somma2){
            printf("Calcolare la trasposta della prima matrice\n");
            for (i=0;i<r;i++)
                for(j=0;j<c;j++) {
                    MT[j][i]=m[i][j];
        } 
            printf("\nStampiamo i dati della matrice traposta\n");
            for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",MT[i][j]);
            }
            printf("\n");
        } 
        } else {printf("Calcolare la trasposta della seconda matrice\n");
            for (i=0;i<r;i++)
                for(j=0;j<c;j++) {
                    M2T[j][i]=m2[i][j];
        } 
            printf("\nStampiamo i dati della matrice traposta\n");
            for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",M2T[i][j]);
            }
            printf("\n");
        }      
        }
        
    }
       
        /*Definizione della funzione Somma_Matrice*/
    void Somma_Matrice (int m[][COL],int m2[][COL],int m3[][COL],int r,int c){
            int i,j;
            
            printf("Somma delle due matrici\n");
            for(i=0;i<r;i++){
                m3[i][j]=0;
                for(j=0;j<c;j++){
                    m3[i][j]=m[i][j]+m2[i][j];
                }
                }
            printf("\nStampiamo i dati della matrice somma\n");
            for(i=0;i<r;i++){
                for(j=0;j<c;j++){
                    printf("\t%d",m3[i][j]);
                }
                printf("\n");
                }
            }
    
     /*Definizione della funzione Prodotto_Matrice*/
    void Prodotto_Matrice (int m[][COL],int m2[][COL],int m4[][COL],int r,int c){
            int i,j;
            
            printf("Prodotto delle due matrici\n");
            for(i=0;i<r;i++){
                m4[i][j]=0;
                for(j=0;j<c;j++){
                    m4[i][j]=m[i][j]+m2[i][j];
                }
                }
            printf("\nStampiamo i dati della matrice prodotto\n");
            for(i=0;i<r;i++){
                for(j=0;j<c;j++){
                    printf("\t%d",m4[i][j]);
                }
                printf("\n");
                }
            }
  • Re: MEGA Funzioni di Matrici

    Ma la traccia di una matrice non si calcola come hai fatto tu


    Comunque tra il testo dell'esercizio e il tuo svolgimento c'è qualcosa di non chiaro

    Primo la traccia di una matrice esiste solo per matrici quadrate

    Inoltre la somma tra matrici esiste solo per matrici che abbiano lo stesso numero di righe e lo stesso numero di colonne

    Essendo quadrate basta dare una sola dimensione
  • Re: MEGA Funzioni di Matrici

    #include <stdio.h>
    #include <stdlib.h>
    #define RIG 100
    #define COL 100
    
    /*Definizione dei prototipi*/
    void Inizializzazione_Matrice (int m[][COL],int r,int c);
    void Stampa_Matrice (int m[][COL],int r,int c);
    void Trasposta_Matrice (int m[][COL],int m2[][COL],int r,int c);
    void Somma_Matrice (int m[][COL],int m2[][COL],int m3[][COL],int r,int c);
    void Prodotto_Matrice (int m[][COL],int m2[][COL],int m4[][COL],int r,int c);
    
    int main() {
        int M[RIG][COL],M2[RIG][COL], M3[RIG][COL],M4[RIG][COL],R,C;
        
        do{
            printf("Inserire il numero di righe: ");
            scanf("%d",&R);
        }while ((R>RIG)||(R<1));
        
        do{
            printf("Inserire il numero di colonne: ");
            scanf("%d",&C);
        }while ((C>COL)||(C<1));
    
        printf("Visualizzare la prima matrice\n");
        Inizializzazione_Matrice(M,R,C);
        Stampa_Matrice(M,R,C);
    
        printf("Visualizzare la seconda matrice\n");
        Inizializzazione_Matrice(M2,R,C);
        Stampa_Matrice(M2,R,C);
        
        printf("Visualizzare la matrice trasposta\n");
        Trasposta_Matrice (M,M2,R,C);
        
        printf("Visualizzare la somma delle due matrici\n");
        Somma_Matrice(M,M2,M3,R,C);
        
        printf("Visualizzare il prodotto delle due matrici\n");
        Prodotto_Matrice(M,M2,M4,R,C);
    
        return 0;
    }
    
    /*Definizione della funzione Inizializza_Matrice*/
    void Inizializzazione_Matrice (int m[][COL],int r,int c){
        int i,j;
        
        for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("Inserisci elemento di riga %d e colonna %d: ", i, j);
                scanf("%d",&m[i][j]);
            }
            printf("\n");
        }
    }
    
    /*Definizione della funzione Stampa_Matrice*/
    void Stampa_Matrice (int m[][COL],int r,int c){
        int i,j;
        
        for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",m[i][j]);
            }
            printf("\n");
        } 
    }
    
    /*Definizione della funzione Trasposta_Matrice*/
    void Trasposta_Matrice (int m[][COL],int m2[][COL],int r,int c){
        int i,j,Somma1=0,Somma2=0,MT[RIG][COL],M2T[RIG][COL];
        
        printf("Confrontare le due matrici\n");
             for(i=0;i<r;i++)
    	  Somma1 += m[i][i]; //somma diagonale principale
            printf("La somma della diagonale principale e': %d\n",Somma1);
            
            for(i=0;i<r;i++)
    	  Somma2 += m2[i][i]; //somma diagonale principale
            printf("La somma della diagonale principale e': %d\n",Somma2);
    
        
        if(Somma1=Somma2){
            printf("Calcolare la trasposta delle singole matrici\n");
            printf("\nCalcoliamo la prima matrice trasposta \n");
            for (i=0;i<r;i++)
                for(j=0;j<c;j++) {
                    MT[j][i]=m[i][j];
        } 
            printf("\nStampiamo i dati della prima matrice traposta\n");
            for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",MT[i][j]);
            }
            printf("\n");
        } 
            
            printf("\nCalcoliamo la seconda matrice trasposta \n");
            for (i=0;i<r;i++)
                for(j=0;j<c;j++) {
                    M2T[j][i]=m2[i][j];
        }
            printf("\nStampiamo i dati della seconda matrice traposta\n");
            for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",M2T[i][j]);
            }
            printf("\n");
        } 
                    
        } else if (Somma1>Somma2){
            printf("Calcolare la trasposta della prima matrice\n");
            for (i=0;i<r;i++)
                for(j=0;j<c;j++) {
                    MT[j][i]=m[i][j];
        } 
            printf("\nStampiamo i dati della matrice traposta\n");
            for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",MT[i][j]);
            }
            printf("\n");
        } 
        } else {printf("Calcolare la trasposta della seconda matrice\n");
            for (i=0;i<r;i++)
                for(j=0;j<c;j++) {
                    M2T[j][i]=m2[i][j];
        } 
            printf("\nStampiamo i dati della matrice traposta\n");
            for(i=0;i<r;i++){
            for(j=0;j<c;j++){
                printf("\t%d",M2T[i][j]);
            }
            printf("\n");
        }      
        }
        
    }
       
        /*Definizione della funzione Somma_Matrice*/
    void Somma_Matrice (int m[][COL],int m2[][COL],int m3[][COL],int r,int c){
            int i,j;
            
            printf("Somma delle due matrici\n");
            for(i=0;i<r;i++){
                m3[i][j]=0;
                for(j=0;j<c;j++){
                    m3[i][j]=m[i][j]+m2[i][j];
                }
                }
            printf("\nStampiamo i dati della matrice somma\n");
            for(i=0;i<r;i++){
                for(j=0;j<c;j++){
                    printf("\t%d",m3[i][j]);
                }
                printf("\n");
                }
            }
    
     /*Definizione della funzione Prodotto_Matrice*/
    void Prodotto_Matrice (int m[][COL],int m2[][COL],int m4[][COL],int r,int c){
            int i,j;
            
            printf("Prodotto delle due matrici\n");
            for(i=0;i<r;i++){
                m4[i][j]=0;
                for(j=0;j<c;j++){
                    m4[i][j]=m[i][j]+m2[i][j];
                }
                }
            printf("\nStampiamo i dati della matrice prodotto\n");
            for(i=0;i<r;i++){
                for(j=0;j<c;j++){
                    printf("\t%d",m4[i][j]);
                }
                printf("\n");
                }
            }
  • Re: MEGA Funzioni di Matrici

    Ho corretto perchè per traccia si intende la somma della diagonale principale, avevo tralasciato questo particolare
Devi accedere o registrarti per scrivere nel forum
51 risposte