PDA

View Full Version : [c++] semplice controllo con If che non va


AYAMY
27-02-2007, 08:59
Ciao a tutti...
Ho un programmino che mi genera dei numeri secondo un certo algoritmo...
Ora io vorrei fare in modo che sono i numeri che sono compresi tra 2 estremi (min e max) siano accettati...
Per fare questo ho usato un ciclo for con dentro un if.... ma non va...secondo voi dove sta l'inghippo?
NB: Z.next mi restituisce un numero secondo un certo algoritmo
poi io associo questo numero alla variabile "dentrocode" e con questa faccio il controllo.... ma non va...mi escono anche valori che non sono compresi tra min e max????
mi date una mano please?
Grazie

for (int i = 0; i < 99; ++i)
{
dentrocode=Z.Next();
if ( dentrocode >= min and dentrocode <= max )
{
vector[k] = dentrocode;
k++;
}
}
for (int i = 0; i < 99; ++i)
{
cout << "Vettore Valori" << endl;
cout << vector[i] << endl;
}

Ziosilvio
27-02-2007, 09:15
Per caso, i numeri fuori dall'intervallo, sono solo tra gli elementi di vector con i>=k?
Perché, se è così, il problema è solo che tu visualizzi tutti gli elementi del vettore, e non solo quelli in cui hai messo davvero un numero: e in generale, la memoria allocata è "sporca" e può contenere qualsiasi valore.

reptile9985
27-02-2007, 09:22
l'indice i del primo ciclo for come mai non viene usato dentro al pezzo di codice?? e k dove l'hai inizializzato??
perchè scrivi and e non &&?? come vedi qualcosa da sistemare c'è :O

AYAMY
27-02-2007, 09:51
innanzitutto grazie x l'aiuto...
K l'ho inizializzato in alto nella parte del programma che non ho postato... adesso ho anche sostituito and con && ma continua a non andare...

Per caso, i numeri fuori dall'intervallo, sono solo tra gli elementi di vector con i>=k?

forse non ho capito.. quello che mi stai dicendo.....
se con il ciclo

for (int i = 0; i < 99; ++i)
{
pippo << Z.Next() << "\n";
dentrocode=Z.Next();
if ( dentrocode >= min && dentrocode <= max )
{
vector[k] = dentrocode;
k++;
}
}

faccio prima il controllo sul valore del numero generato.. e poi lo metto nel vettore chiamato vector[k]... in questo vettore ci dovrebbero essere solo valori compresi tra min e max... giusto?
Ad esempio.. Z.next() mi da come valore 79... min=81 , max = 99 l'IF quindi dovrebbe scartare 79 visto che è minore di min ..e poi continuare l'esecuzione e rieseguire il ciclo for in cui mi viene generato un altro numero da Z.next() sul quale riandare a fare il test di controllo...
E' giusto l'algoritmo? oppure ho sbagliato ..e non funziona come ho scritto?


PS: ecco tutto il codice


#include <iostream>
#include <fstream>
#include "newran03/newran.h"

int main()
{
ofstream pippo;
pippo.open("zuzzurellone.txt", ios::out);
cout << "Prego Inserise L'Angolo (cioe' la Media della Gaussiana)" << endl;
cout << "La Varianza verrà calcolata come il 10% della Media" << endl;
float media;
cin >> media;
float sigma;
int k = 0;
sigma = (0.1*media);
float min = media-3*sigma;
float max = media+3*sigma;
float dentrocode;
float vector[100];
srand(time(0));
int mostra = rand()%100;
char s[]="test file";
MotherOfAll urng;
Random::Set(urng);
Normal N;
SumRandom Z = media + sigma * N;
for (int i = 0; i < 99; ++i)
{
pippo << Z.Next() << "\n";
dentrocode=Z.Next();
if ( dentrocode >= min && dentrocode <= max )
{
vector[k] = dentrocode;
k++;
}
}
for (int i = 0; i < 99; ++i)
{
cout << "Vettore Valori" << endl;
cout << vector[i] << endl;
}
//std::cout << std::endl;
cout << "Test eseguito trovi i risultati in zuzzurellone.txt" << endl;
cin.get();
cin.get();
}



PS: Si appoggia a delle librerie esterne che si possono trovare qui

http://www.robertnz.net/ftp/newran03.zip

GRAZIE ANCORA

reptile9985
27-02-2007, 10:13
il secondo for dovrebbe fare il controllo su k, perchè nel vettore hai inserito k elementi nell'intervallo desiderato:
for (int i = 0; i < k; ++i)
{
cout << "Vettore Valori" << endl;
cout << vector[i] << endl;
}
il resto del tuo codice sembra ok, a meno che l'errore non sia nell'uso della libreria esterna...

AYAMY
27-02-2007, 10:26
ho messo K ma continua a non andare..
come è possibile?
Ma che cavolo di errore c'è nell'IF... mi sembra che sia tutto apposto?
Secondo Voi l'IF funziona nel modo che ho postato poco sopra.. escludendo i valori esterni a min e max?

