Sei sulla pagina 1di 25

Algoritmi

Esercizi
Esercizio 1

Problema: calcolare l’ipotenusa di un triangolo rettangolo, dati i due cateti

Inizio
Leggi un valore e inseriscilo nella variabile cateto1
Leggi un secondo valore e inseriscilo nella variabile cateto2

somma_quadrati  cateto1*cateto1 + cateto2*cateto2


ipotenusa  radice_quadrata(somma_quadrati)
Stampa "Il valore dell’ipotenusa è" ipotenusa

Fine

Semplice sequenza di istruzioni di tipo leggi/stampa (ingresso/uscita)


ed elaborazione aritmetica (assegnamento) – no istruzioni di controllo

2
Esercizio 2
Problema: dati i tre lati di un triangolo, stabilire se si tratta di un triangolo
equilatero, isoscele o scaleno, dopo aver verificato la proprietà di triangolarità,
ovvero che ogni lato è minore della somma degli altri due
Inizio
Leggi lato1, lato2, lato3
Se (lato1<lato2+lato3) AND (lato2<lato1+lato3) AND (lato3<lato1+lato2)
allora
Stampa "E' un triangolo"
Se (lato1=lato2) AND (lato2=lato3) allora Stampa "equilatero"
altrimenti
Se (lato1=lato2) OR (lato1=lato3) OR (lato2=lato3)
allora
Stampa "isoscele"
altrimenti
Stampa "scaleno"
altrimenti Stampa "Non è un triangolo"
Fine
inizio Provare esecuzione
con [8,8,12] e poi
lato1 
con [7,7,7]
lato2 
lato3 

(lato1<lato2+lato3)
AND (lato2<lato1+lato3)

AND (lato3<lato1+lato2)
" E ' un
"Non è un triangolo"
triangolo"

no (lato1=lato2) AND sì
(lato2=lato3)

no (lato1=lato2) OR sì "equilatero"
(lato2=lato3) OR
(lato1=lato3)

"scaleno" "isoscele"

fine
Esercizio 3

Scrivere l’algoritmo (in linguaggio naturale e con un diagramma di flusso)


per il seguente problema:

L’esecutore deve leggere in ingresso una sequenza di numeri naturali


(interi positivi strettamente maggiori di zero) e calcolare e visualizzare il
massimo, il minimo e la media. La sequenza si interrompe non appena
viene introdotto un numero negativo o uguale a zero

Per esempio, data la sequenza 5, 1, 2, 3, 6, -5, il risultato deve essere:


"Il massimo è 6, il minimo è 1, la media è 3.4"

Provare l’esecuzione passo-passo dell’algoritmo con la


sequenza dei valori sopra menzionata

5
Algoritmo in linguaggio naturale
Assumiamo che l’input sia corretto (valori tutti strettamente maggiori di 0)

Inizio
n  0, media  0 x n media max min
Leggi un valore dall'esterno e inseriscilo nella variabile x 0 0
max  x, min x
5 1 5 5 5
1 2 6
Finché x > 0 ripeti 1
Se x > max allora 2 3 8
max  x … e il ramo 3 4 11
Se x < min allora "altrimenti" ? 6 5 17 6
min  x
-5 3.4
media  media + x 6

n n+1
Leggi un valore dall'esterno e inseriscilo nella variabile x
Fine ciclo

media  media / n
Visualizza "Massimo, minimo, media = " seguita dai valori in max, min, media

Fine
Esercizio 3 - estensione
Scrivere l’algoritmo (in linguaggio naturale e con un diagramma di
flusso) per il seguente problema:

L’esecutore deve leggere in ingresso una sequenza di numeri


naturali (interi positivi strettamente maggiori di zero) e calcolare e
visualizzare il massimo, il minimo e la media. La sequenza si
interrompe non appena viene introdotto un numero negativo o
uguale a zero Se x > 0 allora

Per esempio, data la sequenza 5, 1, 2, 3, 6, -5, il risultato deve


essere:
"Il massimo è 6, il minimo è 1, la media è 3.4"

Data la sequenza -2, il risultato deve essere


"La sequenza inserita è nulla"

7
Algoritmo in linguaggio naturale

