Le postcondizioni specificano l’output della funzione.

Slides:



Advertisements
Presentazioni simili
Tail recursion: esempio
Advertisements

Esercizi su alberi binari di ricerca
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…),
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
Tail recursion: esempio
Esercizi su alberi binari di ricerca
alberi completamente sbilanciati
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
Prog2 a.a. 2001/ Albero binario di ricerca Un albero binario di ricerca é un albero binario in cui ogni nodo ha un’etichetta.
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi.
Prog21 Alberi binari (radicati e ordinati) Il figlio destro della radice La radice Il figlio sinistro della radice Il padre del nodo 5.
Le funzioni in C++. Introduzione  Spesso alcuni gruppi di operazioni vengono ripetute in diverse parti all’interno del medesimo programma  Si pensi.
Fondamenti di Informatica A - Massimo Bertozzi LE FUNZIONI.
1 ELEMENTI DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Fondamenti di Informatica A - Massimo Bertozzi LE RAPPRESENTAZIONI CONCATENATE.
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo Fosco Dora Drogo Dudo.
© 2007 SEI-Società Editrice Internazionale, Apogeo
Esercitazioni di Prog. II (esercizi su alberi ennari)
Procedure di controllo di qualità del dato analitico
rielaborato da Atzeni-etal., Basi di dati, Capitolo 4
Esercizio fatture.
Divide et Impera Quicksort Mergesort Charles Antony Richard Hoare
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
Asynchronous JavaScript and XML
PROGRAMMAZIONE BASH – ISTRUZIONE IF
Esercitazioni di Prog. II (esercizi _aggiuntivi_su alberi binari)
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmare.
© 2007 SEI-Società Editrice Internazionale, Apogeo
Strutture di Controllo
I numeri relativi DEFINIZIONE. Si dicono numeri relativi tutti i numeri interi, razionali e irrazionali dotati di segno (positivo o negativo). ESEMPI Numeri.
Scrivere programmi corretti
Ricorsione 16/01/2019 package.
© 2007 SEI-Società Editrice Internazionale, Apogeo
Validazione, verifica, debugging e defensing programming
Schema generale, visita in ampiezza e profondità.
Alberi n-ary Lezioni di C.
Gestione di un banco di magliette
Gestione di un ristorante
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
APPUNTI SUL LINGUAGGIO C
Interpretazione Astratta
esercizi alberi binari
comprensione e modifica di codice
APPUNTI SUL LINGUAGGIO C Implementazioni di Liste Concatenate
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
APPUNTI SUL LINGUAGGIO C
Algoritmi e Strutture Dati
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
LINGUAGGIO C Alberi e livelli
APPUNTI SUL LINGUAGGIO C Simulazione Prima Prova Intermedia
Programmazione e Laboratorio di Programmazione
APPUNTI SUL LINGUAGGIO C Alberi Binari – primi esercizi
Esercizio Dato un albero binario, definiamo altezza minimale di un nodo v la minima distanza di v da una delle foglie del suo sottoalbero, definiamo invece.
Programmazione e Laboratorio di Programmazione
Esercitazione guidata 1
Programmazione e Laboratorio di Programmazione
Unità 1 Programmi base.
Programmazione e Laboratorio di Programmazione
Verifica bilanciamento nel numero dei nodi: definizioni.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Programmazione e Laboratorio di Programmazione
Ricerca 01/08/2019 package.
Programmazione e Laboratorio di Programmazione
Script su vettori Realizza uno script che chiede in input una dimensione d e crea un vettore di d numeri interi casuali. Poi calcola la somma dei due numeri.
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

Le postcondizioni specificano l’output della funzione. OBIETTIVO CORRETTEZZA: specificazione completa con precondizioni e postcondizioni Le precondizioni e postcondizioni aggiunte al prototipo, consentono di fornire una specificazione precisa della funzione Le precondizioni stabiliscono le eventuali restrizioni di definizione della funzione sull’insieme dei dati in input (dato dal tipo dei parametri) il chiamante deve assicurarsi di chiamare la funzione solo se le precondizioni sono soddisfatte, infatti se una precondizione non è rispettata al momento della chiamata, la funzione può comportarsi in modo imprevedibile. Le postcondizioni specificano l’output della funzione. Se il chiamante ha rispettato le precondizioni, la funzione deve rispettare le postcondizioni, cioè restituire i valori in conformità con le postcondizioni.

