Presentazione di PowerPoint - Home page istituzione trasparente

annuncio pubblicitario
Cenni su Algoritmi
e Strutture Dati
14 nov 2011
Concetti di base su
Algoritmi e Dati
 Un computer è un esecutore di algoritmi
 Un algoritmo è un particolare tipo di procedimento
di soluzione di un problema, con caratteristiche
determinate.
 Gli algoritmi sono solo una parte di tutti i possibili
procedimenti di calcolo. In questa parte vedremo
 cos’è un algoritmo,
 in che modo è possibile rappresentarlo usando
carta e penna
 in che modo è possibile rappresentare i dati che
esso utilizza.
Il calcolatore come strumento
per gestire informazione
acquisire
dati
IN
elaborare
PROCESS
archiviare
tradizionalmente
l’enfasi è su
presentare,
attuare
soluzioni
OUT
comunicare
… cioè sui
sistemi di elaborazione
delle informazioni …
Soluzione di un problema
Problema
soggetto 1
ANALISI
Modello di
soluzione
STESURA
DESCRIZIONE
Descrizione
INTERPRETAZIONE
Deve fare tutto lo
stesso soggetto?
soggetto 2
Descrizione
interpretata
ESECUZIONE
Soluzione
La soluzione di un problema
Conoscenza di come si
risolve un problema
soggetto 1
(cuoco)
Descrizione della
soluzione
(ricetta)
soggetto 2
(io)
Effettiva capacità di eseguire
la soluzione del problema
Definire il problema
 Eliminare le ambiguità nella formulazione del
problema
 Individuare il risultato che si vuole ottenere, gli
obiettivi da raggiungere
 Evidenziare
 le regole da rispettare
 i vincoli interni ed esterni
 i dati espliciti ed impliciti
 Eliminare i dettagli inutili ed ambigui
Relazione tra Realtà e Modello
Ricerca della
soluzione
Costruzione
modello
Mondo Reale
Modello
re
tf
ft
12
13
tt
14
15
F=m×a
Interpretazione
della soluzione
Soluzioni ed esecutori
 La descrizione della soluzione di un problema dipende dall’esecutore
 esecutore con un livello medio di scolarità ⇒
“determina la superficie s di un cerchio di cui è noto il raggio r”;
 esecutore che non conosce come calcolare l’area del cerchio ⇒
“la superficie di un cerchio è s = π r2”;
 esecutore che non conosce π  ⇒
“la superficie di un cerchio è s = πr2 e π indica pi greco ed è 3.1415”;
 … ⇒ “eleva al quadrato il raggio e quindi moltiplica il risultato per pi greco”;
 … ⇒ “moltiplica il raggio per se stesso e poi il risultato per 3.14”;
 …
 La descrizione della soluzione di un problema deve essere accettabile
per un esecutore
 si scompone il problema originario in sottoproblemi;
 si scompongono i sottoproblemi in sotto-sottoproblemi;
 si prosegue nella scomposizione fino a giungere a problemi elementari (o
primitivi), cioè problemi che possono essere risolti direttamente dall’esecutore
Area di una campana (1)
Problema
Scomposizione del
problema in tre
sottoproblemi
Sottoproblema 1
r
soluzione elementare:
s = ½  r2
r=b/2
h2
Sottoproblema 2
b
h2
b
soluzione elementare:
s = b h2
h1
B
soluzione elementare:
s = ??
Sottoproblema 3
h1
B
soluzione elementare:
s = ??
Area di una campana (2)
Scomposizione del sottoproblema 3 in
tre ulteriori sottoproblemi
b
h1
B
Sottoproblema 3
soluzione effettiva:
s = ½ (½(B–b) h1) +
b h1 +
½ (½(B–b) h1)
h1
h1
b
½ (B–b)
h1
½ (B–b)
Sottoproblema 3.1
Sottoproblema 3.2
Sottoproblema 3.3
soluzione elementare:
s =½ (½(B–b) h1)
soluzione elementare:
s = b h1
soluzione elementare:
s =½ (½(B–b) h1)
Composizione delle soluzioni dei tre
sottoproblemi 3.1, 3.2 e 3.3 per risolvere
il sottoproblema 3
14 nov 2011
Concetti di base su
Algoritmi e Dati
1.
Cosa permette a un computer di svolgere compiti
che, se svolti dall’uomo, verrebbero considerati
intelligenti?

2.
Algoritmi
Come “rappresentare” un algoritmo?

Carta e Penna, scrivendone i passi (Metodo informale,
adatto agli esseri umani)

Flow Chart (Metodo formale – adatto agli esseri umani)

Programma scritto in linguaggio ad Alto Livello (Metodo
formale – adatto a computer e ad esseri umani)

Programma scritto in linguaggio a Basso Livello (Metodo
formale – adatto ai computer)
Rappresentazione degli algoritmi
 Linguaggio Naturale
 Diagramma di flusso
Inizio
 Sollevare il ricevitore
 Attendere il segnale
di linea libera
Leggi
xey
 Comporre il numero
dx–y
P1 e P 2
P3
 …
Sì
Scrivi
“max è x”
d>0?
No
P4
Scrivi
“max è y”
P5
Fine
P7
P6
Rappresentazione degli algoritmi
 Pseudo Codice
leggi alfa, beta
prod ⇦ 0
finché alfa ≠ 0 ripeti
prod ⇦ prod + beta;
alfa ⇦ alfa – 1;
stampa prod;
 Linguaggio di
programmazione
#include <stdio.h>
int main (void) {
puts (“ciao mondo!”);
return Exit_success;
}
Diagrammi di flusso - Flowchart
START
END
I/O
PROCESS
Inizio
Fine
Operazioni di
ingresso/uscita
Elaborazione
Sì
Predicato
Selezione a due
vie
No
SUB-PROCESS
Sottoprogramma
Esempio
Esempio:
dati in ingresso due
numeri X e Y, si calcoli
e stampi il maggiore.
Inizio
Leggi
xey
P1 e P 2
dx–y
Sì
Scrivi
“max è x”
d>0?
P3
No
P4
Scrivi
“max è y”
P5
Fine
P7
P6
Definizione (informale) di
Algoritmo
 sequenza finita di azioni
 espresse in modo comprensibile all'esecutore
 che, a partire da un insieme di dati input,
 conducono sempre alla risoluzione del
problema
 in un tempo “ragionevole” e
 facendo uso di una quantità “ragionevole” di
risorse.
Algoritmi
 non tutti i procedimenti di soluzione sono
algoritmi,
 non tutti i problemi ammettono un algoritmo,
 un problema può ammettere più di un
algoritmo
Caratteristiche di un algoritmo
 Perché la soluzione ad un problema possa essere detta "algoritmo" è
necessario che presenti tutte insieme le seguenti caratteristiche:
 Insieme finito di istruzioni
 Terminazione Deve terminare dopo un numero finito di passi.
 Assenza di ambiguità Ogni istruzione deve essere eseguibile in un
unico modo, a prescindere da chi l’esegue;
 Presenza di Input Deve operare su un insieme ben specificato di
dati in ingresso
 Produzione di Output Deve essere nella relazione prevista con i
dati di ingresso
 Generalità Deve essere in grado di risolvere tutti i problemi dello
stesso tipo (ad esempio se l'algoritmo calcola la somma di 2
numeri, esso deve fornire sempre il valore corretto della somma
qualsiasi sia la coppia di numeri dati in input).
 Deve usare una quantità limitata di risorse.
Caratteristiche di un algoritmo
 Le procedure che contravvengono anche uno
solo dei requisiti di cui sopra pur essendo
metodi di risoluzione non sono algoritmi.
 Un algoritmo, ovviamente, oltre ad essere
“corretto” è opportuno (ma non necessario)
che sia “efficiente”, cioè deve fornire la
soluzione al problema nel modo più veloce
possibile e usando il minor numero possibile di
risorse esterne.
Un po’ di storia …
 Algoritmo, il concetto fondamentale e centrale
dell'informatica
 La parola ha origine nel Medio Oriente dal nome
del matematico persiano Abu Ja'far Mohammed
ibn Musà al-Khowarizmi (825).
 Una procedura per risolvere un problema
matematico in un numero finito di passi che
implicano frequenti ripetizioni di un'operazione.
ALGORITMO DI EUCLIDE PER
IL MCD DI 2 NUMERI INTERI
Dispense, cap. 1.1.2
Algoritmo di Euclide
 Dati due numeri interi e positivi m e n, si calcoli il
