Questi sono i miei appunti di informatica sviluppati durante i lockdown. Di fatto costituiscono il libro di testo dei miei corsi. La grafica è ispirata a D&D 5e nella speranza di accattivarmi l'interesse dei ragazzi.
Questa parte è adatta ai ragazzi di 1-2° liceo SSA e di 2°-3° ITIS (in particolare ad indirizzo informatico)
2. Contenuti
Introduzione
1. Libro incantesimi
Rappresentare gli algoritmi
Pseudocodice
Primi problemi e soluzioni
Trucchetti
2. Istruzioni di scelta
Di che si tratta
Come si rappresenta
Principio “Matrioska”
Condizioni logiche e tabelle di verità
Scelte multiple
Scelte in diagrammi di flusso e DNS
Scelte nello pseudocodice
3. I cicli
Di che si tratta
Il ciclo while (precondizionato)
Variabile di controllo
Ciclo do..while (postcondizionato)
Approfondimenti
Modelli di cicli
Cicli for (determinati e precondizionati)
Conclusioni
Sintesi
Ruoli
3. Introduzione
iovane mago, hai imparato a muovere i primi passi nell’arcano
mondo dell’informatica e, specificamente, dell’algoritmica.
In questa sezione apprenderai alcuni strumenti assai utili, come la
tabella di traccia e l’arcano linguaggio dello pseudocodice,
G
e apprenderai le ricette “magiche” dei trucchetti,
che ti permetteranno di risolvere i primi
problemi. Grazie ad essi potrai costruire i
programmi che le arcane macchine potranno
eseguire. Al termine di questo percorso, diverrai
un vero Teurgo!
4. Introduzione (seria)
ieccoci! Dopo una fase teorica piuttosto lunga iniziamo a pensare a i
primi algoritmi pratici. Naturalmente partiremo con le cose più
semplici, in modo da permettervi di diventare esperti e utilizzare
queste capacità in modo proficuo e, soprattutto, usarlo come
“mattoni” per costruire algoritmi più complessi.
R
6. Rappresentare gli algoritmi
La Scelta
Come ricorderete, esistono tanti metodi per rappresentare gli algoritmi:
diagrammi di flusso, struttogrammi, linguaggio naturale.
Quella che vi proponiamo di utilizzare in questo corso è lo pseudolinguaggio, più
specificamente, la versione matematica dello pseudolinguaggio, eliminando le
istruzioni di input output. Le motivazioni sono semplici
● Compattezza: si tratta del sistema che occupa meno spazio fisico
● Focus: si concentra totalmente sul procedimento, lasciando perdere tutti gli
aspetti esterni
7. Modello di
rappresentazion
e di un Algoritmo
Introdurremo le istruzioni un po’ per
volta.
Nome(ev. parametri)
Livello dell'algoritmo
Input: Descrizione dati in ingresso
Output Descrizione risultato in uscita
Componenti: Condizioni o conoscente
necessarie per eseguire l’algoritmo
Complessità: Descrizione della lunghezza
istruzione
istruzione
istruzione
8. Primo problema
I triangoli di Rogus
Rogus l’apprendista ha il compito di dipingere di estratto
delle Scarlatte bande di Cyttorak diversi triangoli per il
rituale transplanare del maestro. Dato che l’estratto è molto
prezioso, deve sapere esattamente quante boccette comprare:
ogni boccetta è in grado di colorare esattamente un
centimetro quadro di superficie. Aiutate Rogus a non
sprecare il danaro del suo maestro.
Applicate il metodo generale degli algoritimi e identificate
dati di input, dati di output, il processo di risoluzione,
metodo di verifica. Pensate inoltre a quali competenze deve
avere l’esecutore per poter risolvere il problema con il vostro
algoritmo.
9. Possibile soluzione
Dati di input: misura del lato, numero
triangoli
Dato di output: area del triangolo
Competenze: saper calcolare l’area di
un triangolo, saper misurare il lato di
un triangolo
Descrizione algoritmo:
1. Misura il lato, numero triangoli
2. Calcola l’area di un triangolo
equilatero con quel lato
3. Somma le aree dei triangoli
4. Stampa il risultato
Verfica: input 3-1, output 3.89711
È davvero questo quello che
si chiede?
È sufficiente per risolvere il
problema?
10. Migliore soluzione
Dati di input: misura del lato e triangoli
Dato di output: numero di boccette
Competenze: conoscere i numeri
irrazionali, saper arrotondare per
eccesso, saper misurare il lato di un
triangolo
Descrizione algoritmo:
1. Inserisci la Misura del lato e il
numero dei triangoli
2. Calcola l’area di un triangolo
equilatero con quel lato x numero
triangoli arrotondato all’intero
superiore
3. Stampa il risultato
Verfica: input 3-1, output 4
Ora proviamo a codificarlo nel nostro
formato.
Teniamo presente che la misurazione
del lato è un’operazione di input, per
cui non verrà codificata direttamente
nell’algoritmo, ma apparirà come
parametro.
Allo stesso modo, la stampa non
apparirà nell’algoritmo: si userà
l’istruzione apposita “return”
11. BoccettaTr(lato,n)
Trucchetto
Input: Lato del triangolo e numero triangoli
Output Numero di boccette necessari
Componenti: radice quadrata e
arrotondamento per eccesso
Complessità: O(1)
temp ← (lato*lato*√3/ 4)* N
return ⌈temp⌉
Ecco gli elementi introdotti
1. L’operatore ← indica l’istruzione di
assegnazione, l’unica che veramente ci
serve in questo tipo di problemi.
2. temp è una variabile. Come suggerisce
il nome il suo scopo è quello di
memorizzare temporanemante un valore
che ci servirà in seguito. Il suo ruolo è
quello di temporary [temporaneo]
3. return è una istruzione che ha due
effetti: per prima cosa termina
l’algortimo, e come seconda cosa
restituisce il o i risultati.
4. Lato e n sono parametri,
tecnicamente varibili che non sarnno
mai modificata. Il suo ruolo è fixed
value [fisso]
Algoritmo
12. Secondo problema
Le tigelle di Bott’rah
L’aricimago ha sentito parlare di un cibo
prelibato chiamato “Tigella”, realizzato dall’
grande alchimista Mpass Bott’rah. Grazie a
una divinazione è riuscito ad ottenere la
formula per realizzarla e incarica il
malcapitato apprendista Rogus di
prepararle. Riuscirà Rogus a non deludere il
maestro?
Trasformate la ricetta a lato secondo
utilizzando la sintassi dello pseudocodice.
1 kg di farina; 10g sale; 50 g di lievito di birra; 20g
di zucchero; 2,5 dl di latte
Versate la farina a fontana sul piano di lavoro,
distribuite 4 cucchiaini di sale sulla parte più
esterna in modo che non venga subito a contatto col
lievito. Sbriciolate al centro il lievito di birra,
aggiungete lo zucchero e versate poco alla volta il
latte tiepido mescolato con altrettanta acqua tiepida.
Impastate il tutto per qualche minuto, formate una
palla e lasciatela lievitare in una ciotola per tre ore
coperta da un canovaccio.
Riprendete quindi l’impasto, stendetelo e ricavatevi
dei tondi di circa 6 cm, lasciateli lievitare coperti
per un’altra mezz’ora e cuoceteli in una tigelliera.
Servite le tigelle caldissime con prosciutto crudo,
salame nostrano e mostarda di mele campanine.
13. Tigelle(fa,nc,lv,z,lt)
Trucchetto
Input: farina, numero cucchiaini di sale,
lievito,zucchero,latte
Output Piatto da servire
Componenti: azioni tipiche di un cuoco
Complessità: O(1)
impasto=fa
impasto=impasto+distribuisci(nc)
impasto=impasto+sbriciola(lv)
impasto=impasto+z
acqua=misura_quantità(latte)
impasto=impasto+latte+acqua
impasto=lievita(impasto,3h)
stendi(impasto)
tondi=dividi(impasto)
tondi=lievita(tondi,30m)
tigelle=cuoci(tondi)
return (tigelle,
prosciutto,salame,mostarda)
Ecco i nuovi elementi introdotti
1. return può restituire una lista di
elementi
2. impasto e tondi sono variabili che
mantengono l’ultimo valore calcolato. Il
loro ruolo è most-recent [più recente]
3. acqua è temporary
Discussione: Si tratta davvero di un
algoritmo? Dimostratelo, o dimostrate il
contrario.
Algoritmo
14. Terzo problema
Il fratellino
Il fratellino piccolo di Rogus ha solo 4 anni,
ed è affascinato dai numeri. Chiede
continuamente al fratellone “quanto fa 2 +
3?” o “quanto fa 5+7”, facendogli perdere
un sacco di tempo.
Rogus decide di risparmiare tempo trovando
una soluzione per il petulante fratellino.
In certi casi abbiamo la necessità di leggere
il valore delle variabili o stampare dei
risultati durante l’esecuzione
dell’algoritmo. Questo in generale non fa
parte del “core” del problema, e può essere
risolto usando strutture dati avanzate, ma
nella fase iniziale il poterlo fare semplifica
le cose. Per questo motivo useremo le
istruzioni seguenti:
input() : chiede all’utente un valore
che sarà assegnato a una variabile,
opzionalmente con un messaggio.
output(): visualizza il contenuto di una
o più variabili
error(): segnala una condizione di
errore, interrompendo il programma.
15. somma()
Trucchetto
Input: -
Output: -
Componenti:
Complessità: O(1)
addendo1 = input(“inserici un
valore”)
addendo2 = input(“inserici un
altro valore”)
output(“risultato”)
output(addendo1+addendo2)
L’algoritmo non è niente di che, ma
segnaliamo i seguenti punti.
1. return in questo caso non è presente.
2. output può effettuare calcoli
3. Le istruzioni input, output ed error sono
in realtà tecnicamente molto complesse,
e differiscono assai a seconda del
linguaggio di programmazione
utilizzato.
Algoritmo
16. Quarto problema
Pozioni esplosive
Rogus ha erroneamente versato
nell’alambicco giallo un Estratto di
salamandra e in quello verde il Luto di
Zolfo. Deve rimettere tutto a posto prima
del ritorno del maestro, facendo però
attenzione, perché se i due composti
vengono in contatto, si genera
un’esplosione!
Il problema dello scambio di due valori
si presenta molto spesso nel mondo
dell’informatica, tanto che è presente in
molti linguaggi di programmazione.
scambia(A,B)
Trucchetto
Input: due valori
Output: le variabili con valori scambiati*
Complessità: O(1)
temp ← a
a ← b
b ← temp
17. Trucchetti??
Trucchetti
In Dungeons & Dragons, un “Trucchetto” è un incantesimo di impatto limitato, una delle prima cose
insegnate all’apprendista stregone. Sono tuttavia utili, e propedeutici all’uso degli incantesimi veri e
propri.
Nel nostro parallelo, definiremo trucchetti alcuni algoritmi che hanno le seguenti caratteristiche:
● Usano solo variabili semplici (includiamo anche le stringhe, ma senza operazioni complesse)
● Fanno uso dei soli costrutti di sequenza e selezione
● La correttezza è evidente o facilmente verificabile
● Non sono ottimizzabili e non sono scalabili
● Tipicamente di complessità costante O(1)
Questo non vuol dire che siano inutili!
19. SCELTA
Le istruzioni di scelta cominciano
a rendere interessante la
programmazione. E’solo grazie
ad esse infatti che possiamo avere
dei programmi che davvero
alterano il loro comportamente in
funzione delle situazioni.
Sono le prime istruzioni di
controllo che troviamo
nell’algoritmica e
programmazione. Il computer
infatti sceglie quale sequenza di
operazioni eseguire in base a una
condizione logica ben specificata..
20. Come si rappresenta
Nel caso dei diagrammi di flusso,
Algobuild o Flowgorithm è
espresso tramite rombo al cui
interno è descritta la condizione.
Da essa dipartono due frecce
indicate con “Vero” o “Falso”.
Ciascun ramo può avere zero o più
istruzioni.
Negli struttogrammi, è indicato con
un triangolo con base verso l’alto,
e l’indicazione “V” o “F” al di
sotto delle quali si trovano le
istruzioni da eseguire.
21. Come si rappresenta
Nel nostro pseudolinguaggio, si
indica con la parola chiave if. Per
indicare le istruzioni da eseguire se
la condizione è verifica queste
vanno indentate.
Opzionalmente, è possibile
indicare istruzioni da eseguire se la
condizione NON è verificata, con
la parola chiave else
if i>4
i← i+1
j← j*2
else
j← 0
22. Principio “Matrioska”
Nel mondo della programmazione, vale una proprietà che
potremmo definire “Principio Matrioska”. In termini semplici,
afferma che ogni struttura di controllo può contenerne un altra,
che a sua volta può contenerne un’altra, e così via.
Per cui, una sequenza può contenere una
scelta, che può contenere una scelta, che
può contenere una sequenza.
Questo principio si applica in ogni
linguaggio di programmazione, anche se
con modalità diverse.
23. Principio “Matrioska”
L’esempio a destra mostra una
sequenza (linea gialla) con due
alternative che contiene una scelta
(linea arancione) con due
alternative, la prima delle quali
contiene una sequenza (linea
marrone)
Indipendentemente dalla
complessità del codice,
l’esecuzione segue sempre una sola
possibile sequenza (che dipende
dai valori delle variabili.
if i>4
if j==4
i← i+1
j← j+2
else
i← i-1
else
j← 0
k=i+j
24. Condizioni logiche
La condizione deve sempre assumere un valore vero (true) o
falso (false). In molti casi si usano operatori matematici come
maggiore >, maggiore o uguale >=, uguale ==. Diverso da (≠)
può essere rappresentato come !=, <>, NOT =
Spesso queste condizioni semplici non bastano e occorre
ricorrere a “espressioni logiche”. Scrivere espressioni logiche
può non essere totalmente immediato. Fanno uso degli
“operatori logici”
● AND (vera solo se entrambi gli operandi sono veri) → &&
● OR (vera solo se almeno uno degli operandi è vero) → ||
● NOT (inverte da vero a falso o viceversa) → !
25. Condizioni logiche (esempi)
Condizione vera se il numero è 4, 5 o 6
x == 4 OR x == 5 OR x==6
Condizione vera se il numero è compreso tra 6 e 20
x>=6 AND x<=20
Condizione vera se il numero x è compreso tra -10 e +10 ma
diverso da 0
(x≠0) AND ( x>=-10 && x<=10)
Condizione vera se il numero x è compresotra -10 e +10 purché
dispari
(x % 2==1) AND ( x>=-10 && x<=10)
26. Tabelle di verità
Le avete viste alle elementari, alle
medie, al bienno. Le diamo per
scontate. Come le leggi di De Morgan
che serviranno. (ripassatele):
AND
OR
NOT
Leggi di de Morgan
27. Raffinatezze tecniche
In moltissimi linguaggi di
programmazione tra cui C++, esiste il
concetto di “corto circuito” (short
circuit): se, durante l’esecuzione di una
espressione logica si sa con certezza
che sarà vera o falsa, il resto
dell’esecuzione non viene neppure
valutata. Esempio:
if x≠0 AND y/x > 12
c← y/x+ 2
Se x è zero, la seconda parte non viene
valutata...evitando errori!
Particolarità del linguaggio C/C++
In C/C++, la condizione di un if va sempre
racchiusa tra parentesi tonde.
In C++ le operazioni logiche si possono esprimere
in più modi equivalenti:
and oppure &&
or oppure ||
not oppure !
La prima forma è relativamente recente, e
potrebbe non essere riconosciuta da vecchi
compilatori. Non funziona nel linguaggio C.
In C/C++, il valore falso è associato al valore
intero zero. Quindi l’espressione seguente ha
senso:
if ( y==5 && !x)
Esiste una forma estremamente contratta di if da
usare nelle assegnazioni, il malefico “operatore ?”
x = (x==3) ? 5: 6
28. Esercizio 1 - molto semplice
Scrivere un algoritmo che
restituisce il valore massimo tra
due valori interi
Casi di verifica
● 1 e 5 → 5
● 4 e -5 → 4
max(a,b)
Trucchetto
Input: due valori interi
Output valore massimo
Componenti: -
Complessità: O(1)
if a≥b
return a
else
return b
29. Esercizio 2 - semplice
Scrivere un algoritmo che
restituisce il valore massimo tra
tre valori interi
Casi di verifica
● 1 , 7 e 5 → 7
● 4 e -5 e 11 → 11
max3(a,b,c)
Trucchetto
Input: due valori interi
Output valore massimo
Componenti: -
Complessità: O(1)
if a≥b and a≥c
return a
if b≥a and b≥c
return b
return c
Discussione: come potrà essere
l’algoritmo per 5 variabili? 100?
10000?
30. Scelte
multiple
Come risolvere questa situazione?
Se sei su un’autostrada la tua
velocità massime è 130 km/h
Se sei su una superstrada la
velocità massima è 110 km/h
Se sei in un centro abitato la
velocità massima è 50 km/h
Altrimenti la velocità massima è
90 km/H
31. Scelte multiple nei DdF e DN-S
I diagrammi di flusso non hanno strutture
particolarli per gestire le scelte multiple e si
limitano ad applicare il “principio
matrioska”. Per questo sono piuttosto
scomodi, perchè ogni singola condizione
richiede il suo rombo e due frecce. Piuttoso
ingombrante per qualunque algoritmo non
banale. Lo stesso vale per Algobuild e
Flowgorithm.
Gli struttogrammi (Nassi-Schneidemann)
prevedono invece un modo semplice per
gesitre le scelte multiple, utilizzando delle
colonne che hanno un valore che “attiva” la
colonna interessata.
32. Scelte multiple: Pseudocodice
Nel nostro pseudocodice è possibile
sia utilizzare if / else innestati, sia
usare la parola chiave elseif che
rende la lettura del codice più
semplice poiché limita
l’intestazione.
i
if tipo_strada==”autostrada”
v_max=130
elseif tipo_strada==”superstrada”
v_max=110
elseif tipo_strada==”centro_abitato”
v_max=50
else
v_max=90
33. Scelte multiple: C/C++
Nel linguaggio C/C++ non esiste la parola
chiave elseif, per cui il codice risulta un po’ di
difficile lettura.
if (tipo_strada==autostrada)
{ v_max=130;}
else if (tipo_strada==superstrada)
{ v_max=110; }
else if tipo_strada==centro_abitato)
{v_max=50;}
else
{v_max=90;}
i
Lo Switch
Molti linguaggi, tra cui C/C++ prevedono una
forma di scelta multipla chiamata switch. In
questo caso, il codice assume questa forma:
switch(tipo_strada) {
case autostrada:
v_max=130;
break;
case superstrada:
v_max=110;
break;
case centro_abitato:
v_max=50;
break;
default: v_max=90;
}
Notare che questa istruzione è molto diversa
da un if tradizionale. Oltre alla sinstassi -
visibilmente modificata - richiede un valore
intero, e non permette gamme di valori. Per cui
l’utilità dell’uso dipende dal contesto.
34. Esercizio 3 - Normale
Alla biglietteria della stazione è
possibile acquistare un biglietto
per Bologna (costo base 6,35€) o
Milano (18,22€). Il biglietto può
essere semplice, andata e ritorno,
o mensile. L’andata e ritorno è
pari a 1,75 volte il biglietto
semplice, mentre l’abbonamento è
pari a 25 volte il costo del
biglietto A/R.
Test case:
● Biglietto per Bologna,
semplice → 6,35
● Biglietto per Milano, A/R →
31,885
● Biglietto per Bologna, mensile
→
35. Esercizio 3 - soluzione
La variabile prezzo contiene un
valore che viene di volta in volta
aggiornato ed ogni volta tende
sempre più ad avvicinarsi alla
soluzione richiesta. Il suo ruolo è
chiamato most wanted
biglietto(dest,tipo)
Trucchetto
Input: destinazione, tipo di biglietto
Output costo biglietto
Componenti: -
Complessità: O(1)
if dest==”Bologna”
prezzo ← 6,35
else
prezzo ← 18,22
if tipo != “semplice”
prezzo=prezzo*1,75
if tipo == “abbonamento”
prezzo=prezzo*25
return prezzo
36. Esercizio 4 - Più complicato
Un grossista di frutta vende ai
negozianti. In questo momento si
vende uva e prugne, ma il costo è
variabile, e non è possibile saperlo
in anticipo. Il grossista applica
uno sconto del 10% se si
acquistano almeno 100 kg, e uno
sconto del 15% se si acquistano
almeno 200 kg. Al prezzo va
comunque applicata l’IVA al 4%.
Calcolare il prezzo finale con e
senza IVA.
Casi di verifica:
● 34 kg di uva
→ (40,8 / 42,432)
● 202 kg di prugne
→ (264,418 / 274,99472)
● 115 kg di prugne
→(159,39 / 165,7656)
37. Esercizio 4 - soluzione
La variabile prezzo contiene un
valore che viene di volta in volta
aggiornato ed ogni volta tende
sempre più ad avvicinarsi alla
soluzione richiesta. Il suo ruolo è
chiamato most wanted
Fattura(kg,frutta)
Trucchetto
Input: chili acquistati, tipo di frutta
Output costo biglietto
Componenti: -
Complessità: O(1)
if frutta==”prugne”
prezzo ← 1,54*kg
else
prezzo ← 1,20*kg
if kg >100 and kg<200
prezzo=prezzo*0,90
if kg>=200
prezzo=prezzo*0,85
return (prezzo, prezzo*1,04)
39. I Cicli
I cicli sono un modo conciso per
esprimere una successione di eventi che
si ripetono. In modo più formale si tratta
del costrutto logico iterativo, che
permette di ripetere un gruppo di
istruzioni.
Sono il terzo elemento fondamentale
della programmazione e, per la verità, il
più difficile da far digerire ai
neoprogrammatori.
40. Un semplice esempio
Supponiamo di volere stampare 8
volte la parola “Ciao”.
output(“Ciao”)
output(“Ciao”)
output(“Ciao”)
output(“Ciao”)
output(“Ciao”)
output(“Ciao”)
output(“Ciao”)
output(“Ciao”)
Non proprio entusiasmante. Pensate
se dovessimo stamparlo 1000
volte….
Peggio ancora se volessimo ripetere
una istruzione un numero variabile
di volte.
volte=input()
if volte==1
output(“Ciao”)
if volte==2
output(“Ciao”)
output(“Ciao”)
if volte==3
output(“Ciao”)
output(“Ciao”)
output(“Ciao”)
(ecc)
41. Cosa vorremmo?
Una cosa semplice come questa
volte=input()
RIPETI volte
output(“Ciao”)
Semplice, efficiente, chiaro.
Purtroppo, la realtà è che non è così
semplice!
Infatti, esistono tanti diversi tipi di
cicli, e nessuno ha un vantaggio
decisivo sugli altri. Bisogna, quindi,
conoscerli e saperli usare tutti
quanti.
E allora, andiamo a incominciare.
43. Presentazione
Qui possiamo vedere la
descrizione del ciclo while tramite
diagramma di flusso.
La struttura di questo tipo di ciclo,
il più comune, prevede una
scelta all’inizio del ciclo e una
freccia di ritorno a fine ciclo.
Il blocco di istruzioni viene
eseguito finché la condizione è
vera, ed esce non appena diventa
falsa.
44. DdF e Struttogrammi
Qui possiamo vedere la descrizione del
ciclo while nella versione Flowgorithm
che prevede un simbolo diverso per la
condizione.
Sotto la versione tramite
struttogramma. Si noti come la
condizione “avvolga” le istruzioni del
ciclo
Visto che la condizione è all’inizio del
ciclo, si chiama anche ciclo
precondizionato
45. Il ciclo while
Nel nostro linguaggio di
programmazione, il ciclo while
sarà indicato in modo molto
semplice.
while <condizione>
istruzione
istruzione
…………
Per cui, l’esempio del diagramma
a blocchi visto in precedenza si
tradurrebbe in questo modo:
n ← 1
while n ≤ 100
output(n)
n ← n+1
…………
46. Variabili di controllo
In ogni ciclo la condizione è legata a
una variabile detta variabile di
controllo È molto importante che tale
variabile sia in qualche modo
modificata all’interno di un ciclo
stesso.
In caso contrario ci si imbatte in uno
dei più classici errori di
programmazione: il ciclo infinito.
La variabile di controllo ha di solito
uno dei seguente ruoli:
Se di tipo numerico, di solito passa
attraverso una sequenza di valori sino
a un valore limite. In questo caso è il
suo ruolo è stepper (passo-passo)
Se invece è un valore booleano, il
suo ruolo è simile a quello di un
semaforo, che può essere cambiato
una sola volta. Il suo ruolo è
chiamato one-way flag (segnale di
blocco)
48. Presentazione
Il ciclo do..while
(“fai”...”finquando”) è molto
simile al precedente.
È formato da una sequenza di
istruzioni seguite dalla una
condizione. Se la condizione è
vera, la sequenza viene ripetuta
ancora una volta, altrimenti si
prosegue.
La differenza fondamentale
rispetto al while è che siete sicuri
che il ciclo verrà eseguito
ALMENO una volta.
49. DdF e Struttogrammi
Descrizione del ciclo while nella
versione Flowgorithm che prevede
l’inizio della sequenza sia indicato da
un pallino (connettore), seguito dalla
sequenza, e quindi dalla condizione.
Sotto la versione tramite
struttogramma; anche in questo caso la
condizione è in fondo.
Visto che la condizione è al termine del
ciclo, si chiama anche ciclo
postcondizionato
50. Il ciclo do..while
Nel nostro pseudolinguaggio, il
ciclo do while assomiglia assai
alla versione del while.
do
istruzione
istruzione
…………
while <condizione>
Per cui, l’esempio del diagramma
a blocchi visto in precedenza si
renderebbe in questo modo:
do
age=input()
while age<0 OR age>100
51. Esercizio 1
Dato un numero intero, stampare
un “conto alla rovescia” e, al
termine, stampare la parola
“Boom”.
Casi di test
5 → output: “5 4 3 2 1 Boom”
0 → output: “Boom”
-3 → nessun output
Domande guida
● Usare un ciclo
precondizionato o
postcondizionato?
● Quali e quanti variabili
servono? Che ruolo hanno?
52. Esercizio 1 - soluzione
L’uso del ciclo while
(precondizionato) è obbligatorio,
per gestire correttamente un input
sbagliato. È sufficiente una sola
variabile, il cui ruolo è stepper.
CountDown(n)
Trucchetto
Input: valore iniziale
Output numri e la parola
Complessità: O(n)
while n>0
output(n)
n← n-1
if n==0
output(“Boom”)
53. Esercizio 2
Dato una sequenza di numeri
terminante con 0, stabilire quanti
numeri sono stati effettivamente
forniti
Casi di test
1,2,3,0 → 3
4,4,4,4,4,0 → 5
0 → 0
Domande guida
● Usare un ciclo
precondizionato o
postcondizionato?
● Quali e quanti variabili
servono? Che ruolo hanno?
54. Esercizio 2 - soluzione
L’uso del ciclo do.. while
(precondizionato) è consigliato,
ma con qualche modifica va bene
anche il ciclo while. Servono
almeno due variabili: una conta i
numeri inseriti (most wanted) , la
seconda memorizza
temporaneamente il valore
inserito per effetttuare il controllo
(temporary)
ContaNumeri()
Trucchetto
Input: -
Output numero di elementi inseriti
Complessità: O(n)
conta=-1
do
a=input()
conta ← conta+1
while a!=0
Return conta
56. Problematiche dei cicli
Nello strutturare un ciclo occorre garantire:
● Che il ciclo possa iniziare
● Che il ciclo possa terminare
● Che il numero di iterazioni sia quello desiderato
● Che tutte le iterazioni siano eseguite correttamente
Ricordiamo che il corpo del ciclo viene eseguito più volte:
○ La prima volta lavorerà generalmente con variabili che
sono state inizializzate al di fuori del ciclo,
○ Le volte successive lavorerà con variabili che possono
essere state modificate nel “giro” precedente.
57. Anatomia di un ciclo (while)
INGRESSO
USCITA
CONDIZIONE
AGGIORNAMENTO
RITORNO
CORPO
INIZIALIZZAZIONE
58. Le componenti di un ciclo
Conviene concepire il ciclo come 4 fasi
● Inizializzazione
● Condizione di ripetizione
● Corpo
● Aggiornamento
59. Anatomia 1 - Inizializzazione
Assegnazione del valore iniziale a tutte le variabili che
vengono utilizzate durante il ciclo (nel corpo o nella
condizione).
(Eccezione: nel solo caso del do...while alcune variabili
potrebbero essere non inizializzate)
60. Anatomia 2 - Condizione
Condizione, di solito inizialmente vera, che al termine del ciclo
diventerà falsa permettendo così di terminare il ciclo
Deve dipendere da variabili che saranno modificate all’interno
del ciclo (nel corpo o nell’aggiornamento)
61. Anatomia 3 - Corpo
Le istruzioni che effettivamente occorre ripetere, e realizzano lo
scopo per cui il ciclo è stato realizzato.
● Si possono usare le variabili inizializzate
● Si possono modificare tutte le variabili
62. Anatomia 4 - Aggiornamento
Modifica di una o più variabili in grado di aggiornare il valore
della condizione di ripetizione
● Tiene “traccia” del progresso dell’iterazione
64. Cicli contatori
Servono a contare quante volte si
verifica una certa situazione, quando non
si sa con certezza quante volte essa si
presenta.
Esempio: contare quanti dati utili o validi
ha inserito l’utente.
La variabile di controllo del ciclo è
sempre uno stepper. Può esistere una
seconda variabile (tipicamente
most-wanted)
L’esempio a fianco stampa quanti tra i
numeri inseriti sono pari.
conta← 0; rimasti← 10;
do
a= input()
if a mod 2 == 0
conta← cont+1
rimasti← rimasti-1
while rimasti >0
output(conta)
65. Cicli sentinella
Spesso occorre ripetere una sequenza di
operazioni sinché non si verifica una
certa situazione. Potete pensarlo come a
un semaforo: quando diventa rosso ci si
ferma. Sono cicli indefiniti.
Esempi: controllare l’input dell’utente,
leggere una sequenza di dati dall’utente.
Le variabili di controllo sono one-way
flag
L’esempio a fianco fa in modo che
l’utente inserisca solo valori compresi tra
1 e 10.
InputCheck()
Trucchetto
Input: -
Output : valore controllato tra 1 e 10
Complessità: O(n)
ok=false
while NOT ok
a=input()
if a>0 AND a <11
ok = true
return a
66. Cicli condizionati
I cicli condizionati sono una via di
mezzo dei cicli precedenti. Sono cicli di
durata indefinita che terminano quando si
verifica una certa condizione, che può
essere anche complicata. Sono i cicli più
complicati e flessibili.
do
a= input()
if a mod 2 == 0
conta← cont+1
output(“vuoi continuare?”)
risposta=input()
while risposta not = “NO”
68. Cos’è il ciclo for?
Il ciclo for (“per”, sottinteso tante volte) è un caso particolare
del ciclo while. Infatti non esiste nei diagrammi di flusso (
neppure negli struttogrammi) una notazione specifica: si utilizza
un ciclo standard.
Il for si differenza dal while per due aspetti:
● È eseguito un numero predeterminato di volte. Per questo
viene chiamato ciclo (precondizionato) definito. In realtà ci
possono essere delle eccezione - come sempre.
● Prevede automaticamente il meccanismo di inizializzazione
e aggiornamento - tendenzialmente è quindi più facile da
usare e si commettono meno errori.
69. Il ciclo for
Nel nostro pseudo linguaggio, il
ciclo for userà questa sintassi
for <variabile> ←
<valore> to <valore>
istruzione
istruzione
…………
Il valore della variabile di
controllo è incrementato
automaticamente di 1 ad ogni
iterazione.
Il ciclo che segue stampa tutti i
numeri da 1 a 100.
for i ← 1 to 100
output(i)
E’ innegabile la semplicità e la
chiarezza del ciclo for rispetto al
ciclo while! Tuttavia, il ciclo
while rimane largamente usato.
70. Il ciclo for (variante)
In certi casi, l’incremento di 1 può
non essere adatto al nostro
problema. Per questo è possibile,
opzionalmente indicare di quanto
la variabile deve aumentare ad
ogni passo.
for <variabile> ←
<valore> to <valore>
step <valore>
istruzione
istruzione
…………
Ecco un esempio di applicazione
dei diversi passi.
for i←1 to 10 step 2
output(n)
for i←3 to 0 step -0,5
output(n)
Quiz: cosa stampano questi cicli??
71. Basta?
Per la verità non abbiamo finito con i cicli, anche se la teoria
generale termina qui. In fase di codifica, imparerete molte altre
cose che accenniamo qui...
● Interruzione prematura dei cicli
● Cicli infiniti
● Cicli annidati
73. Sintesi della sezione
In questa sezione avete fatto conoscenza
approfondita di due costrutti
fondamentali che si aggiungono alla
sequenza:
Costrutto di Selezione
● Semplice (if .. else)
● Multipla (if...elseif..; switch)
Costrutto di iterazione
● Ciclo precondizionato (while)
● Ciclo postcondizionato (do..while)
● Ciclo predefinito (for...step)
Avete anche conosciuto il “Principio
Matrioska”, che vi permette di
combinarli. Secondo il teorema di
Boehm-Jacopini, questi tre costrutti vi
rendono in grado di scrivere
QUALSIASI algoritmo!
Ma non montatevi la testa…. La strada è
ancora molto lunga. Per il momento
vediamo di applicare i costrutti tanto
nella teoria quanto nella pratica.
74. Ruoli
Riassumiamo alcuni dei ruoli tipici delle
variabili:
● Fixed
Una variabile che riceve un valore
che non sarà più cambiato. Uso
tipico: parametro, dato dell’utente
● Stepper
Passa attraverso una serie di valori
in modo predeterminato. Uso tipico:
variabile di controllo di un ciclo
● Most-recent
Contiene l’ultimo valore inserito o
calcolato. Uso tipico: input
dell’utente, calcoli intermedi
● Most-wanted
Contiene il valore più desiderabile di
una serie di valori esaminati. Uso
tipico: ricerca dell’obiettivo
● One-way flag
Un indicatore booleano che cambia
una ed una sola volta. Uso tipico:
variabile di controllo di un ciclo
● Temporary
Un valore richiesto per un tempo
molto breve. Uso tipico: calcoli
complessi, variabili di scambio
75. Importante
Algoritmi utili
Avete visto un certo numero di
algoritmi base; alcuni sono di
importanza fondamentale:
● Scambia (a,b)
● Max(a,b)
● Contanumeri()
● InputCheck()
Passaggio di livello
Per poter dire di aver acquisito il
passaggio al 2° livello dovreste
avere effettuato: