Gli algoritmi: definizione, esempi e linguaggi di formalizzazione

UNIVAC
Il primo calcolatore concepito ed impostato come prodotto commerciale, fu realizzato da Eckert e Mauchly
(gli stessi costruttori dell’ENIAC) per l’Ufficio Centrale di Statistica degli Stati Uniti.
Sommario
L’algebra di Boole
Fu teorizzata dal matematico inglese George Boole (18101864) nel lavoro “Analisi Matematica della
Logica”, pubblicato nel 1847. Include un insieme di operazioni su variabili logiche (o variabili booleane),
che possono assumere i due soli valori true e false, indicati da 1 e 0. Le tecniche sviluppate nell’algebra
booleana possono essere applicate all’analisi ed alla progettazione dei circuiti elettronici, poiché essi sono
realizzati con dispositivi che possono assumere solo due stati.
Gli algoritmi
Su insiemi di costanti e variabili logiche possono essere definite funzioni che hanno esse stesse la
caratteristica di assumere due soli valori. La definizione di una funzione booleana può essere effettuata per
mezzo di una tabella di verità, che indica il valore della funzione in corrispondenza di ogni possibile
configurazione dei valori degli argomenti. Le funzioni booleane possono essere scritte e manipolate anche
con metodi algebrici, dato un insieme di funzioni (o operazioni) elementari tramite le quali poter esprimere
ogni altra funzione.
Analisi e programmazione
Algoritmi e loro proprietà
Esempi di algoritmi
Costanti e variabili, istruzioni, proposizioni e predicati
I linguaggi per la formalizzazione di algoritmi
I diagrammi a blocchi
Gli algoritmi iterativi
I vettori
La pseudocodifica
Introduzione ai linguaggi di programmazione di alto livello
1
Gli algoritmi
2
Analisi e programmazione  1
Tramite un elaboratore si possono risolvere problemi di varia
natura: emissione di certificati anagrafici, gestione dei c/c di
un istituto di credito, prenotazioni ferroviarie, etc.
Il problema deve essere formulato in modo opportuno,
perché sia possibile utilizzare un elaboratore per la sua
soluzione
Per analisi e programmazione si intende l’insieme delle
attività preliminari atte a risolvere problemi utilizzando un
elaboratore, dalla formulazione del problema fino alla
predisposizione dell’elaboratore
Scopo dell’analisi: definire un algoritmo
Scopo della programmazione: tradurre l’algoritmo in un
programma
3
Analisi e programmazione  2
Algoritmo  elenco finito di istruzioni che specificano le
operazioni eseguendo le quali un operatore umano risolve
una classe di problemi
Un particolare problema della classe viene risolto utilizzando
l’apposito algoritmo sui dati che lo caratterizzano
Un algoritmo non
dall’elaboratore
può
essere
eseguito
direttamente
Programma  “ricetta” che traduce l’algoritmo ed è
direttamente comprensibile, pertanto eseguibile, da parte di
un elaboratore
Linguaggio di programmazione  linguaggio rigoroso che
permette la formalizzazione di un algoritmo in un
programma
4
Analisi e programmazione  3
Esempio
Problema: Effettuare un accredito
su un c/c bancario
Soluzione: Utilizzare un programma
che serva per predisporre il
calcolatore all’accredito di una
qualunque cifra su un qualunque
c/c; cifra da accreditare e numero
di c/c sono i dati caratteristici del
problema
Algoritmo + dati
Uomo
+
Calcolatrice
Risultati
Programma + dati
Elaboratore
Risultati
Analogie tra le azioni che devono essere
eseguite da un operatore umano e, in
modo automatico, tramite un elaboratore
5
Le fasi del procedimento di analisi
e programmazione
Problema
ANALISI
Relazioni tra problema, analisi, algoritmo,
programmazione, programma, dati ed
elaborazione
Algoritmo
PROGRAMMAZIONE
Programma
ELABORAZIONE
Dati
Risultati
6
Algoritmo: definizione
Algoritmo deriva dal nome del matematico arabo Al Khuwarizmi, vissuto nel
IX secolo d.C.; esempi di algoritmo sono presenti su tavolette babilonesi
risalenti al 18001600 a.C.
Un algoritmo è una successione di istruzioni o passi che definiscono le
operazioni da eseguire sui dati per ottenere i risultati; un algoritmo fornisce
la soluzione ad una classe di problemi
Lo schema di esecuzione di un algoritmo specifica che i passi devono essere
eseguiti in sequenza, salvo diversa indicazione esplicita
Ogni algoritmo è concepito per interagire con l’ambiente esterno per
acquisire dati e comunicare messaggi o risultati; i dati su cui opera ogni
singola istruzione sono forniti dall’esterno o sono frutto di istruzioni eseguite
in precedenza
Dati
Ambiente esterno
Risultati o messaggi
Algoritmo
7
Esempio 1  Il gioco dell’undici
Problema: Undici fiammiferi sono disposti su un tavolo
Il primo giocatore (A) può raccogliere da 1 a 3 fiammiferi
Il secondo giocatore (B) ne raccoglie a sua volta 1, 2 o 3
I giocatori alternano le loro mosse finché sul tavolo non ci sono
più fiammiferi
Il giocatore che è costretto a raccogliere l’ultimo fiammifero è il
perdente
Algoritmo: strategia vincente per il giocatore A che gioca per
primo
prima mossa: A raccoglie 2 fiammiferi
mosse successive: se B raccoglie k fiammiferi (k  3), allora A
raccoglie 4k fiammiferi
8
Esempio 2  Ordinamento di un mazzo di carte
Problema: Sia dato un mazzo da 40 carte da ordinare in modo
che le cuori precedano le quadri, che a loro volta precedono
fiori e picche; le carte di uno stesso seme sono ordinate
dall’asso al re
Algoritmo:
Si suddivida il mazzo in 4 mazzetti, ciascuno costituito da tutte
le carte dello stesso seme
Si ordinino le carte di ciascun mazzetto dall’asso al re
Si prendano nell’ordine i mazzetti delle cuori, quadri, fiori e
picche
9
Esempio 3  Radici di equazioni di 2° grado
Problema: Calcolo delle radici reali dell’equazione di secondo
grado ax2+bx+c=0
Algoritmo:
1)
2)
3)
4)
5)
6)
7)
Acquisire i coefficienti a,b,c
Calcolare  = b24ac
Se <0 non esistono radici reali, eseguire l’istruzione 7)
Se = 0, x1= x2 = b/2a, poi eseguire l'istruzione 6)
Porre x1 = (b +)/2a, x2 = (b )/2a
Comunicare i valori x1, x2
Fine
10
Proprietà degli algoritmi  1
Affinché una “ricetta”, un elenco di istruzioni, possa essere
considerato un algoritmo, devono essere soddisfatti i
seguenti requisiti:
Finitezza: ogni algoritmo deve essere finito, cioè composto da
un numero finito di istruzioni, ciascuna delle quali deve essere
eseguita in tempo finito ed un numero finito di volte
Generalità: ogni algoritmo deve fornire la soluzione per una
classe di problemi; deve pertanto essere applicabile a qualsiasi
insieme di dati appartenenti all’insieme di definizione o dominio
dell’algoritmo e deve produrre risultati che appartengono
all’insieme di arrivo o codominio
Non ambiguità: devono essere definiti in modo chiaro i passi
successivi da eseguire; devono essere evitati paradossi,
contraddizioni ed ambiguità; il significato di ogni istruzione deve
essere univoco per chiunque esegua l’algoritmo
11
Proprietà degli algoritmi  2
Inoltre, sono proprietà essenziali (se non caratterizzanti)
degli algoritmi...
...la correttezza
...e l’efficienza
Un algoritmo è corretto se perviene alla soluzione del
compito cui è preposto, senza difettare di alcun passo
fondamentale
Un algoritmo è efficiente se perviene alla soluzione del
problema nel modo più veloce possibile e/o usando la minor
quantità di risorse fisiche, fatta salva la correttezza
12
Il gioco dell’undici (continua…)
La strategia vincente per il gioco dell’undici è un algoritmo
in quanto...
…è finito, perché termina sempre dopo 6 mosse
…è generale, perché permette al giocatore A di vincere,
qualunque sia la strategia utilizzata da B
…è non ambiguo, perché tutte le situazioni possibili sono prese
in considerazione e per ognuna sono ben specificate le azioni
da compiere
13
Ancora sugli algoritmi...
Un algoritmo deve poter essere eseguito da chiunque, senza
che l’esecutore sia stato necessariamente coinvolto nella
formulazione del problema o nella descrizione del metodo
risolutivo
Gli algoritmi devono essere formalizzati per mezzo di appositi
linguaggi, dotati di strutture linguistiche che garantiscano
precisione e sintesi
I linguaggi naturali non soddisfano questi requisiti, infatti...
…sono ambigui: la stessa parola può assumere significati diversi in
contesti differenti (pesca è un frutto o un’attività sportiva)
…sono ridondanti: lo stesso concetto può essere espresso in molti
modi diversi, ad es. “somma 2 a 3”, “calcola 2+3”, “esegui l’addizione
tra 2 e 3”
14
Costanti e variabili  1
I dati su cui opera un algoritmo sono costanti e variabili
Un dato è costante quando il suo valore non può essere
aggiornato durante l’esecuzione dell’algoritmo, né cambia per
esecuzioni diverse
Una variabile è una coppia <nome, valore>: può essere
immaginata come una scatola sulla quale è scritto un nome e
che può contenere un valore
Valore
Nome
Rappresentazione di una variabile
15
Costanti e variabili  2
Il valore di una variabile deve appartenere all’insieme di
definizione, su cui si opera mediante regole opportune,
specifiche dell’insieme
Data una variabile <x,v>, x è il nome della variabile e v è il
suo valore attuale; le variabili sono indeterminate in fase di
definizione dell’algoritmo, ma corrispondono a valori ben
precisi durante ogni esecuzione
Esempio: Nell’algoritmo di risoluzione delle equazioni di 2°
grado, a, b, c non corrispondono a nessun valore finché non
si esegue l’algoritmo per trovare le soluzioni di una specifica
equazione, ad esempio x29x4=0: in fase di esecuzione,
a=1, b= 9, c=4; nell’istruzione =b24ac,  è la variabile
che contiene il valore del discriminante
16
Assegnazione  1
L’istruzione di assegnazione definisce il valore attuale di una
variabile, che resta inalterato fino all’assegnazione
successiva
L’assegnazione si rappresenta con il simbolo “”:
nome di variabile  espressione
che si legge “assegna alla variabile nome di variabile il
valore di espressione” ; l’espressione a destra di  è
costituita da variabili, costanti e operatori
L’assegnazione viene così eseguita:
si valuta l’espressione a destra di , sostituendo ai nomi di
variabile i loro valori attuali; il risultato deve appartenere
all’insieme di definizione della variabile a sinistra di 
il valore calcolato diventa il nuovo valore della variabile il cui
nome appare a sinistra di 
17
Assegnazione  2
I nomi delle variabili possono essere scelti in modo arbitrario,
ma è opportuno selezionare nomi significativi del contenuto
della variabile
Viceversa, è necessario rispettare la regola dell’ordinamento:
Quando una variabile appare, in un’assegnazione, a destra di
, deve essere già istanziata
cioè le deve essere già stato assegnato un valore
18
Assegnazione  3
Esempi
6
4
b
c
6
4
a  b+c
10
a
x  x+3
b
c
Prima dell’assegnazione
Dopo l’assegnazione
14
x
Prima dell’assegnazione
17
x
Dopo l’assegnazione
19
Le istruzioni  1
Istruzioni operative, che producono risultati
Istruzioni di controllo, che controllano il verificarsi di condizioni
specificate e, in base al risultato del controllo, determinano il flusso
di istruzioni da eseguire
Istruzioni di salto, che alterano il normale flusso di esecuzione delle
istruzioni di un algoritmo, specificando quale sia la successiva
istruzione da eseguire
nelle istruzioni di salto condizionato, l’effettiva esecuzione del salto è
condizionata al verificarsi di una ipotesi specificata
l’istruzione di salto incondizionato produce sempre un salto
Istruzioni di ingresso/uscita, che specificano come debba essere
effettuata una trasmissione di dati o messaggi fra l’algoritmo e
l’ambiente esterno
Istruzioni di inizio/fine esecuzione, che indicano l’inizio/la fine
dell’algoritmo
20
Le istruzioni  2
Esempio: Calcolo delle radici di equazioni di 2° grado
“acquisire i coefficienti a,b,c” è un’istruzione di lettura (ingresso)
“calcolare =b24ac” è un’istruzione operativa
“se =0, x1=x2=b/2a” è un’istruzione di controllo, infatti l’assegnazione
x1=x2=b/2a viene eseguita solo se =0
“comunicare i valori x1, x2” è un’istruzione di scrittura (uscita)
“eseguire l'istruzione 6)” è un’istruzione di salto incondizionato
“se <0 eseguire l’istruzione 7)” è un’istruzione di salto condizionato,
perché 7) è la prossima istruzione da eseguire solo se <0
21
Proposizioni e predicati  1
Una proposizione è un costrutto linguistico del quale si può
asserire o negare la veridicità
Esempi
“Roma è la capitale della Gran Bretagna”
“3 è un numero intero”
falsa
vera
Il valore di verità di una proposizione è il suo essere vera o falsa
Una proposizione è un predicato se il suo valore di verità dipende
dall’istanziazione di alcune variabili
Esempi
“la variabile età è minore di 30”
“la variabile base è maggiore della variabile altezza”
22
Proposizioni e predicati  2
La valutazione di un predicato è l’operazione che permette di
determinare se il predicato è vero o falso, sostituendo alle variabili
i loro valori attuali
I valori vero e falso sono detti valori logici o booleani
Proposizioni e predicati possono essere espressi concisamente per
mezzo degli operatori relazionali:
= (uguale)
 (diverso)
