• Non ci sono risultati.

Corso di Programmazione Progettazione di Programmi

N/A
N/A
Protected

Academic year: 2021

Condividi "Corso di Programmazione Progettazione di Programmi"

Copied!
48
0
0

Testo completo

(1)

Corso di Programmazione - © Stefano Ferilli - DIB

Progettazione di Programmi

Dott. Stefano Ferilli

ferilli@di.uniba.it

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

(2)

Corso di Programmazione - © Stefano Ferilli - DIB

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

Sviluppo di un Programma

Fasi

• Codifica

– Scrittura del programma

• Verifica (e correzione)

– (Test) del programma

• Rimanda ad una delle fasi precedenti

• Manutenzione

– Correttiva – Adattativa – Migliorativa

(3)

Corso di Programmazione - © Stefano Ferilli - DIB

• 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

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

(4)

Corso di Programmazione - © Stefano Ferilli - DIB

Problema

Parti 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

Problema

• Comprendere il problema

– Il suo significato – Il suo scopo

come un tutt’uno

• Vederne molto chiaramente le parti principali

– Incognita – Condizioni – Dati

(5)

Corso di Programmazione - © Stefano Ferilli - DIB

• 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

Formulazione del Problema

• I problemi reali sono tutt’altro che ben formulati

– I dati

• Sono sufficienti?

• Sono sovrabbondanti?

– La condizione

• È sufficiente, è sovrabbondante?

• È contraddittoria?

(6)

Corso di Programmazione - © Stefano Ferilli - DIB

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

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

(7)

Corso di Programmazione - © Stefano Ferilli - DIB

• 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

Formulazione del Problema

Esempio

• 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)

(8)

Corso di Programmazione - © Stefano Ferilli - DIB

Formulazione del Problema

Esempio

• 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

Formulazione del Problema

Esempio

• 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?

(9)

Corso di Programmazione - © Stefano Ferilli - DIB

• 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

Formulazione del Problema

Esempio

• 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

(10)

Corso di Programmazione - © Stefano Ferilli - DIB

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

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

(11)

Corso di Programmazione - © Stefano Ferilli - DIB

Esempio

• 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

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

(12)

Corso di Programmazione - © Stefano Ferilli - DIB

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

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

(13)

Corso di Programmazione - © Stefano Ferilli - DIB

• 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

Analisi

Punti 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

(14)

Corso di Programmazione - © Stefano Ferilli - DIB

Analisi

Ambiguità

• 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

Analisi

Esempio

• 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

(15)

Corso di Programmazione - © Stefano Ferilli - DIB

Esempio

• 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

Analisi

Esempio

• 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)

(16)

Corso di Programmazione - © Stefano Ferilli - DIB

Analisi

Esempio

• 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?

Analisi

Esempio

– 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

(17)

Corso di Programmazione - © Stefano Ferilli - DIB

Esempio

• 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

Analisi

Esempio

– 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

(18)

Corso di Programmazione - © Stefano Ferilli - DIB

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

Progettazione

Tecniche 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

(19)

Corso di Programmazione - © Stefano Ferilli - DIB

• 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

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

(20)

Corso di Programmazione - © Stefano Ferilli - DIB

Progettazione

Criteri 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

Progettazione

Criteri 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

(21)

Corso di Programmazione - © Stefano Ferilli - DIB

Strategia 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

Progettazione

Definizione 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

(22)

Corso di Programmazione - © Stefano Ferilli - DIB

Progettazione

Esempio

• 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”

Progettazione

Esempio

• 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!

(23)

Corso di Programmazione - © Stefano Ferilli - DIB

Esempio

• 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

Progettazione

Esempio

• 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

(24)

Corso di Programmazione - © Stefano Ferilli - DIB

Progettazione

Esempio

• 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!

Progettazione

Esempio

• 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

(25)

Corso di Programmazione - © Stefano Ferilli - DIB

Esempio

• 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

Progettazione

Esempio

• 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 – …

(26)

Corso di Programmazione - © Stefano Ferilli - DIB

Progettazione

Esempio

• 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

Progettazione

Esempio

• 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

(27)

Corso di Programmazione - © Stefano Ferilli - DIB

Esempio

• 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

Progettazione

Esempio

• 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”

(28)

Corso di Programmazione - © Stefano Ferilli - DIB

Progettazione

Esempio

• 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”

Progettazione

Esempio

• 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

(29)

Corso di Programmazione - © Stefano Ferilli - DIB

• 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

Codifica

• Si occupa di realizzare nel miglior modo possibile la strategia solutiva

– Necessita di una definizione chiara del come si giunge alla soluzione del problema

con il linguaggio di programmazione a disposizione

– Tipi e costruttori di tipo predefiniti – Definizioni di sottoprogrammi

(30)

Corso di Programmazione - © Stefano Ferilli - DIB

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

Leggibilità

Esempio

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

1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

(31)

Corso di Programmazione - © Stefano Ferilli - DIB

Esempio

• Leggibile:

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

if i = j then M[i,j] := 1 else M[i,j] := 0

• Poco chiara:

for i := 1 to n do for 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

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

(32)

Corso di Programmazione - © Stefano Ferilli - DIB

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

Codifica

Autodocumentazione

• 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

(33)

Corso di Programmazione - © Stefano Ferilli - DIB

Esempio Errato

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

begin readln(n);

f := 1;

if n>0 then

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

writeln(f);

end.

• Identificatori non significativi

• Mancanza di commenti

• Assenza di controlli sui valori in ingresso

– Valori negativi

Codifica

