AOT LAB - Università degli Studi di Parma

AOT
LAB
Agent and Object Technology Lab
Dipartimento di Ingegneria dell’Informazione
Università degli Studi di Parma
Fondamenti di Informatica
Algoritmi
Prof. Agostino Poggi
AOT
LAB
Algoritmo
Š Il termine algoritmo deriva dal matematico arabo
Al-Khowarzimi del IX secolo d.c. che suggerì un
metodo per sommare 2 numeri rappresentati dal
sistema numerico Hindu
Š Nel medioevo con il termine algorismus si indicava
il complesso di operazioni nel calcolo numerico
con numeri arabi
Š Oggi con il termine algoritmo si indica la sequenza
finita di passi effettuabili per risolvere una classe di
problemi in un tempo finito
2
AOT
LAB
Algoritmo
Š Un algoritmo è un metodo generale che risolve
qualsiasi istanza di un dato problema di
elaborazione
Š Un algoritmo deve avere le seguenti proprietà:
ƒ Finitezza: composto da un numero finito di passi
elementari
ƒ Non ambiguità (determinismo): i risultati non variano in
funzione della macchina/persona che esegue l'algoritmo
ƒ Realizzabilità: deve essere eseguibile con le risorse a
disposizione
3
AOT
LAB
Algoritmo
Š Per definire un algoritmo è necessario:
ƒ Condurre un'attenta analisi del problema ed
eventualmente suddividere il problema in piccoli
sottoproblemi
ƒ Individuare i possibili ingressi e precisare le uscite
(definizione dei dati)
ƒ Definire completamente e dettagliatamente la sequenza
dei passi che portano alla soluzione
4
AOT
LAB
Problema dei Secchi
Š Sono presenti due secchi con capacità volumetrica
rispettivamente di 4 e 3 litri
Š Determinare le operazioni necessarie per far si
che il primo secchio (da 4 litri) sia riempito con 2
litri
Š Possiamo agire sui due secchi attraverso le
seguenti operazioni:
ƒ Riempire completamente un secchio
ƒ Svuotarlo completamente
ƒ Travasare una certa quantità di liquido da un secchio
all’altro
5
AOT
LAB
Problema dei Secchi
1. Riempi il secchio da 4 litri (4, 0)
2. Travasa nel secchio da 3 litri finché e pieno (1,3)
3. Vuota il secchio da 3 litri (1,0)
4. Travasa nel secchio da 3 litri (0,1)
5. Riempi il secchio da 4 litri (4,1)
6. Travasa nel secchio da 3 litri finché e pieno (2,3)
6
AOT
LAB
4L
Problema dei Secchi
3L
7
AOT
LAB
Gestione di una Biblioteca
Š La biblioteca contiene un certo numero di scaffali
Š Ogni scaffale contiene un certo numero di libri che
non vengono spostati quando un libro è estratto
Š La biblioteca è dotata di schedario
ƒ Le schede sono poste in ordine alfabetico per autore
ƒ A parità di primo autore per secondo e così via
ƒ A parità di autori le schede sono in ordine di data
8
AOT
LAB
Accesso a un Libro
1. Si cerca la scheda del libro nello schedario
2. Trovata questa, si segna su un foglietto il numero
di scaffale e la posizione del libro
3. Si ricerca lo scaffale indicato
4. Si accede alla posizione del libro
5. Lo si preleva
6. Se richiesto
1. si scrive sulla scheda: data del prestito e nome di chi
prende in prestito
9
AOT
LAB
Accesso a un Libro
Š Il passo 1, a sua volta, può essere esploso nella
seguente insieme di passi (sottoprocedura):
1. Si esamini la prima scheda dello schedario
2. Se nome dell’autore e titolo coincidono con quello
ricercato
1. La ricerca è conclusa
2. Altrimenti si passi alla scheda successiva
3. Si proceda di scheda in scheda fino a trovare la
scheda cercata
4. Se vengono esaurite le schede
1. La ricerca è conclusa in modo infruttuoso (il libro cercato non è
presente nella biblioteca)
10
AOT
LAB
Algoritmi e Informatica
Š I calcolatori possono essere visti come esecutori di
algoritmi
Š Gli algoritmi vengono descritti tramite programmi,
cioè tramite una sequenza di istruzioni scritte in un
linguaggio comprensibile dal calcolatore
Š Compito di un esperto informatico e di produrre
algoritmi e codificarli in programmi
11
AOT
LAB
Algoritmi e Informatica
Š Per scrivere un programma abbiamo bisogno di
ƒ Descrivere i dati
ƒ Definire le istruzioni che operano sui dati
Š In modo tale che a partire dai dati iniziali otteniamo
dei dati finali rappresentanti la soluzione alla
nostra istanza di problema
12
AOT
LAB
Descrizione dei Dati
Š Abbiamo bisogno di variabili (contenitori di valori)
per esprimere le varie istanze di problemi
Š Le variabili si definiscono in termini di:
ƒ Nome: l’identificatore (a cui fare riferimento)
ƒ Tipo: l’insieme dei possibili valori che possono essere
assunti (char, stringa, intero, reale, booleana)
ƒ Valore: il valore attualmente assunto dalla variabile
Š È molto importante non confondere il nome col
valore
13
AOT
LAB
Tipi di Istruzioni
Š Ci sono tre tipologie di istruzioni:
ƒ Assegnamento ed istruzioni aritmetico-logiche
ƒ Istruzioni di I/O
ƒ Strutture di controllo
14
AOT
LAB
Assegnamento ed istruzioni
aritmetico-logiche
Š Le istruzioni di assegnamento permettono di depositare un
valore in una variabile
ƒ A=5
Š Le istruzioni aritmetiche permettono di eseguire un calcolo
aritmetico e di depositarne il risultato in una variabile
ƒ A=A+1
ƒ A=B+C
Š Le istruzioni logiche permettono di verificare la veracità di
una espressione logica
ƒ A == 5
ƒ A > 12
ƒ A <= B
15
AOT
LAB
I/O
Š Esistono due tipi di istruzioni di I/O:
ƒ Istruzioni di lettura che permettono di leggere dei dati da
un dispositivo esterno
• Leggi A
ƒ Istruzioni di lettura che permettono di leggere dei dati da
un dispositivo esterno
• Scrivi A
16
AOT
LAB
Strutture di Controllo
Š Ci sono tre tipi di strutture di controllo:
ƒ Sequenza
ƒ Condizione
ƒ Iterazione
Š Il teorema di Jacopini-Bohm afferma che è
possibile scrivere algoritmi per risolvere qualunque
problema usando solo queste strutture di controllo
(purché esista un algoritmo risolutivo)
17
AOT
LAB
Rappresentazione degli Algoritmi
Š Esistono due formalismi principali per
rappresentare gli algoritmi
ƒ Diagrammi di flusso
ƒ Pseudo codice
18
AOT
LAB
Diagramma di Flusso
Š I diagrammi di flusso sono un formalismo grafico
per descrivere gli algoritmi
Š I diagramma di flusso scompongono in passi
successivi gli algoritmi
Š Un diagramma di flusso è una descrizione più
efficace e meno ambigua di una descrizione a
parole
19
AOT
LAB
Diagramma di Flusso
Š Le operazioni su cui si basa un diagramma di
flusso sono:
ƒ
ƒ
ƒ
ƒ
Trasferimento di informazioni
Esecuzione di calcoli
Assunzione di decisioni
Esecuzione di iterazioni
Š Un diagramma di flusso è costituito da due tipi di
entità:
ƒ Nodi
ƒ Archi
20
AOT
LAB
Tipi di Nodi
Start
Var ← Expr
Var
Inizio
Elaborazione / Assegnamento
Lettura dati
Stop
Fine
Si
Var
No
Decisione
Scrittura dati
Espr1
Espr1
Espr1
Espr1
Espr1
Espr1
=
≠
>
≥
<
≤
Espr2
Espr2
Espr2
Espr2
Espr2
Espr2
21
AOT
LAB
Strutture di Controllo
I
Si/No
I
No/Si
I
No/Si
Si/No
O
If - Then - Else
No/Si
Si/No
O
While - Do
O
Repeat - Until
22
AOT
LAB
Somma di Tre Numeri
Start
Var1
Var2
Var3
Somma ← Var1 +Var2 + Var3
Somma
Stop
23
AOT
LAB
Somma di N Numeri
Start
No
N
I←0
Somma ← 0
I<N
Si
Var
Somma
Somma ← Somma + Var
I←I+1
Stop
24
AOT
LAB
Pseudo Codice
Š Lo pseudo codice è una sorta di linguaggio che
descrive un algoritmo attraverso istruzioni simili
alle istruzioni di un linguaggio di programmazione
Š Si descrivono algoritmi utilizzando pseudo codice
perché passare dalla descrizione in pseudo codice
alla effettiva descrizione in un linguaggio di
programmazione è (o dovrebbe essere) semplice
25
AOT
LAB
Tipi di Istruzione
Š Elaborazione/Assegnamento
A = Expr
Š Lettura
Leggi Var
Š Scrittura
Scrivi Var
26
AOT
LAB
Strutture di Controllo
Š Condizione semplice
Se condizione
{
...
}
Š Condizione a due vie
Se condizione
{
...
}
Altrimenti
{
...
}
Š Iterazione
Finchè condizione
{
...
}
27
AOT
LAB
Somma di Tre Numeri
Leggi Var1
Leggi Var2
Leggi Var3
Somma = Var1 + Var2 + Var3
Scrivi Somma
28
AOT
LAB
Somma di N Numeri
Leggi N
I=0
Somma = 0
Finché I < N
{
Leggi Var
Somma = Somma + Var
I=I+1
}
Scrivi Somma
29
AOT
LAB
Programmazione Top-Down
Š La programmazione top-down è una tecnica di
programmazione per la realizzazione di programmi
con la scomposizione iterativa di un problema in
sotto problemi
30
AOT
LAB
Programmazione Top-Down
Š La programmazione top-down si presta molto
bene per la definizione di algoritmi con i diagrammi
di flusso:
ƒ All’inizio il diagramma di flusso è rappresentato da un
nodo che rappresenta la soluzione al problema
ƒ Questo nodo viene scomposto in una rete di nodi in
modo iterativo
ƒ La scomposizione termina quando i singoli nodi
possono essere rappresentati da semplici sequenze di
istruzioni del linguaggio di programmazione scelto
31
AOT
LAB
Somma di N Numeri
Start
Somma gli N numeri
Stop
32
AOT
LAB
Somma di N Numeri
Start
Inizializzazione
Leggi e somma gli N numeri
Stampa la somma
Stop
33
AOT
LAB
Somma di N Numeri:
Inizializzazione
N
I←0
Somma ← 0
34
AOT
LAB
Somma di N Numeri:
Leggi e somma gli N numeri
No
I<N
Si
Var
Somma ← Somma + Var
I←I+1
35
AOT
LAB
Somma di N Numeri
Start
No
N
I←0
Somma ← 0
I<N
Si
Var
Somma
Somma ← Somma + Var
I←I+1
Stop
36
AOT
LAB
Stampa il Numero di Righe
Start
Calcola e stampa il numero di righe
Stop
37
AOT
LAB
Stampa il Numero di Righe
Start
Inizializzazione
Calcola il numero di righe
Stampa il numero di righe
Stop
38
AOT
LAB
Stampa il Numero di Righe:
Inizializzazione
Nome Documento
Righe ← 0
39
AOT
LAB
Stampa il Numero di Righe: Leggi
una Riga
No
Ci sono
Righe?
Si
Leggi una riga
Righe ← Righe + 1
40
AOT
LAB
Stampa il Numero di Righe
Start
Nome Documento
No
Ci sono
Righe?
Si
Righe ← 0
Righe
Leggi una riga
Righe ← Righe + 1
Stop
41