1. PROGRAMMAZIONE I
Algoritmo
FONDAMENTI DI PROGRAMMAZIONE
Problemi, Algoritmi, Diagrammi di flusso
Dato un problema, un algoritmo è una procedura,
cioè una sequenza di passi, che può essere eseguita
automaticamente da una macchina in modo da
risolvere il problema dato.
Gianluca Cincotti
• Un problema risolvibile mediante un algoritmo si dice
computabile.
( Lezione I )
Dipartimento di Matematica e Informatica
Università di Catania
e-mail : cincotti@dmi.unict.it
G.Cincotti
Esempio di algoritmo
Un altro esempio di algoritmo
- Procuriamo il kit e gli strumenti;
- Abbiamo gli ingredienti (pollo, olio, mandorle, cipolla,
- Apriamo la scatola;
sale, pepe, etc.) con le giuste quantità;
- Leggiamo le istruzioni;
- Seguiamo la ricetta;
- Mettiamo insieme i pezzi.
- Serviamo il piatto a tavola.
Programmazione I
Fondamenti di Programmazione, pag. 2
La costruzione di un kit di montaggio:
Il pollo alle mandorle:
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 3
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 4
Risoluzione di un problema
Ma …
Algoritmo
Non è così facile come sembra !
• Per scrivere la giusta “sequenza di passi”
Input
Esecutore
Output
bisogna essere un bravo cuoco o un bravo
costruttore !
Generalmente, la risoluzione di un dato problema consiste
nel prendere alcuni dati iniziali (input) relativi al problema
e nel fornire un risultato (output) che risolve quest’ultimo.
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 5
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 6
1
2. Infatti …
Risolutore
Algoritmo
Un algoritmo è una sequenza ordinata e
Esecutore
Problema
finita di passi (azioni o istruzioni) che
Uomo
… la risoluzione
automatica prevede
comunque
una
notevole componente
umana !!!
Macchina
producono un ben determinato risultato in
un tempo finito.
Processo
di
esecuzione
Programmazione I
G.Cincotti
Definizione di algoritmo
Fondamenti di Programmazione, pag. 7
Caratteristiche di un algoritmo
1. Azioni eseguibili e non ambigue.
•
Non ambigue, inoltre non sono ammessi “un pò” e “a piacere”,
che non sono termini adatti ad una macchina.
Fatto un passo, il successivo è uno ed uno solo, ben determinato.
Alternative sono possibili, ma la scelta deve essere univoca.
3. Numero finito di passi.
4. Terminazione.
•
•
Fondamenti di Programmazione, pag. 8
Esempio di “non terminazione”
1. Si consideri un numero N;
2. Scrivere N;
2. Determinismo.
•
Programmazione I
G.Cincotti
3. Scrivere il numero successivo;
4. Ripetere il passo precedente.
L’esecuzione prima o poi deve finire e produrre il risultato in
tempo finito.
Osservazione : la 3 non implica la 4.
Programmazione I
G.Cincotti
Fondamenti di Programmazione, pag. 9
Programmazione I
G.Cincotti
Ancora un esempio
Fondamenti di Programmazione, pag. 10
Codifica dell’algoritmo
Affinché una macchina riesca a comprendere ed
eseguire i passi specificati da un algoritmo,
quest’ultimo deve essere prima codificato in un
opportuno programma scritto in un linguaggio di
alto livello.
Ricerca di un nominativo in un elenco.
• Non ordinato.
– Es.: Una lista di firme.
• Ordinato.
Algoritmo
– Es.: Elenco telefonico.
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 11
G.Cincotti
Traduzione
Programmazione I
Programma
Fondamenti di Programmazione, pag. 12
2
3. L’esecuzione automatica
Uomo
Pseudo-codice
Macchina
G.Cincotti
Programmazione I
Output
Fondamenti di Programmazione, pag. 13
Mescolare fino a quando il pollo sarà ben dorato;
Aggiungere del pepe;
Rosolare con vino bianco fino a quando il pollo è cotto;
6.
Esecuzione
Unire le mandorle pelate al soffritto;
5.
Traduttore
2.
4.
Programma
Preparare il soffritto ed aggiungervi il pollo;
3.
Linguaggio di alto livello
Input
Ricetta del pollo alle mandorle:
1.
Algoritmo
Linguaggio
macchina
Scomposizione in sottoproblemi
Aggiungere olio q.b.;
7.
Se preferisci salato, allora aggiungi sale;
Programmazione I
G.Cincotti
Fondamenti di Programmazione, pag. 14
Scomposizione in sottoproblemi
Descrizione di un algoritmo
La ricetta precedente è un esempio di cosa
significa scomporre un problema in sottoproblemi.
Si descrive un algoritmo cercando di
sintetizzare il più possibile la sua sequenza
di passi.
Ogni sottoproblema può essere scomposto in
problemi via via più elementari.
La descrizione avviene mediante :
• pseudo-codice, oppure
• diagramma di flusso.
Top-down vs. Bottom-Up
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 15
Programmazione I
G.Cincotti
Diagrammi di flusso
Fondamenti di Programmazione, pag. 16
Diagrammi di flusso (1)
I diagrammi di flusso permettono di
descrivere in modo grafico le azioni che
costituiscono un algoritmo e il loro flusso di
esecuzione.
Istruzioni di inizio e fine.
Inizio
• Ogni azione elementare è rappresentata da un
blocco.
Fine
– Esistono 4 tipi di blocchi.
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 17
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 18
3
4. Diagrammi di flusso (2)
Diagrammi di flusso (3)
Operazioni di lettura (input) o scrittura (output).
Leggi il dato
G.Cincotti
Programmazione I
Istruzioni imperative (azioni oppure operazioni).
Calcola : 20+34
Scrivi il dato
Fondamenti di Programmazione, pag. 19
Programmazione I
G.Cincotti
Connettori
Istruzione di assegnamento
Una variabile numerica è un’entità caratterizzata :
I singoli diagrammi devono essere uniti
tramite i connettori.
L’esecuzione delle istruzioni deve essere
fatta sequenzialmente, ovvero seguendo i
connettori.
• da un nome, e
• da un valore (o contenuto)
– che può cambiare nel tempo …
Un’espressione è una combinazione di operatori aritmetici,
costanti e variabili che può essere calcolata generando un
singolo valore numerico.
• Quando si scrive l’algoritmo bisogna fare molta
attenzione alla direzione del flusso di
esecuzione.
• Es.:
X,
Programmazione I
Fondamenti di Programmazione, pag. 21
X + 1,
X + (Y * 3).
Istruzione di assegnamento :
“←”
• Variabile ← Espressione;
– Es.:
G.Cincotti
Fondamenti di Programmazione, pag. 20
Z ← 3;
Esempio
Z ← X + 3;
Programmazione I
G.Cincotti
X ← X + 1;
Fondamenti di Programmazione, pag. 22
Diagramma di flusso : Somma
Inizio
Descrivere, mediante diagramma di
flusso, un algoritmo che calcoli la
somma di due numeri letti in input.
Z ← X+Y
Leggi X
Stampa Z
Leggi Y
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 23
G.Cincotti
Programmazione I
Fine
Fondamenti di Programmazione, pag. 24
4
5. Esempio
Diagramma di flusso: Scambio
Inizio
Descrivere, mediante diagramma di
flusso, un algoritmo che scambi i
valori di due variabili lette in input.
Aux ← X
Leggi X
Scrivi X
X←Y
Leggi Y
Scrivi Y
Y ← Aux
Fine
Programmazione I
G.Cincotti
Fondamenti di Programmazione, pag. 25
Programmazione I
G.Cincotti
Variazioni nel flusso di
esecuzione
Fondamenti di Programmazione, pag. 26
Diagrammi di flusso (4)
Istruzioni condizionali.
Ci sono dei momenti in cui il flusso di esecuzione
può scegliere tra diverse direzioni;
Es.:
In genere, questi salti sono subordinati al
verificarsi di una condizione (che può risultare
Condizione
vera o falsa);
Falso
Falso
Più sale ?
Si parla di istruzioni condizionali.
Vero
Vero
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 27
Programmazione I
G.Cincotti
Esempio
Fondamenti di Programmazione, pag. 28
Diagramma di flusso : Max
Inizio
Descrivere, mediante diagramma di
flusso, un algoritmo che determini il
massimo tra due numeri letti in input.
X>Y
Leggi X
Vero
Falso
Stampa Y
Stampa X
Leggi Y
Fine
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 29
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 30
5
6. Esempio
Diagramma di flusso : Pari o…
Inizio
Descrivere, mediante diagramma di
flusso, un algoritmo che determini se
un numero letto in input è pari o
dispari.
Resto = 0
Leggi N
Vero
Falso
Scrivi :
“N è dispari”
Scrivi :
“N è pari”
Dividi N per 2
Fine
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 31
G.Cincotti
Esercizio
Programmazione I
Fondamenti di Programmazione, pag. 32
Ripetizione o “ciclo”
…
Scrivere la ricetta del pollo alle mandorle
utilizzando i diagrammi di flusso.
• Nota: dove è richiesta una ripetizione – ad
esempio fino a quando – utilizzare
un’istruzione condizionale del tipo mostrato
nella prossima diapositiva.
Il pollo è
cotto?
Falso
Rosolare
con vino
Vero
…
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 33
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 34
PROGRAMMAZIONE I
FONDAMENTI DI PROGRAMMAZIONE
( Lezione II )
Fine
Notazione Lineare Strutturata
Gianluca Cincotti
Dipartimento di Matematica e Informatica
Università di Catania
e-mail : cincotti@dmi.unict.it
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 35
6
7. Esempio
Esempio : Fattoriale
Inizio
Descrivere, mediante diagramma di
flusso, un algoritmo che calcoli il
fattoriale di un numero intero positivo
letto in input.
Fatt ← Fatt * M
Leggi N
M ← M +1
Fatt ← 1
VERO
M←1
M>N
FALSO
Scrivi Fatt
Fine
Programmazione I
G.Cincotti
Fondamenti di Programmazione, pag. 37
Programmazione I
G.Cincotti
Considerazioni
Fondamenti di Programmazione, pag. 38
Notazione Lineare Strutturata
I diagrammi a blocchi si rivelano :
Tre costrutti fondamentali :
• poco pratici,
• Sequenza,
• soggetti a errori,
• Selezione,
• illeggibili se di notevole complessità.
• Iterazione.
Per ovviare a tali inconvenienti si adotta la
Notazione Lineare Strutturata (NLS) o pseudocodice.
Programmazione I
G.Cincotti
Fondamenti di Programmazione, pag. 39
Inoltre, esiste un unico punto d’ingresso ed un
unico punto d’uscita.
Programmazione I
G.Cincotti
Sequenza
Fondamenti di Programmazione, pag. 40
Selezione (o condizione)
if (Condizione) then
Istruzione 1
Falso
Istruzione 1;
Istruzione 2
≡
…
Condizione
Istruzione 2;
≡
else
Blocco 2;
…
Istruzione n;
end if
Blocco 2
Blocco 1
La clausola “else”
può anche essere
assente.
Istruzione n
G.Cincotti
Blocco 1;
Vero
Programmazione I
Fondamenti di Programmazione, pag. 41
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 42
7
8. Ricapitolando ...
Iterazione (o ciclo)
Falso
Condizione
while (Condizione) do
Vero
≡
Blocco;
end while;
Blocco
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 43
Programmazione I
G.Cincotti
Risultato fondamentale
Fondamenti di Programmazione, pag. 44
Esempio : Somma
Inizio
TEOREMA (Böhm-Jacopini) :
Z ← X+Y
• I tre costrutti fondamentali della
NLS sono sufficienti a descrivere
qualunque algoritmo.
Leggi X
Stampa Z
Leggi Y
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 45
Fine
Programmazione I
G.Cincotti
Esempio : Somma in NLS
Fondamenti di Programmazione, pag. 46
Esempio : Max
Inizio
Inizio
Leggi X
Leggi Y
Z←X+Y
Stampa Z
Fine
X>Y
Leggi X
Vero
Falso
Stampa Y
Stampa X
Leggi Y
Fine
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 47
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 48
8
9. Esempio : Max in NLS
Esempio : Numeri da 1 a N
Inizio
Leggi X
Leggi Y
if (X > Y) then
Stampa X
else
Stampa Y
end if
Fine
G.Cincotti
Programmazione I
Inizio
Leggi N
M←0
while (M < N) do
M←M+1
Stampa M
end while
Fine
Fondamenti di Programmazione, pag. 49
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 50
Esempio :
Esempio : Somma dei primi N numeri
Somma dei numeri pari minori di N
Inizio
Leggi N
i←0
S←0
while (i < N) do
i←i+1
S←S+i
end while
Stampa S
Fine
G.Cincotti
Programmazione I
Inizio
Leggi N
i←2
S←0
while (i < N) do
S←S+i
i← i+2
end while
Stampa S
Fine
Fondamenti di Programmazione, pag. 51
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 52
Algoritmo di Euclide per il m.c.m.
Inizio
Leggi A, B
MA ← A
MB ← B
while (MA <> MB) do
if (MA > MB) then
MB ← MB + B
else
MA ← MA + A
end if
end while
Stampa “mcm =” MA
Fine
G.Cincotti
Programmazione I
Es.: m.c.m. (3, 7) = 21
MA
3
6
9
MB
7
Fine
14
12
15
21
18
21
Fondamenti di Programmazione, pag. 53
G.Cincotti
Programmazione I
Fondamenti di Programmazione, pag. 54
9