PDA

View Full Version : [c++] do while


Davidino.gbr91
19-09-2008, 13:12
salve...devo fare un programma con il do while ma non mi è ben chiaro come usarlo...
la traccia è la seguente:
"Leggere una serie di numeri fino ad incontrare il num 0...al termine stampare la media aritmetica dei numeri letti.
es: 7,5,8,4,0
media= 4.8

grazie in anticipo

banryu79
19-09-2008, 13:23
Qui non risolviamo gli esercizi degli altri, semplicemente aiutiamo se possiamo a superare le difficoltà.
Posta una tua implementazione per la soluzione dell'esercizio che devi risolvere e indicaci dove nello specifico hai difficoltà: saremo felici di aiutarti.

Con questo intendo dire che se devi risolvere l'esercizio con il costrutto do-while ma il tuo problema è che non sai come si usa il do-while la soluzione è studiare il do-while :rolleyes:

Comunque a livello di traccia direi che il do-while lo devi usare per leggere la sequenza di numeri in input e memorizzarli temporaneamente in una "lista" per poi calcolare la media:
- leggi un numero
- se è zero ti fermi ed esci dal ciclo
- altrimenti inserisci il numero nella "lista"

quando il ciclo è terminato:
- processi la lista elemento per elemento per calcolare la media aritmentica dei valori.

Oppure potresti anche calcolare la media direttamente nel primo ciclo (nel do-while) man mano che processi ogni nuovo valore.
Prova a cominciare un'implementazione e posta qualcosa.

Davidino.gbr91
19-09-2008, 13:24
il problema è ke se non ci spiegano chiaramente il do while ma ci spiegano solo un accenno io non sono in grado di risolvere l'esercizio :doh:

BeLakor
19-09-2008, 13:26
Il ciclio do while funziona così:


do
{
istruzioni
}
while (condizione);


(mi raccomando, ricordati il ; dopo la condizione che mi ha varie volte dato problemi... :oink: )

Per il tuo problema hai i tuoi valori int in un vettore. Con il ciclo ti vai a leggere il vettore e come condizione verifichi che vettore[i] sia diverso da 0.
Se è diverso prosegui diminuendo la variabile i con un bel i--.
Sempre all'interno del ciclio devi mettere una variabile "appoggio" che ad ogni ciclo sommerà il numero contenuto nel vettore e una seconda variabile che si incremente di 1 (n_elementi).
Quando la condizione vettore[i] diverso da 0 non sarà più vera, il ciclo termina.
A questo punto fuori dal ciclo basta fare media=appoggio/n_elementi.

Spero ti basti questa spiegazione...se non riesci ancora a venirne a capo chiedi pure ;)

BeLakor

Davidino.gbr91
19-09-2008, 13:28
in teoria io dovrei fare
do {
inserisci num...etcetc

while (devo mettere una condizione ke finke incontro lo 0 finisce il conto dei numeri)


e poi media=numeri / variabile appoggio...

giusto?

BeLakor
19-09-2008, 13:30
Il vettore devi riempirlo prima, poi lo fai leggere nel ciclo ;)

BeLakor

banryu79
19-09-2008, 13:31
il problema è ke se non ci spiegano chiaramente il do while ma ci spiegano solo un accenno io non sono in grado di risolvere l'esercizio :doh:

Sì scusa, ho editato il mio messaggio, avevo postato un po' in fretta :stordita:

Davidino.gbr91
19-09-2008, 13:33
tranquillo ;)
ora provo a buttare giu qualcosa!
grazie a tutti cmq!
per qualsiasi cosa riposto qui!

BeLakor
19-09-2008, 13:37
Aspettiamo di vedere cosa combini :p

BeLakor

Davidino.gbr91
19-09-2008, 13:39
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int i=1,media,num;
do {
cout <<"\n inserisci num: ";
cin >> num;
i++;
}
while (num=0);
media = i/num;
cout <<"\n la media e: "<<media;

system("PAUSE");
return EXIT_SUCCESS;
}


per ora ho cacciato fuori questo pero non riesco a trovare l'errore che ho fatto :doh:

BeLakor
19-09-2008, 13:47
Aggiungo dei commenti al tuo codice senza giudicare struttura...

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int i=1,media,num; //dichiari 3 variabili integer (la media può avere la virgola), inizializzi i=1 (è sbagliato, il primo elemento di un vettore è nella posizione 0, non alla posizione 1), dichiarando "num" in questo modo non crei un vettore, ma una normale variabile
do {
cout <<"\n inserisci num: ";
cin >> num; //ma dove lo stai inserendo il numero? in una variabile normale? ogni volta sovrascrivi il valore precedente così...
i++; //cosa stai incrementando qui? incrementi la variabile i ma non la leggi da nessuna parte...
}
while (num=0); //fino a quando tu non inserisci il numero 0 il ciclo sopra non termina e nel momento in cui termina tu avrai proprio num=0
media = i/num; //il risultato di questa operazione non è possibile (non puoi dividere un numero per 0 :p
cout <<"\n la media e: "<<media;

system("PAUSE");
return EXIT_SUCCESS;
}


per ora ho cacciato fuori questo pero non riesco a trovare l'errore che ho fatto :doh:

Conclusioni: cercavi un'errorino? :P
Io ti consiglierei di leggerti le basi di C++ perchè qui non ci siamo proprio :rolleyes:

BeLakor

Davidino.gbr91
19-09-2008, 13:51
in questo esercizio non mi hanno richiesto l'uso di vettori altrimenti li dichiaravo :D

Oceans11
19-09-2008, 13:53
Per le prossime volte, quando posti codice, inseriscilo nei tag code, altrimenti diventa illeggibile, e se pure lo fosse, molti si asterrebbero dal farlo.

Cmq ci sono diversi errori:

1) media deve essere con la virgola
2) a num gli assegni 0, il confronto si fa con '=='
3) ti manca di fare media+= num ad ogni ciclo.



Sono stato lentissimo nel postare.... :(

BeLakor
19-09-2008, 13:53
O utilizzi un vettore, oppure nel ciclo metti una variabile che sovrascrivi ogni volta da input e una seconda variabile in cui sommi i valori...
Come preferisci tu....io personalmente userei un vettore..

BeLakor

Davidino.gbr91
19-09-2008, 14:04
hai perfettamente ragione...
mi conviene la variabile...mi rimetto all'opera :D

Oceans11
19-09-2008, 14:07
Scusate ma sto vettore chi l'ha tirato fuori????
non mi sembra che l'abbia chiesto l'esercizio.

BeLakor
19-09-2008, 14:16
Io l'ho tirato fuori il vettore, ma solo per comodità mia :)

Ho scritto chiaramente che può anche fare variabile di appoggio con la somma ;)

Aspettiamo la tua soluzione Davidino ;)

BeLakor

Davidino.gbr91
19-09-2008, 14:17
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int i,num,A[10];
float media;

do {
cout <<"\n inserisci num: ";
cin >> A[i];

}
while (num==0);
media+= A[i];
cout <<"\n la media e: "<<media;

system("PAUSE");
return EXIT_SUCCESS;
}


per ora ho riformattato cosi

cionci
19-09-2008, 14:18
Il vettore appunto non ti serve, guarda meglio ;) Inoltre quel codice non funziona.
Prendi come buona abitudine di usare sempre i double al posto dei float.

BeLakor
19-09-2008, 14:21
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int i,num,A[10];
float media;

do {
cout <<"\n inserisci num: ";
cin >> A[i];

}
while (num==0);
media+= A[i];
cout <<"\n la media e: "<<media;

system("PAUSE");
return EXIT_SUCCESS;
}


No no, non ci siamo :)
Se non riesci ad usare i vettori, usa variabile semplice.
Questo boh...non riesco a commentartelo, è proprio sbagliato come logica..