yorkeiser
27-02-2007, 11:02
L'if mi pare giusto, non credo ti dia problemi quello.

Non ho idea di cosa sia quel SumRandom Z, ma se viene gestito come una lista/collection, nelle seguenti istruzioni
pippo << Z.Next() << "\n";
dentrocode=Z.Next();
la scorri in avanti 2 volte.

Potresti aver bisogno di fare una cosa del tipo

float temp=Z.Next();
pippo << temp << "\n";
dentrocode=temp;

AYAMY
27-02-2007, 13:42
Non ci credo....
Non è possibile.. non va nemmeno così!!!
Ma perchè eppure è di una semplicità imbarazzante... ma non trovo il problema...
che cavolo.. :muro: :mc:

Ragà.. chiedo il vostro Aiuto... :doh:

yorkeiser
27-02-2007, 14:23
Con qualche semplice modifica al tuo programma ti mostro che l'if è giusto (non sono riuscito a linkare le tue librerie, mancano dei .lib e non so in alternativa quali .cpp includere). In qualsiasi caso ti riporto il codice, che non cambia nulla dal tuo punto di vista.

#include <iostream.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
int main()
{
cout << "Prego Inserise L'Angolo (cioe' la Media della Gaussiana)" << endl;
cout << "La Varianza verrà calcolata come il 10% della Media" << endl;
float media;
cin >> media;
float sigma;
int k = 0;
sigma = (0.1*media);
float min = media-3*sigma;
float max = media+3*sigma;
float dentrocode;
float vector[100];
srand(time(0));
int mostra = rand()%100;
char s[]="test file";
for (int i = 0; i < 99; ++i)
{
dentrocode=(float)(rand()%100);
if ( dentrocode >= min && dentrocode <= max )
{
vector[k] = dentrocode;
k++;
}
}
for (i = 0; i < 99; ++i)
{
cout << "Vettore Valori" << " Min:" << min << " Max:" << max << endl;
cout << vector[i] << endl;
}
cin.get();
cin.get();
}

Il problema è che stampi TUTTO l'array (ovvero da 0 a 99) e non solo per i k indici che hai filtrato per vector (ovvero i valori realmente compresi tra min e max).


Di seguito ti riporto l'output del programma:

La Varianza verrÓ calcolata come
56
Vettore Valori Min:39.2 Max:72.8
65
Vettore Valori Min:39.2 Max:72.8
58
Vettore Valori Min:39.2 Max:72.8
58
Vettore Valori Min:39.2 Max:72.8
66
Vettore Valori Min:39.2 Max:72.8
62
Vettore Valori Min:39.2 Max:72.8
70
Vettore Valori Min:39.2 Max:72.8
43
Vettore Valori Min:39.2 Max:72.8
55
Vettore Valori Min:39.2 Max:72.8
66
Vettore Valori Min:39.2 Max:72.8
49
Vettore Valori Min:39.2 Max:72.8
68
Vettore Valori Min:39.2 Max:72.8

Ovvero fino a un certo indice l'output è giusto, poi ovviamente negli indici finali (dal valore massimo di k fino a 99) sfori da min e max perchè questi valori non dovrebbero far parte di vector. Il linkare o meno le librerie che hai postato non dovrebbe cambiar nulla

AYAMY
27-02-2007, 14:27
... adesso il mio programma è così
#include <iostream>
#include <fstream>
#include "newran03/newran.h"

int main()
{
ofstream pippo;
pippo.open("zuzzurellone.txt", ios::out);
cout << "Prego Inserise L'Angolo (cioe' la Media della Gaussiana)" << endl;
cout << "La Varianza verrà calcolata come il 10% della Media" << endl;
float media;
cin >> media;
float sigma;
int k = 0;
sigma = (0.1*media);
float min = media-3*sigma;
float max = media+3*sigma;
float dentrocode;
float vector[100];
srand(time(0));
int mostra = rand()%100;
char s[]="test file";
MotherOfAll urng;
Random::Set(urng);
Normal N;
SumRandom Z = media + sigma * N;
for (int i = 0; i < 99; ++i)
{
float temp =Z.Next();
pippo << temp << "\n";
dentrocode=temp;
if ( dentrocode >= min && dentrocode <= max )
{
vector[k] = dentrocode;
k++;
}
}
for (int i = 0; i < k; ++i)
{
cout << "Vettore Valori" << endl;
cout << vector[i] << endl;
}
//std::cout << std::endl;
cout << "Test eseguito trovi i risultati in zuzzurellone.txt" << endl;
cin.get();
cin.get();
}


quindi nella stampa dei valori del vettore ci si ferma a k ma escono comunque valori che sono esterni agli estremi....

Sto iniziando a sflippare...
Concettualmente dovrebbe andare...
Il codice mi sembra giusto e una volta lanciato non ne vuole sapere di funzionare nel modo giusto....

Qualche altra idea su dove possa stare il problema?

:mc: :mc: