Logo dell'Università di Catania: Siciliae Studium Generale 1434 Logo DMI, Fondamenti di informatica
matite e gomma
Loghi istituzionali: Siciliae Studium Generale 1434, Università di Catania, Facoltà di Scienze Matematiche, Fisiche, Naturali, Insegnamento di Fondamenti di Informatica

Rappresentazione di algoritmi,
strutture di controllo

Lezione 2 di Fondamenti di informatica

Docenti: Marina Madonia & Giuseppe Scollo

Università di Catania
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Laurea in Informatica, I livello, AA 2008-09

Logo di Conformità WCAG-1 di Livello Tripla A, W3C-WAI Web Content Accessibility Guidelines 1.0 Validazione XHTML 1.0 Validazione CSS 2

Indice

  1. Rappresentazione di algoritmi,
    strutture di controllo
  2. astrazione e raffinamento
  3. livelli di astrazione
  4. primitive di una rappresentazione
  5. descrizione di algoritmi in pseudocodice
  6. ricerca del massimo in un insieme
  7. strutture condizionali
  8. strutture iterative
  9. cicli a condizione anticipata e posticipata
  10. ricerca di un nome in un elenco
  11. strutture di controllo fondamentali
  12. ricerca di un gene in una molecola DNA
  13. esercizi

astrazione e raffinamento

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:

  1. accendi una fiamma vivace sotto un pentolino con un uovo fresco immerso in acqua fredda
  2. all'ebollizione, modera la fiamma e spegni dopo 100 secondi circa
  3. blocca la cottura temperando con acqua fredda

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

livelli di astrazione

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

primitive di una rappresentazione

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:

descrizione di algoritmi in pseudocodice

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 rappresentazione di algoritmi nella quale:

in buona sostanza, la rappresentazione di un algoritmo in pseudocodice ha le stesse caratteristiche strutturali delle sue rappresentazioni in linguaggi di programmazione (di alto livello), ma non è soggetta ai rigidi vincoli sintattici di tali linguaggi

ricerca del massimo in un insieme

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 fornita in ingresso, dove l'immissione di un numero negativo segnala la fine della sequenza in input

conveniamo che v ← E designi l'assegnamento del valore dell'espressione E alla variabile v

strutture condizionali

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 altrettante 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

strutture iterative

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

cicli a condizione anticipata e posticipata

pseudocodice: finché condizione ripeti: corpo del ciclo fine ciclo

pseudocodice: ripeti: corpo del ciclo finché condizione fine ciclo

ricerca di un nome in un elenco

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

strutture di controllo fondamentali

il ciclo a condizione anticipata è la struttura iterativa fondamentale:

versione ridotta del Teorema di Böhm-Jacopini:

infatti, ad esempio, si possono realizzare le strutture condizionali viste prima come segue:

ricerca di un gene in una molecola DNA

problema: ricerca di tutte le 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:

esercizi

  1. un ciclo a contatore è una struttura iterativa descrivibile con lo pseudocodice:
    • per contatore = iniziale, finale, passo ripeti: pseudocodice fine ciclo
    dove (parte del)l'inizializzazione e la condizione di continuazione sono determinati dai tre valori specificati per la variabile contatore :
    inizializzazione: le si assegna il valore iniziale
    continuazione: si incrementa contatore del valore passo alla fine di ogni iterazione, e la condizione di continuazione, all'inizio di ogni iterazione, è vera sse il valore di contatore non supera il valore finale
    l'esercizio consiste nell'indicare come ottenere un descrizione equivalente a quella di un ciclo a contatore adoperando solo le strutture fondamentali del Teorema di Böhm-Jacopini
  2. l'algoritmo di ricerca di un gene in una molecola di DNA proposto ad esempio opera ad un livello piuttosto alto di astrazione, se si considerano le operazioni primitive assunte nell'esempio; raffinarlo ad un livello più basso, assumendo disponibile l'operazione di confronto di eguaglianza di simboli dell'alfabeto dato, mediante algoritmi che definiscano funzioni per le tre operazioni suddette
    • N.B. per definire tali funzioni si suggerisce di adoperare la notazione in pseudocodice usata finora, eccetto che in luogo della primitiva "scrivi E ", che produce il valore dell'espressione E in uscita, conviene adoperare la primitiva "restituisci E ", per fornire il valore di E, quale risultato del calcolo della funzione che si descrive, all'algoritmo più astratto che ne fa uso