1 se x x  L (in genere abbreviato se x  L) cerca(L,x) = OBIETTIVO CORRETTEZZA: specificazione completa con precondizioni e postcondizioni Esempio: sia L una collezione e x un elemento nell’universo di definizione di L, consideriamo la funzione 1 se x x  L (in genere abbreviato se x  L) cerca(L,x) = 0 altrimenti Qual’è il risultato di cerca se L = ? Dal punto di vista logico cerca(,x) = 0, infatti x x   è evidentemente falsa

Ometteremo il riferimento alle precondizioni se non ce ne sono OBIETTIVO CORRETTEZZA: specificazione attraverso precondizioni e postcondizioni Supponendo di aver rappresentato in memoria la collezione come una lista, l’implementazione è: “cerca” è una funzione totale int cerca(Listptr L, Elem el) /* verifica se l'elemento el occorre almeno una volta nella collezione *prec: nessuna *postc: restituisce 1 se l'elemento occorre nella lista, 0 altrimenti */ {if (!L) return 0; if(L->elem == el) return 1; return cerca(L->nextPtr, el); } Qui si fa riferimento al seguente tipo struct nodo { int elem; struct nodo * next; }; typedef struct nodo Lista; typedef Lista* ListaPtr; CONVENZIONE: Ometteremo il riferimento alle precondizioni se non ce ne sono

{if (L->elem == el) return 1; OBIETTIVO CORRETTEZZA: specificazione attraverso precondizioni e postcondizioni Ma in qualche caso è necessario distinguere il caso di ricerca con insuccesso dal caso dell’insieme vuoto. La prima soluzione proposta esclude l’insieme vuoto come argomento della funzione: int cerca1(Listptr L, Elem el) /* verifica se l'elemento el occorre almeno una volta nella collezione *prec: L != NULL *postc: restituisce 1 se l'elemento occorre nella lista, 0 altrimenti */ {if (L->elem == el) return 1; if (L -> nextPtr) return cerca1(L->nextPtr, el); /* Non ci devono essere chiamate su L==NULL */ else return 0; } “cerca1” è una funzione parziale

int cerca2(Listptr L, Elem el) OBIETTIVO CORRETTEZZA: specificazione attraverso precondizioni e postcondizioni La seconda soluzione proposta distingue in output i due casi: int cerca2(Listptr L, Elem el) /* verifica se l'elemento el occorre (almeno una volta) nella collezione *postc: se L =  restituisce -1, altrimenti se l'elemento e' presente restituisce 1 e in caso contrario 0.*/ {if (!L) return -1; if (L->elem == el) return 1; if (L -> nextPtr) return cerca2(L->nextPtr, el); else return 0; } “cerca2” è una funzione totale

OBIETTIVO CORRETTEZZA: specificazione attraverso precondizioni e postcondizioni E’ importante capire che le precondizioni non richiedono alcuna verifica nel codice della funzione, anzi spesso sono introdotte proprio per evitare il controllo di condizioni troppo onerose da verificare. Ovviamente una precondizione non banale rende la funzione parziale e questo può essere un inconveniente per il chiamante che deve assicurarsi di non chiamare la funzione su valori che non soddisfano le precondizioni. La decisione di utilizzare le precondizioni per gestire casi particolari di dati in input deve essere determinata dall’ambito di applicazione della funzione. Se si prevede un uso solo locale di un’applicazione, si può pensare di verificare al momento della chiamata che le precondizioni siano rispettate, se la funzione ha un uso più ampio, bisogna fare un uso molto prudente delle precondizioni. dal costo dei controlli. Esempio: la ricerca binaria opera correttamente solo su elementi ordinati, ma se controlliamo questo al momento della chiamata della ricerca binaria perdiamo tutto il vantaggio in termini di prestazioni della ricerca binaria!