PDA

Visualizza la versione completa : [C++] Ciclo while() con contatore


mistergks
06-02-2011, 01:08
Ciao ! Sto preparando un esame universitario sul c++:
vorrei sapere una cosa:
sul mio manuale (Deitel&Detitel c++) c'è scritto che quando si usa un ciclo while controllato da contatore....questo alla fine del ciclo assume un valore maggiorato di 1 e quindi si ha un eerrore se viene utilizzato dopo il ciclo...
mi spiego meglio con un esempio:
vorrei calcolare la media di n numeri..



#include <iostream>
using namespace std;

int main(){
int x=0, totale=0; //dichiaro e inizializzo la variabile e il totale
int cont=0; // il contatore
float media;
cout<<"inserisci quanti numeri...."; cin>>cont;
while(x<=cont){
totale+=x;
cont++;
}
media=totale/cont;
cout<<media<<endl;

return 0;
}


quando calcolo la media usando la divisione totale/count.... mi viene sballata!forse perchè il contatore diventa sempre maggiorato di 1?
e se usassi il contatore ogni volta facendo cont-1 ??

premoli
06-02-2011, 10:35
Ciao!!!

A dire il vero il problema in questo caso è proprio un altro, infatti tu nel ciclo while metti come condizione x<=cont la x la inizializzi a zero ma così com'è strutturato il programma a meno che qualcuno non metta un valore inferiore a zero, si avrà un loop infinito, infatti la x all'interno del ciclo non viene mai incrementata, ma viene incrementato cont.

Detto questo potresti spiegare qual è l'esercizio che devi svolgere? Tu dici che vuoi calcolare la media di n numeri, cioè i numeri che vanno da 0 a n (dove n è il numero inserito dall'utente)?

quindi se inserisco 4 il risultato sarà 2 ovvero (0+1+2+3+4)/5, è questo che vuoi fare?

mistergks
06-02-2011, 12:28
è vero ho dimenticato di far leggere da input la variabile x e il cont non va incrementato..rimetto il nuovo codice



#include <iostream>
using namespace std;

int main(){
int x=0, totale=0; //dichiaro e inizializzo la variabile e il totale
int cont=0; // il contatore
float media;
cout<<"inserisci quanti numeri...."; cin>>cont;
while(x<=cont){
totale+=x;

cout<<"inserisci il numero"<<endl;
cin>>x;
}
media=totale/cont;
cout<<media<<endl;

return 0;
}




No..quello che voglio fare è: un utente inserisce il valore di cont(cioè quanti numeri vuole inserire) e poi in relazione a quello il ciclo legge la variabile x sempre da immissione utente che dà i numeri su cui calcolare la media.
Esempio di input: cont=2;
x=2; x=6
la variabile totale prenderà valore 8 perchè la somma delle x inserite è 8.
E la media prenderà valore di 4..perchè il totale/cont fa 4....ovvero dovrebbe fare 4... se compilo mi da sballato...ho pensato che il contatore non può essere utilizzato dopo il ciclo perchè appunto dà valore maggiore di 1 rispetto a quello precedente... se provo a usarlo facendo sempre cont-1 ?? sbaglio?

premoli
06-02-2011, 12:43
Ok ora mi è chiaro quello che vuoi fare, quindi... stai sbagliando ancora :D

prima di tutto devi inserire un'altra variabile (ad esempio i) che ti faccia da contatore, da 0 fino a cont-1 oppure da 1 fino a cont (ovvero i numeri che vuoi inserire) poi all'interno del ciclo la x la devi acquisire prima di fare totale+=x, non ha senso incrementare cont, dovresti cambiare la condizione del while, e se vuoi visualizzare il risultato come float dovresti effettuare un cast esplicito, in quanto una divisione tra due int ti restituirà un int, mi sembra di aver elencato tutto.

Prova un po' a mettere in pratica questi spunti, se non riesci ti do un'altra mano.

mistergks
07-02-2011, 13:42
#include <iostream>
using namespace std;

int main(){
int x=0, totale=0; //dichiaro e inizializzo la variabile e il totale
int cont=0; // il contatore
float media;
int i=0;
cout<<"inserisci quanti numeri...."; cin>>cont;
while(i<=cont){
cin>>x;
totale+=x;
i=cont-1;
cout<<"inserisci il numero"<<endl;

}
media=static_cast<float>(totale)/cont;
cout<<media<<endl;

return 0;
}




Ora dovrebbe andare bene vero?? Però c'è qualche altro errore perchè compilando mi da un ciclo infinito :shy:
comunque mi sono perso dall'obiettivo del post! Quello che vorrei sapere è: se uso un contatore in un ciclo while...poi al di fuori di esso...posso usarlo per fare operazioni? se si come? ho letto che da valore maggiore di 1! per esempio se il ciclo va da 1 a 10 il cont alla fine diventa 11!

premoli
07-02-2011, 14:27
#include <iostream>
using namespace std;

int main()
{
int x=0, totale=0; //dichiaro e inizializzo la variabile e il totale
int cont=0; // il contatore
float media;
int i=0;

cout<<"inserisci quanti numeri: ";
cin>>cont;
cout << endl;

while(i<cont){
cout<<"inserisci il numero: ";
cin>>x;
totale+=x;
i++;

}

media=(float)totale/cont;
cout << "\n\nLa media \212: " <<media<<endl;

return 0;
}


Io farei così, dimmi se c'è qualcosa che non capisci.

Per quanto riguarda il discorso del while se ad esempio hai


i=1;
while(i<=10){
.
.
i++
}


naturalmente la i alla fine del ciclo varrà 11.
Comunque se posso permettermi di darti un consiglio in questi casi nessuno può esserti più di aiuto che un compilatore, infatti ti sarebbe bastato fare qualcosa del genere:


.
.
i=1;
while(i<=10)
i++;
cout << "la i vale " << i;

Per scoprire da solo quello che ti interessava.

mistergks
07-02-2011, 17:54
è vero...ma volevo sapere se si può usare il contatore facendo cont-1... o è un errore? facendo così i conti vengono giusti...ma vorrei sapere se è sempre cosi'

_Alfabetagamma_
07-02-2011, 21:29
Originariamente inviato da mistergks
è vero...ma volevo sapere se si può usare il contatore facendo cont-1... o è un errore? facendo così i conti vengono giusti...ma vorrei sapere se è sempre cosi'

Dipende da come funziona il tuo programma, di quale contatore parli. In linea di massima se fai un ciclo while con un contatore che fa fino ad un limite, dopo il ciclo otterai il contatore al limite più uno.

Se usi un do-while non è già più così. Se il contatore si incrementa di 4 alla volta, non è più così. Nel tuo caso, uscito dal while, utilizzare cont-1 è la soluzione.

E comunque se funziona, perchè dovrebbe essere un errore? Per chi? E per qual ragione? :confused:

mistergks
08-02-2011, 00:38
ho capito perfettamente. Grazie mille. :)

Loading