Introduzione
Al termine di questa lezione sarete in grado di: risolvere semplici problemi che prevedono la possibilit di effettuare delle scelte, in base al verificarsi o meno di alcune condizioni; rappresentare graficamente lalgoritmo risolutivo mediante diagrammi di flusso.
Un problema proposto
Consideriamo il seguente problema: Dato un numero intero, stabilire se divisibile per 2. Produrre in output il risultato (per esempio, "Il numero divisibile per 2" o "Il numero non divisibile per 2"). Risolviamo il problema attenendoci al seguente schema: 1. Analisi del problema mediante individuazione a. dei dati iniziali b. dei risultati attesi c. del procedimento risolutivo (algoritmo) 2. Formalizzazione dellanalisi (scrittura dellalgoritmo)
Analisi del problema a. Il dato iniziale il numero intero, che chiameremo intero. b. Il risultato atteso una stringa che ci dice se il numero divisibile o meno per
2. c. Il problema pu essere formulato anche in un altro modo. Chiedersi se un numero divisibile per 2 equivale a domandarsi se pari. La divisione di un numero pari per 2 restituisce sempre resto zero, mentre la divisione di un numero dispari per 2 restituisce sempre resto 1. Per trovare la soluzione dobbiamo quindi dividere il numero dato per 2 e controllare il resto ottenuto. Il procedimento risolutivo consiste nella seguente sequenza di passi: 1. acquisisco in input il numero, intero 2. divido intero per 2 e determino il resto 3. se resto uguale a zero 4. allora produco in output la stringa Il numero divisibile per 2 5. altrimenti produco in output la stringa Il numero non divisibile per 2 Formalizzazione dellanalisi ID intero resto TABELLA DATI Descrizione I/O/L Il numero intero dato I Resto della divisione di L intero per 2 Tipo numero intero numero intero
Osservazione Come potete notare, nella tabella precedente stata introdotta una variazione alla terza colonna: lintestazione non contiene pi le sole due voci input e output
Autore: Bocchi Cinzia Ultimo aggiornamento: 05/10/2012
(I/O) ma anche una ulteriore voce L, che sta per lavoro. Fino ad ora abbiamo parlato solo di dati di input e di output. In realt esiste un terzo tipo di dati che non sono acquisiti in input o prodotti in output, ma vengono utilizzati per contenere i risultati di elaborazioni intermedie. La variabile resto non viene acquisita in input (lutente non conosce il resto) e non richiesta in output (allutente non interessa sapere il valore del resto ma solo se il numero dato divisibile per 2). Di conseguenza, resto una variabile di lavoro (o ausiliaria). E importante individuare le variabili di lavoro, distinguendole da quelle di I/O, perch una variabile di lavoro non sempre necessaria e vedremo che talvolta possibile eliminarla. La decisione di mantenere una o pi variabili di lavoro dettata dalla necessit di rendere il codice maggiormente leggibile. FLOW CHART
Start
input(intero)
resto=0
End
Osservazione Osservate che nel diagramma di flusso presente un blocco contenente la descrizione di unoperazione non completamente specificata: resto= resto divisione tra intero e 2 Questo modo di procedere perfettamente lecito, a patto che si vada a indicare, in un momento successivo, come si intende calcolare il resto della divisione tra intero e 2. Spesso capita di non riuscire a scendere al livello massimo di dettaglio durante la prima stesura dellalgoritmo, soprattutto quando il problema complesso. Tutti i passaggi non dettagliati possono essere specificati meglio nei passaggi successivi (raffinamenti).
PRIMO MODO
Dividiamo il numero intero per due e calcoliamo la differenza tra il numero intero e il risultato della divisione (quoziente) moltiplicato per il divisore (2). Per esempio: intero quoziente (intero:2) resto (intero-quoziente*2) intero quoziente (intero:2) resto (intero-quoziente*2) 10 5 0 11 5 1
A questo punto qualcuno potrebbe porsi la domanda: come mai la divisione tra 11 e 2 da come risultato 5 e non 5,5? La risposta : perch stiamo eseguendo una divisione intera. Alcuni linguaggi di programmazione forniscono due diversi operatori, uno per la divisione intera e laltro per la divisione non intera (per intenderci, quella che restituisce il risultato 5,5). Java, invece, ha un solo operatore per la divisione (/) e la distinzione tra divisione intera ed esatta dipende dal tipo del dividendo (intero) e del divisore (2). Quando dividendo e divisore sono entrambi interi, la divisione sempre intera.
SECONDO MODO
La maggior parte dei linguaggi di programmazione di ultima generazione forniscono uno speciale operatore, detto operatore modulo, che restituisce automaticamente il resto della divisione intera. Anche la rappresentazione adottata per tale operatore e quasi sempre la stessa: si usa il simbolo percentuale (%). Possiamo allora utilizzare tale simbolo allinterno del flowchart. FLOW CHART
Start 1
input(intero)
resto= intero% 2
3 F resto=0 V
End
azione 1
Viene acquisito in input il numero intero (10) e assegnato alla variabile intero. intero 10 resto 0 condizione output
azione 1 azione 2
Viene calcolato il resto della divisione intera tra intero e 2. intero 10 resto 0 vero condizione output
Viene valutata lespressione logica contenuta nel blocco 3, che risulta vera in quanto resto uguale a zero. A questo punto si segue il ramo vero e si tralascia il ramo falso. intero 10 resto 0 vero Il numero divisibile per 2 condizione output
azione 1
Viene acquisito in input il numero intero (11) e assegnato alla variabile intero. intero 11 resto 1 condizione output
azione 1 azione 2
Viene calcolato il resto della divisione intera tra intero e 2. intero 11 resto 1 falso condizione output
Viene valutata lespressione logica contenuta nel blocco 3, che risulta falsa in quanto resto diverso da zero. A questo punto si segue il ramo falso e si tralascia il ramo vero. intero 11 resto 1 falso Il numero non divisibile per 2 condizione output
In output viene prodotta la stringa Il numero non divisibile per 2. Lalgoritmo corretto poich si comporta nel modo desiderato in tutti i casi considerati.
La modifica apportata produce alcuni cambiamenti nella tabella dei dati e nel flow-chart. TABELLA DATI Descrizione I/O/L Il numero intero dato I FLOW CHART
Start input(intero) 1
ID intero
3 F (intero%2) = 0 V
End
Quest'opera stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.