Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C]Funzione per trasporre le matrici

    Ho scritto questo programma,che mi stampa pero' numeri altissimi e casuali che non hanno niente a che vedere con i valori della matrice che scelgo io con scanf.
    Ha 0 errori e 0 warnings.
    Ecco il codice:
    codice:
    #include <stdio.h>
    #define COLONNE 10;
    typedef int matrice[3][3];
    void trasposta(matrice);
    matrice mat;
    main()
    {
        int i,j,k,l;
        printf("Digita elementi matrice");
        for(i=0;i<3;i++)
          for(j=0;j<3;j++)
          {
            printf("Digita elemento riga%d,colonna%d: ",(i+1),(j+1));
            scanf("%d",&mat[i][j]);
            while(getchar()!=10)
              ;
          }
        printf("Visualizzazione matrice trasposta:\n");
        trasposta(mat);
        for(k=0;k<3;k++)
        {
          if(k>=1)
            printf("\n");
          for(l=0;l<3;l++)
            printf("%d;",mat[k][l]);
        }
        return 0;
    }
    void trasposta(matrice m)
    {
        int i,j,mat[3][3];
        for(i=0;i<3;i++)
          for(j=0;j<3;j++)
            m[i][j]=mat[j][i];
        for(i=0;i<3;i++)
          for(j=0;j<3;j++)
            mat[i][j]=m[i][j];
    }
    Siccome mat e' una variabile globale,in teoria dovrebbe funzionare,cosa c'e' che non va ?

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    8
    mat è una variabile globale ma dal momento che tu l'hai ridichiarata nella funzione "trasposta" non verrà utilizzata all'interno della funzione. In questa funzione verrà creata una nuova matrice "mat" che non è inizializzata e pertanto conterrà numeri a caso.

    esempio:

    codice:
    int i = 5;
    int pippo (int i)
    {
    
       if (i == 5)
       {
          int i = 9;
          return i;
       }
       return i;
    }
    
    int main (void)
    {
       printf ("%d", pippo(i));
    }
    la funzione cosa ritorna? 5 o 9?


    rivedi i concetti i visibilità delle variabili.

    ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    8
    ho clikkato troppo presto senza finire.

    un altro esempio che posso fare per farti capire il concetto di visibilità è simile a quello che ti ho proposto:

    codice:
    int i = 5;
    int pippo (int i)
    {
       {
          int i = 9;
          return i;
       }
       return i;
    }
    
    int main (void)
    {
       printf ("%d", pippo(i));
       return 0;
    }
    dove ho tolto anche "if".
    Di variabili "i" all'interno della funzione "pippo" ce n'è due, una vive all'esterno del blocco di codice delimitato dalle parentesi graffe e l'altra all'interno e le due variabili non si vedono. Infatti compilando il codice non risulta alcun errore.

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Scusate ho scritto un messaggio in piu' per sbaglio...

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ritornano tutte e due 9.
    Per sbaglio ho ridichiarato mat,in effetti avrei dovuto usare quella esterna gia' fornita.
    Ecco come avrei dovuto fare:
    codice:
    void trasposta(matrice m)
    {
        int i,j;
        for(i=0;i<3;i++)
          for(j=0;j<3;j++)
            m[i][j]=mat[j][i];
        for(i=0;i<3;i++)
          for(j=0;j<3;j++)
            mat[i][j]=m[i][j];
    }
    Ma non mi fa la trasposta,se per esempio digito 1 2 3 1 2 3 1 2 3 (la matrice e' questa
    1 2 3
    1 2 3
    1 2 3
    Ecco il risultato che mi da:
    1 1 1
    1 2 2
    1 2 3

  6. #6
    così facendo sovrascrivi i valori degli elementi della matrice, perdendoli.
    devi usare una variabile temporanea e fare direttamente lo swap.

    codice:
    void swap(int i, int j)
    {
       int tmp = mat[i][j];
       mat[i][j] = mat[j][i];
       mat[j][i] = tmp;
    }
    
    for (i = 0; i < 3; i ++)
       for (j = i; j < 3; j ++)
          swap(i, j);
    occhio che vale solo per matrici quadrate!

    edit: in realtà, sempre in presenza di matrici quadrate, la diagonale si potrebbe lasciare inalterata.

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.