Corso JAVA Lezione n° 01 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 01 Come si risolve un problema? Ogni qualvolta vi viene presentato un problema, la prima domanda da porsi è: Quali sono i dati che il testo del problema mi fornisce (Dati di input)? Mentre la seconda cosa da chiedersi è: Quali solo i dati, o in generale le informazioni, che si deve fornire come risultato (Dati di output)? Una volta risposto a queste due domande occorre definire un procedimento di risoluzione (algoritmo), ovvero un insieme di operazioni che vi permetteranno, a partire da i dati in input, di ottenere i dati di output. 2 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 01 Esempio (1) Problema: Dati 100 dipendenti di un’azienda, si vuole sapere qual è il nome ed il cognome del dipendente con lo stipendio più alto. Dati in input: Il numero dei dipendenti dell’azienda (100). Il nome, il cognome e lo stipendio di ogni dipendente. Dati in output: Il nome ed il cognome del dipendente che ha lo stipendio più alto. 3 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 01 Esempio (2) Se dovreste risolvere questo problema con carta e penna, quale sarebbe il procedimento (algoritmo) che usereste? Le operazioni da fare sarebbero li seguenti: 1) Prendo il primo dipendente e scrivo sul foglio il suo nome, il suo cognome ed il suo stipendio. 2) Prendo il secondo dipendente e controllo se il suo stipendio è più alto o più basso dello stipendio che dipendente che ho scritto sul foglio. 3) In caso affermativo cancello i dati del primo dipendente e li sostituisco con quelli del secondo, altrimenti passo al dipendente successivo. Continuo fino a quando non ho controllato anche il 100° dipendente. 4 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 01 I Diagrammi di Flusso Utilizzare i diagrammi di flusso non significa altro che trasformare quello che abbiamo scritto a parole nella diapositiva precedente in uno schema composto da vari simboli: L’ellisse: indica l’inizio e la fine del nostro algoritmo. Inizio Il parallelogramma: indica dati in input o dati in output. Input: 5 Fine n° dip. azienda Istituto Statale di Istruzione Superiore “F. Enriques” Output: Nome e cognome dip. Corso di Programmazione in Java – Lezione n° 01 I Diagrammi di Flusso (2) Il rettangolo: indica operazioni generiche scrivi sul foglio il nome, Cognome e stip. del dip. Il rombo: indica una selezione (una scelta). Nota Bene: La scelte possibili devono essere solo 2 e disgiunte. Si 6 A=B+C Oggi piove No Istituto Statale di Istruzione Superiore “F. Enriques” Si N° dip. = 100 No Corso di Programmazione in Java – Lezione n° 01 Rivediamo il problema di prima Per prima cosa l’inizio … Inizio num. dipen. = 100 Nome, cognome e stipendio del 1° dip. Scrivi il nome, cognome e stip. del 1° dip. sul foglio 7 Istituto Statale di Istruzione Superiore “F. Enriques” … poi dobbiamo indicare, con il parallelogramma, che abbiamo dei dati in input. … ogni operazione elementare deve essere indicata con il rettangolo Corso di Programmazione in Java – Lezione n° 01 Rivediamo il problema di prima (2) …adesso ci serve un altro dato in input Nome, cognome e stipendio del 2° dip. Confronto stip. 1° dip. con stip. del 2° dip. … poi devo fare una scelta 8 si stip. 1° dip. è > dello stip. 2° dip. Istituto Statale di Istruzione Superiore “F. Enriques” … si confrontano i due stipendi per vedere qual è il più grande … no Supponiamo che stip. 2° dip. sia maggiore dello stip. 1 dip. Corso di Programmazione in Java – Lezione n° 01 Rivediamo il problema di prima (3) si no Cancella il nome, cognome e stip. del 1° dip. sul foglio Scrivi il nome, cognome e stip. del 2° dip. sul foglio 9 L’operazione di cancellazione dei dati del 1° dip. e scrittura dei dati sul foglio del 2° dip. si effettua solo nel ramo no, ovvero se lo stip. del 2° dip. è > dello stip. del 1° Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 01 Rivediamo il problema di prima (4) Nome, cognome e stipendio del 3° dip. Confronto stip. 2° dip. con stip. del 3° dip. vero 10 stip. 2° dip. è > dello stip. 3° dip. Istituto Statale di Istruzione Superiore “F. Enriques” Si effettua lo stesso procedimento con il 3° dip. ed il 2° dip. e così via fino a raggiungere i 100 dipendenti. falso Corso di Programmazione in Java – Lezione n° 01 Rivediamo il problema di prima (5) si no Cancella il nome, cognome e stip. del x° dip. sul foglio Scrivi il nome, cognome e stip. del 100° dip. sul foglio Nome, cognome e scritti sul foglio 11 Istituto Statale di Istruzione Superiore “F. Enriques” fine Corso di Programmazione in Java – Lezione n° 01 Un solo problema … Molti diagrammi di flusso Il diagramma di flusso appena visto è solo uno dei possibili che si possono creare per risolvere il problema di partenza. L’inconveniente del diagramma presentato è l’eccessiva lunghezza che si traduce in scarsa leggibilità. Nella prossima diapositiva vedremo come si può semplificare il diagramma utilizzando un contatore e la ricorsione, ottenendone uno equivalente. Nota bene: La condizione della selezione (quella nel rombo per intendersi) deve avere solo due risposte possibili … Rosso 12 Di che colore è il semaforo Istituto Statale di Istruzione Superiore “F. Enriques” Verde E se il semaforo è giallo? La domanda corretta da porsi sarebbe: Il semaforo è rosso? Vero/Falso Corso di Programmazione in Java – Lezione n° 01 I Contatori e la Ricorsione Il rombo, ovvero la selezione, può essere utilizzato sia per fare una scelta si/no, sia per ripetere un insieme di operazioni fino a quando non si verifica una determinata condizione. Si introduce una variabile i; una variabile è una locazione di memoria contenente dati che possono essere modificati nel corso del programma, a cui viene associato una lettera o un nome. Esempio: Si vogliono stampare i numeri da 0 a 100. inizio i=0 Stampa i i=i+1 13 Istituto Statale di Istruzione Superiore “F. Enriques” falso i > 100 vero fine Corso di Programmazione in Java – Lezione n° 01 Diagramma semplificato Inizio num. dipen. = 100 Nome = nome i° dip Cognome = cognome i° dip Stip. = stipendio i° dip. vero stipendio i° dip. > Stip. falso falso Nome, cognome e stipendio del i° dip. 14 i = 0, Nome = /, Cognome = /, Stip. = 0 Istituto Statale di Istruzione Superiore “F. Enriques” i = num. dipen. vero Nome e Cognome i = i +1 fine Corso di Programmazione in Java – Lezione n° 01 Esercizio – M.C.D. (Massimo Comun Divisore) Scrivere il diagramma di flusso per il seguente problema: Dati due numeri interi A e B si vuole trovare il Massimo Comun Divisore, ovvero quel numero intero X per cui non esiste nessun altro numero intero più grande che permette di dividere A e B ottenendo come resto 0. Es.: Il Massimo Comun Divisore tra 12 e 8 ? 12 è divisibile per 1, 2, 4, 6, 12 8 è divisibile per 1, 2, 4, 8 Qual è l’elemento in comune? 4 che è proprio il M.C.D. 15 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 01 Soluzione Esercizio M.C.D. Inizio i=i+1 A, B restoA = 0, restoB = 0 x=0 restoA = A % i i=0 x=i restoB = B % i vero 16 Istituto Statale di Istruzione Superiore “F. Enriques” restoA = 0 e restoB = 0 falso Questo diagramma di flusso è corretto? Ovviamente no. Il diagramma di flusso non ha termine. Manca un ramo che ci conduca alla “fine”. Corso di Programmazione in Java – Lezione n° 01 Soluzione Esercizio M.C.D. (2) Inizio i=i+1 A, B falso restoA = 0, restoB = 0 x=0 vero restoA = A % i i=0 i=Ao i=B x=i Fine restoB = B % i Ora è OK? vero 17 Istituto Statale di Istruzione Superiore “F. Enriques” restoA = 0 e restoB = 0 falso No!! Manca l’output!! Corso di Programmazione in Java – Lezione n° 01 Soluzione Esercizio M.C.D. (3) Inizio i=i+1 A, B falso restoA = 0, restoB = 0 i=Ao i=B x=0 vero restoA = A % i i=0 x x=i restoB = B % i Fine vero 18 Istituto Statale di Istruzione Superiore “F. Enriques” restoA = 0 e restoB = 0 falso Adesso ci siamo!!! Corso di Programmazione in Java – Lezione n° 01 La Selezione in cascata Abbiamo detto in precedenza che il test che scriviamo all’interno della selezione (il rombo), deve avere due sole risposte possibili. Riprendiamo il caso del semaforo: Poniamo il caso che in base al colore del semaforo si debba decidere un’azione diversa, esempio: Rosso – Devo Frenare, Verde – Posso passare, Giallo – Accelero / Freno Rosso Di che colore è il semaforo Freno Non rosso Giallo Accelero / Freno 19 Istituto Statale di Istruzione Superiore “F. Enriques” Di che colore è il semaforo Verde Posso passare Corso di Programmazione in Java – Lezione n° 01 Relazione Diagrammi di flusso e programmazione. Perché utilizzare un diagramma di flusso relativo ad un problema posto e non scrivere direttamente il programma in linguaggio Java che risolve tale problema? Il motivo principale è che si può progettare un programma con un diagramma a blocchi indipendentemente dal linguaggio usato e quindi dalla sua sintassi. Una volta terminato il diagramma a blocchi è possibile convertire parti dello stesso in un linguaggio di programmazione come vedremo prossimamente. Prima di vedere come si effettua tale conversione però è necessario introdurre un argomento base della programmazione: i tipi fondamentali dei dati; argomenti iniziale della prossima lezione. 20 Istituto Statale di Istruzione Superiore “F. Enriques”