Sei sulla pagina 1di 74

Capitolo

III
Algoritmi e Programmi

Tra1amento delle Informazioni


Informa6ca = studio sistema6co dei processi che
servono al tra1amento delle informazioni o pi in
generale della denizione della soluzione di
problemi assegna6.
analisi de1agliata di ci che serve al tra1amento
dellinformazione,
proge1o di una soluzione applicabile alla generazione
di informazioni prodo1e da altre informazioni,
verica della corre1ezza e della ecienza della
soluzione pensata,
manutenzione della soluzione nella fase di
funzionamento in esercizio

Informa6ca e studio di Algoritmi


algoritmo

introdo1o nella matema6ca per specicare la sequenza precisa


di operazioni il cui svolgimento necessario per la soluzione di
un problema assegnato.
Algoritmo & esecutore

Informa6ca studio sistema6co degli algoritmi.

Il calcolatore tra tuJ gli esecutori di algoritmi (compreso


luomo) quello che si mostra pi potente degli altri e con una
potenza tale da perme1ere di ges6re quan6t di informazioni
altrimen6 non tra1abili.

Lo studio dellInforma6ca considera quindi il computer


come uno scienziato u6lizza il proprio microscopio: uno
strumento per provare le proprie teorie e, nel caso
specico, vericare i propri ragionamen6 o algoritmi.

La soluzione dei Problemi: osservazioni


La descrizione del problema non fornisce, in generale,
indicazioni sul metodo risolvente; anzi in alcuni casi
presenta imprecisioni e ambiguit che possono portare
a soluzioni errate.
per alcuni problemi non esiste una soluzione;
alcuni problemi, invece, hanno pi soluzioni possibili; e
quindi bisogna studiare quale tra tu1e le soluzioni
ammissibili risulta quella pi vantaggiosa sulla base di un
insieme di parametri pressa6 (costo della soluzione,
tempi di a1uazione, risorse necessarie alla sua
realizzazione, etc.)
per alcuni problemi non esistono soluzioni eseguibili in
tempi ragionevoli e quindi u6li.

Alcuni esempi

Preparare una torta alla fru-a

non si riesce a ricavare alcuna indicazione sulla rice1a da seguire che, tra laltro, non facile
individuare in un libro di cucina per la sua formulazione generica

Risolvere le equazioni di secondo grado

un noto e semplice problema di analisi matema6ca per il quale si conosce chiaramente il


procedimento risolvente

Individuare il massimo tra tre numeri

un esempio di problema impreciso ed ambiguo in quanto non specica se va cercato il


valore massimo o la sua posizione allinterno della terna dei tre numeri assegna6

Calcolare le cifre decimali di

. un problema con una soluzione nota che per non arriva a terminazione in quanto le cifre
da calcolare sono innite

Inviare un invito ad un insieme di amici

.. si pu osservare che esistono sia soluzioni tradizionali basate sulla posta ordinaria, che
soluzioni pi moderne quali i messaggi SMS dei telefoni cellulari o i messaggi di posta
ele1ronica
Bisogna quindi scegliere la soluzione pi conveniente: ad esempio quella che presenta un costo pi
basso

Individuare le tracce del passaggio di extraterrestri

. chiaro esempio di problema che non amme1e soluzione: o, come si dice, non risolvibile

Schema di soluzione

Algoritmo ed Esecutore
algoritmo,

un testo che prescrive un insieme di operazioni od azioni eseguendo le quali


possibile risolvere il problema assegnato.
Se si indica con istruzione la prescrizione di una singola operazione, allora
l'algoritmo un insieme di istruzioni da svolgere secondo un ordine pressato;

esecutore

. l'uomo o la macchina in grado di risolvere il problema eseguendo l'algoritmo.


Se un algoritmo un insieme di istruzioni da eseguire secondo un ordine
pressato, allora lesecutore non solo deve comprendere le singole istruzioni ma
deve essere anche capace di eseguirle.
una dopo laltra secondo un ordine rigidamente sequenziale che impone linizio
dellesecuzione di una nuova istruzione solo al termine di quella precedente, oppure pi
istruzioni contemporaneamente svolgendole in parallelo;

informazioni di ingresso (anche de1e input)

le informazioni che devono essere fornite anch avvengano le trasformazioni


desiderate;

informazioni di uscita (anche de1e output)

... i risulta6 prodoJ dall'esecutore del dato algoritmo.

Conce1o di Automa
Elaborazione conce1o matema6co di funzione
Y=F(X)
in cui X sono i da6 iniziali da elaborare, Y i da6 nali o risulta6 e F la regola di
trasformazione.

Automa a sta6 ni6 astrazione per il conce1o di macchina che esegue


algoritmi
conce-o di stato
par6colare condizione di funzionamento in cui pu trovarsi la macchina.

Lautoma uno dei modelli fondamentali dellinformaEca


