Salta al contenuto
Note per Studenti Ciclo while

Ciclo while

In questa pagina 5

Sintassi e semantica

python
while condizione:
    corpo

La condizione viene valutata prima di ogni iterazione; se è falsa all'inizio il corpo non viene mai eseguito. Il corpo deve modificare qualcosa da cui dipende la condizione, altrimenti il ciclo è infinito.

Python non ha do ... while: si ottiene con while True + break (vedi sotto). In C esiste: Tipi, operatori e controllo del flusso in CTipi interi e reali del C con dimensioni e limiti, conversioni implicite e cast, divisione intera, operatori di incremento, logici e bit a bit; if, switch, while, do-while, for, break e continue.Tipi, operatori e controllo del flusso in C →.

Schemi tipici

Controllato da contatore (numero di iterazioni noto; di solito si preferisce for, vedi Ciclo for e rangefor scorre gli elementi di un iterabile; range per gli indici; enumerate, zip, reversed, sorted; cicli annidati; quando usare for e quando while.Ciclo for e range →):

python
i = 0
while i < 10:
    print(i)
    i += 1

Controllato da condizione (numero di iterazioni non noto a priori):

python
# numero di cifre di n > 0
cifre = 0
while n > 0:
    n //= 10
    cifre += 1
python
# algoritmo di Euclide per il MCD
while b != 0:
    a, b = b, a % b
# ora a è il MCD

Sentinella (si legge finché arriva un valore speciale):

python
somma = 0
x = int(input("numero (0 per finire): "))
while x != 0:
    somma += x
    x = int(input("numero (0 per finire): "))

Validazione dell'input (schema "ripeti finché valido", equivalente a un do-while):

python
while True:
    eta = int(input("età: "))
    if eta >= 0:
        break
    print("valore non valido")

break, continue, else

  • break: esce subito dal ciclo più interno.
  • continue: salta il resto del corpo e torna al controllo della condizione.
  • else dopo il ciclo: eseguito se il ciclo termina senza break (tipico nelle ricerche).
python
d = 2
while d * d <= n:
    if n % d == 0:
        print(n, "non è primo")
        break
    d += 1
else:
    print(n, "è primo")      # nessun divisore trovato (per n >= 2)

Correttezza: terminazione e invariante

  • Terminazione: si individua una quantità intera non negativa che diminuisce a ogni iterazione (in Euclide: b, perché a % b < b).
  • Invariante di ciclo: proprietà vera prima e dopo ogni iterazione; alla fine, insieme alla condizione falsa, dà il risultato. Nel ciclo della somma con sentinella: "somma è la somma dei valori letti finora, escluso l'ultimo".

Ragionare per invarianti aiuta a scrivere e a correggere i cicli (vedi Pattern algoritmici iterativiSchemi ricorrenti nei cicli: accumulatore, contatore, massimo e minimo, ricerca con uscita anticipata, verifica universale, filtro e trasformazione, finestra scorrevole, due indici, elaborazione di coppie.Pattern algoritmici iterativi →).

Errori tipici

  • Dimenticare l'aggiornamento della variabile di controllo (ciclo infinito: si interrompe con Ctrl+C).
  • Errore di uno (off-by-one): < al posto di <= o viceversa. Verificare a mano il primo e l'ultimo giro.
  • Variabile della condizione non inizializzata prima del ciclo (NameError).

Teoria collegata