Inizio
Leggi un valore dall'esterno e inseriscilo nella variabile x
Se x > 0 allora
n  0, media  0
max  x, min x
Finché x > 0 ripeti
Se x > max allora
max  x
Se x < min allora
min  x
media  media + x
n n+1
Leggi un valore dall'esterno e inseriscilo nella variabile x
Fine ciclo
media  media / n
Visualizza "Massimo, minimo, media = " seguita dai valori in max, min, media
altrimenti
Visualizza "La sequenza inserita è nulla"
Fine

8
Schema a inizio

blocchi
media  0 sì
n 0 x > max

no max  x
x

x < min

no sì min  x
x>0
no
max  x
media  media + x
min  x n n+1
" La sequenza
inserita è nulla"
no x>0
x

media  media / n

Corpo del ciclo
Visualizza
valori di Corpo del ciclo
max, min, media

fine 4
Esercizio 4
r

Sia y =  1i
i=q

Scrivere l’algoritmo, in linguaggio naturale e il diagramma di


flusso, per il calcolo di y.

Si assuma di acquisire r e q dall’esterno (dati di input)


(Si controlli che r e q siano interi positivi tali che r > q)

1
Algoritmo in linguaggio naturale
r
y=
1
Inizio

Leggi un valore e inseriscilo nella variabile r i=q i


Leggi un valore e inseriscilo nella variabile q

Se (r>0) AND (q > 0) AND (r > q) allora


y  0, i  q
Finché i <= r ripeti
y  y + 1/i
i i + 1
Fine ciclo
Visualizza "Il risultato è", y
altrimenti
Visualizza "Errore nell’immissione dati"

Fine

10
r
y=
inizio
1
r
q i=q i

(r > 0) AND no
(q >0) AND
(r > q)
"Errore
sì nell' immissione
dei dati"
y0
i q Esercizio: Modificare la
condizione (esploderla) in
modo che si possa
i <= r
no visualizzare un messaggio
che metta in evidenza il
problema specifico
sì Visualizza y

y  y + ( 1 /i)
i  i+1 fine
12
MCD di due numeri naturali x e y
Descrizione
informale
della
procedura di
risoluzione
Individuazione della procedura di risoluzione:
(Basata sul metodo della scomposizione in fattori primi)

Fai la scansione di tutti i numeri compresi fra 1 e il minimo tra x ed y.

Per ognuno stabilisci se è un divisore comune ad x ed y (b è divisore di a


se a mod b = 0, ovvero se la divisione di a per b dà come resto 0).

Ogni volta che un numero preso in considerazione risulta divisore sia di x che
di y memorizzalo come attuale MCD in una variabile (all’inizio posta a 1).

Alla fine della scansione la variabile conterrà il valore desiderato.


MCD – Algoritmo in linguaggio naturale

Inizio
Descrizione
Leggi un valore e inseriscilo nella variabile x
formale della
Leggi un valore e inseriscilo nella variabile y procedura di
risoluzione
Se x < y allora min  x altrimenti min  y

mcd  1
divisore  1

Finché (contatore <= min) ripeti


Se ((x mod divisore = 0) e (y mod divisore = 0))
allora mcd  divisore
divisore  divisore + 1
fine ciclo
Stampa "MCD =" seguito dal valore in mcd
Fine

1
inizio

x
y

… e se x e y sì no
x<y
sono uguali?
min  x min  y

mcd  1
divisore  1
Ciclo a condizione iniziale
no sì
Divisore <= min

(x mod divisore = 0) AND sì


(y mod divisore = 0)

"MCD =" ,  mcd mcd  divisore


no
fine divisore  divisore + 1
MCD – Algoritmo in linguaggio naturale
(variante 1)
Inizio
Leggi un valore e inseriscilo nella variabile x
Leggi un valore e inseriscilo nella variabile y

Se x < y allora min  x altrimenti min  y

mcd  1
divisore  min
flag = 1

Finché (divisore > 0) e (flag = 1) ripeti


Se ((x mod divisore = 0) AND (y mod divisore = 0))
allora
mcd  divisore
flag  0
divisore  divisore -1
fine ciclo
Stampa "MCD =" seguito dal valore in mcd
Fine
MCD – Algoritmo in linguaggio naturale
(variante 2)
Inizio
Leggi un valore e inseriscilo nella variabile x
Leggi un valore e inseriscilo nella variabile y

