Algoritmi

2
Algoritmi
• Definizione
• Caratteristiche
• Pianificazione e progettazione
• Rappresentazione
• Operazioni fondamentali
• Teorema di Jacopini-Böhm
• Diagrammi di flusso
3
Definizione
• Intuitiva
Sequenza ordinata di istruzioni per risolvere
un problema.(Es. ricetta)
• Formale
Insieme ordinato di operazioni non
ambigue, effettivamente eseguibili che
risolvono, in un tempo finito, tutti i
problemi di una determinata classe.
4
Caratteristiche degli algoritmi
• Carattere deterministico (.. Insieme ordinato di
istruzioni non ambigue ..)

una istruzione e’ non ambigua se può essere
direttamente eseguita dall’agente di calcolo
(istruzione primitiva) e la sua interpretazione non
dipende dal contesto o dalla preparazione
dell’agente. I risultati dell’algoritmo non
dipendono dalla macchina o persona che lo
esegue.

5
insieme ordinato … non ambigue
Shampoo
• Bagna i capelli
• Insapona
• Risciacqua
• Ripeti (cosa?,
quante volte?)
Esegui A oppure B
(come stabilire se A o

B?)
Torta
•Prepara base
- setaccia farina
- aggiungi uova, acqua…
•prendi setaccio
•versa la farina
6
Caratteristiche degli algoritmi
• Carattere di realizzabilità pratica
(..effettivamente eseguibili ..)
t ut t e l e i st ruzi oni che cost i t ui scono
l’algoritmo devono essere effettivamente
eseguibili
(Es. calcolare l’esatto valore decimale di !.
Calcola tutti i numeri primi e stampa il primo
maggiore di 100)

7
Caratteristiche degli algoritmi
• Carattere finito (.. risolvono in un tempo
finito …)
il numero delle istruzioni che definiscono un
algoritmo e’ finito e queste vengono
eseguite un numero finito di volte.
(Es. calcolare tutti i numeri primi)
8
Carattere finito
Shampoo
1) Bagna i capelli
2) Contatore = 0
3) Ripeti passi da 4 a 6 finché contatore =2
4) Insapona i capelli
5) Risciacqua
6) Contatore = Contatore + 1
7) stop
9
Algoritmo per sommare due
numeri
c=a+b con a e b numeri formati da m cifre
c
m
c
m-1
c
m-2
.. c
0
= a
m-1
a
m-2
..a
0
+ b
m-1
b
m-2
..b
0
1 riporto = 0
2 i = 0
3 ripeti passi 4 – 6 finché i diventa > m -1
4 somma a
i
e b
i
al riporto per ottenere c
i
10
Algoritmo per sommare due
numeri
5 se c
i
" 10 c
i
= c
i
-10 e riporto = 1, altrimenti
riporto = 0
6 i = i + 1
7 c
m
= riporto
8 stampa risultato
9 stop
11
Pianificazione e progettazione
• Analizzare il problema

comprendere a fondo il problema e darne una
definizione precisa

quali sono gli input?

quali sono i dati? I formati?

quali devono essere gli output?

come elaborare i dati?
12
Pianificazione e progettazione
• Progettare una soluzione
Definire i passi da applicare per risolvere il
problema
Passi dettagliati, non ambigui e finiti
Verifica della soluzione
• Codificare il programma e documentarlo
• Testare il programma
Singole parti del codice (moduli)
13
Pianificazione e progettazione
• Validare il programma
Serie estesa di prove
Input non validi
Valutazioni sull’interfaccia utente (sono
sufficienti le indicazioni fornite?)
14
Esempio
Determinare in un gruppo di persone la
percentuale di presenze divisa nei seguenti
gruppi di età:
0-5
6-12
13-19
20-64
> 65
15
Analizzare il problema
Input età di ogni persona presente
Output percentuale di presenze in ogni
gruppo di età
Elaborazione aggiungere 1 al gruppo di età
per ogni persona che rientra in quel gruppo
16
Progettare una soluzione
1) Richiedere l’età della persona
2) Aggiungerla al gruppo corrispondente
3) Ripeti per tutte le persone i passi 1-2
4) Calcola la percentuale per ogni gruppo
4.1) Determina il numero totale di persone
4.2) Dividi i totali parziali per il totale globale
5) Output risultato
17
Esercizi
• Modificare l’algoritmo della somma in modo
che non stampi gli zero non significativi
• Eseguire la moltiplicazione mediante
l’addizione ripetuta
• Eseguire la divisione mediante la sottrazione
ripetuta
Caratteristiche di un
calcolatore elettronico

È velocissimo

Non è intelligente

