Progettazione di Programmilops/programmazione/Modulo_10_Progettazione... · 2 Corso di...

30
Corso di Programmazione - © Stefano Ferilli - DIB 1/90 Corso di Programmazione Progettazione di Programmi Dott. Pasquale Lops [email protected] Materiale didattico preparato dal dott. Stefano Ferilli Corso di Programmazione - © Stefano Ferilli - DIB 2/90 Sviluppo di un Programma Risoluzione di un problema mediante un calcolatore – Partire dalla descrizione del problema In linguaggio naturale per giungere alla stesura di un programma In un certo linguaggio di programmazione Corso di Programmazione - © Stefano Ferilli - DIB 3/90 Sviluppo di un Programma Fasi (Studio di fattibilità) • Analisi – Chiarifica del problema • Cosa • Progettazione – Individuazione di una strategia di soluzione • Come – Scelta delle strutture di dati

Transcript of Progettazione di Programmilops/programmazione/Modulo_10_Progettazione... · 2 Corso di...

1

Corso di Programmazione - © Stefano Ferilli - DIB 1/90

Corso di ProgrammazioneProgettazione di Programmi

Dott. Pasquale [email protected]

Materiale didattico preparato daldott. Stefano Ferilli

Corso di Programmazione - © Stefano Ferilli - DIB 2/90

Sviluppo di un Programma

• Risoluzione di un problema mediante un calcolatore– Partire dalla descrizione del problema

• In linguaggio naturale

per giungere alla stesura di un programma• In un certo linguaggio di programmazione

Corso di Programmazione - © Stefano Ferilli - DIB 3/90

Sviluppo di un ProgrammaFasi

• (Studio di fattibilità)• Analisi

– Chiarifica del problema• Cosa

• Progettazione– Individuazione di una strategia di soluzione

• Come– Scelta delle strutture di dati

2

Corso di Programmazione - © Stefano Ferilli - DIB 4/90

Sviluppo di un ProgrammaFasi

• Codifica– Scrittura del programma

• Verifica (e correzione)– (Test) del programma

• Rimanda ad una delle fasi precedenti

• Manutenzione– Correttiva– Adattativa– Migliorativa

Corso di Programmazione - © Stefano Ferilli - DIB 5/90

Sviluppo di un Programma

• Accumulo degli errori– Gli errori in ciascuna fase si ripercuotono su

tutte le fasi successive• Più costosi

– Ciascuna fase può aggiungere errori a quelli delle fasi precedenti

• Vari approcci– Differente sequenza di esecuzione delle fasi di

sviluppo

Corso di Programmazione - © Stefano Ferilli - DIB 6/90

Sviluppo di un Programma

• Documentazione di ogni fase– Necessaria per chi riprenderà in seguito il

programma per modificarlo• L’autore stesso• Altre persone

• La documentazione in output da ciascuna fase è input per la fase successiva

3

Corso di Programmazione - © Stefano Ferilli - DIB 7/90

ProblemaParti principali

• Incognita/e o Obiettivo/i– Ciò che si vuole trovare

• Dati– Ciò che è dato o conosciuto

• Condizione– Specifica come l’incognita è connessa ai dati

• Per mezzo di quali relazioni

Corso di Programmazione - © Stefano Ferilli - DIB 8/90

Problema

• Comprendere il problema– Il suo significato– Il suo scopo

come un tutt’uno• Vederne molto chiaramente le parti principali

– Incognita– Condizioni– Dati

Corso di Programmazione - © Stefano Ferilli - DIB 9/90

Problema

• Scopo di un problema che “chiede di trovare”– Trovare

• Trovare, produrre, costruire, identificare, elencare, caratterizzare, …

un certo oggetto• L’incognita del problema

soddisfacente alla condizione del problema• Collega l’incognita ai dati del problema

4

Corso di Programmazione - © Stefano Ferilli - DIB 10/90

Formulazione del Problema

• I problemi reali sono tutt’altro che ben formulati– I dati

• Sono sufficienti?• Sono sovrabbondanti?

– La condizione• È sufficiente, è sovrabbondante?• È contraddittoria?

Corso di Programmazione - © Stefano Ferilli - DIB 11/90

Formulazione del Problema

• Caso di problemi perfettamente determinati (ad es. un teorema)– Tutte le affermazioni contenute nell’ipotesi del

teorema sono essenziali per dimostrare la tesi• Se la dimostrazione non tiene conto di una qualsiasi

parte dell’ipotesi è senz’altro errata• Analogamente se una parte della condizione di un

problema che “chiede di trovare” non viene presa in considerazione, si finisce col risolvere un problema diverso da quello originale

Corso di Programmazione - © Stefano Ferilli - DIB 12/90