EDIT: provo a rispiegarmi meglio...
1) che variabili ti servono? una che riceve i dati da input, una che ti somma tutti i numeri che inserisci, una che si incrementa ogni volta che inserisci un numero e infine la double per la media
2) quali istruzioni si devono ripetere e quindi devi inserire nel ciclo? inserire valore da input nell'apposita variabile, aggiornare la variabile di somma numeri (somma=somma+num), incrementare la variabile che ti indica quanti valori hai inserito (quindi quante volte hai ripetuto il ciclo) di 1
3) quale condizione devi verificare per far partire il ciclo? devi verificare che il numero che inserisci in input sia diverso da 0, non uguale
4) termina il ciclio ed ora? ora puoi finalmente trovare il risultato (media=somma_numeri / numero di cicli eseguiti)...ovviamente somma_numeri è la famosa variabile che ogni volta aggiorni (somma=somma+num), mentre numero di cicli eseguiti e preso dalla variabile che incrementi ad ogni ciclo (i++)

BeLakor

Davidino.gbr91
19-09-2008, 14:47
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int num,somma,i=0;
double media;

do {
cout <<"\n inserisci num: ";
cin >>num;

i++;
}
while (num!=0);
somma=somma + num;
media=somma/i ;
cout <<"\n la media e: "<<media;

system("PAUSE");
return EXIT_SUCCESS;
}


pare che funziona :D

cionci
19-09-2008, 14:50
A me pare proprio che non funziona ;)

BeLakor
19-09-2008, 14:51
Funziona? Mmmh...mi pare strano...C'è una stringa che hai messo fuori dal ciclo e che secondo me starebbe meglio dentro ;)

BeLakor

Davidino.gbr91
19-09-2008, 14:52
infatti....:muro:

Davidino.gbr91
19-09-2008, 14:59
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int num,somma=0,i=0;
double media;

do {
cout <<"\n inserisci num: ";
cin >>num;
somma=somma + num;
i++;
}
while (num!=0);
media= somma/i;
cout <<"\n la media e: "<<media;

system("PAUSE");
return EXIT_SUCCESS;
}


nnt :muro:
ce sto girando intorno pero non riesco a concludere

Oceans11
19-09-2008, 15:01
Scusa se mi permetto...ma che ne dici di fare un bel respiro ed "accendere" il cervello??

Cerca di vedere passo-passo cosa fa quest'ultimo pezzo di codice che hai scritto, ragionaci e non ti lanciare in una correzione che spesso porta ad altri errori.


Nota: con questo non voglio dire che non ti stai impegnando o che il programma non vada bene (nell'ultima versione), c'è solo un'imprecisione dovuta all'uso di numeri interi e in virgola mobile

Davidino.gbr91
19-09-2008, 15:17
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
float num,somma=0,i=0,media;


do {
cout <<"\n inserisci num: ";
cin >>num;
somma=somma + num;
i++;
}
while (num!=0);
media= somma/i;
cout <<"\n la media e: "<<media;

system("PAUSE");
return EXIT_SUCCESS;
}


ho messo tt in float e il programma viene :D

BeLakor
19-09-2008, 15:21
Non è proprio così che si doveva mettere apposto...

Ad ogni modo ti faccio presente una cosa...prova a mettere subito 0 come primo valore da input. Logicamente parlando ti dovrebbe dire che la media dei valori è 0....prova a farlo ;)

BeLakor

Davidino.gbr91
19-09-2008, 15:22
si viene 0

Oceans11
19-09-2008, 15:25
quando fai così:
media= somma/i;

dove "somma" ed "i" sono interi e vorresti un risultato in virgola mobile, devi fare un cast esplicito (il cast è una conversione forzata tra tipi di dato):

media = (int) (somma / i);

senza cast il risultato viene "troncato", ossia la parte decimale viene semplicemente buttata via!

Davidino.gbr91
19-09-2008, 15:26
ehm...ricordo che io faccio il 4 superiore :D

robest88
19-09-2008, 15:27
Le variabili ora sn float...cmq consiglio un controllo: il primo numero inserito deve essere diverso da 0 la prima volta che si inserisce.

Davidino.gbr91
19-09-2008, 15:29
è giusto xke ora ho inserito
1,0
la media viene 0.5
xke giustamente 1+0 / 2 = 0,5

