PDA

Visualizza la versione completa : [c++] Conto presenze valori in vector che non torna...


freetom
19-04-2012, 13:44
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;







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

:ciauz:

freetom
19-04-2012, 13:51
:) 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

LeleFT
19-04-2012, 13:59
Cancellato il post doppio.


Ciao. :ciauz:

freetom
19-04-2012, 14:04
:)

Who am I
19-04-2012, 14:33
Intanto indenta bene il 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:



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.

freetom
19-04-2012, 14:44
Originariamente inviato da Who am I
Intanto indenta bene il 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:



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 :stordita: :fagiano: :zizi:


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

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! ;)

freetom
20-04-2012, 11:08
//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;

}

freetom
20-04-2012, 12:12
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! :D (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:




//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...





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

Who am I
20-04-2012, 12:34
Il problema è che quando dichiari:



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:


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.

freetom
20-04-2012, 13:00
Originariamente inviato da Who am I
Il problema è che quando dichiari:



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:


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.





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??? :mame:

Che skiappa che sonoooooo !!! :dhò: :zizi:

Loading