E applicabile a qualsiasi sistema che evolve nel tempo per ee1o di sollecitazioni
esterne.
Ogni sistema se sogge1o a sollecitazioni in ingresso risponde in funzione della sua
situazione a1uale eventualmente eme1endo dei segnali di uscita, lee1o della
sollecitazione in ingresso il mutamento dello stato del sistema stesso.
Il sistema ha sempre uno stato iniziale di partenza da cui inizia la sua evoluzione.
Pu terminare in uno stato nale dopo aver a1raversato una serie di sta6 intermedi.

Automa a Sta6 Fini6


Un automa M (a sta6 ni6) pu essere denito
da una quintupla di elemen6 (Q,I,U,t,w) dove:
Q un insieme nito di sta6 interni cara1erizzan6
levoluzione del sistema;
I un insieme nito di sollecitazioni in ingresso;
U un insieme nito di uscite;
t la funzione di transizione che trasforma il prodo1o
cartesiano QI in Q (t: QxI Q)
w la funzione di uscita che trasforma QI in U (w:
QxI U).

Rappresentazione a grafo
Grafo
un cerchio per rappresentare gli sta6 del sistema
archi orienta6 ad indicare le transizioni

Il Modello di Macchina di Turing


Il modello di Macchina di
Turing un par6colare automa
per il quale sono deni6
linsieme degli ingressi e delle
uscite come insiemi di simboli
denito un par6colare
meccanismo di le1ura e
scri1ura delle informazioni.

un modello fondamentale
nella teoria dellinforma6ca, in
quanto perme1e di
raggiungere risulta6 teorici
sulla calcolabilit e sulla
complessit degli algoritmi.

Macchina di Turing
E un automa con tes6na di scri1ura/le1ura su nastro bidirezionale
potenzialmente illimitato.

Ad ogni istante la macchina si trova in uno stato appartenente ad un insieme nito e


legge un simbolo sul nastro.
La funzione di transizione, in modo determinis6co ..
fa scrivere un simbolo
fa spostare la tes6na in una direzione o nell'altra
fa cambiare lo stato.

La macchina si compone di:

una memoria cos6tuita da un nastro di dimensione innita diviso in celle; ogni cella
con6ene un simbolo oppure vuota;
una tes6na di le1ura scri1ura posizionabile sulle celle del nastro;
un disposi6vo di controllo che, per ogni coppia (stato, simbolo le1o) determina il
cambiamento di stato ed esegue unazione elabora6va.

Denizione Formale
denita dalla quintupla:
(A, S, fm , fs, fd)

A linsieme nito dei simboli di ingresso e uscita;


S linsieme nito degli sta6 (di cui uno quello di terminazione);
fm la funzione di macchina denita come A S A;
fs la funzione di stato A S S;
fd la funzione di direzione A S D = {Sinistra, Destra, Nessuna}

La macchina capace di:

leggere un simbolo dal nastro;


scrivere sul nastro il simbolo specicato dalla funzione di macchina;
transitare in un nuovo stato interno specicato dalla funzione di stato;
spostarsi sul nastro di una posizione nella direzione indicata dalla
funzione di direzione.

La macchina si ferma quando raggiunge lo stato di terminazione

Esempio di MdT
Costruiamo una macchina che valu6 se il numero
di occorrenze del simbolo 1 in una sequenza di 0
e 1 pari.
Consideriamo in aggiunta che la sequenza debba
iniziare e terminare con un simbolo speciale, ad
esempio @.
Rappresentazione della sequenza: @0101110@
Rappresentazione del risultato:

Numero di 1 pari, la macchina scrive 1 nella prima casella a


destra della stringa di ingresso
Numero di 1 dispari, la macchina scrive 0 nella prima
casella a destra della stringa di ingresso

Proge1o del Controllo


Il disposi6vo di Controllo un automa:
StaE:
Stato S: stato iniziale in cui la macchina resta no a quando
non individua la stringa di ingresso sul nastro.
Stato P: il numero di 1 esaminato pari.
Stato D: il numero di 1 esaminato dispari.
Stato E: la macchina ha eseguito lalgoritmo e si ferma.
Ingressi1, 0, @
Uscite
Spostamento a destra (>), spostamento a sinistra (<), resta
fermo (f), scrivi 1 (S1), scrivi 0 (S0)

Unit di controllo

Macchina di Turing e Algoritmi


Una macchina di Turing che

si arres6
trasformi un nastro t in uno t

rappresenta lalgoritmo per lelaborazione Y=F(X), ove X e Y sono


codica6 rispeJvamente in t e t.

Una macchina di Turing la cui parte di controllo capace di leggere
da un nastro anche la descrizione dellalgoritmo una macchina
universale capace di simulare il lavoro compiuto da unaltra
macchina qualsiasi.
leggere dal nastro la descrizione dellalgoritmo richiede di saper
interpretare il linguaggio con il quale esso stato descri1o.

La Macchina di Turing Universale linterprete di un linguaggio

Tesi di Church e Turing


