Newsgroup: it.comp.lang.c
Titolo: Dubbio su While, Do/While e For

Salve,
ho un dubbio sulle strutture While, Do/While
---
Faccio un esempio così che mi capiate bene :)
/* USO di While, visualizza sullo schermo i numeri da 1 a 10*/
{
   int contatore = 1; /* Inizializzazione */
 
   while (contatore <= 10)
   {
      printf("%d\n", contatore);
     ++contatore;
   }
 
   system("PAUSE"); /* Dipende se non si vuole far chiudere la
finestra sotto windows */
   return 0;
}
---
Ora lo riscrivo in formato Do/While
/* USO di Do/While */
{
   int contatore = 1;
 
   do
   {
      printf("%d\n", contatore);
   }
   while (++contatore <= 10);
  system("PAUSE");
  return 0;
}
---
Ora riscrivo lo stesso programma in FOR
/* USO di FOR */   
{
   int contatore;
   for (contatore = 1; contatore <= 10; contatore++)
     printf("%d\n", contatore);
  system("PAUSE");
  return 0;
}
---
Io non capisco: quando preferire l'uso di Do/While o solo While? è
possibile ad esempio utilizzare sempre il FOR al posto del While e
Do/While?
Praticamente Do/While sarebbe: Fai o Esegui/Finché
invece While sarebbe Finché
Traducendo il programma in While (tipo pseudocodice) diventa:
---
Inizializzo il contatore a 1
finché(contatore è minore o uguale a 10)
   {
      stampa("stringa di controllo del formato + specifica di
conversione\newline", contatore);
     incrementa il contatore di 1;
---
Invece traducendolo in Do/While esce fuori:
---
Inizializzo il contatore a 1
fai/esegui (l'istruzione qui sotto)
{
  printf("stringa di controllo del formato + specifica di
conversione\newline", contatore);
}
finché (incremento di 1 è minore uguale di 10)
Il For l'ho capito bene ma il Do/While non riesco mai a digerirlo!
si può evitare comunque l'uso di While e Do/While con il FOR? o ci
sono momenti in cui è d'obbligo usarlo?

 sono momenti in cui è d'obbligo usarlo?
For e while sono completamente scambiabili l'uno con l'altro
for(i=0; cond; i++)
{
}
e' equivalente a
i = 0;
while(cond)
{
 i++;
}
il do-while e' sostituibile facendo una operazione fuori
del ciclo.
L'unico ambito sensato per l'utilizzo del do-while, a mio
modestissimo giudizio, e' nella definizione di macro.
C:\>iao Angelo
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Il do while si utilizza quando hai un ciclo che deve essere eseguito almeno
una volta. O sbaglio?
Nel senso che il codice all'interno del do viene eseguito sempre e comunque
almeno una volta e poi viene controllata la condizione nel while.

 modestissimo giudizio, e' nella definizione di macro.
Beh, mi pare esagerato... qualche volta capita di dover porre una 
condizione a fine ciclo, invece che all'inizio, e senza do-while, sei 
costretto a ripetere del codice. Il classico esempio che mi viene in 
mente e':
do {
   input = leggi();
} while(!ok(input));
certo, in un caso semplice e' sicuramente trasformabile in:
while(!ok(input = leggi())
   ;
ma ci sono casi in cui il "leggi" e' costituito da un po' di istruzioni, 
metterle tutte nella condizione del while non mi pare il massimo. Tra 
l'altro, secondo me la prima forma e' anche piu' leggibile e lineare.
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Linux registered user 299762 @ Linux registered machine 213003

 ;
Diciamo che finora non mi e' mai capitato niente che non potessi riscrivere
input = leggi();
while(!ok(input))
{
   ...
   input = leggi();
}
ed evitare io do-while
Forse non ho ancora scritto abbanstanza codice... :-)



OTTIMO!

 Forse non ho ancora scritto abbanstanza codice... :-)
O forse non ti capita spesso di scrivere i parser, cioè gli algoritmi che
processano un input con una sintassi un po' più complessa della semplice
sequenza di record.
Io ho notato che è quasi solo in codice di questo tipo che mi viene utile il
do-while, perché capita spesso che la tua sintassi preveda, in un certo
punto, "uno o più" di una certa cosa. Guarda caso, il primo esempio che è
venuto in mente a Mattia Belletti è proprio di questo tipo.
--
Cingar


ho un dubbio sulle strutture While, Do/While
[cut]
while() esegue il test all'inizio, a volte torna utile perche' ti
evita una if().
for() spesso e' piu' comprensibile, e anche utilizzando diverse
variabili, il sorgente rimane compatto.
do while() esegue il codice almeno una volta; nei compilatori piu'
vecchi e' quella che viene meglio ottimizzata.
---
acc(at)
libero.it


Ciao,
in sostanza il do/while non è che una comodità che ti consente di eseguire
il blocco di istruzioni almeno una volta indipendentemente dal tipo di test
dell'istruzione while. Ad esempio:
...
c = getch();
while(c  != 'a')
{
    c = getch();
}
...
equivale a
...
do
{
    c = getch();
}
while(c != 'a');


Scusa non avevo letto questa.