Ricerca occorrenze in matrice

di Anonimizzato9570 il
44 risposte

44 Risposte - Pagina 2

  • 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;
         
         }
    
  • 
     if (inserisci)
                                v2[rpm].val=v[i];
                                v2[rpm].occ=occ;
    
    Devi racchiudere questo blocco fra parentesi
  • 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
  • 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;
    }
    
  • Sorry, era indentato troppo largo e nel form non capiva, cmq vedi l'errore?
  • 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
  • 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
  • Mi stampi il codice modificato e i valori che hai inserito nella matrice per piacere?
  • 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 )
  • 
    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
  • 
     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ì
  • Non ho capito questo :
          if ( q == j  && p == i ); 
                 else {
    cioè se è vera quella condizione che fa?
  • 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;
    	}
    }
    
  • 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