13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

31
13 ottobre 200 2 1 Decisioni Decisioni F. Bombi 13 ottobre 2002

Transcript of 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

Page 1: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 1

DecisioniDecisioni

F. Bombi

13 ottobre 2002

Page 2: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 2

Istruzioni di saltoIstruzioni di salto Le istruzioni che compongono un programma

vengono eseguite in sequenza Istruzioni di salto (JUMP o goto) consentono di

alterare l’ordine di esecuzione Le istruzioni di salto possono essere condizionate

dal valore di un dato o di un’espressione Le istruzioni di salto condizionato consentono di

scrivere programmi il cui comportamento dipende dai dati

Un uso sconsiderato delle istruzioni di salto produce programmi di cui è difficile verificare la correttezza (detti programmi spaghettata)

Page 3: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 3

Programmi e grafiProgrammi e grafi

Se associamo ad ogni istruzione un vertice di un grafo e colleghiamo ogni istruzione alla istruzione che la segue con un arco orientato otteniamo il grafo di flusso associato al programma

Le istruzioni di salto condizionato sono caratterizzate da due archi in uscita che verranno percorsi in alternativa in funzione del verificarsi o meno della condizione di salto

Page 4: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 4

Programmi e grafiProgrammi e grafi

istruzioniin sequenza

salto salto condizionato

Page 5: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 5

La programmazione strutturataLa programmazione strutturata Negli anni ’60 fu dimostrato che qualsiasi grafo

poteva essere trasformato in un grafo strutturato equivalente (dal punto di vista del risultato) composto solo da sequenze di istruzioni combinate con le due strutture fondamentali la scelta (if-then-else) e il ciclo (do-while)

Page 6: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 6

Linguaggi strutturatiLinguaggi strutturati

Negli anni ’70 sono stati sviluppati linguaggi che non dispongono di istruzioni di salto e quindi consentono di scrivere solo programmi strutturati

Il linguaggio di programmazione Java segue questa tendenza e dispone dei costrutti di scelta e ciclo (con qualche utile variante)

Java dispone anche di alcune istruzione di salto (return, continue, break) che possono essere usate solo in particolari contesti

Java non dispone dell’istruzione goto

Page 7: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 7

L’istruzione L’istruzione if-then-elseif-then-else

Esistono due formati possibili– if (espressione booleana)

istruzione1– if (espressione booleana)

istruzione1

else istruzione2 In ogni caso un’istruzione può essere sostituita da

un blocco cioè da una sequenza di istruzione racchiusa fra parentesi graffe {istruzioni}

Page 8: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 8

SemanticaSemantica

Nel primo caso l’esecuzione dell’istruzione avviene solo se l’espressione booleana è vera, viene saltata se l’espressione è falsa

Nel secondo caso viene eseguita l’istruzione1 se l’espressione booleana è vera, l’istruzione2 se l’espressione è falsa

In ogni caso il programma continua con l’istruzione che segue l’istruzione composta if-then o if-then-else

Page 9: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 9

Espressioni booleaneEspressioni booleane

Le espressioni booleane sono espressioni che hanno come risultato un valore di tipo boolean, sono in genere il risultato di operazione di confronto oppure il risultato di operazioni logiche fra espresioni e variabili booleane

Parlando dei tipi di dati primitivi abbiamo visto quali sono le operazioni di confronto possibili

Page 10: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 10

Operatori fra interiOperatori fra interi

Confronto (il risultato è un boolean)< <= > >= == !=

Operatori unari (il risultato è un int)+ - ++ -- (prefissi e postifissi) ~

Operatori binari (il risultato è un int)+ - * / % << >> >>> & | ^

Ternari? :

Conversione (cast)

Page 11: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 11

Operatori fra dati in virgola Operatori fra dati in virgola mobilemobile

Confronto (il risultato è un boolean)< <= > >= == !=

Operatori unari (il risultato è un double)+ - ++ -- (prefissi e postifissi)

Operatori binari (il risultato è un double)+ - * / %

Ternari? :

Conversione (cast)

Page 12: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 12

Operatori fra dati Operatori fra dati booleanboolean

Operatori di confronto== !=

Operatori logici! & ^ |

Operatori di and e or condizionali&& ||

Ternari? :

Page 13: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 13

Gli operatori booleani ! Gli operatori booleani ! &&&& ||||

Il risultato di un espressione boolean è data dalla seguente tabella

a b !a a && b a || b

vero vero falso vero vero

vero falso falso falso vero

falso vero vero falso vero

falso falso vero falso falso

Page 14: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 14

La legge di La legge di De MorganDe Morgan

La legge di De Morgan dice che: – la negazione di una espressione and è pari

all’or della negazione dei due operandi:

!(a && b) è uguale a: !a || !bOppure in modo duale che:

– la negazione di una espressione or è pari all’and della negazione dei due operandi:

!(a || b) è uguale a: !a && !b

Page 15: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 15

Il confronto fra riferimentiIl confronto fra riferimenti

I riferimenti a oggetti possono essere confrontati solo con gli operatori == e !=, notare che il confronto viene fatto fra il valore dei riferimenti, non si confrontano gli oggetti cui i riferimenti puntano

È un errore frequente dimenticarsi di questo fatto e confrontare ad esempio due riferimenti a stringhe di caratteri pensando di confrontare le stringhe

Page 16: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 16

Un esercizioUn esercizio

Scrivere un programma che chieda all’utente tre numeri interi che si assume siano la lunghezza dei lati di un triangolo e stabilisca se il triangolo è:– Scaleno– Isoscele– Rettangolo– Equilatero– Impossibile– Ecc.

Page 17: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 17

I cicli I cicli whilewhile, , dodo e e forfor

In Java esistono tre costrutti per realizzare cicli:– while (espressione booleana)