più grande intero che li divide entrambi
 Si supponga (non cambia il procedimento e non si
perde in generalità) che m≥n (se così non fosse si
scambi m con n).
 L’operazione mn è detta di assegnazione (in
questo caso si legge “si assegni ad m il valore
contenuto in n”),
ALGORITMO PER IL CALCOLO DEL MCD
1. Si divida m per n. Sia r il resto della divisione (con 0  r < n)
2. se r = 0 allora la risposta è n e STOP
3. Altrimenti (cioè r ≠ 0) m  n e n  r e si torni al passo 1
Verifica empirica
 Proviamo con m  774 e n  342:
1.
774 / 342 dà come resto r  90
2.
r = 0? No, per cui non terminiamo
3.
poniamo m  342 e n  90 e torniamo al passo 1.
1.
342 / 90 dà come resto r  72
2.
r = 0? No, per cui non terminiamo
3.
poniamo m  90 e n  72 e torniamo al passo 1
1.
90 / 72 dà come resto r  18
2.
r = 0? No, per cui non terminiamo
3.
poniamo m  72 e n  18 e torniamo al passo 1.
1.
72 / 18 dà come resto r  0
2.
r = 0 SI, per cui MCD = n = 18. STOP
Criteri di algoritmicità per MCD
 Il criterio di terminazione è soddisfatto
 La sequenza dei resti è una successione di numeri
interi decrescenti che termina con 0
 Non Ambiguità.
 Si usano solo divisioni intere, test su numeri positivi
e assegnamenti a variabili. Sappiamo senza
alcuna ambiguità come eseguire queste
operazioni e quindi il criterio è soddisfatto
Criteri di algoritmicità per MCD
 I dati input sono i due numeri positivi
 Il dato in output è il MCD per la coppia
 Il procedimento vale per qualunque coppia di
interi, per cui il criterio di Generalità è
soddisfatto.
 Gli altri criteri sono evidentemente soddisfatti
dal formato con cui si presenta l’algoritmo
14 nov 2011
Dati
 Un algoritmo è un metodo per la manipolazione dei dati.
 Nella pratica, i dati raramente si presentano in formato
elementare (un singolo numero intero oppure un unico
carattere)
 Quasi sempre un algoritmo utilizza “aggregazioni” di dati a
cui si riferisce come ad una singola entità
 Entità Data di calendario. Esso rappresenta un’unica
entità (un giorno) che è composta da più elementi:
 giorno,
 mese,
 anno
Dia
14 nov 2011
Dati
 Scheda bibliografica. Esso rappresenta un’unica
entità (un libro) che è composta da più elementi:
 Titolo
 Autore
 Casa Editrice
 Numero di pagine
…
 Intero Schedario bibliografico, composto da un
insieme di tante schede singole riunite in un unico
“contenitore”, lo schedario
Dati: Variabili e Costanti
 Un algoritmo (e il programma che ne è
rappresentazione) utilizza dati che, al momento
dell’elaborazione, sono fisicamente memorizzati
nelle celle di memoria RAM
 I dati memorizzati nelle celle di memoria sono detti
 “variabili” se possono mutare valore nel corso
dell’elaborazione,
 “costanti” se, una volta che hanno assunto un valore,
non permettono al programmatore di modificarlo
 Valore della variabile (o di una costante) è il
contenuto corrente della cella di memoria associata
alla variabile (o alla costante).
Variabili e Costanti
 Ad ogni dato (sia esso costante che variabile) si
fa riferimento tramite un NOME.
 Il nome di una costante o di una variabile è
 un aiuto mnemonico per chi formula l’algoritmo
 non riveste alcun significato per chi dovrà poi
eseguire l’algoritmo (il calcolatore)
Algoritmi e variabili
 Gli algoritmi sono parametrici:
 producono un risultato che dipende da un insieme di
dati di partenza;
 descrivono la soluzione non di un singolo problema,
ma di una intera classe di problemi strutturalmente
equivalenti.
 Esempi:
l’algoritmo per la moltiplicazione di due numeri
specifica come effettuare il prodotto di tutte le
possibili coppie di numeri;
l’algoritmo per la ricerca di un libro nello schedario
della biblioteca vale per tutti i possibili libri;
…
 Le istruzioni dell’algoritmo fanno riferimento a variabili, il
cui valore non è fissato a priori ma cambia a seconda
della situazione elaborativa in cui l’esecutore si trova.
Uso delle variabili
 All’interno di espressioni,
 l’esecutore usa il valore contenuto nelle variabili per calcolare il