Tesi di Church e Turing: Non esiste alcun formalismo, per
modellare una determinata computazione meccanica, che sia pi
potente della Macchina di Turing e dei formalismi ad essi
equivalen;.

Ogni algoritmo pu essere codicato in termini di Macchina di Turing


ed quindi ci che pu essere eseguito da una macchina di Turing.
Un problema non risolubile algoritmicamente se nessuna Macchina
di Turing in grado di fornire la soluzione al problema in tempo nito.
Se dunque esistono problemi che la macchina di Turing non pu
risolvere, si conclude che esistono algoritmi che non possono essere
calcolaE.

Sono problemi decidibili quei problemi che possono essere


meccanicamente risolvibili da una macchina di Turing; sono
indecidibili tuJ gli altri.

Conseguenze
se per problema esiste un algoritmo risolvente
questo indipendente dal sistema che lo
esegue
. se vero che per esso esiste una macchina di
Turing;

lalgoritmo indipendente dal linguaggio


usato per descriverlo
visto che per ogni linguaggio si pu sempre
denire una macchina di Turing universale.

Calcolabilit
La teoria della calcolabilit cerca di comprendere quali
funzioni amme1ono un procedimento di calcolo
automa6co.
Nella teoria della calcolabilit la tesi di Church-Turing
unipotesi che intui6vamente dice che se un problema
si pu calcolare, allora esister una macchina di Turing
(o un disposi6vo equivalente, come il computer) in
grado di risolverlo (cio di calcolarlo).
Pi formalmente possiamo dire che la classe delle
funzioni calcolabili coincide con quella delle funzioni
calcolabili da una macchina di Turing.

MdT e Von Neumann


La macchina di Turing e la macchina di von Neumann
sono due modelli di calcolo fondamentali per
cara1erizzare la modalit di descrizione e di
esecuzione degli algoritmi.
La macchina di Von Neumann fu modellata dalla
Macchina di Turing Universale per ci che aJene alle
sue modalit di computazione.

La sua memoria per limitata a dierenza del nastro di


Turing che ha lunghezza innita.
La macchina di Von Neumann, come modello di
riferimento per sistemi non solo teorici, prevede anche la
dimensione dellinterazione a1raverso i suoi disposi6vi di
input ed output.

Tra1abilit
calcolabilit

consente di dimostrare lesistenza di un algoritmo risolvente un


problema assegnato ed indipendente da qualsiasi automa

tra1abilit

studia la eseguibilit di un algoritmo da parte di un sistema


informa6co.

Esistono problemi classica6 come risolvibili ma pra6camente


intra1abili non solo dagli a1uali elaboratori ma anche da quelli,
sicuramente pi poten6, del futuro.
Sono no6 problemi che
. pur presentando un algoritmo di soluzione, non consentono di
produrre risulta6 in tempi ragionevoli neppure se esegui6 dal
calcolatore pi veloce.
amme1ono soluzione di per s lenta e quindi inacce1abile.

Tra1abilit e Complessit
Il conce1o di tra1abilit legato a quello di
complessit computazionale

.. studia i cos6 intrinseci alla soluzione dei problemi,


con l'obieJvo di comprendere le prestazioni massime
raggiungibili da un algoritmo applicato a un problema.

La complessit consente di individuare i problemi


risolvibili che siano tra1abili da un elaboratore
con cos6 di risoluzione che crescano in modo
ragionevole al crescere della dimensione del
problema.
Tali problemi vengono deJ tra1abili

Spazio e Tempo
La complessit di un algoritmo corrisponde a una misura delle risorse di
calcolo consumate durante la computazione ed tanto pi elevata quanto
maggiori sono le risorse consumate.
Complessit spaziale
. quan6t di memoria necessaria alla rappresentazione dei da6 necessari
allalgoritmo per risolvere il problema;

Complessit temporale

. il tempo richiesto per produrre la soluzione.

Le misure di complessit possono essere:


sta6che

se sono basate sulle cara1eris6che stru1urali (ad esempio il numero di istruzioni)


dellalgoritmo e prescindono dai da6 di input su cui esso opera.

dinamiche

se tengono conto sia delle cara1eris6che stru1urali dellalgoritmo che dei da6 di input
su cui esso opera

Complessit e da6 di input


Un primo fa1ore che incide sul tempo impiegato
dallalgoritmo la quan6t di da6 su cui
lalgoritmo deve lavorare

il tempo di esecuzione solitamente espresso come


una funzione f(n) della dimensione n dei da6 di input.
Si dir, ad esempio, che un algoritmo ha un tempo di
esecuzione n2 se il tempo impiegato pari al quadrato della
dimensione dellinput.

Da sola la dimensione dei da6 di input non basta.


Il tempo di esecuzione dipende anche dalla
congurazione dei da6 in input oltre che dalla
loro dimensione

Tempo di Esecuzione e congurazione


dei da6 in ingresso
analisi del caso migliore

per calcolare il tempo di esecuzione quando la


congurazione dei da6 presenta dicolt minime di
tra1amento.

