Confronto righe e colonne di due matrici

di il
6 risposte

Confronto righe e colonne di due matrici

Salve a tutti... stavo provando ad affrontare una prova d'esame degli anni passati per esercitarmi, ma sto riscontrando delle difficoltà. Il testo è:
Siano dati due file testo contenenti la dimensione e gli elementi di una matrice quadrata di numeri interi. Scrivere un programma che individui le righe e le colonne delle due matrici contenenti gli stessi elementi.
Ad esempio:
file1:
3
1 2 3
4 5 6
1 2 4
file2:
3
1 2 3
4 2 3
1 2 3
il cout sarà : la riga 0 di mat 1 è uguale alla riga 0 e alla riga 2 di mat2; la colonna 0 di mat1 è uguale alla colonna 0 di mat2.
Ho iniziato creando due matrici e collocando al loro interno gli elementi dei file.
Ho iniziato a pensare l'algoritmo per confrontare le sole righe (per poi successivamente riadattarlo anche per le colonne), ma non funziona quindi credo di aver sbagliato qualcosa....

void confronta_righe(int** matrice1,int** matrice2,int& righe,int& colonne)
{
	int j=0;
	bool ok = true;
	for(int i=0;i<righe;i++)
	{
		for(int c=0;c<righe;c++)
		{
			j=0;
			while(matrice1[i][j]==matrice2[c][j]&& j<colonne)
			{
				j++;
				if(matrice1[i][j]==matrice2[c][j])
				ok=false;
			}
			if(ok)
			cout<<"sono uguali";
		}
	}
}
e ho anche provato l'alternativa
void confronta_righe(int** matrice1,int** matrice2,int& righe,int& colonne)
{
	int j=0;
	int contatore=0;
	for(int i=0;i<righe;i++)
	{
		for(int c=0;c<righe;c++)
		{
			j=0;
			if(matrice1[i][j]==matrice2[c][j])
			{
				contatore=1;
				do
				{
				j++;
				if(matrice1[i][j]==matrice2[c][j])
					{
					contatore++;
					}
				}
				while(matrice1[i][j]==matrice2[c][j])
			if(contatore==colonne)
			cout<<"sono uguali";
		}
	}
}
Ma nessuno dei due rileva le righe uguali quindi ho evidentemente sbagliato qualcosa che non riesco proprio a capire dato che ci sto sopra da ore ormai!
un aiuto? grazie mille per eventuali risposte

6 Risposte

  • Re: Confronto righe e colonne di due matrici

    leonidus ha scritto:


    salve a tutti... stavo provando ad affrontare una prova d'esame degli anni passati per esercitarmi, ma sto riscontrando delle difficoltà. Il testo è:
    Siano dati due file testo contenenti la dimensione e gli elementi di una matrice quadrata di numeri interi. Scrivere un programma che individui le righe e le colonne delle due matrici contenenti gli stessi elementi.
    Ad esempio:
    file1:
    3
    1 2 3
    4 5 6
    1 2 4
    file2:
    3
    1 2 3
    4 2 3
    1 2 3
    il cout sarà : la riga 0 di mat 1 è uguale alla riga 0 e alla riga 2 di mat2; la colonna 0 di mat1 è uguale alla colonna 0 di mat2.
    Ho iniziato creando due matrici e collocando al loro interno gli elementi dei file.
    Ho iniziato a pensare l'algoritmo per confrontare le sole righe (per poi successivamente riadattarlo anche per le colonne), ma non funziona quindi credo di aver sbagliato qualcosa....
    
    void confronta_righe(int** matrice1,int** matrice2,int& righe,int& colonne)
    {
    	int j=0;
    	bool ok = true;
    	for(int i=0;i<righe;i++)
    	{
    		for(int c=0;c<righe;c++)
    		{
    			j=0;
    			while(matrice1[i][j]==matrice2[c][j]&& j<colonne)
    			{
    				j++;
    				if(matrice1[i][j]==matrice2[c][j])
    				ok=false;
    			}
    			if(ok)
    			cout<<"sono uguali";
    		}
    	}
    }
    
    e ho anche provato l'alternativa
    void confronta_righe(int** matrice1,int** matrice2,int& righe,int& colonne)
    {
    	int j=0;
    	int contatore=0;
    	for(int i=0;i<righe;i++)
    	{
    		for(int c=0;c<righe;c++)
    		{
    			j=0;
    			if(matrice1[i][j]==matrice2[c][j])
    			{
    				contatore=1;
    				do
    				{
    				j++;
    				if(matrice1[i][j]==matrice2[c][j])
    					{
    					contatore++;
    					}
    				}
    				while(matrice1[i][j]==matrice2[c][j])
    			if(contatore==colonne)
    			cout<<"sono uguali";
    		}
    	}
    }
    Ma nessuno dei due rileva le righe uguali quindi ho evidentemente sbagliato qualcosa che non riesco proprio a capire dato che ci sto sopra da ore ormai!
    un aiuto? grazie mille per eventuali risposte
    Ciao, per il check delle righe uguali dovresti scrivere qualcosa del genere:
    void confronta_righe(int** matrice1,int** matrice2,int& righe,int& colonne)
    {
    	int countRowEqual = 0;
    	for (int i=0; i< righe; ++i){
    		for(int j=0; j<colonne; ++j)
    			if(matrice1[i][j] == matrice2[i][j])
    				if(j == colonne-1)
    					countRowEqual++;
    			else
    				break;
    				
    	}
    	
    	printf("Rows Equals are : %d",countRowEqual);
    }
    Non l'ho provato, ma dovrebbe funzionare. Prova a fare la stessa cosa per il check delle colonne.
    Se hai problemi, o dubbi, sul codice a disposizione
  • Re: Confronto righe e colonne di due matrici

    Ciao, grazie per la risposta In questi giorni ho provato un altro algoritmo che sembra funzionare, ossia :
    void confronta_colonna(int** matrice1,int** matrice2,int& numerorighe, int& colonna,int& numerocolonne)
    {
    	bool ok;
    	int j;
    	for(int i=0;i<numerocolonne;i++)
    	{
    		ok=true;
    		j=0;
    		while(ok==true&&j<numerorighe)
    		{
    			if(matrice1[j][colonna]!=matrice2[j++][i])
    			ok=false;
    		}
    		if(ok==true)
    		cout<<"La colonna "<<colonna+1<<" della prima matrice e la colonna "<<i+1<<" della seconda matrice sono uguali"<<endl;
    Pensi vada bene in alternativa al tuo oppure ha qualcosa che si puo migliorare?
  • Re: Confronto righe e colonne di due matrici

    leonidus ha scritto:


    ciao, grazie per la risposta In questi giorni ho provato un altro algoritmo che sembra funzionare, ossia :
    void confronta_colonna(int** matrice1,int** matrice2,int& numerorighe, int& colonna,int& numerocolonne)
    {
    	bool ok;
    	int j;
    	for(int i=0;i<numerocolonne;i++)
    	{
    		ok=true;
    		j=0;
    		while(ok==true&&j<numerorighe)
    		{
    			if(matrice1[j][colonna]!=matrice2[j++][i])
    			ok=false;
    		}
    		if(ok==true)
    		cout<<"La colonna "<<colonna+1<<" della prima matrice e la colonna "<<i+1<<" della seconda matrice sono uguali"<<endl;
    Pensi vada bene in alternativa al tuo oppure ha qualcosa che si puo migliorare?
    Ho dato una lettura veloce, mi sembra che possa andare, a quanto vedo invece di avere una funzione che fa il check su tutte le colonne, ne hai scritta una che fa il check sulla singola colonna che gli dai tu in input. Immagino che comunque la funzione confronta_colonna tu l'abbia inserita in un for e la chiami mano mano.
  • Re: Confronto righe e colonne di due matrici

    CarDeFusco ha scritto:


    leonidus ha scritto:


    ciao, grazie per la risposta In questi giorni ho provato un altro algoritmo che sembra funzionare, ossia :
    void confronta_colonna(int** matrice1,int** matrice2,int& numerorighe, int& colonna,int& numerocolonne)
    {
    	bool ok;
    	int j;
    	for(int i=0;i<numerocolonne;i++)
    	{
    		ok=true;
    		j=0;
    		while(ok==true&&j<numerorighe)
    		{
    			if(matrice1[j][colonna]!=matrice2[j++][i])
    			ok=false;
    		}
    		if(ok==true)
    		cout<<"La colonna "<<colonna+1<<" della prima matrice e la colonna "<<i+1<<" della seconda matrice sono uguali"<<endl;
    Pensi vada bene in alternativa al tuo oppure ha qualcosa che si puo migliorare?
    Ho dato una lettura veloce, mi sembra che possa andare, a quanto vedo invece di avere una funzione che fa il check su tutte le colonne, ne hai scritta una che fa il check sulla singola colonne che gli dai tu in input. Immagino che comunque la funzione confronta_colonna tu l'abbia inserita in un for e la chiami mano mano.
    si scusami,ho dimenticato di dirlo, ho inserito questa funzione in un'altra che invece di chiamarsi confronta_colonna si chiama appunto confronta_colonne e fa scorrere questa funzione su tutte le colonne può andare?
  • Re: Confronto righe e colonne di due matrici

    leonidus ha scritto:


    CarDeFusco ha scritto:


    leonidus ha scritto:


    ciao, grazie per la risposta In questi giorni ho provato un altro algoritmo che sembra funzionare, ossia :
    void confronta_colonna(int** matrice1,int** matrice2,int& numerorighe, int& colonna,int& numerocolonne)
    {
    	bool ok;
    	int j;
    	for(int i=0;i<numerocolonne;i++)
    	{
    		ok=true;
    		j=0;
    		while(ok==true&&j<numerorighe)
    		{
    			if(matrice1[j][colonna]!=matrice2[j++][i])
    			ok=false;
    		}
    		if(ok==true)
    		cout<<"La colonna "<<colonna+1<<" della prima matrice e la colonna "<<i+1<<" della seconda matrice sono uguali"<<endl;
    Pensi vada bene in alternativa al tuo oppure ha qualcosa che si puo migliorare?
    Ho dato una lettura veloce, mi sembra che possa andare, a quanto vedo invece di avere una funzione che fa il check su tutte le colonne, ne hai scritta una che fa il check sulla singola colonne che gli dai tu in input. Immagino che comunque la funzione confronta_colonna tu l'abbia inserita in un for e la chiami mano mano.
    si scusami,ho dimenticato di dirlo, ho inserito questa funzione in un'altra che invece di chiamarsi confronta_colonna si chiama appunto confronta_colonne e fa scorrere questa funzione su tutte le colonne può andare?
    Come già ti ho detto, da una lettura veloce sembra funzionare. Chiaramente fai le dovute prove e vedi se è tutto ok. Puoi provare poi ad implementare il check con le colonne con la mia soluzione. Magari per esercizio vedi anche il tempo di esecuzione, per il futuro ti consiglio di ridurre i cicli annidati ed i while annidati quando scrivi codice. Questo perché anche se per piccoli input è veloce, per grandi input fai salire il tempo d'esecuzione perché più cicli annidati hai e più sale la complessità computazionale
  • Re: Confronto righe e colonne di due matrici

    Ho capito, grazie mille, provero!
Devi accedere o registrarti per scrivere nel forum
6 risposte