La prossima cosa da fare è rileggere il codice sorgente. Una delle cose più importanti da fare mentre si programma è leggere e rileggere il codice sorgente. Innanzitutto analizziamo il codice linea per linea comportandoci esattamente come farebbe il programma. Grazie alle strutture di controllo infatti alcune linee di codice possono non essere eseguite mentre altre possono essere eseguite più di una volta. L'importante è che immaginiate ad ogni linea il comportamento di Python.
Iniziamo con il semplice programma per calcolare il perimetro. Non scrivetelo,
dovete leggerlo e basta:
Domanda: Qual'è la prima linea che Python esegue ?height = input("Height: ")
width = input("Width: ")
print "perimeter = ",width+height+width+width
Risposta: height = input ("Height: ").
Domanda: Qual'è il suo effetto ?
Risposta: Stampa Height: sullo schermo e attende l'inserimento di un numero da parte dell'utente per metterlo nella variabile height.
Domanda: Qual'è la prossima linea che Python esegue ?
Risposta: La linea sotto: width = input ("Width: ").
Domanda: Cosa provoca nel programma ?
Risposta: Stampa Width: sullo schermo, attende l'input e assegna il valore immesso alla variabile width.
Domanda: Qual'è la prossima linea ?
Risposta: print "Perimeter = ", width+height+width+width.
Domanda: ma width + height + width + width calcola il perimetro correttamente?
Risposta: Vediamo: il perimetro di un rettangolo si calcola sommando i lati (uh ?). L'ultimo elemento (width) dovrebbe essere un lato (height) non la base (width)...
Domanda: Capisci ora perché alcune volte il perimetro risultava corretto ?
Risposta: Certo, risultava corretto perché tutti i lati erano uguali !!
. . . .Ecco il codice:
Questo programma sarà un po' più complesso, come potete notare nel codice è presente una struttura while. Bando alle ciance, rimbocchiamoci le maniche e cominciamo.number = 5 while number > 1: print ".", number = number - 1 print
Domanda: Qual'è la prima linea ad essere eseguita ?
Risposta: La prima linea del file: 'number = 5'.
Domanda: Cosa fa ?
Risposta: Assegna il valore '5' alla variabile number.
Domanda: Come prosegue ?
Risposta: La prossima linea è: 'while number > 1:'.
Domanda: Cosa fa ?
Risposta: Allora: la struttura while verifica che l'espressione che la segue (number > 1) sia vera o falsa. Nel primo caso esegue il codice tabulato sotto, nel secondo caso lo salta per passare al codice tabulato al suo stesso livello.
Domanda: Quindi in questo caso come si comporta ?
Risposta: Se la condizione 'number > 1' è vera eseguirà le due righe di codice successive.
Domanda: La variabile number allora è maggiore o minore di 1 ?
Risposta: Il valore di number è 5 quindi è maggiore di 1.
Domanda: Quindi qual'è la prossima linea ?
Risposta: La linea indentata appena sotto: 'print ".",' finché la condizione while è vera Python eseguirà questa istruzione, ovvero stamperà un punto e dato che alla fine dell'istruzione compare una virgola, lo stamperà sulla stessa linea del precedente.
Domanda: Ed ora come continua il programma ?
Risposta: number = number - 1 visto che è indentata sotto il while.
Domanda: Cosa fa ?
Risposta: Decrementa la variabile di 1. Quindi number dopo questa istruzione non risulterà più 4 ma 5.
Domanda: Ora come continua ?
Risposta: Dato che il livello di tabulazione decrementa dobbiamo pensare che tipo di struttura di controllo stiamo applicando. Preso atto che è un ciclo while dobbiamo tornare alla linea 'while number > 1:'.
Domanda: Adesso che succede ?
Risposta: Semplice: dopo il riassegnamento della variabile number, che è passata da un valore di 5 a un valore di 4, bisogna rifare il confronto tra la condizione del while e la variabile.
Domanda: Il risultato qual'è ?
Risposta: La condizione 'number > 1' è ancora vera quindi il ciclo continua: verranno eseguite per la seconda volta le istruzioni indentate sotto il while.
Domanda: Ancora 'print ".",' e ' number = number - 1' ?
Risposta: Si :-) Il risultato sarà la stampa di un'altro punto sulla stessa linea del precedente e il decremento di una unità della variabile number che assumerà il valore di 3.
Domanda: A questo punto quale sarà la prossima linea ?
Risposta: finché non ci sarà un cambio di indentazione causato dalla fine del ciclo la linea sarà sempre 'while number > 1:'.
Domanda: Si ricomincia da capo allora ?
Risposta: Già. Verrà aggiunto un'altro punto sulla stessa linea dei precedenti e la variabile number verrà decrementata di nuovo. Queste istruzioni verranno eseguite finché la condizione del while non risulterà falsa.
Domanda: Riassumendo quindi, alla fine di questo ennesimo ciclo i punti saranno 3 e il valore della variabile number sarà 2.
Risposta: Esattamente.
Domanda: Continuiamo? Se non sbaglio ora dobbiamo tornare a 'while number > 1:'.
Risposta: Si, dobbiamo tornare ancora alla linea che inizia il ciclo while per confrontare ancora una volta variabile e condizione del ciclo: dato che 2 è maggiore di 1 eseguiremo ancora le istruzioni indentate sotto. Alla variabile number verrà assegnato il valore di 1 e i punti sulla nostra linea diventeranno 4.
Domanda: Aspetta un secondo: i 4 punti sono il risultato finale del programma. Cosa significa ?
Risposta: Significa che probabilmente l'errore è qui :-) Ricominciamo il ciclo: 'while number > 1:', ovvero finché la variabile number (che ora corrisponde a 1) è maggiore di 1... Ecco l'errore! Il ciclo si interrompe qui visto che 1 non è maggiore di 1.
Domanda: Come posso riparare ?
Risposta: Dato che lo scopo del programma è stampare 5 punti e non 4 dobbiamo semplicemente cambiare la condizione del ciclo while sostituendo 'while number > 1:' con 'while number >= 1:' Questo non è l'unico modo per eseguire il fix del programma.