robest88
19-09-2008, 15:31
è giusto xke ora ho inserito
1,0
la media viene 0.5
xke giustamente 1+0 / 2 = 0,5

Ma a scuola vi insegnano a ragionare così??
Prima si deve pensare alla logica di un programma e poi scriverlo...non scriverlo di getto e dopo mettersi a fare modifiche a caso...

P.S. Sn un programmatore COBOL.

cionci
19-09-2008, 15:33
quando fai così:
media= somma/i;

dove "somma" ed "i" sono interi e vorresti un risultato in virgola mobile, devi fare un cast esplicito (il cast è una conversione forzata tra tipi di dato):

media = (int) (somma / i);

senza cast il risultato viene "troncato", ossia la parte decimale viene semplicemente buttata via!
Il discorso è giusto, ma il cast è sbagliato:

media = (double)somma / i;

Davidino.gbr91...ora riporta a int tutto tranne media ;)

Oceans11
19-09-2008, 15:33
il primo numero inserito deve essere diverso da 0 la prima volta che si inserisce.

perchè? alla fine anche in quel caso la divisione sarebbe 0 / 1 e si può fare, no?

Oceans11
19-09-2008, 15:35
Il discorso è giusto, ma il cast è sbagliato


porca! :doh: perdonatemi sto fondendo!!!!

è che sono stato mezz'ora a scrivere int a tutte le parti :rolleyes:

Davidino.gbr91
19-09-2008, 15:36
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int num,somma=0,i=0;
double media;


do {
cout <<"\n inserisci num: ";
cin >>num;
somma=somma + num;
i++;
}
while (num!=0);
media= (double) somma/i;
cout <<"\n la media e: "<<media;

system("PAUSE");
return EXIT_SUCCESS;
}


anche cosi funziona!

BeLakor
19-09-2008, 15:38
Ok direi che puoi portarlo domani a scuola come combito eseguito :p

BeLakor

robest88
19-09-2008, 15:39
perchè? alla fine anche in quel caso la divisione sarebbe 0 / 1 e si può fare, no?

Non ha senso secondo me fare un'operazione del genere... effettivamente hai ragione e il testo non chiarisce come bisogna comportarsi in quei casi...io al posto suo lo metterei quel controllo...

Davidino.gbr91
19-09-2008, 15:39
yuhuuuuuu :D :D
grazie a tutti pe la pazienza :muro:

Oceans11
19-09-2008, 15:42
media = (int) (somma / i);

tra l'altro oltre che il cast ho anche sbagliato con le parentesi....scusate ancora!

cionci
19-09-2008, 15:51
anche cosi funziona!
Hai capito il perché di quella conversione a double ? (dicesi: cast esplicito)

Davidino.gbr91
19-09-2008, 15:59
sinceramente no stavo x scrive un po di chiarimenti dato che avevo un attimo brekkato...

Oceans11
19-09-2008, 16:04
senza cast il risultato viene "troncato", ossia la parte decimale viene semplicemente buttata via!

fin qui avevo detto bene.

praticamente tu stai facendo un operazione che potrebbe dare come risultato un numero con la virgola, ma senza cast questo risultato viene sbattuto in una parte della memoria che si sà essere utilizzata per contenere interi, così il pc butta via la parte decimale, visto che non sa che farsene.

Con il cast esplicito, invece, stai dicendo che la parte decimale deve essere conservata.

cionci
19-09-2008, 16:04
sinceramente no stavo x scrive un po di chiarimenti dato che avevo un attimo brekkato...
L'operatore di divisione selezionato dal compilatore è:
- la divisione intera se entrambi gli argomenti sono interi
- la divisione in virgola mobile se almeno uno degli argomenti è in virgola mobile

Senza il cast esplicito entrambi gli argomenti sono interi (sia somma che i). Con il cast esplicito il primo argomento (somma) di fatto viene convertito in double e come tale permette la selezione dell'operatore di divisione in virgola mobile.
La divisione intera non funziona bene perché ovviamente il risultato è un intero ;)

Davidino.gbr91
19-09-2008, 16:05
ah capito :D