Se x < y allora min  x altrimenti min  y

mcd  1
divisore  min
flag
Finché ( ! ( (x mod divisore) == 0 AND (y mod divisore) == 0 ) ) ripeti
divisore  divisore -1
fine ciclo

mcd = divisore

Stampa "MCD =" seguito dal valore in mcd


Fine
Algoritmo di Euclide

Si basa sulla constatazione che:


Se x = y allora MCD(x,y) = x (oppure y)
Se x != y allora, supponendo x > y, MCD(x,y) = MCD(x-y,y)

Esempio
Quindi: MCD(18,48)
Se x > y allora MCD(x, y) = MCD(x-y, y)
Input 18 48
altrimenti
MCD(y, x) = MCD(y-x, x) Passo 1 30 18
Passo 2 12 18
Passo 3 12 6
Passo 4 6 6
MCD(18,48) = 6
Algoritmo di Euclide
Descrizione in linguaggio naturale
Leggi il valore x e y

Finché x != y ripeti
Se x > y
x=x–y
altrimenti
y=y–x
Fine ciclo
Visualizza ‘’MCD = valore in y’’
Fine
Alternativa
Divisioni successive invece di sottrazioni successive – può ridurre il numero di
iterazioni necessarie

Inizio
Leggi un valore dall’esterno e inseriscilo nella variabile x
Leggi un valore dall’esterno e inseriscilo nella variabile y

Se x < y allora scambia x con y


Calcola il resto della divisione intera fra x e y (ovvero r  x mod y)
MCD(18, 48)
Finché r ≠ 0 ripeti
x y r
x y
Input 18 48
yr
r  x mod y Passo 1 48 18 12

Fine ciclo Passo 2 18 12 6

Visualizza "MCD = " seguita dal valore in y Passo 3 12 6 0


Fine MCD(18,48) = 6

mod = resto della divisione intera


inizio

x 
y 

sì x<y

nota: per realizzare lo a x no


scambio ho bisogno di una x y
variabile di appoggio (a) ya

r  x mod y

r≠0

no x y

y r

'MCD =' ,  y
r  x mod y
fine
22
Due proprietà degli algoritmi

Correttezza: l’algoritmo risolve il problema per cui è


stato progettato (efficacia). Gli algoritmi visti per il
problema 2 sono tutti corretti rispetto al problema di
calcolare il MCD

Complessità: legata al numero di istruzioni eseguite,


cioè di passi di computazione, necessari per risolvere il
problema (efficienza). Il primo algoritmo visto per il
calcolo del MCD è più complesso degli altri due (a
parità di dati iniziali, numero maggiore di passi)
Esercizio

k i
Sia y = (
1 2
)
i=1 j=1 i + j

Scrivere l’algoritmo in linguaggio naturale e diagramma di


flusso per il calcolo di y assumendo di acquisire k dall’esterno
(dato di input) e controllando che k sia intero positivo. In caso
di errata immissione continuare a chiedere k fino a quando il
valore immesso per k sia intero positivo.

24
Algoritmo k i
y =(
1 2
)
Descrizione dell’algoritmo in linguaggio naturale: i=1 j=1 i + j
Inizio Ciclo
Leggi un valore dall’esterno e inseriscilo nella variabile k
Se k <= 0 allora Visualizza "Errore nell’immissione dati"
Torna a Inizio Ciclo Finché k <= 0
y  0, i  1
Finché i <= k ripeti
s  0, j  1
Finché j <= i ripeti
s  s + 1/(i + j)
j j+1
Fine ciclo
s s*s
y y+s
i i+1
Fine ciclo
Visualizza "Il risultato è", y
Fine
25
k i
y =(
inizio
1 2
)
k 'Errore
nell' immissione i=1 j=1 i + j
dei dati'

k <= 0 sì

no
y 0
i 1

i<=k no
s  s * s sì
y y+s  y
i i+1 s 0
j 1

fine
no j<=i
s  s + 1/(i+j)
sì j  j+1
26

Potrebbero piacerti anche