Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182

    [C++] ciclo while con contatore

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

    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;
                                         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 ??

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    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?

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    è vero ho dimenticato di far leggere da input la variabile x e il cont non va incrementato..rimetto il nuovo codice

    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?

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    Ok ora mi è chiaro quello che vuoi fare, quindi... stai sbagliando ancora

    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    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;
                   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
    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!

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    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;
        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
    codice:
    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:
    codice:
    .
    .
    i=1;
    while(i<=10)
       i++;
    cout << "la i vale " << i;
    Per scoprire da solo quello che ti interessava.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    è 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'

  8. #8
    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?

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    ho capito perfettamente. Grazie mille.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.