13 ottobre 20021 decisioni f. bombi 13 ottobre 2002
Post on 03-May-2015
220 Views
Preview:
TRANSCRIPT
13 ottobre 2002 1
DecisioniDecisioni
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)
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
13 ottobre 2002 4
Programmi e grafiProgrammi e grafi
istruzioniin sequenza
salto salto condizionato
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)
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
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}
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
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
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)
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)
13 ottobre 2002 12
Operatori fra dati Operatori fra dati booleanboolean
Operatori di confronto== !=
Operatori logici! & ^ |
Operatori di and e or condizionali&& ||
Ternari? :
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
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
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
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.
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
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
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
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;}
13 ottobre 2002 21
Un esempioUn esempioCalcolo della media di n datiCalcolo della media di n dati
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
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
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
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
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
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
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)
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]
13 ottobre 2002 30
Gli arrayGli array
int v[];
?v
v = new int[5];0
1
2
3
4
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
top related