Esempio 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 do nfatt:= nfatt*i;

(34)

Corso di Programmazione - © Stefano Ferilli - DIB

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

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

(35)

Corso di Programmazione - © Stefano Ferilli - DIB

Metodo 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

Verifica

Metodo Empirico

• Ispezione preliminare

– Lettura del testo del codice sorgente per individuare errori

• Tracing

– Analisi minuziosa dell’esecuzione

• Test

– Esecuzione su particolari dati in ingresso

(36)

Corso di Programmazione - © Stefano Ferilli - DIB

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 variabili

begin

cont := cont + 1

• Confusione fra identificatori simili

conta := cont + 1

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 + 1 if i < j if i > j p 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

(37)

Corso di Programmazione - © Stefano Ferilli - DIB

• Condizioni errate di terminazione dei cicli

– Esecuzione di un ciclo di troppo

j := 0

while j <= n do begin

j := j + 1;

read(a[j]) end

– Eseguito n + 1 volte

• Condizioni errate di terminazione dei cicli

– Salto del primo elemento

j := 1

while j < n do begin

j := j + 1;

read(a[j]) end

– Viene saltato a[1]

Ispezione Preliminare

• Condizioni errate di terminazione dei cicli

– Variabile di iterazione non modificata

while n < 10 do read(dato)

– n non arriverà mai a 10

• Condizioni errate di terminazione dei cicli

– Valore iniziale della variabile di iterazione

while n < 10 do begin

read(dato) n := n + 1;

end

– Numero di iterazioni variabile

(38)

Corso di Programmazione - © Stefano Ferilli - DIB

Ispezione Preliminare

• Condizioni errate di terminazione dei cicli

– Terminazione dipendente dall’evoluzione

while dato > 0 do read(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

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

(39)

Corso di Programmazione - © Stefano Ferilli - DIB

• 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

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à

(40)

Corso di Programmazione - © Stefano Ferilli - DIB

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

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

(41)

Corso di Programmazione - © Stefano Ferilli - DIB

• La determinazione delle classi di equivalenza non è univoca

– Avviene partendo dalle specifiche del problema

• Provenienti dalla fase di analisi

ed individuando

• Casi tipici

– Uso e comportamento comune

• Casi limite

– Stressano il programma

Test a Scatola Nera

Errori 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

(42)

Corso di Programmazione - © Stefano Ferilli - DIB

Test a Scatola Nera

Errori 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

Test a Scatola Nera

Casi 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 ≤26 n ≥0 per n!

(43)

Corso di Programmazione - © Stefano Ferilli - DIB

Casi Particolari

• Valori speciali 0, 1,

,

∀ – A seconda del problema

• Valori ripetuti o doppioni

– In problemi di ordinamento e ricerca

Test a Scatola Nera

Esempio

• Problema: ricerca di un valore in un array di N elementi 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

(44)

Corso di Programmazione - © Stefano Ferilli - DIB

Test a Scatola Nera

Esempio

– 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

Test a Scatola Nera

Esempio

– 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)

(45)

Corso di Programmazione - © Stefano Ferilli - DIB

Esempio

– Classe 9

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

– Negativo – > max

• Output: Messaggio di errore di dimensione

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à

(46)

Corso di Programmazione - © Stefano Ferilli - DIB

Consegna

• Progetto cartaceo

– Documentazione dettagliata di tutte le fasi

• Dischetto (esente da virus)

– Sorgenti

– Eseguibili

– Documentazione

Consegna

Documentazione

• Analisi

– Chiarifica discorsiva del problema

• Omissioni

• Imprecisioni

• Ambiguità

• Valori accettati

• Casi estremi

• Comportamento

• Assunzioni ed Ipotesi semplificative

(47)

Corso di Programmazione - © Stefano Ferilli - DIB

Documentazione

• Progetto

– Strutturazione ad albero dei sottoprogrammi – Algoritmi dei sottoprogrammi

• Espressi in un formalismo strutturato

– Strutture di dati

• Parametri dei sottoprogrammi

• Variabili locali

Consegna

Documentazione

• Codifica

– C standard – Indentazione

– Identificatori significativi – Commenti opportuni

• Funzione degli identificatori

• Porzioni di programma

(48)

Corso di Programmazione - © Stefano Ferilli - DIB

Consegna

Documentazione

• Test

– Classi di equivalenza – Istanze di ciascuna classe – Output per ciascuna classe

Riferimenti

Documenti correlati

Scrivere il codice di una subroutine IN AD1 che accetti come parametri nel registro R1 il numero di dati (word) da leggere dalla periferica AD1, ed in R2 l’indirizzo di memoria da

Da questo punto di vista, dove consen- tito dalle condizioni del contesto e dalle indicazioni poste dall’UE nella direzione di ridurre la volumetria degli edifici, il pia- no terra

Problema di programmazione convessa.. I funzioni

Definire una funzione scambia che ricevendo due parametri di tipo struct automobile scambi il contenuto delle due strutture (Attenzione! I due parametri hanno entrambi un ruolo

– Il corrispondente parametro effettivo deve essere l’identificatore di una procedura o di una funzione con i medesimi requisiti riguardo a parametri o tipo del risultato. –

It is recommended that thè user limit bandwidth to thè lowest frequency needed by thè application 5 to maximize thè resolution and dynamic range of thè accelerometer.. With thè

 Stabilisci dei limiti di tempo al tuo giocare e prenditi del tempo per delle pause – Dai un occhio all’orologio, prenditi una pausa di tanto in tanto e non giocare oltre il tempo

Effetti Spending Review Istituzione