Lezione_01_progr4_Sv..

Transcript

Lezione_01_progr4_Sv..
Programmazione
g
z
I
a.a 2009-2010
docente: Carmine Gravino
Sviluppo
pp dei Programmi
g
Presentazione realizzata dal Prof. Andrea De Lucia
1
Sviluppo dei programmi
Analisi e
Specifica
Progettazione
Codifica
Verifica
2
Analisi e Specifica
p f
- Definizione di cosa ffa il pprogramma
g
)Individuazione dei dati di ingresso e di uscita, della
precondizione e della regola di trasformazione dei dati di
ingresso in dati di uscita (postcondizione)
- Buona norma utilizzare un dizionario dei dati da
arricchire durante le varie fasi del ciclo di vita
)Una tabella
)U
t b ll il cuii schema
h
è
è:
‹ Attributo, Tipo, Descrizione
‹ La
L descrizione
d
i i
serve a specificare
ifi
meglio
li l’attributo
l’ tt ib t e
a descrivere il contesto in cui il dato viene usato
3
Un esempio: conversione di misura ...
™
™
™
™
Dati di ingresso: cm
Precondizione:
i i
cm >= 0
Dati di uscita: <feet, inch>
Postcondizione: feet è il massimo numero di piedi contenuti
in cm e inch è il valore in pollici corrispondenti alla
differenza tra cm e il valore in centimetri di feet.
feet Il fattore
di conversione tra pollici e centimetri è 2.54 e un piede
equivale
q
a 12 p
pollici
Attributo
Cm
feet
inch
Tipo
Descrizione
reale
intero
reale
Misura in centimetri in ingresso
Misura in piedi in uscita
Misura in pollici in uscita
4
Progettazione
g
Definizione di come il programma effettua la
trasformazione specificata;
™ Progettazione dell’algoritmo per raffinamenti
successivi (stepwise refinement) ...
™ Decomposizione funzionale ... (più avanti nel corso)
™
- Esempio:
p Algoritmo
g
pper conversione di misura
input cm
calcola feet e inch a partire da cm
output
t t feet
f e inch
i h
5
Stepwise
p
refinement
f
- Dettagliare il passo di calcolo;
calcola
l l inch
i h totali
t t li (totalInches
(t t lI h = cm / 2.54)
2 54)
calcola feet a partire da inch totali
(feet = parte_intera (totalinches / 12))
calcola inch rimanenti da inch totali e feet
(inch = totalInches - feet * 12)
… introduzione variabile locale di tipo reale totalInches
6
Modifica
f del dizionario dei dati
™
Il dizionario dei dati viene modificato ogni volta che
viene introdotta una variabile nella progettazione
dell’algoritmo;
Attributo
Tipo
Cm
feet
inch
totalInches
reale
intero
reale
reale
Descrizione
Misura in centimetri in ingresso
Misura in piedi in uscita
Misura in pollici in uscita
Misura in pollici dei centimetri
in ingresso
7
Codifica
f e Verifica
f
- Codifica
Cod c de
dell’algoritmo
go
o nel
e linguaggio
gu gg o sce
sceltoo
- Verifica del programma (individuazione degli
errori)
i)
)Scelta dei casi di prova
)Esecuzione del programma
Verifica dei risultati rispetto ai risultati attesi
)Verifica
- Utilizzo del software di base ...
- Il nostro esempio ...
8
#include <stdio.h>
<stdio h>
main()
{
float totalInches, cm, inch;
i t feet;
int
f t
Codifica
p
printf("This
(
pprogram
g
converts centimeters to feet and inches.\n");
)
printf("Length in centimeters? ");
(
, & cm);
);
scanf("%f",
totalInches = cm / 2.54;
feet = totalInches / 12;;
inch = totalInches - feet * 12;
printf("%f
printf(
%f cm = %d ft + %f in.\n
in.\n",, cm, feet, inch);
}
9
Ambiente di pprogrammazione
g
z
integrato
g
Contiene editor
editor, compilatore
compilatore, collegatore
collegatore,
e tool per testing e debugging
10
Ambiente non integrato
g
(S.O. Linux)
™ Un
editor di testo: vi oppure pico
)vii nomefile.c
)
fil
)pico nomefile.c
™ Un
compilatore e un collegatore integrati: gcc
)Compilazione:
Compilazione: gcc -cc nomefile.c
nomefile c
‹
prodotto il programma oggetto nomefile.o
)Collegamento: gcc nomefile.o
nomefile o –o
o nomefile
‹
prodotto il programma eseguibile nomefile
)Compilazione e collegamento:
gcc nomefile.c –o nomefile
‹
prodotto il file nomefile
11
Scelta dei casi di prova e verifica
™
I casi di prova non vanno scelti “a caso”
)l’obiettivo è quello di una verifica il più possibile
esaustiva … (NB: verificare la correttezza di un qualsiasi
pprogramma
g
è in ggenerale indecidibile ...))
)… cercare di evitare i casi di prova ridondanti
)ii casi di prova e i risultati della verifica vanno
documentati ...
IInput
(cm)
O
Output atteso
(feet, inch)
0
69.85
<0,0>
< 2 , 3.5 >
O
Output effettivo
ff i
(feet, inch)
< 0 , 0 > --- PASS
< 2 , 3.5 > --- PASS
12
Errori nella stesura dei programmi
p g
- Errori sintattici (individuati in fase di
compilazione)
il i )
)A causa di errata scrittura o di mancanza di
conoscenza delle regole del linguaggio (ad es.
mancanza del “;” alla fine di una istruzione)
- Errori logici (più difficili da correggere)
)A causa di una errata trascrizione durante la
codifica dell’algoritmo (ad es. scrittura del numero
4 invece del numero 2)
)Si manifestano con malfunzionamenti durante
l’
l’esecuzione
del
d l programma
13
Errori logici
- Possono essere di diverso tipo:
)Errori nella definizione del pproblema (fasi
(
di analisi
e specifica)
Errori di progettazione (es
(es. nella definizione/scelta
)Errori
dell’algoritmo)
)Errori nella stesura (codifica) dei programmi
- Causano malfunzionamenti del programma
- Più alta è la fase in cui avviene l’errore più è
difficile correggerlo:
)propagazione dell’errore alle fasi più basse
)correzione degli errori: debugging
14
#include <stdio.h>
<stdio h>
main()
{
float totalInches, cm, inch;
i t feet;
int
f t
Programma
g
con
errore (bug)
p
printf("This
(
pprogram
g
converts centimeters to feet and inches.\n");
)
printf("Length in centimeters? ");
(
, & cm);
);
scanf("%f",
eerrore
oe
totalInches = cm * 2.54;
feet = totalInches / 12;;
inch = totalInches - feet * 12;
printf("%f
printf(
%f cm = %d ft + %f in.\n
in.\n",, cm, feet, inch);
}
15
Verifica e Debugging
™
Input
(cm)
Output atteso
(feet, inch)
0
69 85
69.85
<0,0>
< 2 , 3.5
35>
Output effettivo
(feet, inch)
< 0,0>
--- OK
< 14 , 9.419
9 419 > --- FAIL
Ricerca dell’errore nel programma
)Ispezione
i
del codice
i ed esecuzione
i
simulata
i
)Esecuzione e controllo dello stato del programma nei
punti “sospetti” e nei punti critici
‹
Stato del programma: l’insieme dei valori assegnati alle diverse
variabili prima dell’esecuzione di una data istruzione
)Strumenti automatici negli ambienti di programmazione
™
Rimozione dell’errore e nuova verifica con il caso di
prova su cui è stato rilevato il malfunzionamento
16
Controllo precondizione
p
™
Cosa succede se al programma precedente viene
dato in ingresso un valore negativo per cm ?
) l i di uscita
)valori
it indefiniti
i d fi iti ...
)preferibile evitare queste situazioni ...
™
L’istruzione di selezione può essere utilizzata per
controllare la precondizione, prima
dell’elaborazione dei dati di ingresso
™
durante la verifica del programma usare anche casi
di prova che violano la precondizione ...
17
... rivisitiamo l’algoritmo
g
per
p la
conversione di misura ...
input cm
if(cm >= 0) {
/* test precondizione */
calcola feet e inch a partire da cm
/* da raffinare */
output feet e inch }
p “errore: valore di ingresso
g
negativo”
g
else output
18
#include <stdio.h>
main() {
float totalInches, cm, inch;
int feet;
Conversione da
centimetri a piedi
e pollici
lli i
printf("Conversion of centimeters to feet and inches.\n“);
printf("Length in centimeters? “);
scanf("%f", & cm); /* Input cm */
if (cm >= 0) { /* test precondizione */
totalInches = cm / 2.54;
feet = totalInches / 12;
inch = totalInches - feet * 12;
printf("%f cm = %d ft + %f in.\n", cm, feet, inch);}
else pprintf(“errore,
(
, valore di ingresso
g
negativo
g
\n”);
);
}
19
... verifica
f
Input
(cm)
Output atteso
(feet, inch)
Output effettivo
(feet, inch)
0
69.85
-9.7
<0,0>
< 2 , 3.5 >
msg errore
< 0 , 0 > --- PASS
< 2 , 3.5 > --- PASS
msg errore --- PASS
20
- Analisi e specifica
p
Un altro
esempio: Il
ffattoriale
)Dati di ingresso: n
)Dati
Dati di uscita: fatt
)Precondizione: n >= 0
)Postcondizione:
Postcondizione: se n = 0 allora fatt = 1
altrimenti fatt = n * (n-1) * … * 2 * 1
™
Progettazione
input n
if (n >= 0) {
/* test precondizione */
calcola il fattoriale di n e assegnalo a fatt
output fatt
}
else
l output
t t “errore:
“
valore
l
di ingresso
i
negativo”
ti ”
21
Stepwise
p
refinement
f
™
Raffinamento del passo:
calcola il fattoriale di n e assegnalo a fatt
fatt = 1
for (i = 2 ; i <= n ; i++)
fatt = fatt * i
Attributo
n
fatt
i
Tipo
intero
intero
intero
Descrizione
Numero in ingresso
Fattoriale del numero in uscita
Indice del ciclo
22
#include <stdio.h>
main()
{
int n, fatt, i;
Programma
g
fattoriale
printf(“Inserisci
i f(“I
i i un intero
i
positivo:
ii
”);
”)
scanf(“%d”, &n);
if (n >= 0) {
/* test precondizione */
fatt = 1;
for(i =2; i <= n; i++)
fatt = fatt * i;
printf(“Fattoriale
i tf(“F tt i l di %d : %d \n”,
\ ” n, fatt);
f tt)
}
else printf(“errore
printf( errore, valore di ingresso negativo \n
\n”);
);
}
23
... verifica
f
Input
(n)
Output atteso
(fatt)
0
4
-2
1
24
msg errore
Output effettivo
(fatt)
1
--- PASS
24
--- PASS
msg errore --- PASS
24
Forzare la precondizione ad
essere verificata
™
Nell’esempio
N
ll’
i precedente
d t il programma sii arresta
t con
un messaggio di errore nel caso in cui la
precondizione
di i
non è soddisfatta
ddi f tt
)input x
if (precondizione(x))
(
di i ( )) elabora
l b
else messaggio di errore
™
In alcuni
l i casii potrebbe
bb essere preferibile
f ibil ripetere
i
l’immissione dell’input (è una scelta di progetto)
)do input x
while (!precondizione(x))
elaborazione
l b
i
25
#include <stdio.h>
main()
{
int n, fatt, i;
… Forzare la
precondizione ...
do {
p
printf(“Inserisci
(
un intero ppositivo: ”);
)
scanf(“%d”, &n);
}while(n < 0);
/* test precondizione */
Ripete l’input
finché la
precondizione
non è verificata
fatt = 1;
for(i =2;
2; i <
<= n; i++)
fatt = fatt * i;
printf(“Fattoriale di %d : % d \n”, n, fatt);
}
26
Differenziare la prima immissione ...
™
In alcuni casi è preferibile visualizzare un messaggio
di errore nel caso di input che violano la
precondizione
™
Ovviamente tale messaggio non deve comparire alla
prima immissione: necessità di trattare la prima
immissione fuori dal ciclo
input x;
while (!precondizione(x)) {
i di errore;
messaggio
input x; }
elaborazione
done = FALSE;
while (! done) {
input x;
if(
if(precondizione(x))
di i ( ))
done = TRUE;
else messaggio di errore;}
elaborazione
27
#include <stdio.h>
… prima immissione ...
main()
{
int n, fatt, i;
printf(“Inserisci
printf(
Inserisci un intero positivo: ”);
);
scanf(“%d”, &n);
while(n
( < 0)) {
printf(“Errore: numero negativo ! \n”);
printf(“Inserisci un intero positivo: ”);
scanf(“%d”,
f(“%d” &n);
& ) }
fatt = 1;
for(i =2;
2; i <
<= n; i++)
fatt = fatt * i;
printf(“Fattoriale di %d : %d \n”, n, fatt);
}
28
#include <stdio.h>
… prima immissione
void main()
{
int n, fatt, i;
intt done
do e = 0;
while(!done) {
printf(“Inserisci un intero positivo: ”);
scanf(“%d”, &n);
if(n >= 0 ) done = 1;
else printf(“Errore:
printf( Errore: numero negativo ! \n
\n”);
); }
fatt = 1;
for(i
( =2;; i <= n;; i++))
fatt = fatt * i;
printf(“Fattoriale di %d : %d \n”, n, fatt);
}
29