> (maggiore)
< (minore)
 (maggiore o uguale)
 (minore o uguale)
I predicati che contengono un solo operatore relazionale sono detti
semplici
23
Proposizioni e predicati  3
Dato un predicato p, il predicato not p, detto opposto o negazione
logica di p, ha i valori di verità opposti rispetto a p
Dati due predicati p e q, la congiunzione logica di p e q, p and q, è
un predicato vero solo quando p e q sono entrambi veri, e falso in
tutti gli altri casi
Dati due predicati p e q, la disgiunzione logica di p e q, p or q, è un
predicato falso solo quando p e q sono entrambi falsi, e vero in
tutti gli altri casi
I predicati nei quali compare almeno uno fra gli operatori logici not,
and, or sono detti composti
La tavola di verità di un predicato composto specifica il valore del
predicato per ognuna delle possibili combinazioni dei suoi
argomenti
24
Proposizioni e predicati  4
Esempio
Le tavole di verità per i predicati p and q e p or q sono le
seguenti:
p
q
p and q
p or q
falso
falso
falso
falso
falso
vero
falso
vero
vero
falso
falso
vero
vero
vero
vero
vero
25
Proposizioni e predicati  5
Esempio
not (base > altezza)
è vero solo quando il valore di base è minore o uguale del valore di
altezza
età > 30 and età < 50
è vero solo quando il valore di età è compreso tra 30 e 50
base > altezza or base > 100
è vero quando il valore di base è maggiore del valore di altezza, o
quando il valore di base è maggiore di 100, o quando entrambe le
condizioni sono verificate
26
I linguaggi per la formalizzazione
di algoritmi
27
I diagrammi a blocchi  1
Il linguaggio dei diagrammi a blocchi è un possibile
formalismo per la descrizione di algoritmi; il diagramma a
blocchi, o flowchart, è una rappresentazione grafica
dell’algoritmo
Un diagramma a blocchi definisce il flusso di operazioni da
eseguire per realizzare la trasformazione dai dati iniziali ai
risultati, descritta nell’algoritmo
Un particolare simbolo grafico, un blocco elementare, è
associato ad ogni tipo di istruzione; ovvero, ogni istruzione è
rappresentata all’interno di un blocco la cui forma grafica è
determinata dal tipo di istruzione
I blocchi sono collegati tra loro da linee di flusso, munite di
frecce, che indicano il susseguirsi di azioni elementari
28
I diagrammi a blocchi  2
begin
leggi/scrivi
A
X
Blocco iniziale
Blocco azione
Blocco di lettura/scrittura
vero
end
scrivi X
Blocco finale
C
falso
Blocco di controllo
Blocco di scrittura
Blocchi elementari
29
I diagrammi a blocchi  3
Un diagramma a blocchi è un insieme di blocchi elementari
composto da:
un blocco iniziale
un blocco finale
un numero finito n (n  1) di blocchi di azione e/o di blocchi di
lettura/scrittura
un numero finito m (m  0) di blocchi di controllo
30
I diagrammi a blocchi  4
L’insieme dei blocchi elementari che costituiscono
algoritmo deve soddisfare le seguenti condizioni:
un
ciascun blocco di azione o di lettura/scrittura ha una sola freccia
entrante ed una sola freccia uscente
ciascun blocco di controllo ha una sola freccia entrante e due
frecce uscenti
ciascuna freccia entra in un blocco oppure si inserisce in un’altra
freccia
ciascun blocco è raggiungibile dal blocco iniziale
il blocco finale è raggiungibile da qualsiasi altro blocco
Un blocco B è raggiungibile a partire da un blocco A, se esiste
una sequenza di blocchi X1,X2,…,Xn, tali che A=X1, B=Xn e
 Xi, i=1,…,n1, Xi è connesso con una freccia a Xi+1