analisi del caso peggiore

. per calcolare il tempo di esecuzione quando la


congurazione dei da6 presenta dicolt massime di
tra1amento.

Si tra1a di unanalisi molto u6le, perch fornisce delle garanzie sul


tempo massimo che lalgoritmo pu impiegare

analisi del caso medio

per calcolare il tempo di esecuzione quando la


congurazione presenta dicolt medie di tra1amento

Complessit Asinto6ca
Interessa sapere come lordine di grandezza del tempo di
esecuzione cresce al limite, ossia per dimensioni dellinput
sucientemente grandi quando la funzione f(n) tende ai suoi
asinto6.

Lo studio della condizione asinto6ca della complessit di un algoritmo


perme1e ulteriormente di trascurare in un algoritmo operazioni non
signica6ve concentrando la1enzione solo su quelle predominan6.
da6 due algoritmi diversi che risolvono lo stesso problema e
presentano due diverse complessit f(n) e g(n), se f(n)
asinto6camente inferiore a g(n) allora esiste una dimensione
dellinput oltre la quale lordine di grandezza del tempo di esecuzione
del primo algoritmo inferiore allordine di grandezza del tempo di
esecuzione del secondo.

La complessit asinto6ca dipende solo dallalgoritmo, mentre la


complessit esa1a dipende da tan6 fa1ori lega6 alla esecuzione
dellalgoritmo

Tipi di Complessit
A seconda della funzione f(n) asinto6ca, si possono individuare:
complessit di 6po polinomiale
n (lineare)
n2, n3, n5, .

Complessit di 6po esponenziale (o, in generale, Non Polinomiale,


NP)
2n, 3n , .

*.. Per un elaboratore capace di eseguire un


milione istruzioni al secondo (1 MIPS).

La descrizione degli algoritmi


Dato un problema
capire preliminarmente se il problema
amme1e soluzioni
nel caso ne amme1a, individuare un metodo
risolu6vo (algoritmo)
. esprimere tale metodo in un linguaggio
comprensibile all'esecutore a cui rivolto

Un esempio

Soluzione

Stru1ure di Controllo
Si usano naturalmente costru6 che ssano l'ordine in cui le
diverse azioni devono essere svolte.
Il pi semplice tra essi quello che stabilisce che le azioni
devono essere svolte una dopo l'altra. (sequenza)
un altro costru1o stabilisce che alcune azioni devono essere
svolte solo se si vericano determinate condizioni (selezione)
la frase "se la parola sbagliata, allora correggi, altrimen6 non fare
niente" prescrive la correzione soltanto in presenza di un errore.

un ul6mo costru1o dice che alcune azioni devono essere


ripetute un numero di volte prestabilito
("per ogni parola del rigo fai")

o determinato dal vericarsi di certe condizioni (iterazione)


