SlideShare a Scribd company logo
1 of 76
Download to read offline
GUIDA DEL PERFETTO
ALGORITMISTA
Prof. Marcello Missiroli prof.missiroli@gmail.com
II - Prestidigitazione
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
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!
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
Volume I
PARTE 1
Il libro degli incantesimi
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
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
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.
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?
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”
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
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.
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
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.
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
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
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!
Volume I
PARTE 2
Istruzioni di scelta
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..
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.
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
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.
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
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) → !
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)
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
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
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
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?
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
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.
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
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.
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
→
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
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)
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)
Volume I
PARTE 3
I cicli
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.
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)
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.
Ciclo While
Section explanation
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.
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
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
…………
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)
Ciclo Do..while
Section explanation
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.
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
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
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?
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”)
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?
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
Approfondiamo
Section explanation
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.
Anatomia di un ciclo (while)
INGRESSO
USCITA
CONDIZIONE
AGGIORNAMENTO
RITORNO
CORPO
INIZIALIZZAZIONE
Le componenti di un ciclo
Conviene concepire il ciclo come 4 fasi
● Inizializzazione
● Condizione di ripetizione
● Corpo
● Aggiornamento
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)
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)
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
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
Modelli di cicli
Section explanation
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)
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
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”
Cicli for
Section explanation
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.
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.
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??
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
Conclusioni
Section explanation
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.
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
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:
Credits
TEXT
ART
Tiefling Warrior, Bard, Goblin Battle, Cleric, Dungeon of the mad mage - © Wizard of
the Coast.
Libro incantesimi: Spellbook for HOPA game, Galina Levchenko
Ring Magic Cover, Kobold Press
Diverse immagini tratte dal sito xkcd.

More Related Content

What's hot

15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi15 - Programmazione: Algoritmi
15 - Programmazione: AlgoritmiMajong DevJfu
 
Algoritmo probabilistico di tipo montecarlo per il list decoding elaborato
Algoritmo probabilistico di tipo montecarlo per il list decoding   elaboratoAlgoritmo probabilistico di tipo montecarlo per il list decoding   elaborato
Algoritmo probabilistico di tipo montecarlo per il list decoding elaboratodanielenicassio
 
Algoritmo probabilistico di tipo montecarlo per il list decoding
Algoritmo probabilistico di tipo montecarlo per il list decodingAlgoritmo probabilistico di tipo montecarlo per il list decoding
Algoritmo probabilistico di tipo montecarlo per il list decodingdanielenicassio
 
Cosa sono gli algoritmi?
Cosa sono gli algoritmi?Cosa sono gli algoritmi?
Cosa sono gli algoritmi?mattuzzi
 
Algoritmi di ordinamento
Algoritmi di ordinamentoAlgoritmi di ordinamento
Algoritmi di ordinamentoMarco Liverani
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventPietro Di Bello
 
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...Luca Marignati
 
Algoritmi, Calcolabilità, Tesi di Church ed applicazione della logica all'inf...
Algoritmi, Calcolabilità, Tesi di Church ed applicazione della logica all'inf...Algoritmi, Calcolabilità, Tesi di Church ed applicazione della logica all'inf...
Algoritmi, Calcolabilità, Tesi di Church ed applicazione della logica all'inf...Stefano Ficcadenti
 
Umano vs Computer: un esempio pratico
Umano vs Computer: un esempio praticoUmano vs Computer: un esempio pratico
Umano vs Computer: un esempio praticoFrancesco Sblendorio
 
Introduzione a Matlab
Introduzione a MatlabIntroduzione a Matlab
Introduzione a MatlabMarco Suma
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Marcello Missiroli
 
Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)STELITANO
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++Ilio Catallo
 
Puntatori e Riferimenti
Puntatori e RiferimentiPuntatori e Riferimenti
Puntatori e RiferimentiIlio Catallo
 

What's hot (20)

come costruire un algoritmo
come costruire un algoritmocome costruire un algoritmo
come costruire un algoritmo
 
15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi
 