Non è in grado di compiere deduzioni o
ragionamenti in modo autonomo.

Non è in grado di capire un problema.

Non è in grado di capire se il risultato
raggiunto è la soluzione del problema.
Capacità del calcolatore

Sa leggere le informazioni dall’esterno (input).

Sa memorizzare le informazioni.

Sa eseguire alcune operazioni elementari: addizione,
sottrazione, prodotto e rapporto fra numeri,
concatenazione di parole.

Sa eseguire il confronto fra informazioni dello stesso
tipo: (es.: a>b, a=b, a#b e l’uguaglianza fra due parole).

Sa memorizzare sequenze di istruzioni elementari
(programma) e le sa eseguire secondo un ordine
stabilito dal programma stesso.

Sa scrivere le informazioni all’esterno (output).
Compiti del programmatore

Analizzare il problema riducendolo in
termini astratti e formulare un modello del
problema.

Individuare una strategia risolutiva

Codificare l’algoritmo - renderlo
comprensibile al calcolatore.

Analizzare il risultato dell’elaborazione
evidenziando eventuali errori nella
formulazione del problema, nella strategia
risolutiva, nella codifica dell’algoritmo.
21
Rappresentazione degli algoritmi
Gli algoritmi devono essere descritti in
modo chiaro, preciso e non ambiguo.
1 Linguaggio naturale. Testi non strutturati
difficili da seguire (saggi), l’interpretazione
dipende inoltre dal contesto e dalla
esperienza del lettore (poesie).
22
Rappresentazione degli algoritmi
2 Linguaggio di programmazione formale
quando si progetta un algoritmo si parte da
livello elevato di astrazione, senza doversi
concentrare sulla punteggiatura, sulla
grammatica e sintassi.
23
Rappresentazione degli algoritmi
3 Pseudocodice
linguaggio di programmazione senza
regole grammaticali,
facilmente leggibile.

24
Rappresentazione degli algoritmi
4 Diagrammi di flusso (flow chart)
Rappresentazione in forma schematica della
logica e della struttura dell’algoritmo.
Ad ogni istruzione corrisponde un simbolo grafico
la cui forma dipende dal tipo di istruzione
considerata.
Eff i cace mezzo di comuni cazi one t ra i
programmatori e chi e’ coinvolto nell’uso del
programma
25
Operazioni fondamentali
Operazioni sequenziali descrivono un
singolo compito ben definito
Input inserimento dei dati da elaborare
Output visualizzare i risultati
Elaborazione
x = 0
aggiungere due uova
26
Operazioni fondamentali
Operazioni condizionali consentono di
alterare il normale flusso sequenziale.
Si pone una domanda e in base alla risposta
si determina la successiva operazione da
eseguire
Se condizione (vera/falsa) è vera allora
esegui queste operazioni
altrimenti
esegui queste operazioni
27
Operazioni fondamentali
Algoritmo per sommare due numeri
5 se c
i
" 10 c
i
= c
i
-10 e riporto = 1, altrimenti
riporto = 0
5 se c
i
" 10
c
i
= c
i
-10 e riporto = 1
altrimenti
riporto = 0
28
Operazioni fondamentali
Operazioni iterative (ciclo) ripetizione di un
blocco di istruzioni
Ripeti dal passo i al passo j fino a che
condizione (vera/falsa) diventa vera
Algoritmo per sommare due numeri
3 ripeti passi 4 – 6 finché i diventa > m -1
29
Iterazioni per falso
Ciclo repeat
Il corpo del ciclo viene eseguito almeno una
volta (iterazione a condizione finale)
Ripeti dal passo i al passo j fino a che
condizione (vera/falsa) diventa vera
30
Iterazioni per vero
Ciclo while
Il corpo del ciclo viene eseguito 0,1 o più volte
(iterazione a condizione iniziale)
Mentre condizione (vera/falsa) rimane vera
esegui
corpo del ciclo
fine del ciclo
31
Teorema di Jacopini-Böhm
Qualunque algoritmo puo’ essere descritto
ut i l i zzando sol t ant o l e t r e st r ut t ur e
fondamentali:
Sequenza
Diramazione
Iterazione
32
Esercizi
• Scrivere un algoritmo che riceva in ingresso un dato
X e calcoli X
2
e 1/X fino a che X = 0.
• Scrivere un algoritmo che riceva in ingresso N
numeri interi e determini se tra questi e’ presente il
numero X e la sua posizione.
• Scrivere un algoritmo che riceva in ingresso N
numeri interi e determini il più grande.
• Scrivere un algoritmo per il calcolo del fattoriale di
N.
33
Algoritmo trova il maggiore
1 Input N (numero elementi)
2 Input A
i
….. A
N
3 Poni max = A
1
4 Poni i = 2
5 Ripeti fino a che i > N
5.1 se A
i
> max allora poni max = A
i
5.2 poni i = i + 1
5.3 fine ciclo
6 Stampa max
34
Diagrammi di flusso
Ad ogni istruzione corrisponde un simbolo
grafico la cui forma dipende dal tipo di
istruzione considerata.
Tali simboli sono collegati tra loro, dall’alto
verso il basso, da segmenti orientati,
rappresentanti l’ordine di esecuzione delle
istruzioni corrispondenti
35
Diagrammi di flusso
START
STOP
Input/Output
istruzione
36
Diagrammi di flusso
proposizione
vero
falso
proposizione
vero
falso
1 1
37
Diagrammi di flusso
sequenza
proposizione
A
B
diramazione
IF THEN ELSE
Vero
Falso
38
Diagrammi di flusso
proposizione
vero
falso
while
proposizione
falso
vero
repeat until
39
Esercizi
• Rappresentare l’algoritmo per il calcolo della
distribuzione dell’età.
• Rappresentare l’algoritmo per il calcolo di x
y
.
• Rappresentare l’algoritmo per il calcolo dei
primi N numeri di Fibonacci. (1 1 2 3 5 8..)
• Rappresentare l’algoritmo per ordinare in
ordine crescente N numeri (bubble sort)
Esempio: stampare i primi 10 multipli di x.
Problema semplice e chiaro: un solo dato in
input (un parametro che caratterizza l’istanza del
problema): la “base” costituita dal numero x;
1 La strategia risolutiva è la seguente: iniziando
dal numero x letto in input, per 10 volte verrà
calcolato e stampato il multiplo di x,
moltiplicando x per una variabile i il cui valore
verrà incrementato di una unità ad ogni passo,
da 1 fino a 10.
Esempio: stampare i primi 10 multipli
di x.
Leggi in input un numero e chiama x il
numero
letto;
1. Assegna il valore 1 alla variabile i;
2. Calcola x•i e assegna alla variabile y il
risultato;
3. Stampa y;
4. Calcola i+1 e assegna alla variabile i il
risultato;
5. Se i#10 allora vai al passo 3 altrimenti
prosegui;
6. Fermati.
Esercizio: rappresentare il flow-chart
utilizzando l’iterazione per vero a
controllo iniziale
i>10
No
Si
Esempio: letti due numeri stampare il
massimo
letti in input 3 numeri stampare il massimo.
Letti in input n numeri stampare
il massimo
non è possibile
adottare la stessa
strategia: dovremmo
utilizzare troppe
variabili (quante?)
1 È necessario adottare
una diversa strategia:
individuare una
operazione semplice
che ripetuta più volte
porti alla soluzione.
Esercizio: rappresentare il flow-
chart utilizzando l’iterazione per
vero a controllo iniziale
No
Si
i>=n
Sottoprogrammi:
esempio Somma di n numeri
1. Input: un naturale n; Output: la somma degli n
naturali
2. Leggi n
3. sum = 0
mentre (n>0) fai
3.1 leggi x
3.2 sum = sum + x
3.3 n = n-1
4. stampa sum
Calcolare la media aritmetica
di n naturali
Sottoprogrammi
Per calcolare la media aritmetica fra n naturali
sarebbe comodo riutilizzare il codice per la somma
di numeri naturali.
I sottoprogrammi permettono di scrivere codice

modulare

leggibile

riutilizzabile
Sottoprogrammi
In un sottoprogramma è necessario definire quali
sono i parametri di input e i parametri di output
(definizione dell’interfaccia)
Tali parametri sono chiamati parametri formali.
Sottoprogramma <nome sottoprg> (in: x1, x2,... xn;
out: y1,y2,... ym)
Blocco
Sottoprogramma
definizione
sottoprogramma somma (in:n; out: sum)
{
1. sum = 0
2. mentre (n>0) fai {
2.1 leggi x
2.2 sum = sum + x
2.3 n = n-1
}
}
Sottoprogramma
chiamata
Un sottoprogramma per essere eseguito deve
essere “chiamato” da un’altro programma che lo
utilizza esplicitando la lista di parametri di input e
output (parametri attuali).
I nomi dei parametri formali e attuali possono essere
distinti. Al momento della chiamata vengono messi in
corrispondenza in base all’ordine in cui sono stati
dichiarati.
nomesottoprg(in:a1,...,an; out:b1,...,bm)
Media aritmetica
leggi n1
1.somma(in:n1,out: sum1)
2.media = sum1/n1
3.stampa media