Formulazione del Problema

• Un problema chiaramente enunciato deve specificare– La categoria a cui appartiene l’incognita

• Che genere di cosa bisogna trovare– Esempio: un numero, una parola, ecc.

– La condizione che deve soddisfare l’incognita• Il sottoinsieme, tra tutti gli oggetti della categoria a

cui deve appartenere l’incognita, di quegli oggetti che soddisfano la condizione

– Le soluzioni

– I dati

5

Corso di Programmazione - © Stefano Ferilli - DIB 13/90

Formulazione del Problema

• Quasi tutti i problemi sono mal formulati– Non chiaramente enunciati

• Omissioni• Ambiguità• Imprecisioni

• Possibilità di non capire bene le richieste del problema– Necessità di esplicitare le ipotesi

Corso di Programmazione - © Stefano Ferilli - DIB 14/90

Formulazione del ProblemaEsempio

• Problema– Calcolare l’altezza di uno stabile avente n piani di h

metri

• Obiettivo– Trovare il valore dell’altezza complessiva dello stabile

• Dati– Numero di piani dello stabile (n)– Altezza dei piani (h)

Corso di Programmazione - © Stefano Ferilli - DIB 15/90

Formulazione del ProblemaEsempio

• Imprecisione ed ambiguità– Nell’obiettivo (incognita)– Nei dati

• L’incognita è un valore numerico (espressa nella stessa unità di misura dei valori in ingresso) che rappresenta l’altezza complessiva di uno stabile

6

Corso di Programmazione - © Stefano Ferilli - DIB 16/90

Formulazione del ProblemaEsempio

• Cosa si intende per altezza complessiva?– La distanza fra suolo e parapetto del terrazzo?– O questo è escluso?

• Cosa si intende per numero di piani?– Il piano terra costituisce un piano?– Ed è compreso nel dato n fornitoci?

• Cosa si intende per altezza dei piani?– La distanza che intercorre fra pavimento e soffitto?– O fra due solai successivi?

Corso di Programmazione - © Stefano Ferilli - DIB 17/90

Formulazione del Problema

• Tutti i problemi enunciati a parole contengono delle ipotesi semplificatrici sottintese– Necessità di un certo lavoro preliminare di

interpretazione e di astrazione da parte di colui che risolve il problema

• In particolare quando si parte da un problema relativo ad oggetti reali per ridurlo ad un problema matematico

Corso di Programmazione - © Stefano Ferilli - DIB 18/90

Formulazione del ProblemaEsempio

• Un aeroplano di pattuglia percorre 220 miglia all’ora in atmosfera tranquilla. Esso trasporta benzina per 4 ore di volo sicuro. Se decolla in pattuglia contro un vento di 20 miglia orarie, di quanto può allontanarsi per ritornare sano e salvo?– È sottinteso:

• Che si suppone che il vento continui a soffiare con la stessa intensità durante tutto il volo

• Che l’aeroplano voli in linea retta• Che il tempo necessario per cambiare direzione nel punto

estremo sia trascurabile• …e così via

7

Corso di Programmazione - © Stefano Ferilli - DIB 19/90

Formulazione di un Problema

• NON iniziare a risolvere un problema prima di averlo capito– Lo si è capito quando si è in grado di

riformulare il problema indicando chiaramente• Le incognite• I dati

e spiegando• La condizione

Corso di Programmazione - © Stefano Ferilli - DIB 20/90

Chiarifica

• Riformulazione del problema –considerandolo risolto – cercando di vedere con chiarezza, in ordine conveniente, tutte le relazioni che devono intercorrere fra le incognite ed i dati, in rapporto alla condizione– Se n è il numero delle incognite, ottenere n

equazioni

Corso di Programmazione - © Stefano Ferilli - DIB 21/90

ChiarificaEsempio

• Un fattore ha polli e conigli. Questi animali hanno 50 teste e 140 zampe. Quanti polli e quanti conigli ha il fattore?– Bisogna trovare 2 numeri, p e c, che rappresentano il

numero dei polli e il numero dei conigli rispettivamente– Sono forniti il numero delle teste (50) ed il numero

delle zampe (140)p + c = 50

2p + 4c = 140• 2 = nro zampe per ciascun pollo• 4 = nro zampe per ciascun coniglio

8

Corso di Programmazione - © Stefano Ferilli - DIB 22/90

Chiarifica

• Il chiarimento del problema avviene– Se il proponente il problema è disponibile

• Ponendogli domande puntuali riguardo lo scopo del problema, i dati e le relazioni intercorrenti tra incognita e dati

– Altrimenti • Facendo opportune ipotesi

– Ottenere dei campioni

