Ricerca occorrenze in matrice

di il
44 risposte

44 Risposte - Pagina 2

  • Re: Ricerca occorrenze in matrice

    Ho risolto, avevo inserito male i controlli di inserimento e di accrescimento rpm, lo posto risolto:
    
    //procedura per calcolare le occorrenze in un vettore :
    void calcolaOccorrenze(vettore v,int r, int i, vett & v2,int & rpm){
                        
                        rpm=0;   
                        for ( i=0;i<r-1;i++){
                        int occ=0;
                         bool riemp = false;//controllo su riempimento del vettore delle occorrenze
                        bool inserisci =false;//controllo per inserire gli elementi nel vett delle occorrenze
                         if(!ePresente( v, r, i, v2,rpm)){
                            for (int j=i+1;j<r;j++){
                                
                                                     if (v[i]==v[j]){
                                                                     inserisci=true;
                                                                     riemp=true;
                                                                     occ++;
                                                                     }
                                                    } 
                                if (inserisci)
                                v2[rpm].val=v[i];
                                v2[rpm].occ=occ;
                                if(riemp)
                                rpm++;}
                            
                        }    
                for (int p=0;p<rpm;p++)
                cout<<v2[p].val<<" si ripete "<<v2[p].occ <<" volte\n";    
                      
    }
    
    
    bool ePresente(vettore v, int r, int i,vett v2,int rpm){
         for ( int p=0;p<rpm;p++)
         if (v2[p].val==v[i]){
             return true;
         }
         
         return false;
         
         }
    
  • Re: Ricerca occorrenze in matrice

    
     if (inserisci)
                                v2[rpm].val=v[i];
                                v2[rpm].occ=occ;
    
    Devi racchiudere questo blocco fra parentesi
  • Re: Ricerca occorrenze in matrice

    Ale quello funziona benissimo, ora ripropongo l'esercizio con una matrice

    io ho fatto così, ma credo sia un problema di parentesi, puoi dargli un occhio?
    
    void ricercaOccorrenze(matrice m,int r, int c, int i, int j,vettore & v,int & rpm){
        rpm=0;
         for(int i=0;i<r;i++){
                 for(int j=0;j<c;j++){
                                       int occ=0;
                                       bool riemp = false;
                                       bool inserisci =false;
                                       if(!ePresente(m,r,c,i,j,v,rpm)){
                                                                        for(int p=0;p<r;p++){
                                                                                for(int q=j+1;j<c;j++){
                                                                                                       if(m[i][j]==m[p][q]){
                                                                                                                            inserisci=true;  
                                                                                                                             riemp=true;
                                                                                                                              occ++;
                                                                                                                                        
                                                                                                       } 
                                                                                                       if(inserisci){
                                                                                                                     v[rpm].val=m[i][j];
                                                                                                                     v[rpm].occ=occ;
                                                                                                                     }
                                                                                }
                                                        
                                    
                                                                                
                                                                        }  
                                                                        
                                               if(riemp)
                                               rpm++;                         
                                                                             
                                       } 
                                  
                     }
                 }
                 for (int m=0;m<rpm;m++)
                 cout<<"\nL' elemento "<<v[m].val<<" si ripete "<<v[m].occ<<" volte";
                 
                 cout<<endl<<endl;
         }
         
    
         
         
    bool ePresente (matrice m,int r,int c,int i,int j,vettore  v,int  rpm){
         
         for(int s=0;s<rpm;s++)
         if(m[i][j]==v[s].val){
                               
         return true;
         }
          
              return false;
              }
         
    
         
         
         
         
    
         
    si ferma alla prima riga
  • Re: Ricerca occorrenze in matrice

    Un po di identazione non farebbe male.
    
    void ricercaOccorrenze(matrice m,int r, int c, int i, int j,vettore & v,int & rpm)
    {
    	rpm=0;
    	for(int i=0;i<r;i++){
    		for(int j=0;j<c;j++){
    			int occ=0;
    			bool riemp = false;
    			bool inserisci =false;
    			if(!ePresente(m,r,c,i,j,v,rpm)){
    				for(int p=0;p<r;p++){
    					for(int q=j+1;j<c;j++){
    						if(m[i][j]==m[p][q]){
    							inserisci=true; 
    							riemp=true;
    							occ++;
     						}
    						if(inserisci){
    							v[rpm].val=m[i][j];
    							v[rpm].occ=occ;
    							rpm++;
    						}
    					}
    				} 
    			}
    			cout<<m[i][j];         
    		}
    	}
    	for (int m=0;m<rpm;m++)
    		cout<<"\nL' elemento "<<v[m].val<<" si ripete "<<v[m].occ<<" volte";
                 
    	cout<<endl<<endl;
    }
         
    bool ePresente (matrice m,int r,int c,int i,int j,vettore  v,int  rpm){
         
         for(int s=0;s<rpm;s++)
    		if(m[i][j]==v[s].val){
    			return true;
    		}
    	return false;
    }
    
  • Re: Ricerca occorrenze in matrice

    Sorry, era indentato troppo largo e nel form non capiva, cmq vedi l'errore?
  • Re: Ricerca occorrenze in matrice

    Il problema è che cerchi di fare tutto in un' unica funzione e quindi risulta più difficile ricercare l' errore ( questo è un consiglio per il futuro ). Se vedi il mio vecchio post , io ho creato una funzione a parte che conta il num di occorrenze . Comunque gli errori che vedo a prima lettura sono :

    la variabile booleana riemp a cosa serve?
    nella funzione ePresente passi tanti parametri ( esempio r e c che li passi a fare? )
    
    for(int p=0;p<r;p++){
                   for(int q=j+1;j<c;j++)
    

    p non deve essere = 0 ma = i , perchè devi sempre iniziare dal valore successivo che devi calcolare, e siccome utilizzi un metodo che blocchi le righe e muovi le colonne allora inizia da p= i e q= j+1
    
    if(!ePresente(m,r,c,i,j,v,rpm)){
                for(int p=0;p<r;p++){
                   for(int q=j+1;j<c;j++){
                      if(m[i][j]==m[p][q]){
                         inserisci=true; 
                         riemp=true;
                         occ++;
                      }
                      if(inserisci){
                         v[rpm].val=m[i][j];
                         v[rpm].occ=occ;
                         rpm++;
                      }
                   }
                } 
             }
    
    l' if (inserisci ) mettilo fuori dall' if ( !ePresente ).
    Vedi un pò come va
  • Re: Ricerca occorrenze in matrice

    Va meglio , mi trova tutte le occorrenze per riga, l'unico problema è che se su una riga non c'è l'occorrenza, lui mi inserisce nel vettore delle occorrenze comunque l'ultimo elemento
  • Re: Ricerca occorrenze in matrice

    Mi stampi il codice modificato e i valori che hai inserito nella matrice per piacere?
  • Re: Ricerca occorrenze in matrice

    No, ho provato a cambiare la matrice e mi fa ancora molti errori, vuoi dare un occhio al progetto? http://www.olivierogennaro.eu/wp-content/uploads/user_uploads/progetto.rar
  • Re: Ricerca occorrenze in matrice

    Non c'è bisogno, incollami il codice modificato come ti avevo detto e dammi un esempio di matrice che non funziona e lo leggo . Sono impegnato altrimenti l' avrei fatto io ( scusami xD )
  • Re: Ricerca occorrenze in matrice

    
    void ricercaOccorrenze(matrice m,int r, int c, int i, int j,vettore & v,int & rpm){
        rpm=0;
         for(int i=0;i<r;i++){
                 for(int j=0;j<c;j++){
                  int occ=0;
                  bool riemp = false;
                  bool inserisci =false;
                  if(!ePresente(m,r,c,i,j,v,rpm)){
                    for(int p=i;p<r;p++){
                     for(int q=j+1;j<c-1;j++){
                      if(m[i][j]==m[p][q]){
                        inserisci=true;  
                        riemp=true;
                        occ++;
                        } 
                      }
                    }  
                    if(inserisci){
                     v[rpm].val=m[i][j];
                     v[rpm].occ=occ;
                     }
                    if(riemp)
                     rpm++;                         
                  } 
                                  
                 }
               }
                 for (int m=0;m<rpm;m++)
                 cout<<"\nL' elemento "<<v[m].val<<" si ripete "<<v[m].occ<<" volte";
                 
                 cout<<endl<<endl;
         }
         
    
         
         
    bool ePresente (matrice m,int r,int c,int i,int j,vettore  v,int  rpm){
         
         for(int s=0;s<rpm;s++)
         if(m[i][j]==v[s].val){
                               
         return true;
         }
          
              return false;
              }
         
    
         
    esempio di esecuzione

    1 2 2 3 3
    3 4 5 6 1
    2 3 4 5 6
    7 8 9 8 7

    l'elemento 3 si ripete 2 volte
    l'elemento 3 si ripete 1 volte
    l'elemento 7 si ripete 1 volte
    l'elemento 7 si ripete 1 volte
  • Re: Ricerca occorrenze in matrice

    
     for(int p=i;p<r;p++){
                     for(int q=j+1;j<c-1;j++)
    
    Allora ora ti spiego ( oltre che nel for hai dichiarato q ma poi hai incrementato j o.O ):
    non si può utilizzare q=j+1 perchè quando deve andare alla riga successiva lui partirà sempre dalla colonna j+1 invece deve iniziare da q = 0 . Per la riga dovrebbe andare bene quindi si deve cambiare così:
    
     for(int p=i;p<r;p++){
          for(int q=0;q<c;q++) {
                 if ( q == j  && p == i ); 
                 else {
                       if(m[i][j]==m[p][q]) {
                         inserisci=true; 
                          riemp= true;
                         occ++;
                        } 
                 }
             }
        }
    
    Prova così
  • Re: Ricerca occorrenze in matrice

    Non ho capito questo :
          if ( q == j  && p == i ); 
                 else {
    cioè se è vera quella condizione che fa?
  • Re: Ricerca occorrenze in matrice

    Chiedo scusa. non ho seguito il problema dall'inizio ma adesso che stai mettendo l'esempio mi sembra chiaro ciò che vuoi fare e non capisco il perche di tutti questi for.
    Ecco un esempio fatto alla veloce.
    
    #include <iostream>
    
    
    struct elemento
    {
    	int valore;
    	int occorrenze;
    };
    
    elemento conteggio[100];
    size_t index = 0;
    
    void contaOccorrenze(int val)
    {
    	for(size_t i = 0; i < index; i++)
    	{
    		if(val == conteggio[i].valore)
    		{
    			conteggio[i].occorrenze++;
    			return;
    		}
    	}
    	conteggio[index].valore = val;
    	conteggio[index].occorrenze = 1;
    	index++;
    }
    
    int main()
    {
    	const int m[][5] = {{1, 2, 2, 3, 3},{3, 4, 5, 6, 1},{2, 3, 4, 5, 6},{7, 8, 9, 8, 7}};
    
    
    	for(size_t i = 0; i < 4; i++)
    	{
    		for(size_t j = 0; j < 5; j++)
    		{
    			contaOccorrenze(m[i][j]);
    		}
    	}
    	
    	for(size_t i = 0; i < index; i++)
    	{
    		std::cout << "Valore: " << conteggio[i].valore << " Occorrenze: " << conteggio[i].occorrenze << std::endl;
    	}
    }
    
  • Re: Ricerca occorrenze in matrice

    Perchè io devo mostrare per ogni riga quante occorrenze ci sono (se ci sono)
    quindi se un valore non ha un occorrenza non deve essere proprio preso in considerazione,
    ripartendo da capo il prof ha suggerito:
    usate una funzione per verificare se ogni elemento ha già un occorrenza (nel vettore delle occorrenze), se non è così esaminatelo, controllate se in tutta la matrice si ripete, se si lo inserite nel vettore delle occorrenze con il suo numero di occorrenze, altrimenti andate avanti
Devi accedere o registrarti per scrivere nel forum
44 risposte