istruzione– do istruzione while (espressione booleana)– for (iniziale; condizione; passo) istruzione

Come per l’if l’istruzione può essere sostituito da un blocco (sequenza) di istruzione racchiuse fra parentesi graffe

Page 18: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 18

Semantica del ciclo Semantica del ciclo whilewhile

All’esecuzione viene valutata l’espressione booleana, se è vera viene eseguita l’istruzione e si valuta di nuovo l’espressione booleana; se l’espressione è falsa si procede con l’esecuzione dell’istruzione che segue il ciclo

Se l’istruzione non altera il valore dell’espressione booleana il ciclo non terminerà mai

Page 19: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 19

Semantica del ciclo Semantica del ciclo dodo Viene eseguita l’istruzione, si valuta quindi

l’espressione booleana; se l’espressione è falsa si procede con l’esecuzione dell’istruzione che segue il ciclo se è vara si ritorna ad eseguire l’istruzione

Se l’istruzione non altera il valore dell’espressione booleana il ciclo non terminerà mai

In un ciclo do a differenza di quanto avviene in un ciclo while l’istruzione viene eseguita sempre almeno una volta

Page 20: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 20

Semantica del ciclo Semantica del ciclo forfor

for (iniziale; condizione; passo) istruzione;

Ha lo stesso effetto del ciclo while seguente

iniziale; While (condizione){ istruzione; passo;}

Page 21: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 21

Un esempioUn esempioCalcolo della media di n datiCalcolo della media di n dati

Page 22: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 22

Il problemaIl problemaSono dati n numeri interi (a priori non

sappiamo quanti sono)Si vuole calcolare la media dei datiChiamando xi con i=1,…n i dati sappiamo

che la media m è data dalla formula

m = 1/ni=1,nxi

Ora si tratta di ideare un algoritmo che risolva il problema utilizzando solo operazioni elementari note ed eventualmente decisioni e iterazioni

Page 23: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 23

Trasformare la formula in un Trasformare la formula in un algoritmoalgoritmo

sn = i=1,nxi

sn = sn-1 + xn

Sn-1 = sn-2 + xn-1

…………

S2 = s1 + x2

S1 = x1

Page 24: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 24

Se guardiamo le espressioni ricorrenti vediamo che la sommatoria di un dato è pari al dato stesso, la sommatoria di due dati è la sommatoria di un dato aumentata dal secondo, la sommatoria di tre quella di due più il terzo fino all’n-esimo

Ad ogni passo dobbiamo sommare al risultato parziale il dato corrente

Dobbiamo concludere il calcolo quando abbiamo considerato tutti gli n dati

Possiamo utilizzare come valore iniziale della sommatoria 0 (zero) assumendo che al primo passo si sommi al valore iniziale il primo dato

Page 25: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 25

Le operazioni elementariLe operazioni elementari

Supponiamo di saper fare le seguenti operazioni elementari– Chiedere all’utente di inserire un dato– Convertire una stringa di caratteri in un numero

intero– Sommare, moltiplicare, dividere numeri interi– Ripetere operazioni se una condizione è vera– Convertire un numero in una stringa di caratteri– Scrivere sulla console una stringa

Page 26: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 26

La soluzioneLa soluzione

Dobbiamo chiedere all’utente i dati uno alla volta e contare quanti dati vengono inseriti

L’utente segnalerà la fine dei dati con il pulsante “annulla”

Dobbiamo contare quanti dati vengono inseriti Per calcolare la sommatoria usiamo la formula

ricorrente vista Nota la sommatoria sappiamo calcolare la media

dividendo per il numero di dati ricevuti

Page 27: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 27

Un’osservazioneUn’osservazione

Il programma non gestisce correttamente il caso in cui non ci sono dati (n pari a zero)

Se si inseriscono dati sbagliati il programma fallisce senza dare modo all’utente di correggere l’errore

Come esercizio modificare il programma in modo che gestisca correttamente il caso n pari a zero

Studieremo in una prossima lezione come gestire un eventuale errore catturando l’eccezione generata dal tentativo di conversione errato

Page 28: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 28

Soluzione alternativaSoluzione alternativa

Si potrebbe adottare una soluzione diversa leggendo e contando i dati in una prima fase e procedendo successivamente al calcolo della sommatoria

Per poter fare questo abbiamo bisogno di un contenitore per i dati: Java (come quasi tutti i linguaggi ad alto livello) consente di costruire vettori (array) partendo da dati di qualsiasi tipo (è possibile costruire array di dati primitivi e array di oggetti di qualsiasi tipo)

Page 29: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 29

Gli arrayGli array Un array è un contenitore di dati tutti dello stesso tipo, di

dimensioni fissate al momento della sua creazione, nel quale gli elementi sono individuati dal loro rango o posizione

Il rango è un numero intero compreso fra 0 e la dimensione dell’array meno uno

Un array è un oggetto e quindi il nome di un array dichiarato con un’istruzione del tipo

tipo[] nome;

è un riferimento, l’array deve essere creato con una clausola del tipo

nome = new tipo[max]; È possibile riferirsi ad un singolo elemento di un array conoscendo il

suo rango inome[i]

Page 30: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 30

Gli arrayGli array

int v[];

?v

v = new int[5];0

1

2

3

4

Page 31: 13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

13 ottobre 2002 31

MediaMedia utilizzando un array utilizzando un array

È possibile risolvere il problema del calcolo della media in due fasi, nella prima si procede alla lettura dei dati conservandoli in un array, nella seconda si calcola la media utilizzando i dati contenuti nell’array.

Un limite della soluzione deriva dal fatto che l’array deve essere allocato con dimensioni predeterminate maggiori di n

È normale che l’array sia solo parzialmente utilizzato