Corso di Programmazione - © Stefano Ferilli - DIB 23/90

Chiarifica

• La fase di chiarifica– PUÒ raffinare e definire meglio, eventualmente

ricorrendo a delle ipotesi semplificative, quanto non esplicitamente presente nella traccia del problema come fornita dal committente

– NON DEVE disattendere o contravvenire a quanto esplicitamente riportato nella traccia del problema come fornita dal committente

Corso di Programmazione - © Stefano Ferilli - DIB 24/90

Chiarifica

• Generalmente per essere in grado di comprendere il problema bisogna avere delle conoscenze pertinenti– Dominio del problema– Esempio: problemi geometrici

• Il teorema di Pitagora, la proporzionalità dei lati nei triangoli simili, formule per aree e volumi, ecc.

• In generale si fa ricorso alle definizioni

9

Corso di Programmazione - © Stefano Ferilli - DIB 25/90

Analisi

• Input: Traccia del problema• Processo: Chiarire con precisione cosa vuole il

problema (non come va fatto)– Obiettivo del problema

• Dati a disposizione• Risultati desiderati

– Ambiguità e imprecisioni nella definizione del problema

• Obiettivo, dati• Possibilità di capire male le richieste

• Output: Descrizione dettagliata discorsiva del problema

Corso di Programmazione - © Stefano Ferilli - DIB 26/90

AnalisiPunti chiave

• Dati (input)– Formato o tipo, ordine, limiti sui valori, limiti sul

volume, fine dei dati, ipotesi di ordinamento

• Risultati (output)– Contenuto, formato, ordine, limite sul volume

• Errori e Casi limite– Tipi di errori (di input e/o di elaborazione) ed azioni da

intraprendere– Campioni di input e di output corrispondenti

Corso di Programmazione - © Stefano Ferilli - DIB 27/90

AnalisiAmbiguità

• Alcune informazioni su cui è necessario fare delle assunzioni– Ordine dell’input

• 8/7 = 8 luglio o 7 agosto?

– Limiti sui valori• 0 < età < 125

– Errore di elaborazione• ∆ < 0 nelle equazioni di II grado

10

Corso di Programmazione - © Stefano Ferilli - DIB 28/90

AnalisiEsempio

• Data una lista di numeri, stampare il 1° numero della lista, il 2° e così via fino al più grande dei valori presenti nella lista

3 8 2 25 13 19

• Necessità di una fase di chiarifica del problema

Corso di Programmazione - © Stefano Ferilli - DIB 29/90

AnalisiEsempio

• Input: lista di numeri– Insieme composto da non più di 100 valori

interi positivi (>0). • Un valore fittizio nullo, aggiunto in coda

all’insieme, definisce la fine dei dati– Lo 0 non fa parte dei valori

– I dati di ingresso non sono ordinati rispetto al valore

• Campione di Ingresso: 1 7 3 9 5 8

Corso di Programmazione - © Stefano Ferilli - DIB 30/90

AnalisiEsempio

• Output: elenco di valori– Si vuole la stampa di una colonna di numeri che

corrispondono ai numeri di ingresso nello stesso ordine• La colonna inizia con il primo numero e termina quando

l’ultimo numero stampato è il più grande dell’intero insieme di ingresso

– Verranno stampati al massimo un numero di valori pari alla numerosità dell’insieme di input

• Se il valore più grande non è l’ultimo

• Campione di Uscita: 1 7 3 9 (incolonnati)

11

Corso di Programmazione - © Stefano Ferilli - DIB 31/90

AnalisiEsempio

• Input– Quali numeri?

• Reali, interi– Limiti sui valori?

• Qual è il minimo ammissibile? Qual è il massimo?– Ad es., se rappresentassimo età non avrebbero senso dei

valori negativi– Se fossero anni di nascita sarebbero fuori range tutti i

valori > 2002

– Limiti sul volume?• Quanti al massimo potranno essere i dati?

Corso di Programmazione - © Stefano Ferilli - DIB 32/90

AnalisiEsempio

– Come si riconosce la fine dei dati?– Sono ordinati?

• Qual è il criterio di ordinamento?– Crescente, decrescente, non crescente, non decrescente– Lessicografico, …

• Rispetto a cosa (per dati non atomici)?– Cognome, anno di nascita, …

• Controlli sui dati in ingresso– Da realizzarsi nel programma

Corso di Programmazione - © Stefano Ferilli - DIB 33/90

AnalisiEsempio

• Errori e casi limite– Valori negativi

• Scartare il dato, oppure• Prendere il valore assoluto

– Troppi dati (più di 100)• Prendere in considerazione solo i primi 100

– Presenza di più massimi• Fermarsi in output alla prima occorrenza del

massimo

12

