Confrontare array di array di caratteri

di il
24 risposte

24 Risposte - Pagina 2

  • Re: Confrontare array di array di caratteri

    È uguale, ho provato
  • Re: Confrontare array di array di caratteri

    void ordinaNomi( Elenco e,int r){
    
       bool ordine = true;
       for(int i=0;i<r;i++){
          for (int j=0;j<r;j++)
    {
             string p,s;
            p=e[i][0];
            s=e[j][0];
             if(s>p)
               { 
                 ordine=false;
               }
    }
    
          }
    if(ordine==true)
        cout<<"\n sono in ordine \n";
    
    else cout<<"\n non sono in ordine \n";
    
    }
    prova così anche se non è la soluzione migliore xD ma almeno se non funziona nemmeno così sappiamo che il problema è da qualche altra parte
  • Re: Confrontare array di array di caratteri

    Il codice che usi per controlalre le occorrenze è poco corretto, dato che per quello che ho visto usi due cicli for per incrementare l'indice nell'elenco e visualizzare a video quante occorrenze ci siano di una parola, il problema è QUALE parola, con il tuo codice infatti il numero di occorrenze si riferirà sempre all'ultima stringa dell'elenco. A questo punto potresti calcolare le occorrenze di UNA stringa in questo modo:
    
    //per le occorrenze
    void calcolaOcc( Elenco e,int pos,int r){
        int occ=-1;
        for (int i=0;i<r;++i){
            if (strcmp(e[i],e[pos])==0)
                ++occ;
       }
       cout<<"\nci sono "<<occ<<" nomi ripetuti \n";
    }
    
    Altrimenti dovresti strutturare il codice in modo tale da calcolarti tutte le possibili occorrenze esistenti
    
    //ad esempio in tale lista:
    //    Paolo
    //    Valeria
    //    Anna
    //    Paolo
    //    Anna
    
    ci sono 2 parole che hanno ripetizioni , Paolo ne ha 2 e Anna ne ha 2. In questo caso potresti usare come appoggio un array di interi che abbia la stessa dimensione della lista, il cui valore dell'iesimo elemento equivalga al numero di occorrenze presenti nell'elenco per quella stringa, un esempio:
    
    void calcolaOcc( Elenco e,int r){
        int occ[r]; //array di appoggio
        int nOcc;
        for (int i=0;i<r;++i){
            nOcc=-1;
            for(int j=0;j<r;++j){
                if (strcmp(e[i],e[j])==0)
                    ++nOcc;
            }
            occ[i]=nOcc;
       }
    // altro codice per visulaizzare i risultati
    }
    
    Altrimenti fai uso di puntatori.
    Per il codice dell'ordinamento invece, il codice è sbagliato perché il secondo for parte sempre dall'inizio, quindi non fa quello che dovrebbe, prova invece così:
    
    void ordinaNomi( Elenco e,int r){
        bool ordine = true;
        for(int i=0;i<r-1;++i){
            if(strcmp(e[i],e[i+1])>0){
                ordine=false;
                break;
            }
        }
        if(ordine==true)
            cout<<"\n sono in ordine \n";
        else
            cout<<"\n non sono in ordine \n";
    }
    
  • Re: Confrontare array di array di caratteri

    Sto provando con questo codice :
    void calcolaOcc( Elenco e,int r){
        int occ[r]; //array di appoggio
        int nOcc;
        for (int i=0;i<r;++i){
            nOcc=-1;
            for(int j=0;j<r;++j){
                if (strcmp(e[i],e[j])==0)
                    ++nOcc;
            }
            occ[i]=nOcc;
       }
    // altro codice per visulaizzare i risultati
    }
    ma in esecuzione mi da il seguente errore : segmentation fault
  • Re: Confrontare array di array di caratteri

    Su quale riga da l'errore?
  • Re: Confrontare array di array di caratteri

    Mi da quest'errore in esecuzione, infatti compila, ma quando esegue il programma nel momento in cui dovrebbe farmi quella procedura mi scrive in console il suddetto errore
  • Re: Confrontare array di array di caratteri

    Di solito il segmentation fault esce o quando si sta per accedere ad un'area di memoria non di propria competenza oppure se si sta modificando un valore di sola lettura. prova ad utilizzare il debug per vedere il punto preciso dell'errore.
  • Re: Confrontare array di array di caratteri

    Ho rifatto il programma e funziona con questa procedura:
    void cercaOccorrenze(array v, int r){
         cout<<"\nRicerca delle occorrenze in corso\n";
         int occ=0;
         for(int i=0;i<r;i++){
                 occ--;
                 for(int j=0;j<r;j++)
                 if(strcmp(v[i],v[j+1])==0){
                 occ++;
                 }
                 }
                 cout<<"\n ci sono "<<occ<<" occorrenze \n";
         }
         
    
    Ma se volessi eliminare le occorrenze avevo pensato ad uno strcpy, anche se mi confondo con i cicli, infatti non funziona bene, ecco postata la mia procedura :
    
          
         
    void eliminaOccorrenze(array v, int r){
         cout<<"\nEliminazione delle occorrenze in corso\n";
         
         for(int i=0;i<r;i++){
            
                 for(int j=0;j<r;j++)
                 if(strcmp(v[i],v[j+1])==0){
                 strcpy(v[i],v[i+1]);
                 r--;
                 }
         }
                 cout<<"\n Stampa del nuovo vettore: \n";
                   for(int i=0;i<r;i++)
                   cout<<v[i]<< " ";
          
    cout<<endl;
    }
  • Re: Confrontare array di array di caratteri

    Non funziona a dovere perché vai a decrementare 'r' che è la dimensione dell'elenco ed è comune ai due cicli for. Inoltre mi sembra altrettanto strano come posssa funzionare la funzione per le occorrenze. faccio un esemipio: nel caso l'array fosse formato da 10 elementi, l'indice va da 0 a 9, quindi per la i del primo for esso va da 0 a 9, questo anche per j del secondo ciclo. facciamo caso che stiamo valutando l'ultimo elemento, con i=9 ed anche j=9. Quando viene effettuato lo strcmp, mettendo j +1 esso varrà 10, che equivale all'11esimo elemento dell'array, il quale non esiste! Qui dovrebbe esserci segmentation fault, inoltre anche se funziona, il comportamento è impresto dello strcmp, dato che non si è sicuri che in quello spazio di memoria dopo l'ultimo elemento dell'array esista una stringa valida. Questo vale anche per la funzione di eliminazione. Per l'eliminazione potresti provare così:
    
    int i,j;
    for(i=0;i<r-1;++i){
        for(j=i+1;j<r;++j){
            if(strcmp(v[i],v[j])==0){
                --r;
                for(int k=j;k<r;++k)
                    strcpy(v[k],v[k+1]);
            }
        }
    }
    
  • Re: Confrontare array di array di caratteri

    Siccome stai studiano il C++ è meglio fare le cose in C++ e non in C. Magari non capirai niente ma in C++ ci sono tante funzioni che ti aiutino a fare ciò che vuoi senza inventare l'acqua calda ogni volta come credo che stai facendo da un pò di tempo.
    
    #include <iostream>
    #include <fstream>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <iterator>
    
    
    int main() 
    {
    
    	//dichiaro file
    	std::ifstream in("in.txt", std::ios::binary);
    
    	//dichiaro vettore di stringhe
    	std::vector<std::string> vettore;
    	
    	//copio contenuto file nel vettore (una riga per nome senza spazi) 
    	std::copy(	std::istream_iterator<std::string>(in),
    				std::istream_iterator<std::string>(),
    				std::back_inserter(vettore));
    
    	//chiudo il file
    	in.close();
    
    	//riordino il vettore
    	std::sort(vettore.begin(),vettore.end());
    
    	//conteggio occorrenze
    	std::vector<std::string>::iterator it = std::unique(vettore.begin(),vettore.end());
    	std::cout << "ci sono " << std::distance(it,vettore.end()) << " occorrenze" << std::endl;
    	
    		//elimino duplicati dal vettore
    	vettore.erase(it,vettore.end());
    
    	//stampo risultati
    	std::copy(	vettore.begin(),
    				vettore.end(),
    				std::ostream_iterator<std::string>(std::cout, "\n"));
    }
    
    come vedi con 4 righe ti ho fatto il programma che a te non so quante righe tiene. Nessun conteggio, nessuna allocazione e nessun segmentation fault perche sono protteto dall'uso corretto delle librerie che mi sono fornite dallo standard C++. E' sicuramente molto + efficace del tuo metodo.
Devi accedere o registrarti per scrivere nel forum
24 risposte