I cicli

I cicli

Come si sa è possibile assegnare più valori ad una stessa variabile, con la variabile che assume sempre l’ultimo valore assegnato.
Ad esempio:

Num = 3
print Num,
Num = 9
print Num

Il risultato di questo programma è 3 9, perché la prima volta che Num è stampato il suo valore e`3, la seconda 9.
Nota bene: La virgola dopo la prima istruzione print evita il ritorno a capo dopo la stampa; in questo modo entrambi i valori appaiono sulla stessa riga.
Detto questo, si provi a scrivere il seguente programma e analizza cosa succede.

a = 1
while a < 4 :
print a
a = a + 1

Prova a leggere il programma con l’istruzione while come fosse scritto in un linguaggio naturale (while significa: finché, fintantoché). Otterrai:
“Finché (while) a è minore di 4 stampa il valore di a e poi aumentalo di 1.  Quando arrivi a 4 esci perché a deve essere minore di 4”.

Si provi ora a scrivere un programma per stampare:

  1. tutti i numeri minori di 10
  2. tutti i numeri da 100 a 1000 compresi.

Come hai capito questo comando viene usato per eseguire le azioni ripetitive e i computer sono bravissimi a ripetere le azioni tante volte. Per risolvere questo tipo di problema si usano i “cicli” o “loop” (che in inglese significa appunto “ciclo”).
Ci sono due tipi di “cicli” e tra i due c’è una differenza molto importante.
Il primo, chiamato while, viene usato quando non si sa prima quante volte deve ripetere l’azione.
Il secondo, chiamato for, è usato quando si sa in anticipo quante volte si dovrà ripetere l’azione.

Il programma precedente può essere rappresentato cosi:


Vediamo ora insieme i programmi 1 e 2.

  1. Stampa tutti i numeri minori di 10
    a = 0
    while a < 10:
         print a,
         a = a + 1
  2. Stampa tutti i numeri da 100 a 1000
    a = 100
    while a <= 1000:
    print a,
    a = a + 1

Riprendiamo ora il semplice programma di prima:

programma

visualizza

a =1
while a < 4 :
print a
a = a + 1

1

2

3

 

Ripetiamo. L’istruzione while significa: “fai tutto quello che segue fintantoché la relazione scritta fra la parola while e i due punti è soddisfatta”.

Nota bene: i due punti sono obbligatori 

In modo più formale il flusso di esecuzione di un’istruzione while è il seguente:

  1. Valuta la condizione controllando se essa è vera o falsa.
  2. Se la condizione è falsa esci dal ciclo while e continua l’esecuzione dalla prima istruzione che lo segue.
  3. Se la condizione è vera esegui tutte le istruzioni nel corpo del while e torna al passo 1.

Nel nostro caso il programma esegue le istruzioni:
print a
a = a + 1
tre volte, cioè finché a è minore di 4.
Ecco in dettaglio quello che succede in quelle tre volte.

Il programma esce dal ciclo.

Più in generale, se si scrive:
while <relazione> :
<istruzione 1>
<istruzione 2>
<istruzione 3>
il programma esegue il seguente ciclo:

Nota bene: Tutte le istruzioni che seguono la

while <relazione> :

devono essere indentate se fanno parte delle cose da fare quando <relazione> è soddisfatta.

Se la condizione è falsa al primo controllo, le istruzioni del corpo non saranno mai eseguite.
Il corpo del ciclo dovrebbe cambiare il valore di una o più variabili così che la condizione possa prima o poi diventare falsa e far così terminare il ciclo. In caso contrario il ciclo si ripeterebbe all’infinito, determinando un ciclo infinito.
Esaminiamo ora il seguente programma.

a = 3
    while a > 2:
           print a
           a = a + 1

Il programma stampa prima 3, poi 4, poi 5 e cosi via, e non si ferma mai.
Perché?
Se volete evitare che il vostro PC continui a visualizzare la successione dei numeri naturali, premete contemporaneamente i tasti CTRL e C.
Molto bene, il vostro programma di lavoro sta procedendo regolarmente.
Ora dedichiamo un po’ di tempo ad esercitarti, l’esercizio e la pratica sono indispensabili se si vuole diventare un bravo programmatore.

Esercitiamoci insieme

Provate ad eseguire questi due programmi.
Programma 1
a = 1
while a < 100 :
      a = a+1
Programma 2
a = 1
while a < 100000 :
      a = a + 1

Cosa fanno questi due programmi?
Perché il secondo dura più del primo?
A cosa possono servire questi programmi?

Qualche volta, nel corso di un programma complesso, può essere opportuno fermarsi un po’ di tempo per consentire all’utilizzatore del programma di riflettere prima di proseguire. I due programmi precedenti servono proprio a questo, ossia a perdere tempo.
Quanto tempo?
Dipende dalla velocità del calcolatore. Infatti, un calcolatore molto veloce può eseguire una delle due istruzioni:
while a < 100:
a = a + 1
in un decimo di milionesimo di secondo.
Si provi a rispondere a questa domanda: fa perdere più tempo il programma 1 oppure il programma 2?

Visualizza tutti i numeri compresi fra 0 e 100.
i = 0
while i <= 100 :
     print i
     i = i + 1
Visualizza tutti i numeri compresi fra 3 e 9.
i = 3
while i <= 9 :
      print i
      i = i + 1
Visualizza in ordine decrescente i numeri da 200 a 100.
i = 200
while i >= 100 :
      print i
      i = i – 1
Scrivi il programma “Conto alla rovescia” che – finché (while) n è più grande di 0 – stampa il valore di n e poi lo diminuisce di 1. Quando arriva a 0 stampa la stringa “Pronti…VIA!”-.
n = 10
while n > 0 :
      print n
      n = n – 1
print “Pronti …VIA!”

Quando esegui il programma, scopri che la visualizzazione dei numeri è troppo veloce. Come si può fare per rallentarla?

Visualizza la tabellina del sette stampando i numeri di seguito sulla stessa riga.
i = 1
while i <= 10 :
print 7*i,
i = i + 1
10.8 Scrivi un programma che attende finche non viene inserita la password corretta.
(La password la decidi tu, ad es. “chicchiricchi”).
password = “python”
while password != “chicchiricchi”:
password = raw_input(“Password:”)
print “Entra pure”
10.9 Visualizza tutti i numeri dispari compresi fra 1 e 100.
i = 1
while i < 100 :
print i
i = i + 2
10.10 Stampa la frase “Aiuto! Non mi fermo più” infinite volte usando il ciclo while.
(Per fermare il programma usa i tasti CTRL + C)
i=1
while i != 0 :
print “Aiuto! Non mi fermo più”
i = i + 1
e poi stampa il messaggio di seguito, senza saltare una riga fra uno e l’altro e senza andare a capo.
(Per fermare il programma usa i tasti CTRL + C)
i=1
while i <> 0 :
print “Aiuto! Non mi fermo più”,
i = i + 1

Visualizza la tabellina del sette stampando i numeri di seguito sulla stessa riga.
i = 1
while i <= 10 :
print 7*i,
i = i + 1
Scrivere un programma che attende finché non viene inserita la password corretta.
(La password la decidi tu, ad es. “chicchiricchi”).
password = “python”
while password != “chicchiricchi”:
    password = raw_input(“Password:”)
print “Entra pure”
10.9 Visualizza tutti i numeri dispari compresi fra 1 e 100.
i = 1
while i < 100 :
print i
i = i + 2
Stampa la frase “Aiuto! Non mi fermo più” infinite volte usando il ciclo while.
(Per fermare il programma usa i tasti CTRL + C)
i=1
while i != 0 :
    print “Aiuto! Non mi fermo più”
    i = i + 1
e poi stampa il messaggio di seguito, senza saltare una riga fra uno e l’altro e senza andare a capo.
(Per fermare il programma usa i tasti CTRL + C)
i=1
while i <> 0 :
    print “Aiuto! Non mi fermo più”,
    i = i + 1

Provare a trovare i divisori di un numero usando il ciclo while.
i=1
n = input(“qual è il numero di cui vuoi trovare i divisori? “)
print n, ” è divisibile per “
while i < n :
    if n%i == 0 :
        print i,
i = i + 1
Scrivere un programma che chieda il risultato dell’operazione 15 x 17 tante volte sino a quando non viene indicata la soluzione corretta.
corretto = “no”
while corretto == “no”:
    risposta = input(“quanto vale 15 x 17? “)
    if risposta == 15*17:
        corretto = “si”
        print “Brava!”
    else:
        corretto = “no”

I Cicli annidati

Precedentemente abbiamo risolto il programma n.1 ma quando lo eseguiamo scopriamo che il conteggio alla rovescia è molto veloce. Troppo.
a = 1
while a < 100 :
a = a+1
La soluzione che conta lentamente non è altro che la fusione dei due programmi.
n = 10
while n > 0 :
      print n
      a = 1
      while a < 1000000 :
            a = a + 1
      n = n – 1
print “Pronti …VIA!”

Nota bene: Quest’ultimo programma contiene due cicli while, di cui il secondo, quello introdotto per “perdere tempo”, è ANNIDATO entro il primo.
Notare come è stato scritto il programma:
l’istruzione while a < 1000000 è indentata rispetto a while n > 0 mentre l’istruzione a = a + 1 è indentata rispetto a while a < 1000000.

Le istruzioni che possono essere annidate non devono essere necessariamente dello stesso tipo, possono essere disomogenee.
Ad esempio, posso annidare una decisione (IF), oppure un ciclo di altro tipo (FOR), e anche una funzione.

Esercizi:

Scrivere un programma per stampare il quadrato e il cubo dei numeri da 1 a 10.
i = 1
while i <= 10 :
    e = 1
    while e <= 3 :
        print i ** e, ” “,
        e = e + 1
    print
    i = i + 1
Scrivere un programma che chiede una sequenza di numeri da aggiungere ad una somma. Per terminare inserisci 0.
a = 1
somma = 0
print ‘Inserisci i numeri da aggiungere alla somma ‘
print ‘Quando hai finito inserisci 0’
while a != 0 :
        print ‘La somma è:’,somma
        a = input(‘Numero? ‘)
        somma = somma + a
print ‘Totale =’,somma

Scrivere un programma per stampare la Tavola Pitagorica.
print ” TAVOLA PITAGORICA”
print
riga = 1
while riga <= 10 :
    colonna = 1
    while colonna <= 10 :
        print ‘\t’, riga * colonna,
        colonna = colonna + 1
    riga = riga + 1
    print

Il carattere di backslash ‘\’ indica l’inizio di una sequenza di escape.
Le sequenze di escape sono usate per rappresentare caratteri “speciali” e invisibili come la tabulazione (‘\t’) e il ritorno a capo (‘\n’) e possono comparire in qualsiasi punto di una stringa.

Indovina un numero! Scrivi un programma per indovinare un numero
numero = 27
indovina = 0
while indovina!= numero :
    indovina = input(“Indovina un numero: “)
    if indovina > numero:
        print “Troppo grande”
    elif indovina < numero :
            print “Troppo piccolo”
print “BRAVO!!”

….ancora sulle STRINGHE

Sinora abbiamo visto che una stringa è una serie di caratteri, cifre, lettere o altri simboli che si trovano sulla tastiera, cioè un messaggio qualunque.
Inoltre, sappiamo che una stringa per essere considerata tale deve essere racchiusa tra virgolette (semplici o doppie) e che si possono fare alcune operazioni con le stringhe.
Possiamo scrivere:
“ciao” * 3 oppure “ciao” + “ciao” + “ciao” oppure
“ciao” * 2 + “ciao”
invece
“ciao”/4 oppure “ciao” + 5 oppure “18” + 8
sono sbagliate e generano un syntax error.
Che cosa hanno di diverso le stringhe dagli altri tipi di dati (interi, floating point)?
Le stringhe sono qualitativamente diverse dagli altri tipi di dati perché sono composte di unità più piccole: i caratteri.
Per questo le stringhe sono dati “composti” in alternativa ai dati “semplici” che sono gli interi e i floating point.
Questo ci consente di trattare una stringa come fosse una singola entità oppure di agire sulle sue singole parti (i caratteri) a seconda di ciò che stiamo facendo. Come si fa ad agire sui singoli caratteri?

Quale sarà il risultato di questo programma?
squadra = “Juventus”
messaggio = squadra[0] + squadra[2] + squadra[3] + squadra[4] + squadra[5] + squadra[6] + squadra[7]
print squadra
print messaggio
>>>Juventus
>>>Jventus

Come si individuano i singoli caratteri.
Nella variabile squadra abbiamo messo la stringa tutta intera mentre nella variabile messaggio l’abbiamo inserita come sequenza di caratteri.
squadra[i] e` una stringa fatta di un solo carattere e non è altro che il carattere di Juventus che occupa la posizione i + 1.
L’espressione tra parentesi quadrate seleziona i caratteri della stringa. Quindi squadra[0] seleziona il primo carattere, squadra[1] il secondo e cosi via.
Ricordati che i calcolatori iniziano quasi sempre a contare da 0.
L’espressione tra parentesi quadrate è chiamata indice.
Un indice individua un particolare elemento di una stringa e può essere una qualsiasi espressione intera.
Un’espressione aritmetica negativa come –i fra parentesi quadre [-i] indica il carattere posto nella posizione (i + 1) a partire dal fondo.
Così, ad esempio,
squadra[-0] è uguale al carattere “s”
squadra[-2] è uguale al terzultimo carattere, ossia “t”.
Cosa si ottiene scrivendo il seguente programma?
>>>squadra = “Juventus”
>>>messaggio = “VIVA” + ” ” + squadra[0] + squadra[1] + squadra[2] + squadra[3]
>>>print squadra
>>>print messaggio
Juventus
VIVA Juve