Corso di Programmazione - © Stefano Ferilli - DIB 34/90

AnalisiEsempio

– Mancanza di dati (lista vuota)• Prevedere il controllo adeguato da programma

– Mancanza del flag di fine dati• Non rilevabile da programma

• N.B.:– Per ogni situazione di errore individuata va

almeno inviato un messaggio di notifica all’utente

Corso di Programmazione - © Stefano Ferilli - DIB 35/90

Progettazione

• Si occupa di definire una strategia di soluzione che porti ad ottenere il risultato desiderato– Necessita di una definizione chiara del cosa si vuole

ottenere

• Organizza la soluzione in un insieme di moduli cooperanti– Tecniche basate sul metodo di soluzione di problemi

consistente nello scomporre un problema in sottoproblemi più semplici

Corso di Programmazione - © Stefano Ferilli - DIB 36/90

ProgettazioneTecniche di Sviluppo

• Top-Down– Raffinamento successivo della procedura di soluzione– Raffinamento della descrizione dei dati

• Bottom-Up– Sfrutta algoritmi codificati già esistenti raggruppandoli

per adattarli a nuove situazioni

• Ibrida– Basata su una cooperazione fra le tecniche precedenti

13

Corso di Programmazione - © Stefano Ferilli - DIB 37/90

Progettazione

• Input: Analisi del problema• Processo: Chiarire con precisione come va

ottenuto lo scopo voluto dal problema– Strategia di soluzione– Strutture di dati

• Output: Descrizione dettagliata della struttura della soluzione

Corso di Programmazione - © Stefano Ferilli - DIB 38/90

Progettazione

• Individuare una possibile scomposizione in sottoproblemi più semplici

• Descrivere un procedimento risolutivo per ciascun sottoproblema

• Riportare l’algoritmo per il problema originario– Attenzione: l’algoritmo dipende sempre dal

modo in cui sono organizzati i dati

Corso di Programmazione - © Stefano Ferilli - DIB 39/90

ProgettazioneCriteri di Modularizzazione

• Coesione– Misura relativa ad un singolo modulo

• Logica– Modulo di ordinamento

• Di comunicazione• Funzionale

– Modulo per il calcolo degli stipendi• Informativa

– Accorpamento di tutte le funzioni di stampa di messaggi d’errore

– Riguarda il tipo di relazione che esiste tra funzioni svolte e tra dati da esse usati

14

Corso di Programmazione - © Stefano Ferilli - DIB 40/90

ProgettazioneCriteri di Modularizzazione

• Accoppiamento– Misura delle relazioni che esistono fra moduli diversi

• Per dati– Riguarda le modalità di scambio di informazioni fra moduli

» Tramite variabili locali» Tramite parametri per tutti i dati di I/O (applicazione

flessibile per non paralizzare la leggibilità)• Per controllo

– Si passano dati che non vengono modificati, ma determinano l’ordine di esecuzione delle istruzioni

Corso di Programmazione - © Stefano Ferilli - DIB 41/90

ProgettazioneStrategia di Soluzione

• Individuare l’insieme di moduli che costituiscono la soluzione– Il compito specifico di ciascuno

• Rappresentazione strutturata grafica o lineare– Prima descrivere l’algoritmo principale (Main)– Poi dettagliare i singoli blocchi (procedure/funzioni)

– Le loro interazioni• Albero delle procedure

Corso di Programmazione - © Stefano Ferilli - DIB 42/90

ProgettazioneDefinizione dei Dati

• Elencare le principali strutture dati– Per ogni singolo blocco (Main, Procedura o

Funzione) riportare • Identificatori• Uso• Tipo• Range

– Per le procedure parametriche riportare la specifica di interfaccia

15

Corso di Programmazione - © Stefano Ferilli - DIB 43/90

ProgettazioneEsempio

• Problema– Trovare in una agendina il numero telefonico di

una persona di cui sia noto il cognome– Dati di ingresso

• Agendina e cognome

– Dati di uscita• Numero telefonico

– Caso particolare: se nell’agenda non esiste quel cognome? Risposta “non trovato”

Corso di Programmazione - © Stefano Ferilli - DIB 44/90

ProgettazioneEsempio

• Organizzazione di un’agendina– Pagine consecutive– Ordinate alfabeticamente– In base all’intestazione

• Una singola lettera alfabetica• Un gruppo di lettere consecutive

– Ci sono tutte le 26 lettere!

Corso di Programmazione - © Stefano Ferilli - DIB 45/90

ProgettazioneEsempio

• Ogni pagina contiene cognomi ed i corrispondenti numeri telefonici relativi alla propria intestazione– All’interno di ciascuna pagina, i cognomi non

