PDA

Visualizza la versione completa : Stampa diagonale secondaria matrice C++


Rafwiz22
25-10-2014, 01:06
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:


#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");


}

Phyrans
25-10-2014, 01:14
#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.

Rafwiz22
25-10-2014, 01:18
Ti ringrazio per la risposta. Il mio problema è solo la stampa a video della seconda diagonale...potresti dirmi dove sbaglio nel codice?
Grazie ancora.

Phyrans
25-10-2014, 01:20
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...

Rafwiz22
25-10-2014, 01:28
Che stupido è vero mi stavo scervellando da mezz'ora per una cosa banale...sarà l'orario e l'inesperienza.
Grazie per l'aiuto.

Phyrans
25-10-2014, 01:41
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.

M.A.W. 1968
26-10-2014, 20:21
Vale la pena di ricordare che presentare codice di questo genere

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.

M.A.W. 1968
27-10-2014, 13:15
Per una utile appendice sulle proprietà intrinseche delle antidiagonali di una matrice generica, si veda anche qui (http://www.ioprogrammo.it/index.php?topic=21411.msg85149#msg85149) e ovviamente qui (http://forum.masterdrive.it/blogs/m-a-w-1968/zigzag-i-143/). 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.

Loading