Porzioni di stringa
Nell’esempio precedente abbiamo preso una parte della stringa Juventus sommando i primi 4 caratteri; potevamo ottenere lo stesso risultato usando l’espressione
messaggio = “VIVA” + squadra[0:4]
che vuol dire “seleziona tutto il pezzo di stringa a partire dal carattere [0], il primo, fino al carattere [4], il quinto, escluso.
Quale sarà il risultato di:
squadra[:3]
>>>
squadra[3:]
>>>
squadra[:]
>>>
Se non è specificato il primo indice (prima dei due punti 🙂 la porzione parte dall’inizio della stringa. Senza il secondo indice la porzione finisce con il termine della stringa.
Di conseguenza squadra[:] è la stringa intera.
Gli indici di porzione sbagliati vengono gestiti con eleganza: un indice troppo grande viene rimpiazzato con la dimensione della stringa, un indice destro minore di quello sinistro restituisce una stringa vuota.

Lunghezza di una stringa
La lunghezza di una stringa è rappresentato dal numero di caratteri che contiene.
La funzione len (nome della stringa) restituisce la lunghezza della stringa, cioè restituisce il numero di caratteri della stringa.
>>>squadra = “Roma”
>>>print len(squadra)
4
Quanto vale len(“Juventus”)?
Osserva che abbiamo scritto len(squadra) senza virgolette perché squadra è il nome di una variabile e invece abbiamo scritto len(“Juventus”) perché in questo caso abbiamo inserito direttamente la stringa tra parentesi.
Quanto vale len(“squadra”)?
Le stringhe sono immutabili.
>>>squadra = “roma”
>>>squadra[0] = “t”
TypeError: object doesn’t support item assignment
Se proviamo a cambiare il primo carattere della stringa “roma” il risultato non è toma ma un messaggio di errore perché le stringhe non sono modificabili.
Provate a pensare come si potrebbe ottenere un risultato simile.
La soluzione è:
squadra2 = “t” + squadra[1:4]
Abbiamo creato una nuova stringa concatenando la lettera “t” ad una porzione della stringa “roma”. Il risultato è “toma” ma questa operazione non ha avuto alcun effetto sulla stringa originale.

Facciamo qualche esercizio per comprendere il significato delle funzioni:
>>>3
3
>>>repr(3) (converte un intero in una stringa)
‘3’
Riflettete su questo esempio: il 3 contenuto fra le parentesi è un numero;la risposta del sistema ‘3’ è una stringa costituita da un solo carattere, il carattere ‘3’.
>>>repr(-321)
‘-321’
>>>”32″
’32’

>>>int(32) (converte una stringa in un intero )
32
La funzione int produce un numero intero.
Essa può avere come argomento sia una stringa che rappresenti un numero intero sia un’espressione che rappresenti un numero decimale di cui sarà prodotto il valore intero corrispondente, come appare chiaro dagli esempi seguenti.
>>>”32”*2
‘3232’
Questo è un risultato che può apparire strano.
Siccome * si applica non al numero 32 ma alla stringa fatta dai due caratteri ‘3’ e ‘2’, * ha il significato di “replica la stringa tante volte”, come già sappiamo.
>>> int(“32”) * 2
64
>>>repr(3.21) (da decimale a string)
‘3.21’
>>>int(3.21) (da decimale a intero)
3
>>>int(-3.21)
-3
>>> float(“3.21”) (converte una stringa in un decimale)
3.21

Che cosa viene visualizzato con il programma?
py = “Python”
i=0
while i < 6:
print py[i], ‘\t’ , py[0:i+1], ‘\t’, py[i]+py[i-1]+py[i-2]
i=i+1
Ecco il risultato:
P P Pno
Y Py yPn
T Pyt tyP
H Pyth hty
o Pytho oht
N Python noh

Commento all'articolo