sono generalmente ordinati ma raggruppati– Esempio: GH

• Gruppo dei cognomi che iniziano con G o con H• Non ordinati

16

Corso di Programmazione - © Stefano Ferilli - DIB 46/90

ProgettazioneEsempio

• Descrivere il metodo che si usa quando abbiamo da risolvere questo problema– Algoritmo di ricerca in una agendina

• Bisogna– Pensare “come si fa” a ricercare in un’agendina

telefonica– Darne una descrizione sistematica

Corso di Programmazione - © Stefano Ferilli - DIB 47/90

ProgettazioneEsempio

• Scomposizione del problema in sottoproblemi più semplici il cui insieme sia equivalente al problema di partenza– Trovare la pagina dell’agendina in cui dovrebbe

trovarsi (se c’è) il cognome dato– Ricercare il cognome dato nella pagina trovata

• Risoluzione dei sottoproblemi individuati– Quantunque chiara possa essere la formulazione di un

problema, essa non fornisce, in genere, un metodo che consenta di ottenere il risultato partendo dai dati iniziali!

Corso di Programmazione - © Stefano Ferilli - DIB 48/90

ProgettazioneEsempio

• Sottoproblema 1– Si tratta di un problema di ricerca in un insieme di

pagine ordinato alfabeticamente– L’insieme delle pagine che costituiscono l’agendina è

piccolo– La scansione è sequenziale

• Si sfogliano tutte le pagine, una dopo l’altra, a partire dalla prima

– È una ricerca di sicuro successo• La pagina cercata esiste sicuramente nell’agendina

17

Corso di Programmazione - © Stefano Ferilli - DIB 49/90

ProgettazioneEsempio

• Come– Controlliamo se la pagina attuale è proprio la pagina

cercata• In tal caso avremmo raggiunto il nostro obiettivo (termine della

ricerca)

• Sfogliare una pagina alla volta, iniziando dalla prima pagina, fino a che la pagina attuale contiene nell’intestazione la lettera iniziale del cognome cercato– Confrontare la lettera iniziale del cognome con la

lettera o il gruppo di lettere contenute nell’intestazione della pagina attuale

Corso di Programmazione - © Stefano Ferilli - DIB 50/90

ProgettazioneEsempio

• Individuazione della pagina in cui cercare il cognome voluto– A– B– C– D → se il cognome è DOTOLI,– E termina la scansione– F dell’agendina alla ricerca della pagina– G– …

Corso di Programmazione - © Stefano Ferilli - DIB 51/90

ProgettazioneEsempio

• Entità da rappresentare– Sequenza di pagine

• 2 componenti– Intestazione– Insieme di righi

– Ogni pagina ha un insieme di righi• Tutti con la stessa struttura

– Ogni rigo ha le stesse suddivisioni• Ciascuna destinata ad un’informazione diversa

– Cognome– Numero telefonico

18

Corso di Programmazione - © Stefano Ferilli - DIB 52/90

ProgettazioneEsempio

• Strutture di dati– Agendina: File sequenziale

• Pagina: Record– Intestazione: Insieme di Caratteri– Righi: Array di 25 Record

» Cognome: Array di 30 Caratteri» Numero telefonico: Array di 10 Caratteri

Corso di Programmazione - © Stefano Ferilli - DIB 53/90

ProgettazioneEsempio

• Per il sottoproblema 2– Si tratta di un problema di ricerca in un insieme

di cognomi non ordinati– Non è assicurato che la ricerca avrà successo

• Ossia che si troverà il cognome cercato– La ricerca è di tipo sequenziale (come per il

sottoproblema 1)• Si parte dal primo cognome presente sulla pagina e

si passa al cognome immediatamente successivo

Corso di Programmazione - © Stefano Ferilli - DIB 54/90

ProgettazioneEsempio

• La scansione dei cognomi nella pagina ha termine quando:– Si è trovato un cognome uguale a quello cercato

• In tal caso il numero riportato accanto è il risultato

– Oppure si sono scanditi tutti i cognomi• In tal caso il risultato è “non presente”

19

Corso di Programmazione - © Stefano Ferilli - DIB 55/90

ProgettazioneEsempio

• Sfogliare una pagina alla volta, iniziando dalla prima pagina, fino a che la pagina attuale contiene nell’intestazione la lettera iniziale del cognome cercato

• Scandire sequenzialmente un cognome alla volta, iniziando dal primo, fino a che il cognome attuale coincide con il cognome cercato– e in tal caso comunicare il numero accanto riportato

oppure non ci sono più cognomi– e in tal caso comunicare “non presente”

Corso di Programmazione - © Stefano Ferilli - DIB 56/90

ProgettazioneEsempio

