Controllo righe matrice.

di il
4 risposte

Controllo righe matrice.

Devo controllare se almeno due righe di una matrice quadrata sono uguali.
Il mio ragionamento è prendere ogni volta due array della matrice che ho chiamato temp0 e temp1e confrontarli. Devo stampare "true" e ce ne sono almeno due uguali e "false" altrimenti. Il problema è che alcune volte gli array si soprappongono e quindi e quindi il programma pensa che siano due array uguali. In pratica mi manca un contatore che arrivi a 3. Se il contatore è >= 3 allora stampa "true" altrimenti stampa "false". Il problema è che non riesco a metterlo.

Vi posto il programma:

#include <iostream>

using namespace std;

const int dim = 4;


bool confronto(int temp0[dim],int temp1[dim])
{

bool x = true;
int count = 0;

while(x == true && count < dim)
{

        for(int i = 0; i < dim; i++)
        {
                if(temp0[i] != temp1[i])
                {
                        x = false;
                }
        count++;
        }


}


        if(x == true)
        {
                cout <<"True.\n";

                        for(int i = 0; i < dim; i++)
                        {
                                cout << temp0[i] <<"\n";

                        }


        }
}


int righe_uguali(int a[dim][dim])
{
        int temp0[dim];
        int temp1[dim];
        int k = 0;
        int d = 0;
        int h = 1;


while(d < dim)
{
        while(h < dim)
        {

                for(int j = 0; j < dim; j++)
                {  
                        temp0[j] = a[k][j];

                }
                        for(int j = 0; j < dim; j++)
                        {
                                temp1[j] = a[h][j];
                        }


                                 confronto(temp0,temp1);

        h++;
        }


h = 0;
d++;
k++;
}

return 0;

}


int main()
{

int a[dim][dim] = {{2,3,5,1},{3,4,1,4},{3,1,0,0},{3,4,1,4}};
righe_uguali(a);
return 0;
}
Questo è l'output:

True.
True.
True.
True.
True.
Ho messo che stampa "true" ogni volta che un array è uguale ad un altro. Come si vede dall'output conta alcune volte lo stesso array, perchè temp0 e temp1 sovrappongono. Dove/come posso mettere il contatore?

Grazie delle eventuali risposte.