31
I diagrammi a blocchi  5
begin
Diagramma a blocchi dell’algoritmo per il
calcolo delle radici dell’equazione di 2°
grado ax2 + bx + c = 0
Leggi a,b,c
delta  b2  4ac
Vero
delta<0
Vero
Falso
delta=0
Falso
x1 b/2a
x1 (b+sqrt(delta))/2a
x2 b/2a
x2 (bsqrt(delta))/2a
scrivi
x1 e x2
scrivi
“non ci sono radici reali”
end
32
Schemi di composizione  1
Fra tutti i possibili schemi di flusso ne esistono alcuni che
sono detti schemi fondamentali di composizione
Schema di sequenza: è uno schema elementare o uno schema
di sequenza
begin
A
S1, S2,…, Sn schemi di flusso
end
33
Schemi di composizione  2
Schema di selezione: un blocco di controllo subordina
l’esecuzione di due possibili schemi di flusso al verificarsi di
una condizione
Nel primo caso, lo schema S viene eseguito solo se la condizione
C è vera; se C è falsa, non viene eseguita alcuna azione
Nel secondo caso, viene eseguito solo uno dei due schemi Sv o
Sf, in dipendenza del valore di verità della condizione
34
Schemi di composizione  3
Schema di iterazione: si itera l’esecuzione di un dato schema
di flusso
Nel primo caso, S può non venire mai eseguito, se la condizione
C è subito falsa; nel secondo caso, S viene eseguito almeno una
volta
Quando lo schema S viene eseguito finché la condizione C si
mantiene vera si parla di iterazione per vero; si ha un’iterazione
per falso quando S viene eseguito finché C è falsa
35
Schemi di composizione  4
Gli schemi di flusso sono…
…aperti quando consentono una sola esecuzione di una
sequenza di blocchi elementari
…chiusi quando permettono più di un’iterazione della sequenza
di blocchi
Gli schemi di sequenza e di selezione sono aperti, lo schema
di iterazione è chiuso
36
Gli algoritmi iterativi  1
Accade spesso che, per risolvere un
problema, un certo insieme di
operazioni debba essere eseguito un
dato numero di volte
Esempio: Calcolare la somma di tre
interi consecutivi
Note:
La variabile somma è un contenitore
di somme parziali, finché non si
ottiene la somma totale richiesta
La soluzione del problema viene
raggiunta eseguendo azioni simili
per un numero opportuno di volte
37
Gli algoritmi iterativi  2
Il ciclo o loop è uno schema di flusso per descrivere, in modo conciso,
situazioni in cui uno gruppo di operazioni deve essere ripetuto più volte
La condizione di fine ciclo viene
verificata ogni volta che si
esegue il ciclo; se la condizione
assume valore vero (falso), le
istruzioni
vengono
reiterate,
altrimenti si esce dal ciclo
La condizione di fine ciclo può
essere verificata prima o dopo
l’esecuzione dell’iterazione
Le istruzioni di inizializzazione,
assegnano valori iniziali ad
alcune variabili (almeno a quella
che controlla la condizione di fine
Ciclo con controllo in testa
Ciclo con controllo in coda
ciclo)
38
Gli algoritmi iterativi  3
Problema: Calcolare la somma di tre
interi consecutivi
Note:
La fase di inizializzazione riguarda la
somma e l’indice del ciclo
Il controllo di fine ciclo viene
effettuato in coda
39
Gli algoritmi iterativi  4
Un ciclo è definito quando è noto a priori il numero di iterazioni:
un ciclo definito è detto anche enumerativo
Un contatore del ciclo tiene memoria di quante iterazioni sono
state effettuate; può essere utilizzato in due modi:
incremento del contatore: il contatore viene inizializzato ad un
valore minimo (ad es. 0) e incrementato ad ogni esecuzione
del ciclo; si esce dal ciclo quando il valore del contatore
eguaglia il numero di iterazioni richieste
decremento del contatore: il contatore viene inizializzato al
numero di iterazioni richiesto e decrementato di uno ad ogni
iterazione; si esce quando il valore del contatore raggiunge 0
40
Gli algoritmi iterativi  5
Un ciclo è indefinito quando non è possibile conoscere a
priori quante volte verrà eseguito
La condizione di fine ciclo controlla il valore di una o più
variabili modificate da istruzioni che fanno parte
dell’iterazione
Comunque, un ciclo deve essere eseguito un numero finito
di volte, cioè si deve verificare la terminazione
dell’esecuzione del ciclo
41
Gli algoritmi iterativi  6
Problema: Calcolo della media di
un insieme di numeri; non è noto
a priori quanti sono i numeri di
cui deve essere calcolata la media
I numeri vengono letti uno
alla volta fino a che non si
incontra un x = 0, che segnala
la fine dell’insieme
42
I vettori  1
Le variabili, definite come coppie <nome, valore>, sono
scalari
Una coppia <nome,
vettore o array e
contenitore diviso in
contenere un valore,
vettore
insieme di valori > è una variabile
può essere immaginata come un
scomparti; ciascun scomparto può
detto elemento o componente del
Ciascuna componente è individuata dal nome del vettore,
seguito dal relativo numero progressivo, racchiuso fra
parentesi tonde: l’indice del vettore
La dimensione di un vettore è il numero dei suoi elementi
I vettori sono particolarmente utili per collezionare dati fra
loro correlati, sui quali devono essere effettuate le stesse
operazioni
43
I vettori  2
v(1)
v(2)
v(3)
v(4)
Vettore v, costituito dai 4 elementi v(1), v(2), v(3), v(4)
L’utilizzo di variabili vettoriali, in un algoritmo, presuppone la
dichiarazione esplicita della loro dimensione
La dimensione del vettore costituisce un limite invalicabile
per la selezione delle componenti del vettore
Esempio: v(100) asserisce che il vettore v è costituito da 100
elementi; possono essere selezionati v(12), v(57), v(89), ma
non v(121) o v(763), che non esistono
44
I vettori  3
Esempio: Calcolare il vettore somma di due vettori di uguale
dimensione n
5
7
a(1)
a(2)
6
9
0
a(3)
1
3
a(4)
5
b(1)
b(2)
b(3)
b(4)
11
16
1
8
c(1)
c(2)
c(3)
c(4)
45
I vettori  4
Esempio: algoritmo per calcolare
il vettore somma di due vettori
Note:
L'utilità dei vettori consiste nell’impiego della tecnica iterativa
in modo da effettuare la stessa
operazione su tutti gli elementi
del vettore
Usando la variabile contatore di
un ciclo come indice degli
elementi di un vettore è possibile
considerarli tutti, uno alla volta,
ed
eseguire
su
di
essi
l’operazione desiderata
46
I vettori  5
Esempio: Algoritmo
per il calcolo del
massimo elemento di
un vettore
vero
47
La pseudocodifica  1
La pseudocodifica è un linguaggio per la descrizione di
algoritmi PASCALlike
La descrizione di un algoritmo mediante pseudocodifica si
compone di due parti...
la dichiarazione delle variabili usate nell’algoritmo
la descrizione delle azioni dell’algoritmo
48
La pseudocodifica  2
Tipo delle variabili
Il tipo di una variabile indica l’insieme dei valori che possono
essere assegnati a quella variabile
Su costanti e variabili di un tipo è possibile effettuare le
operazioni che sono proprie di quel tipo e tutte le operazioni
di confronto (utilizzando gli operatori relazionali)
Sono permessi i seguenti 4 tipi: integer, real, boolean,
stringq
49
La pseudocodifica  3
integer: sono le variabili cui possono essere assegnati numeri interi;
le costanti di tipo integer sono numeri interi, ad es. 1, 3, 150
real: sono le variabili cui possono essere assegnati numeri razionali;
le costanti real possono essere rappresentate in notazione decimale,
con un “.” che separa la parte intera dalla parte decimale (ad es.,
5.17, 12.367, 123., 0.005) o in notazione scientifica
(23.476E+2=2347.6, 456.985E4=0.0456985)
boolean: sono le variabili cui possono essere assegnati i valori
logici; le costanti logiche sono true e false
stringq: sono le variabili cui possono essere assegnate parole (o
stringhe) costituite da q caratteri; le costanti stringq sono
costituite da parole di q caratteri racchiusi tra apici (che non fanno
parte della costante); ad es., ‘FABIO’ è una costante string5,‘+’ è
una costante string1 e ‘124’ string3
50
La pseudocodifica  4
Dichiarazione delle variabili
La dichiarazione delle variabili è un elenco, preceduto dalla
parola var, delle variabili sulle quali l’algoritmo opera
Le variabili sono suddivise per tipo: quelle dello stesso tipo
sono separate l’una dall’altra da una “,”; l’elenco delle variabili
dello stesso tipo è seguito dai “:” e dall’indicazione del tipo; gli
elenchi di variabili di tipo diverso sono separati dal “;”, l’ultimo
elenco è seguito da un “.”
Esempio:
var i, j, a(20): integer;
p, q: real;
nome: string20;
sw: boolean.
51
La pseudocodifica  5
Descrizione delle azioni
Gli schemi di flusso fondamentali sono descritti utilizzando
convenzioni linguistiche: ad ogni schema di composizione
corrisponde una convenzione linguistica
La descrizione di un algoritmo deve soddisfare le seguenti
regole:
a)
b)
c)
d)
e)
La prima azione dell’algoritmo è preceduta dalla parola begin;
L’ultima azione dell’algoritmo è seguita dalla parola end;
L’azione di lettura è rappresentata dalla parola read;
L’azione di scrittura è rappresentata dalla parola write;
Lo schema di sequenza di n flussi S1, S2,…, Sn è rappresentato da
S1;
S2;
…
S n;
52
La pseudocodifica  6
S, Sf, Sv,
sono schemi
f)
Gli schemi di selezione sono rappresentati come:
g)
Gli schemi di iterazione sono rappresentati come:
53
La pseudocodifica  7
Esistono convezioni linguistiche alternative in relazione a
particolari schemi di flusso
Esempio: Ciclo enumerativo
Nel caso che il valore di
“incremento” sia 1, la parte
“step incremento” della frase
for...endfor può essere omessa
54
La pseudocodifica  8
Esempio: Algoritmo per il calcolo del vettore somma di due
vettori di numeri razionali
var a(100), b(100), c(100): real;
i, n: integer.
begin
read n;
for i from 1 to n do
read a(i), b(i);
c(i)  a(i) + b(i);
write c(i)
endfor
end
55
La pseudocodifica  9
Esempio: Algoritmo per il calcolo del massimo elemento di un
vettore di numeri razionali
var max, v(100): real;
i, n: integer.
begin
read n;
for i from 1 to n do
read v(i)
endfor
max  v(1);
for i from 2 to n do
if max < v(i)
then max  v(i)
endif
endfor
write max
end
56
La pseudocodifica  10
Esempio: Algoritmo per il calcolo delle radici di equazioni di
2° grado
var x1, x2, a, b, c, delta: real.
begin
read a, b, c;
delta  b24ac;
if delta < 0
then write “non esistono radici reali”
else if delta = 0
then x1  b/2a;
x2  x1
else x1  (b + delta)/2a;
x2  (b  delta)/2a
endif
write x1, x2
endif
end
57
Introduzione ai linguaggi di
programmazione di alto livello
58
Cenni storici  1
Benché siano macchine in grado di compiere operazioni complesse,
i calcolatori devono essere “guidati” per mezzo di istruzioni
appartenenti ad un linguaggio specifico e limitato, a loro
comprensibile
A livello hardware, i calcolatori riconoscono solo comandi semplici,
del tipo “copia un numero”, “addiziona due numeri”, “confronta due
numeri” : questi comandi definiscono il set di istruzioni della
macchina e i programmi che li utilizzano direttamente sono i
programmi in linguaggio macchina
In linguaggio macchina ogni operazione richiede l’attivazione di
numerose istruzioni base (il linguaggio riflette l’organizzazione della
macchina più che la natura del problema da risolvere); inoltre,
qualunque entità  istruzioni, variabili, dati  è rappresentata da
numeri binari: i programmi sono difficili da scrivere, leggere e
mantenere
59
Cenni storici  2
Negli anni `50, tutti i programmi erano scritti in linguaggio
macchina o in assembly (o assembler)
In assembly ogni istruzione è identificata da una sigla piuttosto
che da un numero e le variabili sono rappresentate da nomi
piuttosto che da numeri
Esempio: carica il numero 8 nel primo registro libero della CPU
0011 1000 
LOAD 8
Codice
istruzione
Linguaggio macchina
Assembly
I programmi scritti in assembly necessitano di un apposito
programma assemblatore per tradurre le istruzioni tipiche del
linguaggio in istruzioni macchina
60
Cenni storici  3
L’assembly definisce una notazione simbolica che è in stretta
relazione con i codici in linguaggio macchina
registro
LOAD R1, MEM1
CMP R1, R2
BEQ RISZERO
STORE R1, MEM1
RISZERO:
LOAD R2, MEM2
Assemblatore
10001000110110101101010101010100
01001001001000000000000000000101
11000000000000000000000000001000
10011000110110101101010101010100
10001001010110101101001000001100
OPCODE
(LOAD)
61
Cenni storici  4
Oggi si utilizza l’assembly solo se esistono vincoli stringenti sui
tempi di esecuzione; viceversa si usano linguaggi più vicini al
linguaggio naturale, i linguaggi di alto livello
I linguaggi di alto livello sono elementi intermedi di una varietà di
linguaggi ai cui estremi si trovano il linguaggio macchina, da un
lato, ed i linguaggi naturali, come l’italiano e l’inglese, dall’altro
I
linguaggi
di
programmazione,
progettati per manipolare informazioni,
differiscono dai linguaggi naturali: sono
infatti meno espressivi ma più precisi
(non ambigui)
62
Scopi e caratteristiche  1
I linguaggi di programmazione di alto livello consentono al
programmatore di trattare oggetti complessi senza doversi
preoccupare dei dettagli della particolare macchina sulla quale il
programma viene eseguito
Richiedono un compilatore o un interprete che sia in grado di
tradurre le istruzioni del linguaggio di alto livello in istruzioni
macchina di basso livello eseguibili dal calcolatore
Un compilatore è un programma “simile” ad un assemblatore, ma
più complesso, infatti…
esiste una corrispondenza biunivoca fra istruzioni in assembler ed
istruzioni macchina
ogni singola istruzione di un linguaggio di alto livello corrisponde a
molte istruzioni in linguaggio macchina: quanto più il linguaggio di
programmazione si discosta dal linguaggio macchina, tanto più il
lavoro di traduzione del compilatore è difficile
63
Scopi e caratteristiche  2
Esempio: In PASCAL, l’assegnazione
e := (a+b)(c+d);
calcola l’espressione e, ottenuta eseguendo una serie di operazioni
aritmetiche sulle variabili a, b, c, e d, salvando opportunamente il
risultato nella posizione di memoria etichettata da e; in linguaggio
assembly la stessa istruzione potrebbe essere riscritta nel modo
seguente:
LOAD a, %r0
LOAD b, %r1
ADD %r0, %r1
LOAD c, %r2
LOAD d, %r3
ADD %r2, %r3
MULT %r1, %r3
STORE %r3, e
64
Scopi e caratteristiche  3
I linguaggi che non dipendono dall’architettura
macchina offrono due vantaggi fondamentali:
i programmatori non devono
architetturali di ogni calcolatore
cimentarsi
con
i
della
dettagli
i programmi risultano più semplici da leggere e da modificare
 portabilità, leggibilità, mantenibilità
65
L’essenza della programmazione di alto livello, ovvero dell’uso di linguaggi di elevata potenza espressiva,
risiede nella capacità di astrazione, cioè nella possibilità di prescindere dai dettagli considerati inessenziali
ai fini della soluzione di un problema, favorendo con ciò la concentrazione sugli elementi fondamentali. Un
linguaggio di programmazione deve fornire all'utente buoni meccanismi per definire autonomamente tutte
le astrazioni di cui ha bisogno: il programmatore, deve disporre di strumenti sufficienti per spiegare al
calcolatore tutte le operazioni che intende effettuare.
Scopi e caratteristiche  4
La funzione svolta da un programma ben strutturato in un linguaggio di programmazione di alto livello può
essere facilmente compresa da un lettore: i simboli e le istruzioni utilizzate si avvicinano più ai simboli ed
alle istruzioni di uso comune che non a quelle interne del calcolatore.
Portabilità: i programmi scritti per un calcolatore possono essere
utilizzati su qualsiasi altro calcolatore, previa ricompilazione
Leggibilità: la relativa similitudine con i linguaggi naturali rende i
programmi più semplici, non solo da scrivere, ma anche da leggere
Mantenibilità: con questo termine si intende far riferimento a
modifiche di tipo correttivo, perfettivo, evolutivo e adattivo; i
programmi scritti in linguaggi di alto livello sono più semplici da
modificare e da correggere
La possibilità di codificare algoritmi in maniera astratta si traduce in
una migliore comprensibilità del codice e quindi in una più facile
analisi di correttezza
66
Scopi e caratteristiche  5
Eventuale svantaggio dell’uso dei linguaggi di alto livello è la
riduzione di efficienza:
È possibile utilizzare istruzioni macchina diverse per scrivere
programmi funzionalmente equivalenti: il programmatore ha un
controllo limitato sulle modalità con cui il compilatore traduce il
codice
Tuttavia… i compilatori attuali ricorrono a trucchi di cui molti
programmatori ignorano l’esistenza
La ragione fondamentale per decretare la superiorità dei
linguaggi di alto livello consiste nel fatto che la maggior parte
dei costi di produzione del software è localizzata nella fase di
manutenzione, per la quale la leggibilità e la portabilità sono
cruciali
67
Un esempio di programma PASCAL
begin
leggi n, ncomp
Problema: Si legga una lista di
valori, la cui lunghezza non è nota a
priori (è un dato in ingresso),
stampando un opportuno messaggio
se un certo valore, anch’esso letto a
runtime,
appartiene
o
non
appartiene alla lista
trovato  FALSE
i1
leggi ncorr
Vero
ncorr = ncomp
Falso
i  i+1
Vero
in
Falso
“trovato un
numero uguale”
trovato  TRUE
Vero
trovato = TRUE
end
Falso
“non trovato
un numero uguale”
68
PROGRAM Search(input,output);
(* Ricerca di un valore desiderato in una lista *)
VAR
n: INTEGER; (* lunghezza della lista *)
ncomp: INTEGER; (* termine di paragone *)
ncorr: INTEGER; (* valore nella lista *)
trovato: BOOLEAN; (* TRUE se si è trovato *)
i: INTEGER; (* contatore dei valori della lista *)
BEGIN
READ(n);
WRITELN(‘Ci sono’, n, ‘valori.’);
READ(ncomp);
WRITELN(‘Ricerca di’, ncomp, ‘.’);
trovato := FALSE; (* non ancora trovato alcun valore *)
FOR i = 1 TO n DO
BEGIN
READ(ncorr);
WRITELN(ncorr);
IF ncorr = ncomp
THEN trovato := TRUE; (* trovato un valore uguale *)
END (* fine ciclo for *)
IF trovato
THEN WRITELN (‘Trovata corrispondenza’)
ELSE WRITELN (‘Non trovata corrispondenza’);
END (* fine programma Search *)
69