• Ricercare in un elenco telefonico il numero corrispondente ad una persona di cui sia noto il cognome– Molte pagine

• Più pagine per lettera– Ordinamento a più livelli

• Paesi• Cognomi

• Ricercare in un vocabolario il significato corrispondente ad un termine dato– Stesse modalità di consultazione

Corso di Programmazione - © Stefano Ferilli - DIB 57/90

Progettazione

• Elementi a disposizione– Dati in ingresso– Dati in uscita– Relazioni esistenti fra essi

• Prodotto– Rappresentazione delle entità del problema– Suddivisione in sottoproblemi– Strategia per passare dalle entità in ingresso a quelle in

uscita

20

Corso di Programmazione - © Stefano Ferilli - DIB 58/90

Codifica

• Si occupa di realizzare nel miglior modo possibile la strategia solutiva – Necessita di una definizione chiara del come si

giunge alla soluzione del problemacon il linguaggio di programmazione a disposizione– Tipi e costruttori di tipo predefiniti– Definizioni di sottoprogrammi

Corso di Programmazione - © Stefano Ferilli - DIB 59/90

Qualità di un Programma

• Correttezza– Aderenza alle

specifiche

• Leggibilità• Efficienza

– Uso delle risorse

• Modularità– Grado di

organizzazione interna

• Modificabilità• Parametricità

– Grado di generalità

• Portabilità– Diversi ambienti di

calcolo

• Robustezza– Gestione di situazioni

impreviste

Corso di Programmazione - © Stefano Ferilli - DIB 60/90

LeggibilitàEsempio

• Costruire un programma che crei una matrice quadrata diagonale ad elementi unitari

1 0 0 00 1 0 00 0 1 00 0 0 1

21

Corso di Programmazione - © Stefano Ferilli - DIB 61/90

LeggibilitàEsempio

• Leggibile:

for i := 1 to n dofor j := 1 to n do

if i = j thenM[i,j] := 1elseM[i,j] := 0

• Poco chiara:

for i := 1 to n dofor j := 1 to n do

M[i,j] := (i DIV j) * (j DIV i)

– Basata sull’assunzione non esplicita che

n DIV m = 0 sse n < m

Corso di Programmazione - © Stefano Ferilli - DIB 62/90

Codifica

• Input: Progetto di soluzione del problema• Processo: Realizzare la soluzione in un

linguaggio di programmazione– Strategia di soluzione– Strutture di dati

• Output: Codice sorgente e corrispondente programma compilato

Corso di Programmazione - © Stefano Ferilli - DIB 63/90

Codifica

• Il prodotto va in ingresso– All’elaboratore per l’esecuzione

• Istruzioni dichiarative ed operative– Poco naturali per gli esseri umani

– Ai programmatori per le modifiche• Necessità di documentazione che ne aumenti la

comprensibilità– Non richiesta dall’elaboratore

• Necessità di coerenza con la progettazione

22

Corso di Programmazione - © Stefano Ferilli - DIB 64/90

CodificaAutodocumentazione

• Parole chiave in maiuscolo• Identificatori significativi• Commentare opportunamente

– La funzione delle variabili– La funzione svolta dai frammenti di programma

• Indentare correttamente e con metodo uniforme• Separare visivamente i blocchi di programma• Non usare istruzioni di salto• Non modificare gli indici dei cicli for

Corso di Programmazione - © Stefano Ferilli - DIB 65/90

CodificaEsempio Errato

program t (input ,output) ;var n, f, i: integer;begin

readln(n);f := 1;if n>0 then

for i:=1 to n dof := f * i;

writeln(f);end.

• Identificatori non significativi

• Mancanza di commenti

• Assenza di controlli sui valori in ingresso– Valori negativi

Corso di Programmazione - © Stefano Ferilli - DIB 66/90

CodificaEsempio Corretto

program fattoriale (input, output); (* calcola n! mediante algoritmo iterativo *)var n, nfatt, i : integer;begin (* main *)

writeln (‘ *** fattoriale ***’);repeat (* lettura di n e verifica di non negatività *)

writeln;write (‘ Immettere un intero >= 0’);readln(n);

until n >= 0 ;(* calcolo di n! *)nfatt:= 1;if n >0 then

for i :=1 to n donfatt:= nfatt*i;

writeln (‘ fattoriale di’,n:5,’=’,nfatt:8) (* stampa del fattoriale calcolato n! *)end. (* main *)

23

Corso di Programmazione - © Stefano Ferilli - DIB 67/90

Verifica

• È estremamente raro che un programma sia scritto senza alcun errore– Necessità di verifica prima del rilascio

• Individuazione degli errori• Correzione

– Correttezza di un programma• Terminazione e risposta corretta per ingressi corretti• Riconoscimento e segnalazione di ingressi errati

