La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002.

Presentazioni simili


Presentazione sul tema: "13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002."— Transcript della presentazione:

1 13 ottobre Decisioni F. Bombi 13 ottobre 2002

2 2 Istruzioni 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)

3 13 ottobre Programmi 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

4 13 ottobre Programmi e grafi istruzioni in sequenza saltosalto condizionato

5 13 ottobre La 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)

6 13 ottobre Linguaggi 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

7 13 ottobre L’istruzione if-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}

8 13 ottobre Semantica 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

9 13 ottobre Espressioni 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

10 13 ottobre Operatori 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 )

11 13 ottobre Operatori fra dati in virgola mobile Confronto (il risultato è un boolean ) >= == != Operatori unari (il risultato è un double ) (prefissi e postifissi) Operatori binari (il risultato è un double ) + - * / % Ternari ? : Conversione ( cast )

12 13 ottobre Operatori fra dati boolean Operatori di confronto == != Operatori logici ! & ^ | Operatori di and e or condizionali && || Ternari ? :

13 13 ottobre Gli operatori booleani ! && || Il risultato di un espressione boolean è data dalla seguente tabella ab!aa && ba || b vero falsovero falso vero falsovero falsovero falso verofalso

14 13 ottobre La legge di De 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 || !b Oppure in modo duale che: – la negazione di una espressione or è pari all’ and della negazione dei due operandi: !(a || b) è uguale a : ! a && !b

15 13 ottobre Il 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

16 13 ottobre Un 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.

17 13 ottobre I cicli while, do e for 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

18 13 ottobre Semantica del ciclo while 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

19 13 ottobre Semantica del ciclo do 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

20 13 ottobre Semantica del ciclo for for (iniziale; condizione; passo) istruzione; Ha lo stesso effetto del ciclo while seguente iniziale; While (condizione) { istruzione; passo; }

21 13 ottobre Un esempio Calcolo della media di n dati

22 13 ottobre Il problema Sono dati n numeri interi (a priori non sappiamo quanti sono) Si vuole calcolare la media dei dati Chiamando x i con i=1,…n i dati sappiamo che la media m è data dalla formula m = 1/n  i=1,n x i Ora si tratta di ideare un algoritmo che risolva il problema utilizzando solo operazioni elementari note ed eventualmente decisioni e iterazioni

23 13 ottobre Trasformare la formula in un algoritmo s n =  i=1,n x i s n = s n-1 + x n S n-1 = s n-2 + x n-1 ………… S 2 = s 1 + x 2 S 1 = x 1

24 13 ottobre 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

25 13 ottobre Le 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

26 13 ottobre La 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

27 13 ottobre Un’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

28 13 ottobre Soluzione 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)

29 13 ottobre Gli 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 i nome[i]

30 13 ottobre Gli array int v[]; ? v v = new int[5];

31 13 ottobre Media 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


Scaricare ppt "13 ottobre 20021 Decisioni F. Bombi 13 ottobre 2002."

Presentazioni simili


Annunci Google