Informatica I
3 – Algoritmi e Linguaggi
di Programmazione
16 Aprile 2012
Corso di Laurea in Matematica e applicazioni
Università di Camerino
A.A. 2011/2012
Cos’è un algoritmo?
Un algoritmo è una procedura generale, finita, non ambigua ed
eseguibile che lavora su dati d’ingresso fornendo alcuni dati
d’uscita.
• procedura: una sequenza di passi computazionali o istruzioni
• generale: il metodo deve risolvere una classe di problemi e non un singolo
problema (ad esempio deve essere in grado di calcolare l'area di tutti i
triangoli e non solo quella di un particolare triangolo)
• finita: le istruzioni che la compongono ed il numero di volte che ogni azione
deve essere eseguita devono essere finiti
• non ambigua: ogni istruzione deve essere definita in modo preciso ed
univoco, senza alcuna ambiguità sul significato dell’operazione
• eseguibile: deve esistere un agente di calcolo (umano o macchina) in grado
di eseguire ogni istruzione in un tempo finito
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Determinismo e non determinismo
• Algoritmo deterministico: per ogni istruzione esiste, a parità di
dati d'ingresso, un solo passo successivo; in pratica esiste uno e
un solo possibile percorso (o path) dell’algoritmo e quindi con gli
stessi input produce gli stessi output
• Algoritmo non deterministico: contiene almeno un’istruzione
che ammette diversi passi successivi: può produrre output
diversi con gli stessi input, compiendo diversi path di esecuzione.
Es. Algoritmi probabilistici: per un istruzione, più passi
successivi con associata una probabilità di essere scelti (lancio
della moneta)
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Storia
Etimologia:
Il termine algoritmo significa procedimento di
calcolo
Deriva dal termine latino medievale algorismus, che
a sua volta deriva dal nome del matematico
persiano Abu Jafar Mohammad ibn-Musa alKhowarismi, vissuto nel IX (?) secolo, che pubblicò
l’opera Kitab Al-jabrwal Muquabala (L’arte di
numerare ed ordinare le parti in tutto) da cui deriva
il nome algebra
Informatica I
3 – Algoritmi e Linguaggi
Abu Jafar
Mohammad ibnMusa alKhowarismi
A.A. 2011/2012
Storia
•Algoritmi in uso ancora oggi sono stati studiati da matematici
greci 2000 anni fa, es. Algoritmo di Euclide per il MCD
•La teoria degli algoritmi ha iniziato a stabilizzarsi agli inizi del XX
secolo,mentre le tecniche di progettazione di algoritmi e di
analisi di correttezza e di efficienza si sono evolute nella seconda
metà del XX secolo grazie alla diffusione dei calcolatori
elettronici
• Ovunque si impieghi un calcolatore occorrono algoritmi corretti
e efficienti che ne utilizzino al massimo le potenzialità.
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Come valutiamo un algoritmo?
• CORRETTEZZA (Risolve correttamente il problema?): un
algoritmo si dice corretto se, per ogni istanza di input, si ferma
con l’output corretto/desiderato
• EFFICIENZA (Risolve il problema in maniera efficiente?): deve
cioè fare un buon uso delle risorse a disposizione. (tempo o
memoria).  analisi degli algoritmi e teoria della complessità
Alcuni problemi non possono essere risolti in maniera efficiente
Esempio: Knapsack problem (problema NP-completo)
INPUT: uno zaino che sopporta un peso W e N oggetti, ognuno dei quali
caratterizzato da un peso wi e un valore ci.
OUTPUT: una scelta degli oggetti che massimizza il valore scegliere senza
superare il peso sostenibile dallo zaino W.
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Esempio: Ricette come algoritmi
Una ricetta può essere vista come un algoritmo in cui:
• INPUT: ingredienti e utensili da cucina
• OUTPUT: il piatto cucinato
Algoritmo: Cottura spaghetti
Input: Spaghetti, sale,
pentola, fornello
Output: Spaghetti cotti
Informatica I
Algoritmo:
1. Mettere l’acqua nella pentola
2. Mettere la pentola sul fuoco
3. Attendere l’ebollizione
4. Buttare gli spaghetti
5. Buttare il sale
6. Attendere il tempo di cottura
7. Scolare gli spaghetti
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Esempio: Calcolo del MCD
INPUT: Due naturali a e b
OUTPUT: Il massimo comun divisore d di a e b
Algoritmo banale:
1. Assegnare a d il minimo tra a e b
2. Se d divide sia a e b, allora restituisco d
3. Altrimenti decremento d. Passo 2.
Algoritmo di Euclide:
1. Assegnare a a0  a e a b0  b (supponendo b  a)
2. Assegnare a i  1
3. ai  bi-1 e bi  an-1 mod bn-1
4. Se bi = 0, allora restituisco ai.
5. Altrimenti incremento i, i  i + 1. Passo 3.
Informatica I
3 – Algoritmi e Linguaggi
ai = qibi + bi+1
A.A. 2011/2012
Correttezza dell’algoritmo di Euclide
1. Esiste N t.c. bN = 0? Sì esiste. Infatti risulta bn+1 < bn per ogni n (essendo il resto
della divisione tra an e bn), quindi la successione dei bn è strettamente
decrescente, e quindi esiste un N tale che bN = 0.
2. Per tale N, aN è MCD(a,b)? Sì, dimostriamo in due passi.
a) aN divide a e b? Sì, perchè aN=bN-1 | aN-1= qN-1bN-1 (infatti l’ultimo resto è
0). Inoltre aN | aN-2 = qN-2 bN-2 + bN-1, perchè divide sia bN-1 (=aN) che qN-2
bN-2 (aN | aN-1=bN-2). Così proseguendo si ha che aN divide tutti i resti
successivi fino ad a e b.
b) aN è il massimo tra i divisori? Sì, dimostriamo che il massimo comun
divisore d di a e b divide anche aN (e quindi aN=d è l’MCD). a e b possono
essere scritti come a = md e b = nd, con m e n naturali. Allora d divide
anche il primo resto a2=b1=a − q0b = md − q0nd = (m − q0n)d.
Analogalmente d divide anche a3=b2=a1-q1b1 = b –q1a2 (perchè divide sia
b che a2), e così via. Quindi d|aN, il che implica che d ≤ aN. Ma d è il
massimo tra i divisori, quindi daN.  d=aN, aN è l’MCD.
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Algoritmo di Euclide in azione
a = 1071
b = 462
ai = qibi + bi+1
ai e bi
0
1071 = q0462 + b1
a0 = 1071, b0 = 462
1071
Passo
462
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Algoritmo di Euclide in azione
a = 1071
b = 462
Passo
ai = qibi + bi+1
ai e bi
0
1071 = q0462 + b1
a0 = 1071, b0 = 462
1
462= q1147+ b2
a1 = 462, b1 = 147
147
462
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Algoritmo di Euclide in azione
a = 1071
b = 462
Passo
ai = qibi + bi+1
ai e bi
0
1071 = q0462 + b1
a0 = 1071, b0 = 462
1
462= q1147+ b2
a1 = 462, b1 = 147
2
147= q221+ b2
a2 = 147, b2 = 21
147
21
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Algoritmo di Euclide in azione
a = 1071
b = 462
Passo
ai = qibi + bi+1
ai e bi
0
1071 = q0462 + b1
a0 = 1071, b0 = 462
1
462= q1147+ b2
a1 = 462, b1 = 147
2
147= q221+ b3
a2 = 147, b2 = 21
3
a3 = 21, b3 = 0
MCD(1071,462) = 21
Informatica I
3 – Algoritmi
A.A. 2011/2012
Codifica tramite flowchart
I diagrammi di flusso (flowcharts) sono una notazione
grafica per la codifica degli algoritmi
Blocchi di inizio e fine algoritmo
Input /
Output
Istruzione
Blocco di input/output
Blocco di istruzione
Blocco condizionale (valuta una
condizione, abilitando il percorso T
(true) o F (false)
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Spaghetti flowchart
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
The friendship algorithm
Jim Parsons aka
Sheldon Cooper
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Flowchart per l’algoritmo di Euclide
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Algoritmi e programmi
• Gli algoritmi vengono descritti tramite programmi, che si avvalgono di
istruzioni e costrutti dei linguaggi di programmazione per essere eseguiti da
calcolatori elettronici
• I programmi sono formulazioni concrete di algoritmi astratti che si basano
su particolari rappresentazioni dei dati, e utilizzano operazioni di
manipolazione dei dati, messe a disposizione da uno specifico linguaggio di
programmazione
• Le proprietà degli algoritmi sono talmente fondamentali, generali e robuste,
da essere indipendenti dalle caratteristiche di specifici linguaggi di
programmazione o di particolari calcolatori elettronici
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Quale linguaggio?
• Linguaggi ad alto livello, vicini al programmatore, i più adatti
per codificare algoritmi astratti
• Pseudocodice (didattico, generico)
• Java
• C, C++
• Fortran
• PHP
• Javascript
• ....
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Variabili
• Una variabile identifica una porzione di memoria
(generalmente RAM) destinata a contenere dei dati, che
possono essere modificati nel corso dell'esecuzione di
un programma
• Ha associato un nome simbolico (nome della variabile) che
permette di accedere al contenuto della variabile. Il nome è
una sequenza di caratteri alfanumerici, che inizia con un
carattere alfabetico
• Diversa dalle variabili in matematica, non necessariamente fa
parte di un equazione o formula
var x;
Informatica I
Dichiarazione di una variabile con nome ‘x’
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Costanti
• Una costante identifica una porzione di memoria destinata a
contenere dei dati, che non possono essere modificati nel corso
dell'esecuzione di un programma
• Ha associato anch’essa un nome simbolico
const x = 10;
Dichiarazione di una costante con nome ‘x’
e valore 10
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Tipi di dato elementari
Variabili e costanti hanno associato un tipo di dato, che
determina
• l’insieme dei valori che una variabile può rappresentare
• le operazioni supportate sui dati
Esempi:
•String (sequenza di caratteri)
var s1 = “Hello”;
const s2 = “World”;
•Boolean (true, false)
var t = true;
const f = false;
• Number (numerico)
const x = 10;
var y = 5.23;
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Strutture dati
• Il concetto di algoritmo è inscindibile da quello di dato: per
risolvere un problema computazionale, occorre organizzare ed
elaborare dati
• Un algoritmo può essere visto come un manipolatore di dati: a
fronte di dati in ingresso che descrivono il problema producono
dati in uscita come risultato del problema
• E’ fondamentale che i dati siano ben organizzati e strutturati in
modo che il calcolatore li possa elaborare efficientemente
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Strutture dati
• La struttura dati è un’entità usata per organizzare un insieme
di dati, insieme gli algoritmi per manipolare tali dati.
• L’efficienza di tali algoritmi dipende dalla particolare struttura
dati
• Sono costruite a partire dai tipi di dato elementari
• Struttura dati astratta (SDA): è una specifica della struttura e
delle operazioni. Può avere diverse implementazioni.
Cosa vogliamo?
• Struttura dati (concreta) (SD): è una struttura data
implementata (realizzata) concretamente in un linguaggio.
Come lo implementiamo?
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Strutture dati - Esempi
Struttura Dati:
Algoritmi
• Liste
• Pile
• Code
• Heaps
• Grafi
• ...
• Inserimento
• Cancellazione
• Ricerca
• Ordinamento
• ...
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Espressioni
• Un'espressione è un costrutto che combina valori, costanti,
variabili, utilizzando operatori e funzioni.
• Le espressioni servono per rappresentare calcoli a livello
simbolico, e vengono valutate producendo a loro volta valori
• Le espressioni sono valutate secondo regole di precedenza e di
associazione. L'ordine di precedenza tra operatori stabilito dal
linguaggio può essere alterato mediante parentesi.
•Es.
• a + b
• 3 / 2 + 9
• a*(b%5)
• (a == “blabla”) || !(b1 && b2)
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Statement
• Uno statement è la più piccolo elemento eseguibile di un
programma, un’istruzione.
• Si compone di espressioni, organizzate secondo una sintassi
specifica (che contiene espressioni, keywords, altri statement)
• La fine di uno statement è marcata da un ;
• Es.
•
•
•
•
Informatica I
var x = 1;
return x;
{var z=y; x=x+z;}
if(z!=x) z=x; else y=z;
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Statement semplici
• Assegnamento: assegna a una variabile un’espressione
Es.
• x = y + 5;
• x = (y>=5)&&(z.substr(0,5)==“Hello”);
• z =“Hello World!”;
• Return statement: in una funzione, permette di restituire in
output un’espressione
Es.
• return x;
• return x!=y;
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Statement semplici
• Chiamata a funzione: si utilizza per eseguire una funzione (metodo,
routine, sottoprogramma). Una funzione è caratterizzata da un
• nome simbolico,
• zero o più argomenti di input,
• opzionalmente un argomento in output, restituito al chiamante
attraverso il return statement,
• un blocco di statement che contiene il codice della funzione (il corpo
della funzione)
var xTimesy = mul(x,y);
function mul (arg0, arg1)
{
...codice....
return arg0*argn;
}
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Statement semplici
• Chiamata a funzione: si utilizza per eseguire una funzione (metodo,
routine, sottoprogramma). Una funzione è caratterizzata da un
• nome simbolico,
• zero o più argomenti di input,
• opzionalmente un argomento in output, restituito al chiamante
attraverso il return statement,
• un blocco di statement che contiene il codice della funzione (il corpo
della funzione)
Nome
Funzione
Informatica I
var xTimesy = mul(x,y);
function mul (arg0, arg1)
{
...codice....
return arg0*arg1;
}
3 – Algoritmi e Linguaggi
Chiamata a funzione
Argomenti in input
Return statement
A.A. 2011/2012
Statement composti
Uno statement composto, è uno statement che contiene a sua
volta altri statement
• Blocco di statement: contiene zero o più statement racchiusi
da { (begin block) e } (end block). Se composto da un singolo
statement le parentesi si possono omettere.
• Control flow statement: costrutti che regolano il flusso di
esecuzione del programma, ovvero se, quando, in quale
ordine e quante volte le istruzioni del programma vanno
eseguite
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Control flow statement – If
Sintassi
if (cond) block1 else block2
• cond è un’espressione booleana (ovvero si valuta in true o
false)
• se cond è vera, si esegue il blocco di statement block1,
altrimenti (else) si esegue block2
• se non necessario, l’else si può omettere
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Control flow statement – Switch
Sintassi
switch (n){
case a: block1; break;
case b: block2; break;
...
default: blockn;
}
• n è un’espressione che viene valutata inizialmente
• se il valore di n è a, allora eseguo il block1; se è uguale a b,
eseguo il block2;...; nel caso in cui non è uguale a nessuno
dei precedenti eseguo il blocco di default, blockn.
• l’istruzione break serve per uscire dalla struttura di controllo
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Control flow statement – While
Sintassi
while (cond) block
• cond è un’espressione booleana
• finchè cond è vera, si esegue il blocco di statement block. A
fine blocco si rivaluta la condizione.
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Control flow statement – Do-While
Sintassi
do block while (cond)
• è come il while con la differenza che block viene eseguito
prima di valutare cond
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
Control flow statement – For
Sintassi
for (stmt1; cond; stmt2) block
• cond è un’espressione booleana
• è come il while, con la differenza che prima dell’entrata nel
ciclo si esegue stmt1, e alla fine del blocco prima di rivalutare
cond si esegue stmt2.
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
If - Esempio
Creare una funzione che restituisce il minimo tra due
argomenti
function min(a, b){
if(a<b)
return a;
else
return b;
}
Informatica I
oppure
function min(a, b){
if(a<b)
return a;
return b;
}
3 – Algoritmi e Linguaggi
A.A. 2011/2012
While - Esempio
Creare una funzione MCD che restituisce il
massimo comun divisore (Euclide) tra due
argomenti, e chiamarla con i valori 132 e 36.
function MCD(a, b){
while(b!=0){
var r = a%b;
a=b;
b=r;
}
return a;
}
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012
For - Esempio
Creare una funzione che prende in input 3 interi e che stampa
(funzione print) tutti gli interi tra a e b che sono multipli di c
function multipli(a,b,c){
for(var i=a; i<=b; i++)
if(i%c==0)
print(i);
}
Informatica I
3 – Algoritmi e Linguaggi
A.A. 2011/2012