Corso di Programmazione - © Stefano Ferilli - DIB 68/90

Verifica

• Un programma descrive una classe di processi– Obiettivo: correttezza per qualunque ingresso

• Metodi di verifica– Analitico

• Dimostrazione formale di correttezza

– Empirico• Controllo di correttezza su singoli processi

Corso di Programmazione - © Stefano Ferilli - DIB 69/90

VerificaMetodo Analitico

• Correttezza– Inserimento di asserzioni logiche nei punti chiave del

programma • Reso possibile dalla strutturazione

– Precondizioni, Postcondizioni, Invarianti

– Dimostrazione formale della validità delle asserzioni

• Terminazione– Analisi dei cicli– Analisi delle ricorsioni

24

Corso di Programmazione - © Stefano Ferilli - DIB 70/90

VerificaMetodo Empirico

• Ispezione preliminare– Lettura del testo del codice sorgente per

individuare errori• Tracing

– Analisi minuziosa dell’esecuzione• Test

– Esecuzione su particolari dati in ingresso

Corso di Programmazione - © Stefano Ferilli - DIB 71/90

Ispezione Preliminare

• Mancata dichiarazione di variabili– Non rilevata dal

compilatore in caso di shadowing

• Variabili locali con lo stesso nome di variabili non locali

• Mancata inizializzazione di variabilibegincont := cont + 1

• Confusione fra identificatori simili

conta := cont + 1

Corso di Programmazione - © Stefano Ferilli - DIB 72/90

Ispezione Preliminare

• Confusione nell’uso di operatori (aritmetici, relazionali, logici)– Non sono errori d’uso

del linguaggio• Non riconosciuti dal

compilatore

i := i – 1 i := i + 1if i < j if i > jp OR q p AND q

• Riferimento ad elementi non validi di array– Fuori limite– Non significativi

• Non è un errore di esecuzione

A: array[1..10] of …A[0] A[11]A[9] con 8 valori inseriti

25

Corso di Programmazione - © Stefano Ferilli - DIB 73/90

Ispezione Preliminare• Condizioni errate di

terminazione dei cicli– Esecuzione di un ciclo di

troppo

j := 0while j <= n do

beginj := j + 1;read(a[j])

end

– Eseguito n + 1 volte

• Condizioni errate di terminazione dei cicli– Salto del primo elemento

j := 1while j < n do

beginj := j + 1;read(a[j])

end

– Viene saltato a[1]

Corso di Programmazione - © Stefano Ferilli - DIB 74/90

Ispezione Preliminare

• Condizioni errate di terminazione dei cicli– Variabile di iterazione

non modificata

while n < 10 doread(dato)

– n non arriverà mai a 10

• Condizioni errate di terminazione dei cicli– Valore iniziale della

variabile di iterazione

while n < 10 dobegin

read(dato)n := n + 1;

end

– Numero di iterazioni variabile

Corso di Programmazione - © Stefano Ferilli - DIB 75/90

Ispezione Preliminare

• Condizioni errate di terminazione dei cicli– Terminazione dipendente

dall’evoluzione

while dato > 0 doread(dato)

– dato potrebbe non essere mai negativo

• Corrispondenza fra parametri formali ed effettivi nelle chiamate di sottoprogrammi– Errori di semantica statica

• Modalità di passaggio dei parametri– Per valore invece che per

riferimento

26

Corso di Programmazione - © Stefano Ferilli - DIB 76/90

Tracing

• Simulare manualmente l’esecuzione del programma, scrivendo su carta l’evoluzione del contenuto delle variabili dopo ogni singolo passo– Consente di accorgersi del punto in cui

avvengono• Mutazioni impreviste• Operazioni non consentite

Corso di Programmazione - © Stefano Ferilli - DIB 77/90

Metodo delle Stampe

• Inserire nel punto critico del programma istruzioni di stampa– Del contenuto di alcune variabili– Della fase di elaborazione attraversata

e rieseguirlo– Consentono di ottenere ed analizzare

informazioni dettagliate sul comportamento del programma e sull’evoluzione dell’elaborazione

Corso di Programmazione - © Stefano Ferilli - DIB 78/90

Test

• Analizzare il comportamento in output del programma per particolari valori di input– Impossibilità di provare tutte le combinazioni di

valori ammesse dai domini delle variabili in ingresso

– Impossibilità di assicurare, per quanto accurato sia il test, la correttezza del programma in tutte le possibili situazioni di operatività

27

Corso di Programmazione - © Stefano Ferilli - DIB 79/90

Test

• A scatola nera– Ricercano le condizioni in cui il programma

non si comporta secondo le specifiche date• Esempio: Divisione in classi di equivalenza

