Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Stampa diagonale secondaria matrice C++

    Salve ragazzi sono un nuovo membro del forum quindi scusate per eventuali errori.
    Il mio problema è che non riesco a stampare a video gli elementi della diagonale secondaria di una matrice...me ne stampa solo 1.
    Vi posto il programma che comprende anche la stampa della diagonale principale (non ci sono stati problemi su questa)

    codice:
    codice:
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main (){
    
    int mat[10][10];
    int i,j;
    int n1,n2;
    
    
    cout<<"\n Diagonali matrice max 10x10";
    
    do
    {
    
      cout<<"\n\nSpecificare grandezza riga     :";
      cin>>n1;
    
      cout<<"\nSpecificare grandezza colonna: :";
      cin>>n2;
    
      if(n1!=n2)
      {
      cout<<"\nERRORE la matrice deve essere quadrata.Riprova!";
      
      }
      
    }
    
    while(n1!=n2);
    
    //inserimento dati matrice
    
    for(i=0; i<n1; i++)
    {
        for(j=0; j<n2; j++)
        {
    
          cout<<"\nInserisci elemento riga "<<i+1<<" colonna "<<j+1<<" :";
          cin>>mat[i][j]; 
         
        }
    }    
    
    //stampa matrice
    
    for (i=0; i<n1; i++)
    {
        for (j=0; j<n2; j++)
        {
          
        cout << "mat["<<i+1<<"]["<<j+1<<"]=" << mat[i][j]<<endl;
        
        }
    
    }
    
    //stampa diagonale 1
    
    cout<<"\n Diagonale 1= ";
    
    for (i=0; i<n1; i++)
    {
        
        for (j=0; j<n2; j++)
        {
          
            if(i==j)
            {
            
            cout<<mat[i][j]<< "  ";
            }
    
        }
    }
    
    //stampa diagonale 2
    
    cout<<"\n Diagonale 2= ";
    
    for (i=0; i<n1; i++)
    {
        
        for (j=0; j<n2 ; j++)
        {
          
            if(i==j-n1+1)
            {
            
            cout<<mat[i][j]<< "  ";
            }
    
        }
    }
    
    
    cout<<endl<<endl;
    system("pause");
    
    
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    7
    codice:
    #include <iostream>
    #include <cstdlib>
    
    
    using namespace std;
    
    
    int main (){
    
    
    int mat[10][10];
    int i,j;
    int n1,n2;
    
    
    
    
    cout<<"\n Diagonali matrice max 10x10";
    
    
    do
    {
    
    
      cout<<"\n\nSpecificare grandezza riga     :";
      cin>>n1;
    
    
      cout<<"\nSpecificare grandezza colonna: :";
      cin>>n2;
    
    
      if(n1!=n2)
      {
      cout<<"\nERRORE la matrice deve essere quadrata.Riprova!";
      
      }
      
    }
    
    
    while(n1!=n2);
    
    
    //inserimento dati matrice
    
    
    for(i=0; i<n1; i++)
    {
        for(j=0; j<n2; j++)
        {
    
    
          cout<<"\nInserisci elemento riga "<<i+1<<" colonna "<<j+1<<" :";
          cin>>mat[i][j]; 
         
        }
    }    
    
    
    //stampa matrice
    
    
    for (i=0; i<n1; i++)
    {
        for (j=0; j<n2; j++)
        {
          
        cout << "mat["<<i+1<<"]["<<j+1<<"]=" << mat[i][j]<<endl;
        
        }
    
    
    }
    
    
    //stampa diagonale 1
    
    
    cout<<"\n Diagonale 1= ";
    
    
    for (i=0; i<n1; i++)
    {
        
        for (j=0; j<n2; j++)
        {
          
            if(i==j)
            {
            
            cout<<mat[i][j]<< "  ";
            }
    
    
        }
    }
    
    
    //stampa diagonale 2
    
    
    cout<<"\n Diagonale 2= ";
    
    
    for (i=0; i<n1; i++)
    {
        for (j=0; j<n2 ; j++)
        {
          
           if(i+j==(n1-1))
            {
            cout<<mat[i][j]<< "  ";
            }
    
    
        }
    }
    
    
    
    
    cout<<endl<<endl;
    system("pause");
    }
    Ti ho risolto il problema, cerca comunque di gestire il codice in maniera piu' ottimizzata e stai attento agli errori.
    Ultima modifica di Phyrans; 25-10-2014 a 00:18

  3. #3
    Ti ringrazio per la risposta. Il mio problema è solo la stampa a video della seconda diagonale...potresti dirmi dove sbaglio nel codice?
    Grazie ancora.

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    7
    Ho modificato appena adesso il messaggio, comunque esistono varie soluzioni.
    Per la diagonale secondaria la condizione corretta per trovare gli elementi è verificare quando la somma dei due indici e' uguale alla dimensione-1, quindi tradotto in codice: if(i+j==(n1-1)) AZIONE;
    Ecco dove sbagliavi...
    Ultima modifica di Phyrans; 25-10-2014 a 00:24

  5. #5
    Che stupido è vero mi stavo scervellando da mezz'ora per una cosa banale...sarà l'orario e l'inesperienza.
    Grazie per l'aiuto.

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    7
    Comunque rivediti il codice perché ci sono istruzioni alquanto inutili, e sprechi di memoria che non servono! Per esempio riservi 8byte per la dimensione della Matrice (ovvero allochi due interi), quando te la potresti cavare benissimo con una sola variabile essendo appunto quadrata la matrice, ed un quadrato essendo tale, ha tutti i lati uguali quindi stessa dimensione. Prova a riscrivere il codice migliorandolo e posta di nuovo la soluzione.

  7. #7
    Vale la pena di ricordare che presentare codice di questo genere
    codice:
    cout<<"\n Diagonale 1= ";
    
    for (i=0; i<n1; i++)
    {
        for (j=0; j<n2; j++)
        {
            if(i==j)
            {
                cout<<mat[i][j]<< "  ";
            }
        }
    }
    in sede di esame o colloquio lavorativo può comportare una bocciatura/rifiuto, o nel migliore dei casi un drastico abbassamento del voto.

    Non è assolutamente necessario usare addirittura due variabili di induzione e un duplice loop annidato (con complessità computazionale quadratica!) contenente per giunta una if() per stampare valori in posizioni notevoli di una matrice quadrata. Tutti gli indici possono (e devono) essere ricavati linearmente da una singola variabile di induzione tramite banali manipolazioni aritmetiche. Nel caso della diagonale principale, ciascun elemento è identificabile come ai,i mentre per l'antidiagonale o diagonale secondaria vale la ben nota proprietà che la somma degli indici è costante, e pari alla dimensione della matrice, proprietà peraltro già richiamata nel corso del thread. In tal modo si evitano inefficienze assai rilevanti, che possono risultare fortemente penalizzanti in molti contesti.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  8. #8
    Per una utile appendice sulle proprietà intrinseche delle antidiagonali di una matrice generica, si veda anche qui e ovviamente qui. Non occorre sottolineare nuovamente, spero, che per l'antidiagonale massimale (diagonale secondaria) il valore costante della somma nella modalità di indicizzazione zero based avrà valore pari alla dimensione della matrice diminuita di uno.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.