Algoritmo probabilistico di tipo montecarlo per il list decoding elaborato
Algoritmo probabilistico di tipo montecarlo per il list decoding   elaboratoAlgoritmo probabilistico di tipo montecarlo per il list decoding   elaborato
Algoritmo probabilistico di tipo montecarlo per il list decoding elaborato
 
Algoritmo probabilistico di tipo montecarlo per il list decoding
Algoritmo probabilistico di tipo montecarlo per il list decodingAlgoritmo probabilistico di tipo montecarlo per il list decoding
Algoritmo probabilistico di tipo montecarlo per il list decoding
 
Algoritmi
Algoritmi Algoritmi
Algoritmi
 
Cosa sono gli algoritmi?
Cosa sono gli algoritmi?Cosa sono gli algoritmi?
Cosa sono gli algoritmi?
 
Algoritmi di ordinamento
Algoritmi di ordinamentoAlgoritmi di ordinamento
Algoritmi di ordinamento
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA event
 
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...
Dal modello a memoria condivisa al modello a rete, impossibilità del consenso...
 
Reti Logic
Reti LogicReti Logic
Reti Logic
 
Algoritmi, Calcolabilità, Tesi di Church ed applicazione della logica all'inf...
Algoritmi, Calcolabilità, Tesi di Church ed applicazione della logica all'inf...Algoritmi, Calcolabilità, Tesi di Church ed applicazione della logica all'inf...
Algoritmi, Calcolabilità, Tesi di Church ed applicazione della logica all'inf...
 
Umano vs Computer: un esempio pratico
Umano vs Computer: un esempio praticoUmano vs Computer: un esempio pratico
Umano vs Computer: un esempio pratico
 
Introduzione a Matlab
Introduzione a MatlabIntroduzione a Matlab
Introduzione a Matlab
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
 
Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
Flow chart
Flow chartFlow chart
Flow chart
 
Puntatori e Riferimenti
Puntatori e RiferimentiPuntatori e Riferimenti
Puntatori e Riferimenti
 
Algoritmi
Algoritmi Algoritmi
Algoritmi
 

Similar to Algorithmist guide II

Lezione 3 (29 febbraio 2012)
Lezione 3 (29 febbraio 2012)Lezione 3 (29 febbraio 2012)
Lezione 3 (29 febbraio 2012)STELITANO
 
Modulo 1 concetti di base dell'ict
Modulo 1 concetti di base dell'ictModulo 1 concetti di base dell'ict
Modulo 1 concetti di base dell'ictAndreina Concas
 
5 Strutture Iterative
5   Strutture Iterative5   Strutture Iterative
5 Strutture Iterativeguest60e9511
 
Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)STELITANO
 
Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)STELITANO
 
Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)STELITANO
 
Python nel primo biennio della scuola superiore
Python nel primo biennio della scuola superiorePython nel primo biennio della scuola superiore
Python nel primo biennio della scuola superioreguestc11532
 
Laboratorio Programmazione: Funzioni
Laboratorio Programmazione: FunzioniLaboratorio Programmazione: Funzioni
Laboratorio Programmazione: FunzioniMajong DevJfu
 
Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)STELITANO
 
05 - Programmazione: Funzioni
05 - Programmazione: Funzioni05 - Programmazione: Funzioni
05 - Programmazione: FunzioniMajong DevJfu
 
Modellazione tramite geometria frattale
Modellazione tramite geometria frattaleModellazione tramite geometria frattale
Modellazione tramite geometria frattaleMassimiliano Leone
 

Similar to Algorithmist guide II (20)

Lezione 3 (29 febbraio 2012)
Lezione 3 (29 febbraio 2012)Lezione 3 (29 febbraio 2012)
Lezione 3 (29 febbraio 2012)
 
Modulo 1 concetti di base dell'ict
Modulo 1 concetti di base dell'ictModulo 1 concetti di base dell'ict
Modulo 1 concetti di base dell'ict
 
1 Programmazione
1   Programmazione1   Programmazione
1 Programmazione
 
02 algo programmi
02 algo programmi02 algo programmi
02 algo programmi
 
