"Siano date in ingresso due matrici quadrate di numeri interi M1 e M2,entrambe aventi la stessa dimensione. Scrivere un programma che verifichi se esistono due diagonali , una in M1 e l'altra in M2, che includono gli stessi valori indipendentemente dalla loro posizione e dalla loro frequenza di occorrenza. Per lo svolgimento di tale operazione si considerino solo le diagonali parallele alla diagonale principale. Stampare infine gli elementi delle due diagonali trovate.
Si organizzi il programma in sottoprogrammi."
L'ho risolto e pare che funziona, ma come sempre vorrei avere dei pareri.
EDIT: Piccola modifica al codice.
- Codice:
#include <iostream>
#include<cstdlib>
#define nmax 100
using namespace std;
void leggi_vettore(int dim,int V[])
{
for(int i=0;i<dim;i++)
{
cout<<"\nInserisci l'elemento "<<i+1<<" ";
cin>>V[i];
}
}
void stampa_vettore(int dim,int V[])
{
for(int i=0;i<dim;i++)
{
cout<<" "<<V[i];
}
}
void leggi_matrice(int nrig,int ncol,int M[][nmax])
{
for(int i=0;i<nrig;i++)
{
cout<<"\n";
for(int j=0;j<ncol;j++)
{
cout<<"Inserisci l'elemento posto alla riga "<<i+1<<" e alla colonna "<<j+1<<"\n";
cin>>M[i][j];
}
}
}
void stampa_matrice(int nrig,int ncol,int M[][nmax])
{
for(int i=0;i<nrig;i++)
{
cout<<"\n";
for(int j=0;j<ncol;j++)
{
cout<<" "<<M[i][j]<<" ";
}
}
}
void elimina_k_elementi(int k,int pos,int & dim,int V[])
{
int j=pos-1;
for(int i=j;i<dim-k;i++)
{
V[i]=V[i+k];
}
dim=dim-k;
}
void ordina_crescente(int dim,int V[])
{
int min;
int posmin;
for(int j=0;j<dim-1;j++)
{
min=V[j];
posmin=j;
for(int i=j+1;i<dim;i++)
{
if(V[i]<min)
{
min=V[i];
posmin=i;
}
}
V[posmin]=V[j];
V[j]=min;
}
}
void elem_dist(int dim, int V[])
{
ordina_crescente(dim,V);
int j=0;
while(j<dim-1)
{
if(V[j]==V[j+1])
{
elimina_k_elementi(1,j+1,dim,V);
}
else
++j;
}
}
bool controlla_uguaglianza_vettori(int dim1, int V1[], int dim2, int V2[])
{
if(dim1!=dim2)
{
return 0;
}
int j=0;
while(j<=dim1-1)
{
if(V1[j]==V2[j])
++j;
else
{
return 0;
}
}
return 1;
}
int main()
{
int M1[nmax][nmax];
int M2[nmax][nmax];
cout<<"Scegliere la dimensione di 2 matrici quadrate M1 e M2\n";
int dim;
cin>>dim;
leggi_matrice(dim,dim,M1);
cout<<"M1 = ";
stampa_matrice(dim,dim,M1);
leggi_matrice(dim,dim,M2);
cout<<"M2 = ";
stampa_matrice(dim,dim,M2);
//creo un vettore di supporto V1 in cui memorizzare una diagonale di M1 e un vettore di supporto V2 in cui memorizzare una diagonale di M2
int V1[nmax];
int dim1;
int V2[nmax];
int dim2;
//INIZIO PRIMO PEZZO
for(int h=2;h<dim;h++)
{
dim1=h;
for(int i=0;i<h;i++)
{
V1[i]=M1[dim-h+i][i];
}
elem_dist(dim1,V1);
//ciclo che memorizza in V2 la diagonale di M2 che va dalla prima diagonale a partire da sinistra alla diagonale immediatamente a sinistra della principale
for(int k=2;k<dim;k++)
{
dim2=k;
for(int i=0;i<k;i++)
{
V2[i]=M2[dim-k+i][i];
}
elem_dist(k,V2);
if(controlla_uguaglianza_vettori(dim1,V1,k,V2))
{
cout<<"\nHo trovato due diagonali!";
cout<<"\nd1 = ";
for(int i=0;i<h;i++)
{
cout<<" "<<M1[dim-h+i][i];
}
cout<<"\nd2 = ";
for(int i=0;i<k;i++)
{
cout<<" "<<M2[dim-k+i][i];
}
exit(0);
}
}
//ciclo che memorizza in V2 la diagonale di M2 che va da quella immediatamente a destra della principale all'ultima
for(int j=dim-1;j>1;j--)
{
dim2=j;
for(int i=0;i<j;i++)
{
V2[i]=M2[i][dim-j+i];
}
elem_dist(j,V2);
if(controlla_uguaglianza_vettori(dim1,V1,j,V2))
{
cout<<"\nHo trovato due diagonali!";
cout<<"\nd1 = ";
for(int i=0;i<h;i++)
{
cout<<" "<<M1[dim-h+i][i];
}
cout<<"\nd2 = ";
for(int i=0;i<j;i++)
{
cout<<" "<<M2[dim-j+i][i];
}
exit(0);
}
}
}
//INIZIO SECONDO PEZZO
for(int h=dim-1;h>1;h--)
{
dim1=h;
for(int i=0;i<h;i++)
{
V1[i]=M1[i][dim-h+i];
}
elem_dist(dim1,V1);
//ciclo che memorizza in V2 la diagonale di M2 che va dalla prima diagonale a partire da sinistra alla diagonale immediatamente a sinistra della principale
for(int k=2;k<dim;k++)
{
dim2=k;
for(int i=0;i<k;i++)
{
V2[i]=M2[dim-k+i][i];
}
elem_dist(k,V2);
if(controlla_uguaglianza_vettori(dim1,V1,k,V2))
{
cout<<"\nHo trovato due diagonali!";
cout<<"\nd1 = ";
for(int i=0;i<h;i++)
{
cout<<" "<<M1[i][dim-h+i];
}
cout<<"\nd2 = ";
for(int i=0;i<k;i++)
{
cout<<" "<<M2[dim-k+i][i];
}
exit(0);
}
}
//ciclo che memorizza in V2 la diagonale di M2 che va da quella immediatamente a destra della principale all'ultima
for(int j=dim-1;j>1;j--)
{
dim2=j;
for(int i=0;i<j;i++)
{
V2[i]=M2[i][dim-j+i];
}
elem_dist(j,V2);
if(controlla_uguaglianza_vettori(dim1,V1,j,V2))
{
cout<<"\nHo trovato due diagonali!";
cout<<"\nd1 = ";
for(int i=0;i<h;i++)
{
cout<<" "<<M1[i][dim-h+i];
}
cout<<"\nd2 = ";
for(int i=0;i<j;i++)
{
cout<<" "<<M2[i][dim-j+i];
}
exit(0);
}
}
}
//messaggio nel caso non viene trovato nulla
cout<<"\nNon ci sono diagonali che soddisfano le condizioni richieste";
}