Pagina 1 di 6 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 59

Discussione: [C]Matrice quadrata

  1. #1

    [C]Matrice quadrata

    Ciao,
    devo fare un programma che, dato in ingresso la dimensione di una matrice quadrata svolga a seconda della scelta dell'utente le sequenti opzioni:
    a)La matrice trasposta;
    b)La traccia della matrice degli elementi sulla diagonale principale;
    c)La somma degli elementi della diagonale secondaria;
    d)In caso di matrice di ordine n<=3 il determinante (regola di Sarrus).

    Solo che non riesco a capire come si debba fare la matrice trasposta e la traccia (nel senso di codice).

    Inoltre penso anche che ci siano degli errori logici?
    codice:
    //Matrice quadrata
    #include <stdio.h> 
    #include <string.h> 
    int main() 
    { 
       char scelta=0;
       int x=0, y=0, cnt=0; 
       float mat[10][10], val=0, det=0, out=0, tot=0;
       printf("Inserisci il valore che vuoi dare alla radice quadrata:\n");
       scanf("%d", &cnt);
       printf("Dati per la matrice quadrata: \n\n");
       for(x=0; x<cnt; x++)
       {
                for(y=0; y<cnt; y++)
                {
                         printf("Inserisci i dati della posizione matrice [%d][%d]", x,y);
                         scanf("%f", &val);
                         mat [x][y]=val;
                }
       }  
       printf("Scegli un' opzione:\n");
       printf(" a) La matrice trasposta:\n");
       printf(" b) La traccia della matrice degli elementi sulla diagonale principale:\n");
       printf(" c) La somma degli elementi della diagonale secondaria:\n");
       printf(" d) In caso di matrice di ordine n<=3 il determinante (regola di Sarrus):\n");
       printf("Scelta:");
       scanf("%c", &scelta);
       if(scelta='a')
       {
       }
       else
       {
                   if(scelta='b')
                   {
                          printf("Traccia delgi elementi sulla diagonale principale:");
                          for(x=0; x<cnt; x++)
                          {
                                for(y=0; y<cnt; y++)
                                {
                                        if(x==y)
                                        {
                                                out=mat [x][y];
                                                printf("%f",out);
                                        }
                                                
                                }
                          }
                   }  
                   else
                   {
                       if(scelta='c')
                       {
                         printf("Somma degli elementi sulla diagonale secondaria:");
                          for(x=0; x<cnt; x++)
                          {
                                for(y=0; y<cnt; y++)
                                {
                                        if(y==-x+cnt)
                                        {
                                                tot=tot+mat [x][y];
                                                printf("%f",tot);
                                        }
                                                
                                }
                          }         
                       }
                       else
                       {
                           if(cnt<=3)
                           {
                             det = mat[0][0]*mat[1][1]*mat[2][2] + mat[0][1]*mat[1][2]*mat[2][0] + mat[0][2]*mat[1][0]*mat[2][1] - mat[2][0]*mat[1][1]*mat[0][2] - mat[2][1]*mat[1][2]*mat[0][0] - mat[2][2]*mat[1][0]*mat[0][1];
                             printf("Il determinante della matrice e\': %f", det);
                           }
                           else
                           printf("Non si può determinare con la regola di Sarrus ma, bisogna usare quella di Laplace"); 
                       }
                   }
       }   
       system ("pause");
       return 0;
    }
    Ciao e grazie

    P.S. Se vede anche delle altre cose che non vanno nel mio codice fatemelo sapere
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Per la trasposta, tu sai teoricamente come ottenerla?

    Per quanto riguarda il codice:

    non

    if(scelta='a')

    ma

    if(scelta=='a')

    e righe simili ...

    In ogni caso, visto che le scelte sono tante, al posto delle varie if ... else inserisci un più comodo switch ... case

    Infine, devi azzerare tot subito prima di iniziare il suo calcolo, non soltanto la prima volta.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Da quel che vedo nel tuo codice non hai nemmeno provato a trovare la trasposta.
    Per cui suppongo che il tuo problema sia l' algoritmo.

    Una delle soluzioni più semplici sta nel trovare la matrice aggiunta e poi dividerla per il determinante, se diverso da zero.
    Per quanto riguarda il determinante lo calcoli con Sarrus, tenendo presente che se la matrice è più larga di una 3x3, poiché è valida la formula:

    codice:
    det(A)= sum ( (-1)^(i+j) aij * det(Aij)) j from 1 to n
    Dove Aij è il minore associato, e aij è il valore di indici ij della matrice.
    Per cui se hai una 4x4 puoi calcolare il determinante delle 3 sub-matrici 3x3 scegliendo una riga a tuo piacimento (fai una funzione per Sarrus e poi la riutilizzi quante volte vuoi).


    Per quanto riguarda la traccia ti puoi risparmiare dei conti, abbassando l' efficienza da N^2 a N, perché basta un solo ciclo per sommare gli elementi sulla diagonale principale:

    codice:
    for(x=0; x<cnt; x++)
    {
        tot=tot+mat [x][x];
        // non stamparlo 1000 volte, stampalo fuori dal for
    }
    Lo stesso vale per la diagonale secondaria (lascio a te il piacere ).
    Per quanto riguarda Sarrus non sono stato a verificare se è giusto ma ti consiglio di fare una funzione invece di scrivere la il codice, così è riutilizzabile (per il punto a dove ti serve la matrice inversa).

  4. #4
    Ciao,
    ho cambiato il codice apportando queste modifiche:
    1)Ho cambiato la if con lo switch;
    2)Ho modificato il for del punto 2.

    Solo che riscontro 2 problemi:
    1)Non so come scrivere l'algoritmo delle matrice trasposta che è quella che si ottiene invertendo le righe con le colonne;
    2)Quando compilo il codice il compilatore mi dice che vi è un errore sulla riga della parentesi graffa dopo il retur 0 dicendomi che è un errore sintattico alla fine dell'input.

    codice:
    //Matrice quadrata
    #include <stdio.h> 
    #include <string.h> 
    int main() 
    { 
       char scelta=0;
       int x=0, y=0, cnt=0; 
       float mat[10][10], val=0, det=0, tot=0;
       printf("Inserisci il valore che vuoi dare alla radice quadrata:\n");
       scanf("%d", &cnt);
       printf("Dati per la matrice quadrata: \n\n");
       for(x=0; x<cnt; x++)
       {
                for(y=0; y<cnt; y++)
                {
                         printf("Inserisci i dati della posizione matrice [%d][%d]", x,y);
                         scanf("%f", &val);
                         mat [x][y]=val;
                }
       }  
       printf("Scegli un' opzione:\n");
       printf(" a) La matrice trasposta:\n");
       printf(" b) La traccia della matrice degli elementi sulla diagonale principale:\n");
       printf(" c) La somma degli elementi della diagonale secondaria:\n");
       printf(" d) In caso di matrice di ordine n<=3 il determinante (regola di Sarrus):\n");
       printf("Scelta:");
       scanf("%c", &scelta);
       switch(scelta)
       {
       case 'a':
       {
       }  
       break;                
       case 'b':
       {
        printf("Traccia delgi elementi sulla diagonale principale:");
        for(x=0; x<cnt; x++)
        {
         tot=tot+mat [x][x];
        }
        printf("La traccia degli elementi e\': %f", tot);
       }
       break;
       case 'c':
       {
        printf("Somma degli elementi sulla diagonale secondaria:");
        for(x=0; x<cnt; x++)
        {
                for(y=0; y<cnt; y++)
                {
                                if(y==-x+cnt)
                                {
                                tot=tot+mat [x][y];
                                printf("%f",tot);
                                }
                }
        }
       }         
       break;
       default:
       {
        if(cnt<=3)
        {
         det = mat[0][0]*mat[1][1]*mat[2][2] + mat[0][1]*mat[1][2]*mat[2][0] + mat[0][2]*mat[1][0]*mat[2][1] - mat[2][0]*mat[1][1]*mat[0][2] - mat[2][1]*mat[1][2]*mat[0][0] - mat[2][2]*mat[1][0]*mat[0][1];
         printf("Il determinante della matrice e\': %f", det);
        }
        else
        printf("Non si può determinare con la regola di Sarrus ma, bisogna usare quella di Laplace"); 
       }     
       system ("pause");
       return 0;
    }
    Ciao e grazie
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  5. #5
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Non so per quale motivo avevo capito l' inversa
    Allora è più facile, la trasposta la ottieni scambiando le righe con le colonne, tutto qua.

    Per quanto riguarda l' errore sintattico ti sei solo dimenticato una graffa a fine main.

  6. #6
    Ciao,
    ho risolto il problema 2) che era generato dalla mancanza della parentesi graffa per far terminare lo switch. però permane sempre il problema 1).
    codice:
    //Matrice quadrata
    #include <stdio.h> 
    #include <string.h> 
    int main() 
    { 
       char scelta=0;
       int x=0, y=0, cnt=0; 
       float mat[10][10], val=0, det=0, tot=0;
       printf("Inserisci il valore che vuoi dare alla radice quadrata:\n");
       scanf("%d", &cnt);
       printf("Dati per la matrice quadrata: \n\n");
       for(x=0; x<cnt; x++)
       {
                for(y=0; y<cnt; y++)
                {
                         printf("Inserisci i dati della posizione matrice [%d][%d]", x,y);
                         scanf("%f", &val);
                         mat [x][y]=val;
                }
       }  
       printf("Scegli un' opzione:\n");
       printf(" a) La matrice trasposta:\n");
       printf(" b) La traccia della matrice degli elementi sulla diagonale principale:\n");
       printf(" c) La somma degli elementi della diagonale secondaria:\n");
       printf(" d) In caso di matrice di ordine n<=3 il determinante (regola di Sarrus):\n");
       printf("Scelta:");
       scanf("%c", &scelta);
       switch(scelta)
       {
       case 'a':
       {
       }  
       break;                
       case 'b':
       {
        printf("Traccia delgi elementi sulla diagonale principale:");
        for(x=0; x<cnt; x++)
        {
         tot=tot+mat [x][x];
        }
        printf("La traccia degli elementi e\': %f", tot);
       }
       break;
       case 'c':
       {
        printf("Somma degli elementi sulla diagonale secondaria:");
        for(x=0; x<cnt; x++)
        {
                for(y=0; y<cnt; y++)
                {
                                if(y==-x+cnt)
                                {
                                tot=tot+mat [x][y];
                                printf("%f",tot);
                                }
                }
        }
       }         
       break;
       default:
       {
        if(cnt<=3)
        {
         det = mat[0][0]*mat[1][1]*mat[2][2] + mat[0][1]*mat[1][2]*mat[2][0] + mat[0][2]*mat[1][0]*mat[2][1] - mat[2][0]*mat[1][1]*mat[0][2] - mat[2][1]*mat[1][2]*mat[0][0] - mat[2][2]*mat[1][0]*mat[0][1];
         printf("Il determinante della matrice e\': %f", det);
        }
        else
        printf("Non si può determinare con la regola di Sarrus ma, bisogna usare quella di Laplace"); 
       }
       }     
       system ("pause");
       return 0;
    }
    Ciao e grazie
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Scambi le righe con le colonne, cioè nel caso di una 3x3 basta fare un for dove scambi l' elemento i,j con l' elemento j,i stando attento a non effettuare due volte lo stesso scambio, altrimenti otterresti la stessa matrice di partenza.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E non hai ancora azzerato tot come ti dicevo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Ciao,
    ho apportato le seguenti modifice:
    1)Ho (o almeno spero) azzerato tuuti tot prima del loro conteggio;
    2)Ho modificato la posizione degli output della scelta (b) e di (c).

    Però volevo chiedrvi perchè devo azzerare tutte le volte il 'tot' e non solo una volta?

    codice:
    //Matrice quadrata
    #include <stdio.h> 
    #include <string.h> 
    int main() 
    { 
       char scelta=0;
       int x=0, y=0, cnt=0; 
       float mat[10][10], val=0, det=0, tot=0;
       printf("Inserisci il valore che vuoi dare alla radice quadrata:\n");
       scanf("%d", &cnt);
       printf("Dati per la matrice quadrata: \n\n");
       for(x=0; x<cnt; x++)
       {
                for(y=0; y<cnt; y++)
                {
                         printf("Inserisci i dati della posizione matrice [%d][%d]", x,y);
                         scanf("%f", &val);
                         mat [x][y]=val;
                }
       }  
       printf("Scegli un' opzione:\n");
       printf(" a) La matrice trasposta:\n");
       printf(" b) La traccia della matrice degli elementi sulla diagonale principale:\n");
       printf(" c) La somma degli elementi della diagonale secondaria:\n");
       printf(" d) In caso di matrice di ordine n<=3 il determinante (regola di Sarrus):\n");
       printf("Scelta:");
       scanf("%c", &scelta);
       switch(scelta)
       {
       case 'a':
       {
       }  
       break;                
       case 'b':
       {
        tot=0;
        for(x=0; x<cnt; x++)
        {
         tot=tot+mat [x][x];
        }
        printf("La traccia degli elementi sulla diagonale principale e\': %f", tot);
       }
       break;
       case 'c':
       {
        tot=0;
        for(x=0; x<cnt; x++)
        {
                for(y=0; y<cnt; y++)
                {
                                if(y==-x+cnt)
                                tot=tot+mat [x][y];
                }
        }
        printf("Somma degli elementi sulla diagonale secondaria e\': %f", tot);
       }         
       break;
       default:
       {
        if(cnt<=3)
        {
         det = mat[0][0]*mat[1][1]*mat[2][2] + mat[0][1]*mat[1][2]*mat[2][0] + mat[0][2]*mat[1][0]*mat[2][1] - mat[2][0]*mat[1][1]*mat[0][2] - mat[2][1]*mat[1][2]*mat[0][0] - mat[2][2]*mat[1][0]*mat[0][1];
         printf("Il determinante della matrice e\': %f", det);
        }
        else
        printf("Non si può determinare con la regola di Sarrus ma, bisogna usare quella di Laplace"); 
       }
       }     
       system ("pause");
       return 0;
    }
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  10. #10
    Ciao,
    ho modificato il codice aggiungendo la matrice trasposta, però non so se il codice sia giusto oppure no.
    Fatemi sapere.
    Ciao e grazie:
    codice:
    //Matrice quadrata
    #include <stdio.h> 
    #include <string.h> 
    int main() 
    { 
       char scelta=0;
       int x=0, y=0, cnt=0; 
       float mat[10][10], val=0, det=0, tot=0, out=0;
       printf("Inserisci il valore che vuoi dare alla radice quadrata:\n");
       scanf("%d", &cnt);
       printf("Dati per la matrice quadrata: \n\n");
       for(x=0; x<cnt; x++)
       {
                for(y=0; y<cnt; y++)
                {
                         printf("Inserisci i dati della posizione matrice [%d][%d]", x,y);
                         scanf("%f", &val);
                         mat [x][y]=val;
                }
       }  
       printf("Scegli un' opzione:\n");
       printf(" a) La matrice trasposta:\n");
       printf(" b) La traccia della matrice degli elementi sulla diagonale principale:\n");
       printf(" c) La somma degli elementi della diagonale secondaria:\n");
       printf(" d) In caso di matrice di ordine n<=3 il determinante (regola di Sarrus):\n");
       printf("Scelta:");
       scanf("%c", &scelta);
       switch(scelta)
       {
       case 'a':
       {
        for(x=0; x<cnt; x++)
        {
          for(y=0; y<cnt; y++)
          {
                   mat [y][x]=mat[x][y];
                   out= mat [y][x];
                   printf("Ora la matrice trasposta ha in posizione [%d][%d] il valore: %f", out);
          }         
        }           
       }  
       break;                
       case 'b':
       {
        tot=0;
        for(x=0; x<cnt; x++)
        {
         tot=tot+mat [x][x];
        }
        printf("La traccia degli elementi sulla diagonale principale e\': %f", tot);
       }
       break;
       case 'c':
       {
        tot=0;
        for(x=0; x<cnt; x++)
        {
                for(y=0; y<cnt; y++)
                {
                                if(y==-x+cnt)
                                tot=tot+mat [x][y];
                }
        }
        printf("Somma degli elementi sulla diagonale secondaria e\': %f", tot);
       }         
       break;
       default:
       {
        if(cnt<=3)
        {
         det = mat[0][0]*mat[1][1]*mat[2][2] + mat[0][1]*mat[1][2]*mat[2][0] + mat[0][2]*mat[1][0]*mat[2][1] - mat[2][0]*mat[1][1]*mat[0][2] - mat[2][1]*mat[1][2]*mat[0][0] - mat[2][2]*mat[1][0]*mat[0][1];
         printf("Il determinante della matrice e\': %f", det);
        }
        else
        printf("Non si può determinare con la regola di Sarrus ma, bisogna usare quella di Laplace"); 
       }
       }     
       system ("pause");
       return 0;
    }
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.