5 Strutture Iterative
5   Strutture Iterative5   Strutture Iterative
5 Strutture Iterative
 
1.01 Algoritmi
1.01 Algoritmi1.01 Algoritmi
1.01 Algoritmi
 
Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)
 
Corso python 2020 - Lezione 1
Corso python 2020 - Lezione 1Corso python 2020 - Lezione 1
Corso python 2020 - Lezione 1
 
Lezione 3 metodo monte carlo
Lezione 3   metodo monte carloLezione 3   metodo monte carlo
Lezione 3 metodo monte carlo
 
I cicli in Python 3
I cicli in Python 3I cicli in Python 3
I cicli in Python 3
 
Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)
 
Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)
 
Algoritmi
AlgoritmiAlgoritmi
Algoritmi
 
Pyscuola
PyscuolaPyscuola
Pyscuola
 
Python nel primo biennio della scuola superiore
Python nel primo biennio della scuola superiorePython nel primo biennio della scuola superiore
Python nel primo biennio della scuola superiore
 
Laboratorio Programmazione: Funzioni
Laboratorio Programmazione: FunzioniLaboratorio Programmazione: Funzioni
Laboratorio Programmazione: Funzioni
 
Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)
 
05 - Programmazione: Funzioni
05 - Programmazione: Funzioni05 - Programmazione: Funzioni
05 - Programmazione: Funzioni
 
Tutorial Matlab 2009
Tutorial Matlab 2009Tutorial Matlab 2009
Tutorial Matlab 2009
 
Modellazione tramite geometria frattale
Modellazione tramite geometria frattaleModellazione tramite geometria frattale
Modellazione tramite geometria frattale
 

More from Marcello Missiroli

More from Marcello Missiroli (20)

Workshop: Introduzione ad TDD
Workshop: Introduzione ad TDDWorkshop: Introduzione ad TDD
Workshop: Introduzione ad TDD
 
Variabili
VariabiliVariabili
Variabili
 
Sviluppo degli algoritmi
Sviluppo degli algoritmiSviluppo degli algoritmi
Sviluppo degli algoritmi
 
5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo
 
Big O Notation
Big O NotationBig O Notation
Big O Notation
 
Insegnare Agile
Insegnare AgileInsegnare Agile
Insegnare Agile
 
The Sequel to sql
The Sequel to sqlThe Sequel to sql
The Sequel to sql
 
L'avvento del programmatore sociale
L'avvento del programmatore socialeL'avvento del programmatore sociale
L'avvento del programmatore sociale
 
Il ciclo for
Il ciclo forIl ciclo for
Il ciclo for
 
Lo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in JavaLo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in Java
 
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
 
Controllo di versione e Git
Controllo di versione e GitControllo di versione e Git
Controllo di versione e Git
 
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
 
Moodle: i compiti (homework)
Moodle: i compiti (homework)Moodle: i compiti (homework)
Moodle: i compiti (homework)
 
Uefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il maleUefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il male
 
Corso Moodle: presentazione
Corso Moodle: presentazioneCorso Moodle: presentazione
Corso Moodle: presentazione
 
Corso Moodle: perché?
Corso Moodle: perché?Corso Moodle: perché?
Corso Moodle: perché?
 
Il sistema binario
Il sistema binarioIl sistema binario
Il sistema binario
 
Routing dinamico
Routing dinamicoRouting dinamico
Routing dinamico
 
Investire nelle user story
Investire nelle user storyInvestire nelle user story
Investire nelle user story
 

Algorithmist guide II

  • 1. GUIDA DEL PERFETTO ALGORITMISTA Prof. Marcello Missiroli prof.missiroli@gmail.com II - Prestidigitazione
  • 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
  • 5. Volume I PARTE 1 Il libro degli incantesimi
  • 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:
  • 76. Credits TEXT ART Tiefling Warrior, Bard, Goblin Battle, Cleric, Dungeon of the mad mage - © Wizard of the Coast. Libro incantesimi: Spellbook for HOPA game, Galina Levchenko Ring Magic Cover, Kobold Press Diverse immagini tratte dal sito xkcd.