4 Risposte

  • Re: Controllo righe matrice.

    Allora
    int mat1[5][5] // definizione matrice quadratica cioè stesso numero di righe e colonne!
    int indy,kindy,mindy,cindy // definizione degli indici della matrice indy = riga1 kindy =colonna cindy = indice di riga da analizzare mindy serve per vedere se le operazioni sono finite
    int uguale // serve per stabilire se le righe sono uguali
    indy=0;kindy=0;mindy=0;uguale=0; cindy=1 // inizializzazione variabili
    for (indy=0;indy<5;indy++)
       {
         for (kindy=0;kindy<5;kindy++)
             {
               cout << "inserisci riga " << indy << " colonna " << kindy << " : ";
               cin >> mat1[indy][kindy]
             }
        } // doppio ciclo per l'immissione della matrice
    indy=0;kindy=0;mindy=0;uguale=0; // rinizializzo le variabili per evitare casini
    while (mindy==0) // ciclo di verifica delle righe
          {
            cindy=indy+1;
            if (cindy > 4)  { mindy=1; goto fine_ciclo; }
            if (indy > 4) { mindy=1; goto fine_ciclo; }
             while (kindy < 5)
                   {
                     uguale++; // dai per scontato che gli elementi sono uguali
                     if ( mat1[indy][kindy] != mat[cindy][kindy]) // esce risparmia tempo se non lo sono
                       { kindy=4; uguale=0; }
                     kindy++;
                   }
            if (uguale == 5) // se tutti gli elementi sono uguali stampa il messaggio sottostante
              { cout << " le righe " << indy "  e " <<  cindy << " sono uguali "; }
           uguale=0; // vai alle prossime righe
           indy++; kindy = 0;
           fine_ciclo: ;
    }
    cosi dovrebbe funzionare.
    P.s. potresti farlo anche con i for ma ammeno che la matrice non contenga tutti dati uguali faresti lavorare il computer per senza niente!
    scusami per la modifica
    spero di esserti stato d'aiuto.
  • Re: Controllo righe matrice.

    Grazie per la tua risposta, ora la guardo attentamente.
    Ma per caso hai visto anche il mio di programma? Così da aiutarmi a mettere quel dannato contatore...
    Sono convinto che il tuo funzioni ma vorrei continuare l'algoritmo come ho fatto io per la semplice motivazione che lo capisco di più rispetto a quello che scrivono gli altri. Per me è ancora difficile capire il ragionamento degli altri..però guarderò il tuo.

    Grazie ancora della risposta !
  • Re: Controllo righe matrice.

    non preoccuparti delle scarse conoscenze qui stiamo tutti quanti per imparare
    allora vedendo il tuo codice ho notato diversi errori.
    nella funzione confronto
    non passi 2 vettori ma due variabili i vettori si passano utilizzando i puntatori.
    poi nella funzione righe_uguali
    1) commetti lo stesso errore di prima non passi una matrice ma passi una variabile.
    2) confronti un elemento di un vettore con un elemento di matrice
    3) a confronto passi due variabili che non sono state definite (mi meraviglio come il compilatore
    non ti abbia segnalato questo errore!)
    4) sinceramente il secondo ciclo for e inutile per 2 motivi
    primo perchè passerai sempre tempo[3] e temp1[3]
    secondo perchè la chiamata a confronto sta fuori hai due cicli.
    questo e codice tuo:
    while(d < dim)
    {
            while(h < dim)
            {
    
                    for(int j = 0; j < dim; j++)
                    {  
                            temp0[j] = a[k][j];
    
                    }
                            for(int j = 0; j < dim; j++)
                            {
                                    temp1[j] = a[h][j];
                            }
                                    confronto(temp0,temp1);
            h++;
            }
    
    
    h = 0;
    d++;
    k++;
    }
    
    usando il tuo stesso algoritmo io avrei fatto in questo modo.
    
    #include "stdafx.h" // questo serve per visual studio se non usi visual studio lo puoi pure omettere
    #include <iostream>
    using std::cout; // serve per poter attivare la cout
    using std::cin; // serve per poter attivare la cin
    using std::endl;
    using namespace std;
    const int dim = 4;
    // qui devi mettere i prototipi delle tue funzioni.
    bool confronto(int,int)
    int _tmain(int argc, _TCHAR* argv[]) // funzione principale per visual studio qui devi mettere la funzione principale secondo il tuo compilatore.
    {
    int a[dim][dim] = {{2,3,5,1},{3,4,1,4},{3,1,0,0},{3,4,1,4}};
    bool b;
    int d,h,k ,temp0,temp1,contatore;
    // al posto di creare la funzione righe_uguali la metto nella main
    temp0=0;
    temp1=0;
    k = 0;
    d = 0;
    h = 1;
    
    while(d < dim)
    {
            while(h < dim)
            {
    
                    for(int j = 0; j < dim; j++)
                    {  
                            temp0 = a[k][j];
                            temp1 = a[h][j];
                            b = confronto(temp0,temp1);
                           if ( b = true) { contatore++;}
                     }
                                             h++;
            }
    if (contatore == 4) { qui faccio stampare il messaggio che voglio}
    contatore=0;
    h = 0;
    d++;
    k++;
    }
    return 0;
    }
    bool confronto(int temp0,int temp1)
    {
    if (temp0== temp1) { return true; }
    return false;
    }
    comunque la prossima volta metti prima il main function e poi le tue funzioni cosi sarà più facile capire il codice!
    spero di averti fatto capire qualcosa.
  • Re: Controllo righe matrice.

    Io cercherei di semplificare:)
    Se ho capito bene vuoi solo sapere se ci sono almeno due righe uguali. E' vero? Se è così, userei un algoritmo molto semplice e risparmioso in termini di memoria e tempo di esecuzione:
    In linguaggio pseudo naturale abbiamo:
    
    uguali = falso;
    in un loop sul numero di riga i
      in un loop sul numero di riga j che parte da j+1
          in un loop su un indice k di colonna
             se l'elemento (i,k) è uguale dall'elemento (j,k) poni uguali = vero
             altrimenti poni uguali = falso e interrompi il ciclo su k;
      se (attento sono nel ciclo su j) uguali è vero allora esco dalla funzione restituendo gli indici di riga i  e j
    in C si può tradurre così
    #include <stdio.h>
    const int dim = 4;
    int confronta(int* r1, int* r2, int a[4][4]);
    int main(){
    	int matrice[4][4] = {{2,3,5,1},{3,4,1,4},{2,3,5,1},{3,4,1,4}};
        int riga1, riga2;
    	if (confronta(&riga1, &riga2, matrice)) {
    		printf("\n la riga %d è uguale alla riga %d",riga1,riga2);
    	}
        return 1;
    }
    int confronta(int* r1, int* r2, int a[4][4]) {
    	int i,j,k;
        int uguali = 0;
    	for (i=0;i<dim;i++) {
    		for (j=i+1;j<dim;j++) {
    			for (k=0;k<dim;k++) {
                    if (a[i][k]==a[j][k]) {
    					uguali = 1;
    			    } else {
    					uguali = 0;
    	                break;
    			    }
    		    }
    			if (uguali) {
    	            *r1 = i;
    	            *r2 = j;
    				return uguali;
    	        }
            }
        }
    	return 0;
    }
    
    Si può migliorare ma, non è male. E' abbastanza efficiente.
    Spero ti possa servire per approfondire il linguaggio C. Ti potrà dare molte soddisfazioni. Ciao.
Devi accedere o registrarti per scrivere nel forum
4 risposte