("ripe6 le azioni da 1) a 4) no alla terminazione del testo)

Tipi di Istruzione
Istruzioni:

elementari quelle istruzioni che l'esecutore in grado di


comprendere ed eseguire;
non elementari quelle non note all'esecutore.

Perch un'istruzione non elementare possa essere eseguita


dall'esecutore a cui rivolta, deve essere specicata in
termini pi semplici.
Il procedimento che trasforma una istruzione non
elementare in un insieme di istruzioni elementari, prende il
nome di ranamento o specicazione dell'istruzione non
elementare.
Il processo di ranamento molto importante. Senza di esso si
dovrebbero esprimere gli algoritmi dire1amente nel linguaggio
di programmazione disponibile

Cara1eris6che delle
operazioni di un algoritmo
nitezza:

Le operazioni devono avere termine entro un intervallo di


tempo nito dall'inizio della loro esecuzione;

descrivibilit:

Le operazioni devono produrre, se eseguite, degli eeJ


descrivibili, per esempio fotografando lo stato degli oggeJ
coinvol6 sia prima che dopo lesecuzione delloperazione;

riproducibilit:

Le operazioni devono produrre lo stesso ee1o ogni volta che


vengono eseguite nelle stesse condizioni iniziali;

comprensibilit:

Le operazioni devono essere espresse in una forma


comprensibile all'esecutore che deve eseguirle.

Sequenza Dinamica
L'esecuzione di un algoritmo da parte di un
esecutore si traduce in una successione di azioni
che vengono ee1uate nel tempo.
Si dice che l'esecuzione di un algoritmo evoca un
processo sequenziale, cio una serie di even6 che
occorrono uno dopo l'altro, ciascuno con un inizio e
una ne iden6cabili.
Si denisce sequenza di esecuzione la descrizione del
processo sequenziale. La sequenza di esecuzione
l'elenco di tu1e le istruzioni eseguite, nell'ordine di
esecuzione, e per questo mo6vo viene anche de1a
sequenza dinamica.

Dipendenza della sequenza dallinput

2 sequenze

Il solitario del carcerato: esempio

solitario sequenze

Un algoritmo pu prescrivere pi di una sequenza di esecuzione.


Se poi l'algoritmo prescrive un processo ciclico, pu accadere che il numero di
sequenze sia innito. In questo caso l'algoritmo prescrive un processo che non ha mai
termine.

Sequenza Sta6ca e Dinamica


In un programma

descrizione dell'algoritmo in un linguaggio di programmazione

la sequenza lessicograca (anche chiamata sequenza sta=ca) delle


istruzioni
. descrizione delle azioni da svolgere nel linguaggio di
programmazione

descrive una pluralit di sequenze dinamiche dieren6.


Il numero di sequenze dinamiche non noto a priori e dipende dai
da6 da elaborare.
La valutazione sia del 6po che del numero delle sequenze
dinamiche di fondamentale importanza per valutare soluzioni
diverse dello stesso problema in modo
da poter dire quale di esse presenta un tempo di esecuzione migliore
da poter aermare se una soluzione ha terminazione o meno.

Linguaggio di Programmazione
Il linguaggio di programmazione una notazione formale per descrivere
algoritmi e, come ogni linguaggio, dotato di un alfabeto, un lessico, una
sintassi ed una semanEca.
L'aspe1o formale del linguaggio si manifesta sopra1u1o nella presenza di
regole rigide per la composizione di programmi a par6re dai semplici
cara1eri dell'alfabeto.
L'insieme di queste regole cos6tuisce la grammaEca del linguaggio.

Un limitato insieme di regole denisce la stru-ura lessicale del


programma

.. o unit elementari, cio le parole del linguaggio.


Il lessico, quindi, perme1e di stru1urare l'insieme limitato dei cara1eri
dell'alfabeto nel vocabolario.

L'organizzazione delle parole in frasi invece guidata da regole che


compongono la sintassi del linguaggio.
Inne l'a1ribuzione di un signicato alle frasi ogge1o delle regole
semanEche.

Dal Linguaggio Macchina


Il linguaggio pi semplice quello che dire1amente compreso
dalla CPU.

Chiameremo linguaggio macchina tale linguaggio per evidenziare il


suo stre1o legame con l'hardware.

E dicile programmare in linguaggio macchina

gran numero di comandi per singole istruzioni


. istruzioni espresse so1o forma di sequenze di

I linguaggi assemblaEvi

pur mantenendo uno stre1o legame con le potenzialit oerte dal


linguaggio macchina,

sos6tuiscono alle sequenze di bit dei codici mnemonici pi facili da


interpretare e ricordare.
I linguaggi macchina e assembla6vi sono anche comunemente deJ
linguaggi di basso livello, in quanto si pongono al livello della
macchina

ai linguaggi ad alto livello


Linguaggi ad Alto Livello
linguaggi di programmazione che, con istruzioni pi
sinte6che
ossia con istruzioni pi vicine al tradizionale modo di
esprimere i procedimen= di calcolo da parte di un essere
umano,

rendono l'aJvit di programmazione pi semplice;


Fanno uso di uno pseudo-linguaggio umano,
u6lizzando per il loro scopo parole-chiave o codici
opera=vi ispira6 quasi esclusivamente alla lingua
inglese.

Metalinguaggi
. linguaggi con i quali si presentano le regole della grammaEca di
un qualsiasi linguaggio.
Un metalinguaggio descrive quindi le propriet sintaJche e
seman6che rela6ve a un altro linguaggio o al linguaggio stesso.

BNF, Backus Naur Normal Form

Metalinguaggio sviluppato da John Backus e Peter Naur nel 1960


Prescrive che le frasi, che compongono un linguaggio, possono essere
specicate a par6re da un unico simbolo iniziale di alto livello.
Ogni simbolo di alto livello (non terminale) pu essere sos6tuito da
una frase fra un insieme di so1ofrasi, comprenden6 simboli sia non
terminali che di basso livello (terminali), mentre i simboli terminali
non possono essere sos6tui6.
Il processo si arresta quando si oJene una sequenza di soli simboli
terminali.

BNF - cara1eris6che
Il linguaggio denito da una BNF cos6tuito da tu1e le
sequenze di simboli terminali o1enute applicando questo
processo a par6re dal simbolo iniziale di alto livello.

I simboli non terminali sono racchiusi fra parentesi angolari (<),


i terminali fra virgole1e ("),
le diverse alterna6ve per un non terminale sono separate da
una barra ver6cale (|)
e il segno := indica le possibili sos6tuzioni per il non terminale.
Esempio:

<Frase> := <Sogge1o> <Predicato verbale> <Complemento ogge1o>


<Sogge1o> := io | tu | mario
<Predicato verbale> := "mangia" | beve
<Complemento ogge1o> := mela | lacqua

EBNF
Una estensione della BNF, de1a Extendend BNF
(EBNF), stata introdo1a da Niklaus Wirth per
specicare la sintassi del linguaggio di
programmazione Pascal.
Nella EBNF i simboli {,}, (, ) e * possono comparire
nel lato destro di una frase.
Una sequenza di simboli racchiusa fra { e } indica che
tale sequenza opzionale,
mentre un simbolo, o una sequenza racchiusa fra
( e ), seguito da *, indica un numero arbitrario di
ripe6zioni della sequenza, incluso 0.

Carte SintaJche
Sono strumento di 6po graco usate per la
descrizione delle regole del linguaggio.
Una carta sintaJca un grafo in cui linee
orientate uniscono delle scatole di formato
dierente: seguendo le frecce ed interpretando
opportunamente il contenuto delle scatole si
costruiscono frasi sintaJcamente corre1e.

Simboli terminali e non


Le scatole re1angolari in gura sono de1e SIMBOLI NON
TERMINALI in quanto il loro contenuto non compare dire1amente
nelle frasi.

Esse fanno riferimento ad altre carte sintaJche (quelle il cui nome


coincide col contenuto della scatola) che virtualmente devono essere
inserite nella posizione assunta dal nodo del grafo.

Le scatole tonde della gura sono de1e SIMBOLI TERMINALI in


quanto contengono cara1eri o sequenze di cara1eri che devono
apparire dire1amente nella frase, nella posizione assunta dal nodo
del grafo.

Cara1eris6che delle Carte SintaJche


Le carte sintaJche non solo perme1ono un
rapido apprendimento delle regole della
gramma6ca del linguaggio grazie
allimmediatezza fornita dalla rappresentazione
di natura graca, ma me1ono anche nella
condizione di scoprire facilmente eventuali errori
presen6 nella frase.
DifaJ cos come data una carta si in grado di
costruire una frase corre1a del linguaggio, si pu
partendo dalla frase controllarne la corre1ezza
ripercorrendo la carta corrispondente ed in caso
nega6vo anche individuare la causa degli errori

Programmazione Stru1urata
Il ruolo degli algoritmi fondamentale se si
pensa che essi sono indipendenE sia dal
linguaggio in cui sono espressi sia dal
computer che li esegue.
Si pensi ad una rice1a per una torta alla fru1a:
il procedimento lo stesso indipendentemente
dall'idioma usato;
la torta prodo1a (dovrebbe J ) la stessa
indipendentemente dal cuoco.

La proge1azione degli algoritmi


Il proge1o degli algoritmi una onerosa aJvit
intelle1uale

. molto pi onerosa di quella di esprimere l'algoritmo con un


linguaggio di programmazione

che richiede creaEvit ed intuito.


Non esiste un algoritmo per il proge1o degli algoritmi!
Valutazione della complessit della soluzione individuata:
se ci sono algoritmi diversi per descrivere lo stesso processo:

la complessit ci dice quale di essi migliore, ossia quale viene


eseguito nel minor tempo con la minima occupazione di memoria, pi
in generale con il miglior u6lizzo di tu1e le risorse disponibili.
lo studio della correCezza ci consente di valutare l'aderenza della
soluzione alle speciche del problema.
Essere sicuri della corre1ezza un'aJvit tanto pi complessa quanto pi
complesso risulta il proge1o dell'algoritmo.

LIngegneria del Soware


Ai ni di una produzione industriale di qualit necessario
evitare di produrre soware in base alle esperienze e/o alle
inizia6ve del programmatore:
il processo di produzione del soware non pu essere un
processo di 6po ar6gianale

Ad esempio, negli anni '60 il programmatore usava mille trucchi per


risparmiare memoria!

deve invece servirsi di metodologie e tecniche sistemaEche di


proge1azione e programmazione con ssa6 parametri di qualit
e in maniera standard.

La "so<ware engineering" (ingegneria del soware) la


branca dell'Ingegneria Informa6ca che raccoglie il
patrimonio di metodi e tecniche per la produzione del
soware.

Requisi6 del Soware


buon livello qualita6vo;
produJvit medio-alta;
impiego di personale non troppo specializzato
(la specializzazione fornita dallo standard);
riduzione sensibile del costo del prodo1o.

Il ciclo di vita del soware

La programmazione Stru1urata
L'obieJvo principale della programmazione stru1urata
consiste nella costruzione di programmi con le seguen6
cara1eris6che:

leggibilit: un programma deve essere comprensibile ad altri


programmatori;
documentabilit: un programma deve contenere al suo interno
il signicato e la mo6vazione di tu1e le scelte di proge1o
ee1uate;
modicabilit: un programma deve essere stru1urato in modo
da perme1ere un rapido ada1amento ad una eventuale
variazione di alcuni parametri del proge1o;
provabilit: un programma deve essere costruito in modo da
facilitare le aJvit di tes6ng e debugging (controllo della
corre1ezza e correzione degli errori) n dalle prime fasi del
proge1o soware.

Cara1eris6che: modularit
La modularizzazione ci dice che un programma deve
essere composto di moduli funzionali.
Ogni modulo funzionale deve possedere un singolo e ben
precisato compito.
Ogni modulo deve essere dotato di un solo ingresso e di
una sola uscita.

La modularizzazione comporta una regolarit della


stru1ura dei programmi ed un valido supporto per la
fase di proge1o, in quanto rispecchia la limitazione
degli esseri umani ad esaminare un solo aspeCo di un
problema alla volta.

Cara1eris6che: 1in 1out


Le stru1ure di controllo sono da considerarsi
degli schemi di composizione dei moduli
cos6tuen6 il programma.
Esse devono assolutamente avere un solo
ingresso ed una sola uscita.
Tale condizione discende dalla necessit che un
modulo, composto dall'integrazione di altri moduli
tramite le stru1ure di un controllo, abbia un solo
punto di ingresso ed un solo punto di uscita cos come
i singoli moduli componen6.

Cara1eris6che: Top Down


Il top-down e lo stepwise renement cos6tuiscono il modo
procedurale di raggiungimento della soluzione (divide et impera)
Tale approccio parte dalla considerazione che la complessit di un
problema da risolvere non consente di tener conto
contemporaneamente di tu1e le decisioni realizza6ve.
Sar quindi necessario procedere per "Ranamen6 Successivi"
procedendo dal generale al par6colare.

"si analizza il problema al pi alto livello possibile di astrazione


individuandone gli elemen= pi importan= e supponendo di avere a
disposizione un sistema adaCo ad eseguire gli elemen= funzionali
individua=".
Ogni elemento, a sua volta, diventa il problema da analizzare subendo
una suddivisione in problemi pi elementari.
Il procedimento con6nua no a raggiungere un livello di
scomposizione comprensibile all'esecutore (o soware del sistema in
uso).

Esempio top down

Soluzione del Problema: Albero


la radice corrisponde al
problema
i nodi rappresentano le
dieren6 decisioni di
proge1o,
le foglie, vengono
associate alla descrizione
della soluzione in modo
comprensibile all'esecutore.

Bo1om Up
parte considerando il sistema reale a disposizione e creando man
mano moduli elementari che opportunamente integra6 formano
moduli capaci di compiere operazioni pi complesse.
Il procedimento con6nua no a quando stato creato un modulo
che corrisponde proprio alla soluzione del problema

La proge1azione dei programmi di


piccole dimensioni
Una delle esigenze maggiormente sen6ta
quella di una separazione ne1a, in fase
proge1uale, tra il cosa (analisi dei requisi6 e
speciche funzionali) e il come (proge1o a
diversi livelli di de1aglio).
In eeJ la dis6nzione tra il cosa e il come
comune a qualsiasi 6po di proge1o ed un modo
per esprimere con altre parole la separazione fra
analisi e sintesi.

Fasi
fase di analisi dei requisi= e delle funzioni
fase di progeCo
analisi cri=ca della soluzione

Analisi
Capacit di acquisire tu1e le informazioni necessarie alla
comprensione del problema e di stru1urarle in un modello che
esprima, in un linguaggio adeguato, una rappresentazione coerente
e completa di cosa si deve fare.
Le informazioni devono essere ricavate ..

dai colloqui con gli uten6 di qualsiasi livello, ovvero con coloro che sono
coinvol6 nell'uso del programma sia a livello direJvo che esecu6vo,
da un esame dell'ambiente in cui il programma sar u6lizzato,

queste aJvit cos6tuiscono la cosidde1a fase di denizione dei


requisi6.
Il compito dell'analista quello di trarre, dall'insieme confuso e a
volte contraddi1orio di esigenze ed obieJvi, un modello che
esprima il problema con un formalismo a1o ad aumentarne la
comprensibilit.

Requisi6
i requisi6 funzionali
cosa deve fare il programma e su quali da6 deve
operare

i requisi6 non funzionali


quali prestazioni il programma deve orire

Il passaggio dall'acquisizione dei requisi6 alla


formulazione del modello rappresenta la
cosidde1a fase di analisi di un problema

Corre1ezza
necessario vericare che ogni aspe1o delle speciche abbia un'unica
interpretazione nel contesto delle applicazioni che si descrivono ed
ee1uare delle esemplicazioni degli eeJ delle trasformazioni tra da6
di ingresso e da6 di uscita.
Tali esemplicazioni cos6tuiscono la base per un confronto del programma
con l'utente che perme1e di vericare la corre1ezza delle speciche.

Sempre ai ni della corre1ezza occorrer:

vericare che nelle speciche non vi siano inconsistenze;


vericare che le speciche coprano tu1e le possibili situazioni coinvolte nel
problema.

Al termine della fase di analisi si deve disporre della documentazione su:


la denizione dei da6 di ingresso al problema;
la denizione dei da6 in uscita dal problema;
la descrizione di un metodo risolu6vo che sulla carta risolva le speciche del
problema.

Proge1o
La fase di proge1o pu iniziare solo dopo un'accurata fase di
denizione dei requisi6.
Si ar6cola nelle aJvit di ranamento successivo dei da= e
dell'algoritmo.
Costruire un algoritmo equivale a:

esaminare una specica realt (il problema assegnato),


costruirne un'astrazione,
inne rappresentare una tale astrazione in maniera formale in un
linguaggio di programmazione.

La tecnica top-down si presenta come un approccio guida con


l'obieJvo preciso di ridurre la complessit e di orire uno
strumento di composizione di un'archite1ura modulare dei
programmi.

Il modo di procedere di tale approccio una dire1a applicazione del


metodo anali6co deduJvo che si rilevato, storicamente, il pi ada1o
alla media degli esseri umani

Come procedere
Un modo di procedere quello per livelli di astrazione.
L'astrazione consiste nell'estrazione di de1agli essenziali
mentre vengono omessi i de1agli non essenziali.

Ogni livello della decomposizione presenta una visione astra1a


dei livelli pi bassi in cui i de1agli vengono spin6, quanto pi
possibile, ai livelli ancora pi bassi.
I moduli di livello pi alto specicano gli obieJvi di qualche
azione oppure cosa deve essere fa1o, mentre quelli di livello pi
basso descrivono come l'obieJvo verr raggiunto.

Il passo di ranamento itera6vo produce, a par6re dal


problema, una prima decomposizione dell'algoritmo e
prosegue con successivi ranamen6, sempre pi vicini
all'espressione nale dell'algoritmo nel linguaggio di
programmazione.

Separazione Analisi e Proge1o


Mo6vi alla base di tale separazione sono:
la possibilit di documentare in maniera completa
i requisi6 del problema e quindi, indire1amente,
le scelte della fase di proge1o;
l'impossibilit d'inciare i risulta6 dell'analisi a
causa di scelte an6cipate di proge1o;
la possibilit di rendere indipendente l'analisi dai
vincoli di realizzazione.

Da6 e Funzioni
Un'altra dis6nzione, in senso orizzontale, avviene fra da6 e funzioni
che rappresentano gli aspeJ duali, ma stre1amente lega6, di ogni
problema che si esamina;
tale separazione dovuta
sia a ragioni intrinseche

in quanto da6 e funzioni sono cara1erizza6 da propriet dieren6,

che a ragioni metodologiche

in quanto opportuno tra1are separatamente funzioni da un lato e da6


dall'altro, in modo da oJmizzarne gli aspeJ rela6vi in maniera indipendente
dai condizionamen6 che, viceversa, un'analisi complessiva comporterebbe.

Ci consente di o1enere:

l'esame accurato dell'aspe1o seman6co dei da6;


la completezza dell'analisi, in quanto essa viene compiuta da dieren6
pun6 di vista;
l'assicurazione che da6 e funzioni assumano il giusto peso in analisi e
non si enfa6zzino gli uni rispe1o agli altri.

La Documentazione dei Programmi


La documentazione dei programmi lo strumento
fondamentale per la chiarezza e la leggibilit dei
programmi.
Tali cara1eris6che di leggibilit consentono:

una pi semplice comprensione di quale sia il problema


che il programma risolve e quindi della corre1ezza del
programma stesso;
una pi semplice prosecuzione del proge1o ogni qualvolta
lo si sia interro1o;
una pi elementare comunicazione delle scelte di
proge1o;
una pi semplice modicabilit del programma al variare
delle speciche del problema.

Regole della documentazione


Produrre la documentazione nel corso stesso del
proge1o
in quanto si pu essere cer6 della ecacia e della
completezza della documentazione soltanto se si
documentano le scelte nel momento in cui esse
vengono fa1e.

Inserire la documentazione quanto pi possibile


all'interno del programma in modo che viva con il
programma stesso, cambi e cresca con esso, e
quindi sia sempre aggiornata.

Documentazione esterna
E il primo livello di documentazione e va compilato
preliminarmente nella fase di analisi dei requisi6.
Descrive soltanto il "cosa" fa il programma e non il "come"
lo fa.
Deve segnalare de1agli opera6vi tali da rendere autonomo
l'utente del programma nell'uso dello stesso.

a) funzionalit esterne;
b) aJvazione del programma;
c) diagnos6che di errore;
d) congurazione richiesta del sistema;
e) indicazione sull'installazione del programma;
f) versione e data di aggiornamento.

Documentazione interna
descrive la stru1ura interna del programma in termini
di scelte sulle stru1ure da6 e sull'algoritmo.
evidenziazione della stru1ura del programma mediante
l'uso dell'indentazione

indentare un programma signica me1ere in evidenza nel testo


del programma, mediante opportuni incolonnamen6, blocchi di
istruzioni che svolgono una funzionalit ben precisa

documentazione top-down

ossia facendo comprendere come il programma stato generato


a1raverso i vari ranamen6

uso di nomi di variabili autoesplica6vi, ossia tali da


spiegare il ruolo da esse svolte nel corpo del programma
commento del programma a1raverso le frasi di commento
di cui tuJ i linguaggi di programmazione sono dota6