risultato dell’espressione,
 per esempio op1 + op2 × op3 oppure op1 / op2 – op3, …
 in istruzioni di assegnamento
 introdurre nel contenitore identificato dal nome della variabile
il valore specificato a destra dell’assegnamento;
 per esempio r ← 35 (assegna 35 alla variabile il cui nome è r),
pi ← 3,14, …
 in istruzioni di assegnamento combinate con espressioni
 assegna a una variabile il risultato ottenuto dalla valutazione di
un’espressione, per esempio in “circ ← 2 × r × pi” il risultato
dell’espressione 2 × r × pi viene calcolato utilizzando i valori
contenuti nelle variabili r e pi e il risultato viene poi assegnato
alla variabile circ;
 la stessa variabile può comparire in entrambi i lati dell’istruzione
di assegnamento, per esempio in “k ← k + 1” il valore
contenuto in k viene utilizzato per trovare il valore
dell’espressione k + 1 che viene memorizzato come nuovo
valore di k.
Assegnamento di valori a variabili
 Il valore assegnato a una variabile si
sostituisce a quello che era presente
in precedenza: il vecchio valore non
potrà più essere recuperato.
………
 Esempio: si ipotizzi di voler
scambiare i valori contenuti in due
variabili x e y.
 Soluzione proposta:
doppio assegnamento del tipo
x←y
y←x
per indicare che il valore di y deve
essere copiato in x e che, nello
stesso tempo, il valore di x sia
trasferito in y.
 Le istruzioni però vengono eseguite
in sequenza! Quindi l’assegnamento
x ← y viene completato prima di
iniziare y ← x.
x  y;
y  x;
………
x
y
7
9
t0
7
9
t1
9
9
t2
9
9
t3
9
9
t4
x
y
tempo
Assegnamento di valori a variabili
Soluzione corretta:
uso di una variabile
aggiuntiva (tmp), come
strumento di
memorizzazione
temporanea (“buffer”) del
valore originariamente
contenuto in x
tmp ← x
x←y
y ← tmp
………
tmp  x;
x  y;
y  tmp;
In questo modo lo scambio
avviene senza perdere i
valori originari
………
tmp
x
y
??
7
9
t0
7
7
9
t1
7
7
9
t2
7
7
9
t3
7
9
9
t4
7
9
9
t5
7
9
7
t6
tmp
x
y
tempo
Dati: Accesso dei programmi
ai dati
 Come si indirizzano le celle di memoria?
 Un programma esegue operazioni su dati.
 Ogni dato elementare è memorizzato in una cella di
memoria.
 Ogni cella di memoria ha un indirizzo fisico.
 Per “accedere” ad una cella di memoria il programma (e
quindi il programmatore che lo “scrive”) dovrebbe quindi
conoscere il suo indirizzo fisico.
 Il programmatore utilizza invece nomi simbolici per far
riferimento ai dati (es., x, y, nome,...) detti “nomi” delle
variabili o delle costanti, molto più semplici da gestire
 Un software apposito, in fase di esecuzione del programma,
assocerà ad ogni nome simbolico un effettivo indirizzo di
memoria.
Tipo di un dato
 Un essere umano
 comprende “a vista” i tipi di dato sui quali lavora
 Conosce le operazioni che è lecito effettuare su
di essi. Egli sa che non è possibile
 estrarre la radice quadrata di un’immagine,
 moltiplicare due parole (o almeno non nel senso matematico del
termine)
 sottrarre una nota musicale da un’altra.
 Questo anche perché parole, numeri, note,
ecc… vengono rappresentati utilizzando
alfabeti e regole di composizione molto diversi
tra di loro.
Tipo di un dato
 Il nome di una costante o di una variabile è
 un aiuto mnemonico per il programmatore
 non riveste alcun significato per il calcolatore
 Un calcolatore “rappresenta” tutti i tipi di dati
mediante sequenze di bit
 bisogna specificare in modo esplicito all’interno
dell’elaborazione il tipo associato ad ogni dato
Tipo di un dato
 Supponiamo che in una cella di memoria sia presente
la parola binaria 01010011
 a quale “tipo di dato” essa corrisponde?
 che tipo di operazioni possono essere effettuate su di
essa
 Infatti la sequenza binaria 01010011
 se interpretata come numero corrisponde al numero
decimale 83
 se interpretata come carattere corrisponde alla lettera S
 e, inoltre, potrebbe anche essere una parte di un disegno
