"Siano dati in ingresso due matrici di numeri interi M1 e M2.
Si assuma che il numero di colonne di M1 sia uguale al numero
di righe di M2. Scrivere un programma che, per ogni riga di M1,individui la
colonna C di M2 avente il più elevato numero di elementi in comune
con tale riga. Si provveda quindi a scambiare gli elementi della
riga R con quelli della colonna C. Stampare infine le matrici M1 e M2 cosi ottenute."
La mia soluzione è questa ma il programma non funziona correttamente poiché la colonna di interesse non viene copiata nella corrispondente riga.
#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 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]<<" ";
}
}
}
int cerca_massimo(int dim,int V[])
{
int max=V[0];
for(int i=1;i<dim;i++)
{
if(max<V[i])
max=V[i];
}
return max;
}
int pos_max(int dim,int V[])
{
int max=V[0];
int posmax=0;
for(int i=1;i<dim;i++)
{
if(max<V[i])
{
max=V[i];
posmax=i;
}
}
return posmax+1;
}
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;
}
int nmax_elementi_comune(int dim1,int V1[],int dim2,int V2[])
{
int j=0;
int k;
int cont=0;
while(j<dim1)
{
k=0;
while(k<dim2&&j<dim1)
{
if(V1[j]==V2[k])
{
++cont;
elimina_k_elementi(1,1+j,dim1,V1);
elimina_k_elementi(1,1+k,dim2,V2);
k=0;
}
else
++k;
}
++j;
}
return cont;
}
void copia_riga_INvettore(int nrig,int ncol,int M[][nmax],int dimV,int V[],int riga)//questa funzione copia una riga di matrice in un vettore
{
for(int i=0;i<ncol;i++)
{
V[i]=M[riga-1][i];
}
}
void copia_colonna_INvettore(int nrig,int ncol,int M[][nmax],int dimV,int V[],int colonna)
{
for(int i=0;i<nrig;i++)
{
V[i]=M[i][colonna-1];
}
}
void copia_vettore_INriga(int nrig,int ncol,int M[][nmax],int dimV,int V[],int riga)//copia in una riga di matrice un vettore
{
for(int i=0;i<ncol;i++)
{
M[riga-1][i]=V[i];
}
}
void copia_vettore_INcolonna(int nrig,int ncol,int M[][nmax],int dimV,int V[],int colonna)
{
for(int i=0;i<nrig;i++)
{
M[i][colonna-1]=V[i];
}
}
int main()
{
int M1[nmax][nmax];
int M2[nmax][nmax];
int nrig1;
int dim;
cout<<"Scegli il numero di righe di una matrice M1 ";
cin>>nrig1;
cout<<"\nScegli il numero di colonne di M1 uguale al numero di righe di una matrice M2\n";
cin>>dim;
leggi_matrice(nrig1,dim,M1);
int ncol2;
cout<<"\nScegli il numero di colonne di M2 ";
cin>>ncol2;
leggi_matrice(dim,ncol2,M2);
cout<<"\nM1 = ";
stampa_matrice(nrig1,dim,M1);
cout<<"\nM2 = ";
stampa_matrice(dim,ncol2,M2);
int V1supporto[nmax];//qui memorizzo una riga di M1
int V2supporto[nmax];//qui memorizzo una colonna di M2
int V3supporto[nmax];//qui memorizzo il massimo numero di elementi in comune fra la riga di M1 e la colonna di M2
for(int i=0;i<nrig1;i++)
{
copia_riga_INvettore(nrig1,dim,M1,dim,V1supporto,i+1);
for(int j=0;j<ncol2;j++)
{
copia_colonna_INvettore(dim,ncol2,M2,dim,V2supporto,j+1);
V3supporto[j]=nmax_elementi_comune(dim,V1supporto,dim,V2supporto);
}
copia_colonna_INvettore(dim,ncol2,M2,dim,V2supporto,pos_max(dim,V3supporto));
copia_vettore_INriga(nrig1,dim,M1,dim,V2supporto,i+1);
copia_vettore_INcolonna(dim,ncol2,M2,dim,V1supporto,pos_max(dim,V3supporto));
}
cout<<"\nM1 = ";
stampa_matrice(nrig1,dim,M1);
cout<<"\nM2 = ";
stampa_matrice(dim,ncol2,M2);
}