PDA

Visualizza la versione completa : [C++] Controllo uguaglianze righe e colonne tra due matrici


Mrhide1
28-06-2016, 10:30
Buongiorno a tutti,ho un problema con questo programma date due matrici prese da due file devo vedere se presentano righe e colonne uguali. Lettura e stampa delle due matrici fila liscio ma per le uguaglianze invece non capisco perch� non mi da il risultato voluto,in sostanza per la comparazione ho ragionato cos�: la prima riga della prima matrice la devo comparare con ogni riga della seconda matrice,la seconda riga della prima matrice con ogni riga della seconda matrice e cos� via,quindi ho pensato che l'unico indice che avevano in comune le due matrice era quella delle colonne mentre avrei dovuto usare due indici diversi per le righe. Nel codice perci� ho scritto un primo for riguardante le righe della prima matrice il quale incrementa il suo indice solo dopo aver fatto tutte le comparazione con ogni riga della seconda matrice(essere uscita dal while).Posto qui la parte incriminata del codice riguardante la comparazione,tanto il resto � solo lettura e stampa.



int k = 0;
int j = 0;

for(int i = 0; i < righe ; i++)
{


while ( mat1[i][j] == mat2[k][j] && j < colonne && k < righe)
{
j++;
if (j == colonne-1)
{
k++;
cout << "true\n";
}




}

j = 0;


}


Non date molto conto al cout << "true" � solo per rendermi conto se le comparazione le fa bene,infatti ho avuto anche la falsa speranza di aver fatto bene il programma perch� mi dava due true poich� la seconda matrice ha due righe uguali ad una riga della prima ma mettendo anche una terza riga nella matrice 2 uguale alla medesima riga nella matrice 1 mi ridava comunque due true,chiaramente c'� qualcosa che non va.

Mrhide1
28-06-2016, 12:39
Penso di essere quasi arrivato alla soluzione, il problema che nella comparazione il programma considera solo le prime due posizione delle mie matrici 3x3 infatti mi dice che la prima riga dalla matrice 1 (1 2 3) uguale alla prima riga della seconda matrice (1 2 5).Ho pensato di togliere dall'if il -1 ma cos non esco dal while forzatamente facendo crashare il programma?


for (int i = 0;i < righe; i++) {
for (int k = 0; k < righe; k++)
{
int j = 0;
while (mat1[i][j]==mat2[k][j] && j < colonne)
{
j++;
if (j == colonne)
cout << "La riga " << i+1 << " della prima matrice e' uguale alla riga " << k+1 << " della seconda matrice\n";
}
}
}
}

Scara95
28-06-2016, 20:20
Basta che inverti l'ordine di
mat1[i][j]==mat2[k][j] && j < colonne
Ovvero basta che fai
j < colonne && mat1[i][j]==mat2[k][j]
Oppure aggiungi un break all'interno dell'if.

Mrhide1
30-06-2016, 16:56
no vabb credo di aver capito perch andava bene,in sostanza invece di partire con j = 0 come avevo impostato, le comparazioni partono da 1 perch gi con la prima uguaglianza il contatore viene aumentato quindi l'ultima comparazione coincide esattamente con il numero massimo di colonne che 4. Tuttavia sto trovando problemi per quanto riguarda le colonnE e in questo caso mi crash il programma:


void uguaglia_colonne (int **mat1,int **mat2,int righe,int colonne){
for (int j = 0;j < colonne; j++)
{
for (int k = 0; k < colonne; k++)
{
int i = 0;
while (mat1[i][j]==mat2[i][k] && i < righe)
{
i++;
if (i == righe)
cout << "La colonna " << j+1 << " della prima matrice e' uguale alla colonna " << k+1 << " della seconda matrice\n";
}
}
}


}

Mrhide1
30-06-2016, 19:22
comunque per curiosit cosa cambia dallo scrivere nel while le condizioni in ordine differente? nel mio caso controlla prima se l'indice j minore di colonne e quindi in caso arriva alla condizione dell'if esce dal while prima di far crashare tutto?

Scara95
01-07-2016, 00:10
Il codice era corretto se facevi una delle due cose che avevo detto. Gli indici vanno da 0 a n-1 estremi compresi. Il problema che provi ad accedere anche alla posizione n. Invertire l'ordine dei controlli o aggiungere un break nell'if evita ci.
Perch invertire l'ordine dei controlli risolve il problema? Per quella che si chiama short-circuit evaluation (https://en.wikipedia.org/wiki/Short-circuit_evaluation).

Mrhide1
01-07-2016, 11:20
si infatti ho fatto come hai detto tu ,per le colonne ho invertito l'ordine dei controlli e fila liscio.Comunque grazie Scara

Scara95
02-07-2016, 17:59
Figurati :ciauz:

Loading