o di un brano musicale, ecc…
 o, ancora, potrebbe essere parte di un’istruzione (se in
quella zona di RAM risiede un programma, ad es. Word).
Tipo di un dato
 Per definire una variabile o una costante bisogna
specificare il tipo di dato che essa assumerà.
Tipo di un dato
 Il tipo di dato determina
 l’insieme dei valori che possono essere assunti dal dato.
 interi
 numeri reali
 Caratteri
 …
 Tutte le operazioni che è possibile effettuare sui dati.
 Somma, moltiplicazione
 Arrotondamento per eccesso/difetto
 Confronto alfabetico tra due caratteri
…
 la quantità di memoria che il computer deve “dedicare”:
un carattere, ad esempio, occupa 8 bit, mentre un
numero intero spesso ne occupa 32 e un numero reale ne
richiede 64.
Tipi di dato
 Tipi di dato elementari (predefiniti):
 Integer (numero intero)
 Real (numero reale)
 Char (singolo carattere)
 Boolean (può valere VERO o FALSO)
…
 Tipi di dato “composti” (costruiti a partire da tipi
elementari)
 String (sequenza di caratteri)
 Array (Vettore o matrice)
 Record (gruppo di dati eterogenei)
 Text (File contenente testi)
…
UD 3.1b: Costrutti di un
Algoritmo
Dispense 1.2
I Costrutti di base
 Necessità di descrivere in modo chiaro e
preciso “su foglio” le istruzioni e la sequenza
operativa di un algoritmo
 Un qualsiasi algoritmo può essere rappresentato
utilizzando unicamente i seguenti costrutti:
 Sequenza (realizzata tramite l’istruzione di
assegnazione)
 Decisione binaria (realizzata tramite l’istruzione
condizionale)
 Ciclo (realizzata tramite l’istruzione ciclica)
I Costrutti di base
 E’ opportuno aggiungere un’altra tipologia di
istruzione, che permette di scambiare dati tra
l’algoritmo e l’esterno (lettura dati, scrittura
risultati, visualizzazione dati intermedi).
 Tutte le altre istruzioni non aggiungono potere
computazionale, ma servono per semplificare
la scrittura della soluzione
Istruzione di Assegnazione
(Sequenza)
 Assegnazione: Istruzione che assegna il valore di
un’espressione ad una variabile
 Sintassi:
<Nome della Variabile> <Espressione>
Istruzione di Assegnazione
(Sequenza)
 Le espressioni corrispondono ad operazioni sui dati
 Un’espressione può coinvolgere nomi di variabili,
costanti, operatori aritmetico-logici, ecc
 Esempi: x  3+4;
y  x+y-1; (dove x è una variabile)
 Esempio
somma  somma + 5
 Si supponga che, inizialmente, somma contenga il valore 2
 Passo 1: viene valutata innanzitutto l’espressione somma+5, cioè 2+5,
cioè 7.
 Passo 2: Il risultato dell’espressione viene assegnato nuovamente alla
variabile di nome “somma”, che quindi, alla fine dell’operazione,
conterrà il numero 7.
Istruzione condizionale (Decisione
Binaria)
1.
valuta una condizione (espressione booleana)
2.
esegue, in alternativa, in base all’esito del
confronto

(la condizione è VERA) un primo insieme di
istruzioni (racchiuse tra la coppia begin … end)

(la condizione è FALSA) un secondo insieme di
istruzioni (racchiuse tra la coppia begin … end)
Istruzione condizionale (Decisione
Binaria)
 Sintassi:
if <Condizione>
then begin <Istruzioni1> end
else begin <Istruzioni2> end
 Se <Istruzioni1> o <Istruzioni2> sono composte da
una sola istruzione, la coppia begin … end può
essere omessa
Istruzione ciclica
(Ciclo a condiz. iniziale)
1. valuta una condizione (espressione booleana)
2. finchè la condizione si mantiene VERA:
 esegue un insieme di istruzioni e torna al passo 1
3. Quando la condizione diventa FALSA si esce dal
ciclo
 La condizione può risultare falsa alla prima
esecuzione: in questo caso l'algoritmo esce
direttamente dal ciclo, senza aver mai eseguito le
istruzioni interne.
Istruzione ciclica
(Ciclo a condiz. iniziale)
Sintassi:
while <Condizione> do
begin
<Lista Istruzioni>
end
 Se <Lista istruzioni> è composta da
una sola istruzione, la coppia
begin … end può essere omessa
Scarica