• A scatola trasparente– Esaminano la struttura e la logica del

programma• Esempio: Copertura

Corso di Programmazione - © Stefano Ferilli - DIB 80/90

Test a Scatola Nera

• Cerca le condizioni in cui il programma non rispetta le specifiche date senza tener conto della sua struttura

• Basato sull’esame del solo input e output del programma– Si divide l’insieme dei possibili dati in ingresso in

classi di equivalenza• Ciascuna rappresenta un insieme di dati di ingresso con

caratteristiche simili• Per ciascuna, si prova il programma con un solo insieme di dati

Corso di Programmazione - © Stefano Ferilli - DIB 81/90

Test a Scatola Nera

• La determinazione delle classi di equivalenza non è univoca– Avviene partendo dalle specifiche del problema

• Provenienti dalla fase di analisied individuando

• Casi tipici– Uso e comportamento comune

• Casi limite– Stressano il programma

28

Corso di Programmazione - © Stefano Ferilli - DIB 82/90

Test a Scatola NeraErrori nei Dati di Ingresso

• Dati di ingresso– Corretti

• Validi rispetto alle specifiche del problema• Appartenenti al dominio di definizione

– Errati• Non rispettano le specifiche

• Se non ci sono controlli e vengono immessi dati errati che non sono rilevati da programma– L’esecuzione si interrompe– L’esecuzione continua

• I risultati saranno errati

Corso di Programmazione - © Stefano Ferilli - DIB 83/90

Test a Scatola NeraErrori nei Dati di Ingresso

• Un programma deve essere in grado di– Individuare errori nei dati di ingresso– Notificare l’anomalia all’utente tramite opportuni

messaggi significativi

• Generalmente ci si limita a considerare solo alcuni dei possibili errori nei dati di ingresso– I più probabili– I più pericolosi

Corso di Programmazione - © Stefano Ferilli - DIB 84/90

Test a Scatola NeraCasi Limite

• Limiti sul volume– Minima e massima dimensione consentita– Valori esterni alla minima e massima dimensione

consentita

• Limiti di valore– Minimo e massimo valore consentito– Valori eccedenti il minimo e massimo consentiti

• Esempi: 18 ≤ età per il servizio di leva ≤ 26n ≥ 0 per n!

29

Corso di Programmazione - © Stefano Ferilli - DIB 85/90

Test a Scatola NeraCasi Particolari

• Valori speciali 0, 1, ∃, ∀– A seconda del problema

• Valori ripetuti o doppioni– In problemi di ordinamento e ricerca

Corso di Programmazione - © Stefano Ferilli - DIB 86/90

Test a Scatola NeraEsempio

• Problema: ricerca di un valore in un array di Nelementi interi– Classe 1

• Input: L’array ha più di un elemento uno dei quali è il valore cercato (ma non il primo né l’ultimo)

• Output: Trovato

– Classe 2• Input: L’array ha più di un elemento, il primo dei quali è il

valore cercato• Output: Trovato

Corso di Programmazione - © Stefano Ferilli - DIB 87/90

Test a Scatola NeraEsempio

– Classe 3• Input: L’array ha più di un elemento, l’ultimo dei quali è il

valore cercato• Output: Trovato

– Classe 4• Input: L’array ha più di un elemento, nessuno dei quali è il

valore cercato• Output: Non trovato

– Classe 5• Input: L’array ha un solo elemento, pari al valore cercato• Output: Trovato

30

Corso di Programmazione - © Stefano Ferilli - DIB 88/90

Test a Scatola NeraEsempio

– Classe 6• Input: L’array ha un solo elemento, che non è il valore cercato• Output: Non trovato

– Classe 7• Input: L’array non ha elementi (caso particolare)• Output: Messaggio di array vuoto

– Classe 8• Input: L’array più di un elemento, dei quali più di uno coincide

col valore cercato• Output: Trovato (Il primo? L’ultimo? Avverte che ce n’è più di

uno? Dipende dalle specifiche date)

Corso di Programmazione - © Stefano Ferilli - DIB 89/90

Test a Scatola NeraEsempio

– Classe 9• Input: N fuori dal range degli indici dell’array

– Negativo– > max

• Output: Messaggio di errore di dimensione

Corso di Programmazione - © Stefano Ferilli - DIB 90/90

Correzione degli Errori

• Dopo aver individuato un errore nel programma, bisogna eliminarlo– L’attività correzione è molto delicata

• Possibilità che l’errore non sia nel punto in cui si è manifestato

• Possibilità di introduzione di ulteriori errori durante la correzione di alcuni

– Cattiva leggibilità e/o organizzazione del programma– Fretta e/o Superficialità