Docente:
Giuseppe Scollo
Università di Catania
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Laurea in Informatica, I livello, AA 2009-10
la definizione di algoritmo, nelle sue diverse varianti, esige l'eseguibilità dei passi, o l'effettiva computabilità delle operazioni, da parte dell'esecutore o agente di calcolo
ad esempio, una descrizione più concisa dell'algoritmo di cottura dell'uovo alla coque già visto può presupporre che l'esecutore sappia riconoscere un uovo fresco, e abbia qualche familiarità con l'uso dei fornelli:
questa descrizione è a un più alto livello di astrazione rispetto alla precedente perché, appunto, astrae da alcuni dettagli, inutili al presupposto livello cognitivo dell'esecutore
astrazione e raffinamento sono concetti fondamentali, inerenti qualsiasi genere di descrizione, non solo quella di algoritmi
si costituisce naturalmente una gerarchia di livelli di astrazione in base alla presenza di dettagli, a un livello inferiore, dai quali si astrae al livello superiore
nell'evoluzione storica dei linguaggi di programmazione è facilmente riconoscibile una tendenza verso livelli di astrazione sempre più alti, cioè meno vincolati a caratteristiche degli agenti di calcolo
al momento, questi concetti ci tornano utili per dotarci di una notazione agevole per la rappresentazione di algoritmi
i calcolatori non sono gli esclusivi destinatari di descrizioni di algoritmi
il linguaggio naturale sembra conveniente a tal fine, ma si presta ad ambiguità, e inoltre non fornisce supporto immediato ai costrutti più tipici degli algoritmi; d'altra parte, i linguaggi di programmazione pongono vincoli formali spesso eccessivi a fini di comunicazione
le primitive di una rappresentazione ne sono i costituenti di base, cioè sono:
tipici esempi di primitive in descrizioni di algoritmi sono:
oltre alle primitive, la rappresentazione di un algoritmo necessita di
queste si applicano alle primitive, come pure a espressioni composte risultanti dall'applicazione delle regole
lo pseudocodice è una tecnica informale di descrizione di algoritmi nella quale:
in sostanza, la rappresentazione di un algoritmo in pseudocodice ha le stesse caratteristiche strutturali delle rappresentazioni in linguaggi di programmazione (di alto livello), ma non è soggetta ai rigidi vincoli sintattici di tali linguaggi
facciamoci una prima idea della rappresentazione in pseudocodice attraverso un semplice esempio: la ricerca del massimo in un insieme finito di numeri
ipotizziamo che l'insieme sia rappresentato da una sequenza di numeri naturali in ingresso, la fine della quale è segnalata dall'immissione di un numero negativo
conveniamo che v ← E designi l'assegnamento del valore dell'espressione E alla variabile v
≥
0
ripeti:
≥
0
allora scrivi candidato
altrimenti scrivi
"insieme vuoto?"
quali primitive si usano nell'esempio visto?
≥
",
">"
gli operatori di confronto sono di tipo booleano, cioè formano, con i loro argomenti, espressioni la cui valutazione dà un valore di verità: vero o falso; nell'esempio visto si hanno tre espressioni di tal tipo, costituenti la condizione in strutture di controllo
strutture condizionali:
il costrutto finché condizione ... fine ciclo è una struttura di controllo iterativa :
lo esaminiamo appresso, assieme ad altre strutture di questo tipo
una struttura di controllo implicita nelle descrizioni di algoritmi è la sequenza: in assenza di costrutti che alterino l'ordine di esecuzione, si intende che i passi dell'algoritmo vadano eseguiti nell'ordine in cui sono descritti
stato: la mappa dei valori assegnati alle variabili, in un dato momento dell'esecuzione
ingredienti essenziali di una struttura iterativa (o ciclo, ingl. loop ) :
N.B. talvolta l'inizializzazione è realizzata esternamente alla struttura iterativa propriamente detta, che è composta in sequenza con essa
pseudocodice: finché condizione ripeti: corpo del ciclo fine ciclo
pseudocodice: ripeti: corpo del ciclo finché condizione fine ciclo
ipotizziamo che il nome da cercare, e il nome di un file contenente l'elenco, siano i due argomenti della funzione desiderata, che produrrà in uscita un numero naturale; questo indicherà la posizione, a partire da 1, (della prima occorrenza) del nome nell'elenco, se il nome è nell'elenco, altrimenti sarà 0
estendiamo le primitive dello pseudocodice con
il ciclo a condizione anticipata è la struttura iterativa fondamentale:
versione ridotta del Teorema di Böhm-Jacopini:
infatti, ad es., si possono realizzare le strutture condizionali viste prima come segue:
problema:
ricerca delle occorrenze di una sequenza (contigua) di simboli
S =
S1...Sk
in una data sequenza M =
M1...Mn
di simboli dello stesso alfabeto {A,T,C,G}, con n > k
assumiamo di disporre delle seguenti operazioni primitive su sequenze:
≥
1
e la lunghezza di X sia almeno p+k-1)
=
Y : vera sse
X e Y
hanno la stessa lunghezza e
Xi =
Yi
per ogni posizione i
≤
n
ripeti:
=
estrai(M, posizione, k)
allora scrivi posizione