Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77

    [C++] Controllo uguaglianze righe e colonne tra due matrici

    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.

    codice:
    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.
    Ultima modifica di Mrhide1; 28-06-2016 a 10:46

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    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?

    codice:
    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";
                }
            }
        }
        }
    Ultima modifica di Mrhide1; 28-06-2016 a 13:20

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Basta che inverti l'ordine di
    codice:
    mat1[i][j]==mat2[k][j] && j < colonne
    Ovvero basta che fai
    codice:
    j < colonne && mat1[i][j]==mat2[k][j]
    Oppure aggiungi un break all'interno dell'if.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    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:

    codice:
    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";
                }
            }
        }
    
    
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    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?

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    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.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    si infatti ho fatto come hai detto tu ,per le colonne ho invertito l'ordine dei controlli e fila liscio.Comunque grazie Scara

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Figurati
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.