Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    [c++] Conto presenze valori in vector che non torna...

    Nel vector presenzemultiple alla fine dei miei calcoli mi ritrovo 135 valori (ripetuti e non).
    Ora a me servirebbe semplicemente sapere quante volte ciascun valore è ripetuto o meno.

    Per adesso... ho provato a fare così:

    Dopo aver definito e inizializzato... all'inizio del programma:

    int contatorevolte=0;




    codice:
    for (int i = 0; i < presenzemultiple.size(); i++) {
      
      
      
      if (presenzemultiple[i] == presenzemultiple[i+1]) {
                          
      contatorevolte++;
      cout << "\n contatore volte: ";
      cout << contatorevolte;
      cout << "\n";
       
      if (contatorevolte>3)  {
    
       cout << "QUESTO VALORE : ";
       cout << presenzemultiple[i];
       cout << " sembra essere presente ";
       cout << contatorevolte;
       cout << " volte... verificare!";
       cin.get();
      
      sceltissimi.push_back(presenzemultiple[i]);
      contatorevolte=0;
      
      }
        
      
      
    }
     
    }
    Ma nonostante vada vicino al risultato voluto mi riporta per alcuni valori un valore di frequenza (=presenza nel vector) = +1 rispetto quello reale... o per meglio dire facendo un esempio se metto contatore > 3 mi considera anche i valori = 3.

    Ho cercato e ricercato nel codice dove il sistema potrebbe confondersi... ma non riesco a trovare il bug! Mi aiutate a cercarlo? Sicuramente è una svista del bip! ma non riesco a "focalizzarla".

    Grazie ancora


  2. #2
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    cancellare uno di questi due msg doppioni perfavore

    chiedo ad un admin del forum di cancellare uno di queti due messaggi in quanto sono doppioni (per errore) e il sistema non mi permette di cancellarlo.

    Grazie

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303

    Moderazione

    Cancellato il post doppio.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    grazie


  5. #5
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Intanto indenta bene il codice:

    codice:
    for (int i = 0; i < presenzemultiple.size(); i++) 
    {
        if (presenzemultiple[i] == presenzemultiple[i+1]) 
        {
            contatorevolte++;
            cout << "\n contatore volte: ";
            cout << contatorevolte;
            cout << "\n";
            if (contatorevolte>3)  
            {
                cout << "QUESTO VALORE : ";
                cout << presenzemultiple[i];
                cout << " sembra essere presente ";
                cout << contatorevolte;
                cout << " volte... verificare!";
                cin.get();
                sceltissimi.push_back(presenzemultiple[i]);
                contatorevolte=0;
            }
        }
    }
    Allora stai uscendo dall' array quando viene eseguito il confronto presenzemultiple == presenzemultiple[i+1] perché nell' ultima iterazione i vale size()-1 e stai chiedendo l' elemento presenzemultiple[i+1], che è un elemento che sta al di fuori del vettore.
    Poi non va bene fare un solo for, devi fare due for annidati perché il tuo scopo è verificare quali sono le ripetizioni all' interno dell' array, quindi se hai gli elementi:

    codice:
    indice: i, valore: 4
    indice i, valore: 5
    indice i valore: 4
    Se esegui l' algoritmo su questa porzione di array contatorevolte non viene mai incrementato.Poi prima di pushare un elemento nell' array devi verificare che nons ia già presente.

  6. #6
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    grazie Who am I but...

    Originariamente inviato da Who am I
    Intanto indenta bene il codice:

    codice:
    for (int i = 0; i < presenzemultiple.size(); i++) 
    {
        if (presenzemultiple[i] == presenzemultiple[i+1]) 
        {
            contatorevolte++;
            cout << "\n contatore volte: ";
            cout << contatorevolte;
            cout << "\n";
            if (contatorevolte>3)  
            {
                cout << "QUESTO VALORE : ";
                cout << presenzemultiple[i];
                cout << " sembra essere presente ";
                cout << contatorevolte;
                cout << " volte... verificare!";
                cin.get();
                sceltissimi.push_back(presenzemultiple[i]);
                contatorevolte=0;
            }
        }
    }
    Allora stai uscendo dall' array quando viene eseguito il confronto presenzemultiple == presenzemultiple[i+1] perché nell' ultima iterazione i vale size()-1 e stai chiedendo l' elemento presenzemultiple[i+1], che è un elemento che sta al di fuori del vettore.
    Poi non va bene fare un solo for, devi fare due for annidati perché il tuo scopo è verificare quali sono le ripetizioni all' interno dell' array, quindi se hai gli elementi:

    codice:
    indice: i, valore: 4
    indice i, valore: 5
    indice i valore: 4
    Se esegui l' algoritmo su questa porzione di array contatorevolte non viene mai incrementato.Poi prima di pushare un elemento nell' array devi verificare che nons ia già presente.

    Adesso ci capisco meno di prima


    Potresti indicarmi la soluzione? Senno credo che ci fo notte conoscendo i miei neuroni...

    Grazie!

    ps: Grazie alla tua splendida funzione ho caricato in rispettivi vector altri 90 gruppi di ben 30 elementi ciascuno in un batter d'occhio! Grazie davvero!

  7. #7
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    vi aggiorno sui tentativi senza esito fatti...

    codice:
    //ordino in modo crescente gli elementi del vettore...
    sort(cinquina60.begin(),cinquina60.end());
    
    for (int b=0; b<cinquina60.size(); b++) {
    
    int contatore=0;
    
    //controllo se adiacente ad un elemento ve ne sta un altro e incremento nel caso...
    //di 1 il contatore...
    
    if (cinquina60[b]==cinquina60[b+1]) {
    
    contatore++;
                                     
    cout << cinquina60[b];   
    cout << " # ";     
    cout << "questo valore e' presente + volte! ";   
    cout << " esattamente ";
    cout << contatore;
    cout << " volte! ";  //esattamente una bip! :D in quanto mi visualizza sempre 1
    cout << "\n\n";
    
    
    }
    
    //riazzero il contatore per ricominciare il calcolo delle presenze con un altro elemento del 
    // vettore...
    
    contatore=0;
        
    }

  8. #8
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    Allora non so come ho fatto... ma...

    Trovata una funzione che faceva allo scopo per quanto riguarda un array di valori fissi l'ho riadattata (un po' a caso...) al mio vector e... funziona! (che botta di cul.. pardon fortuna...) però... nonostante riesca a visualizzare correttamente le frequenze individuate non riesco a servirmene in quanto un nuovo errore sul controllo di queste mi impedisce sia l'aggiunta in uno specifico vector sceltissimi sia il salvataggio su un file sceltissimi.txt ecc...

    Riporto qui la soluzione trovata con il relativo nuovo problema:

    codice:
    //funzione conta riadattata... al vector
    
    void conta(vector<int>presenzemultiple,int k[],int na,int nk){
    
        for(int i=0;i<nk;i++)
            k[i]=0;
    
        for(int i=0;i<na;i++)
            k[presenzemultiple[i]]++;// nel secondo array alla posizione 2 saranno salvate le occorrenze del 2 e così via
    
    }
    //codice nel corpo del main...

    codice:
    
    int va[90];
    
    
    conta(presenzemultiple,va,30,90);
    
    
    for(int i=1;i<90;i++)
    
    cout << i << ": " << va[i] << "\n"; //se non metto il controllo successivo funziona tutto a
    // meraviglia... però mi dovrei accontentare di visualizzare i valori a video... 
    
    
    if (va[i]>=3) {  // <----- RIGA SEGNALATA DAL NUOVO ERRORE
     
     cout << "Ok se non mi desse il nuovo errore.. ci sarei quasi!" ;             
                  
    }                   
    
    
    cin.get();
    Ah dimenticavo il nuovo.. simpatico... errore...

    177 nuovo-lotto-programma-in-continuo-divenire-aprile-2012\Prove-conteggio-elementi-in-vector2.cpp name lookup of `i' changed for new ISO `for' scoping

    tnx

  9. #9
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Il problema è che quando dichiari:

    codice:
    for(int i=1;i<90;i++)
    {
        // qua i esiste
    }
    // qua i non esiste
    La variabile i è locale al for, cioè esiste dentro lo scope del for ma poi cessa di esistere.
    L' alternativa è dichiarare i fuori dal for:
    codice:
    int i;
    for(i=1;i<90;i++)
    {...}
    PS: Per controllare se funziona testa tanti input, prova ad esempio array come {1,2,3,1,2}.Non credo sia giusta la tua soluzione.

  10. #10
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725
    Originariamente inviato da Who am I
    Il problema è che quando dichiari:

    codice:
    for(int i=1;i<90;i++)
    {
        // qua i esiste
    }
    // qua i non esiste
    La variabile i è locale al for, cioè esiste dentro lo scope del for ma poi cessa di esistere.
    L' alternativa è dichiarare i fuori dal for:
    codice:
    int i;
    for(i=1;i<90;i++)
    {...}
    PS: Per controllare se funziona testa tanti input, prova ad esempio array come {1,2,3,1,2}.Non credo sia giusta la tua soluzione.

    In effetti definendo i all'inizio del programma non mi da piu' errore
    Però...

    in questo codice non mi sente per nulla nè il cin.get();
    (va fino in fondo fino all'ultimo valore senza fermarsi)
    nè l'if che considera solo alla fine rispetto a quando dovrebbe...
    e solo per stampare al video il cout senza alcun controllo...
    Per il resto dovrebbe funzionare anche se non è tanto una soluzione dinamica
    in quanto ad ogni numero di elementi che varia devo riportare l'esatto valore
    correttamente nelle giuste posizioni del codice... però per adesso potrebbe bastarmi
    avendo da analizzare solo gruppi di 30 elementi.

    codice:
    
    for(i=1;i<90;i++)
    
    cout << i << ": " << va[i] << "\n";
    
    cin.get();
    
    
    if (va[i]>=3) {
     
     cout << "Ok se non mi desse errore.. ci sarei quasi!" ;             
                  
    }                   
    
    
    cin.get();
    
    //----------------------------------
    come mai quindi non si ferma ad ogni valore i esaminato?

    Trovato l'errore forse... Non mettevo le parentesi graffe dopo il for!!! Giusto???

    Che skiappa che sonoooooo !!!

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.