Schemi per diapo Sistemi in tempo reale
Transcript
Schemi per diapo Sistemi in tempo reale
Stampa di alcuni numeri interi Università degli studi di Parma Dipartimento di Ingegneria dell’Informazione Informatica – a.a. 2012/13 Inizio Informatica Facoltà di Medicina Veterinaria a.a. 2012/13 Stampa ‘0’ prof. Stefano Cagnoni Stampa ‘1’ Esercizi sui Diagrammi di Flusso Stampa ‘2’ Fine Informatica 2012/2013 Stampa dei primi N numeri interi Inizio c=0 c < 10 No Si Stampa c c=c+1 Fine Informatica 2012/2013 (1) L’algoritmo rappresentato tramite questo DF stampa a video i numeri 0, 1 e 2 Ogni esecuzione dell’algoritmo produce sempre lo stesso risultato non è un algoritmo “interessante”... -2- Stampa dei primi N numeri interi L’algoritmo rappresentato tramite questo DF stampa a video i numeri da 0 a 9 inclusi Ogni esecuzione dell’algoritmo produce lo stesso risultato La variabile “c” permette di contare quante volte viene eseguito il ciclo Il blocco condizione (rombo) permette di realizzare un ciclo Il ciclo si interrompe nel momento in cui la condizione risulta falsa Inizio c=0 c < 10 2. Il valore con cui c viene confrontato all’interno della condizione (in questo caso 10) No Si 3. Il segno di confronto impiegato all’interno della condizione (in questo caso < ) c=c+1 4. La quantità di cui la variabile c viene incrementata ad ogni iterazione del ciclo Fine Informatica 2012/2013 Il numero di volte che l’istruzione “Stampa c” viene eseguita dipende da: 1. Il valore iniziale della variabile c Stampa c -3- (2) -4- Pag. 1 1 Stampa dei primi N numeri interi Inizio (3) Stampa dei primi N numeri interi In questo caso l’algoritmo stampa a video i numeri da 1 a 9 inclusi c=1 c < 10 In questo caso l’algoritmo stampa a video i numeri da 1 a 10 inclusi Inizio c=1 No Si La differenza rispetto alla versione precedente è l’inizializzazione della variabile c al valore 1 anziché al valore 0 La differenza rispetto alla versione precedente è l’uso del “<=“ anziché del semplice “<“ all’interno della condizione c <= 10 No Si Stampa c Stampa c c=c+1 c=c+1 In questo esempio, come nei precedenti, se l’algoritmo viene eseguito più volte, l’output è sempre lo stesso Fine Informatica 2012/2013 Fine Informatica 2012/2013 -5- Stampa dei primi N numeri interi Inizio Leggi N c=1 c <= N No Si Stampa c c=c+1 Fine Informatica 2012/2013 (4) -6- Stampa dei primi N numeri interi: Esempio di esecuzione passo passo (5) In questo caso l’algoritmo stampa a video i numeri da 1 a N inclusi Prima di iniziare la stampa dei numeri, infatti, si chiede all’utente di inserire il valore dell’ultimo numero da stampare Questo valore viene memorizzato nella variabile N e utilizzato all’interno della condizione per decidere quando terminare il ciclo In questo caso l’output dell’algoritmo dipende dalla particolare esecuzione: esecuzioni diverse possono produrre output diversi a seconda del dato di input inserito dall’utente Inizio (1) Passo 1 Output a Schermo Leggi N c=1 Contenuto della Memoria (Variabili) N c <= N No c Si Stampa c c=c+1 Fine Informatica 2012/2013 -7- Vediamo ora come analizzare ed eseguire passo passo un algoritmo rappresentato da un diagramma di flusso Il tutto comincia dal blocco chamato “Inizio” -8- Pag. 2 2 Stampa dei primi N numeri interi: Esempio di esecuzione passo passo Inizio Stampa dei primi N numeri interi: Esempio di esecuzione passo passo (2) Passo 2 Inizio Passo 3 Output a Schermo Output a Schermo Leggi N Leggi N c=1 c=1 Contenuto della Memoria (Variabili) N c <= N No Stampa c c=c+1 Fine Informatica 2012/2013 c <= N c=c+1 Fine - 10 - Stampa dei primi N numeri interi: Esempio di esecuzione passo passo (4) Passo 4 1 La variabile “contatore” c viene inizializzata al valore 1 Informatica 2012/2013 Stampa dei primi N numeri interi: Esempio di esecuzione passo passo 3 c Stampa c -9- Inizio No Si Si chiede all’utente di inserire un numero intero Tale numero viene memorizzato nella variabile N Supponiamo venga inserito il numero 3 Contenuto della Memoria (Variabili) N 3 c Si Inizio Output a Schermo Leggi N c=1 No Si Stampa c c=c+1 Fine Informatica 2012/2013 3 c 1 1 c=1 Contenuto della Memoria (Variabili) N (5) Passo 5 Output a Schermo Leggi N c <= N (3) c <= N Contenuto della Memoria (Variabili) No Si Per scegliere il percorso da seguire, è necessario valutare la condizione “c <= N” In questo caso la condizione “1<=3” risulta vera e si prosegue per il ramo etichettato con “Si” Stampa c N 3 c 1 Si stampa a schermo il contenuto attuale della variabile c c=c+1 Fine Informatica 2012/2013 - 11 - - 12 - Pag. 3 3 Stampa dei primi N numeri interi: Esempio di esecuzione passo passo Inizio Stampa dei primi N numeri interi: Esempio di esecuzione passo passo (6) Passo 6 Inizio Passo 7 Output a Schermo Leggi N No 1 2 c <= N Stampa c c=c+1 No Informatica 2012/2013 Stampa c c=c+1 Fine Informatica 2012/2013 - 13 - Stampa dei primi N numeri interi: Esempio di esecuzione passo passo Inizio - 14 - Stampa dei primi N numeri interi: Esempio di esecuzione passo passo (8) Passo 8 2 Per scegliere il percorso da seguire, è necessario valutare la condizione “c <= N” In questo caso la condizione “2<=3” risulta vera e si prosegue per il ramo etichettato con “Si” Fine 3 c Si Il valore corrente di c viene incrementato di una unità Il contenuto della variabile c passa così da 1 a 2 Contenuto della Memoria (Variabili) N 3 c Si 1 c=1 Contenuto della Memoria (Variabili) N c <= N Output a Schermo Leggi N 1 c=1 Inizio c <= N Output a Schermo Leggi N 12 c=1 No Si Stampa c 3 c 2 12 c=1 Contenuto della Memoria (Variabili) N c <= N Contenuto della Memoria (Variabili) No Si Si stampa a schermo il contenuto attuale della variabile c Stampa c c=c+1 c=c+1 Fine Informatica 2012/2013 (9) Passo 9 Output a Schermo Leggi N (7) N 3 c 2 3 Il valore corrente di c viene incrementato di una unità Il contenuto della variabile c passa così da 2 a 3 Fine Informatica 2012/2013 - 15 - - 16 - Pag. 4 4 Stampa dei primi N numeri interi: Esempio di esecuzione passo passo Inizio Stampa dei primi N numeri interi: Esempio di esecuzione passo passo (10) Passo 10 Inizio Passo 11 Output a Schermo Leggi N No 3 Stampa c c=c+1 Fine Informatica 2012/2013 c <= N c=c+1 Fine - 18 - Stampa dei primi N numeri interi: Esempio di esecuzione passo passo (12) Passo 12 3 Si stampa a schermo il contenuto attuale della variabile c Informatica 2012/2013 Stampa dei primi N numeri interi: Esempio di esecuzione passo passo 3 c Stampa c - 17 - Inizio No Si Per scegliere il percorso da seguire, è necessario valutare la condizione “c <= N” In questo caso la condizione “3<=3” risulta vera e si prosegue per il ramo etichettato con “Si” Contenuto della Memoria (Variabili) N 3 c Si 123 c=1 Contenuto della Memoria (Variabili) N c <= N Output a Schermo Leggi N 12 c=1 Inizio c <= N Output a Schermo Leggi N 123 c=1 No Si Stampa c c=c+1 3 c 3 4 c <= N Contenuto della Memoria (Variabili) No Si Il valore corrente di c viene incrementato di una unità Il contenuto della variabile c passa così da 3 a 4 Stampa c c=c+1 Fine Informatica 2012/2013 12 c=1 Contenuto della Memoria (Variabili) N (13) Passo 13 Output a Schermo Leggi N (11) Fine Informatica 2012/2013 - 19 - N 3 c 4 Per scegliere il percorso da seguire, è necessario valutare la condizione “c <= N” In questo caso la condizione “4<=3” risulta falsa e si prosegue per il ramo etichettato con “No” - 20 - Pag. 5 5 Stampa dei primi N numeri interi: Esempio di esecuzione passo passo Inizio Somma dei primi N numeri interi (1) (14) Passo 14 Inizio Output a Schermo Leggi N c=1 c=1 Contenuto della Memoria (Variabili) N c <= N Leggi N 123 No Stampa c c=c+1 Fine Informatica 2012/2013 4 c <= N Stampa c c=c+1 Fine Informatica 2012/2013 Somma dei primi N numeri interi (2) c = 1, s = 0 - 22 - Calcolo di n! (n fattoriale) Le modifiche apportate sono quindi le seguenti: Inizio 1. Utilizziamo una variabile chiamata s per tenere conto della somma parziale dei numeri finora considerati e la inizializziamo al valore 0 (elemento invariante per la somma) Leggi N No Si Giunti al blocco “Fine” l’esecuzione dell’algoritmo termina L’output conferma che l’algoritmo risolve correttamente il problema “Stampa i primi N numeri interi” - 21 - Inizio 1. La stampa del risultato andrà spostata subito prima della fine, fuori dal ciclo 2. All’interno del ciclo, possiamo utilizzare il valore corrente della variabile c per aggiornare una “somma parziale” dei primi N numeri 3. Sarà quindi necessario utilizzare una variabile in più per tenere traccia di questa “somma parziale” 3 c Si (1) Leggi N c = 1, s = 0 c <= N 2. Ad ogni iterazione del ciclo, sommiamo al valore corrente di s il valore del numero considerato (c), aggiornando così la somma parziale dei numeri No Si s=s+c c <= N c=c+1 s=s+c Stampa s c=c+1 Fine Informatica 2012/2013 No Si 3. Una volta terminato il ciclo, e quindi terminato il calcolo della somma, stampiamo a video il risultato (contenuto in s) Stampa s Si può calcolare la somma dei primi N numeri interi, apponendo qualche semplice modifica al diagramma di flusso utilizzato per la stampa dei primi N numeri interi: Calcolare n! significa moltiplicare tra loro tutti i numeri compresi tra q e n inclusi Per risolvere il problema è possibile, ancora una volta, utilizzare la stessa struttura ciclica vista finora. Ancora una volta le modifiche da apportare al DF sono minime... Anziché calcolare una somma di numeri dovremo calcolarne il prodotto Se vogliamo, possiamo chiamare la variabile dove salviamo il risultato con un altro nome, ad esempio r, per risultato Fine Informatica 2012/2013 - 23 - - 24 - Pag. 6 6 Calcolo di n! (n fattoriale) Inizio (2) Leggi N c = 2, r = 1 c <= N No Si Esercizi Visto che l’elemento invariante per il prodotto è 1, è necessario inizializzare a 1 il valore di r Visto che moltiplicare 1*1 è inutile, possiamo far inizializzare il valore di c a 2 anziché 1, risparmiando così un’iterazione del ciclo... r=r*c Stampa r c=c+1 Fine Informatica 2012/2013 All’interno del ciclo aggiorniamo il valore corrente di r moltiplicandolo per il valore corrente di c Per il secondo supporre che il numero inserito dall’utente sia 4 e verificare che il risultato proposto sia 24 - 26 - Contare a ritroso Inizio Leggi N No Si Stampa N N=N-1 Fine Informatica 2012/2013 Per il primo supporre che l’utente inserisca il numero 5 e verificare che l’output prodotto sia 15 Informatica 2012/2013 - 25 - Contare a ritroso N>0 Provare a fare un’esecuzione passo-passo, come visto precedentemente, per i due DF della somma dei primi N numeri e del calcolo di N! Anziché mettere un valore iniziale fisso per N, chiediamo all’utente il numero da cui iniziare il conto alla roverscio Inizio 4321 Leggi N Visto che contiamo all’indietro, verifichiamo se il valore corrente di N è maggiore di 0 per decidere quando fermarci All’interno del ciclo aggiorniamo il valore corrente di N decrementandolo di 1 ad ogni iterazione N>0 No Stampa N N=N-1 Fine Informatica 2012/2013 In generale l’output prodotto sarà: N N-1 N-2 ... 3 2 1 Si - 27 - Supponendo che l’utente inserisca il numero 4, l’output prodotto sarà: In questo modo il ciclo viene eseguito N volte Mettendo il <= all’interno della condizione il ciclo verrà eseguito N+1 volte e verrà stampato anche lo 0 - 28 - Pag. 7 7 Calcolo del prodotto di due numeri interi positivi per mezzo di somme successive (1) Inizio Leggi A e B r=0 A>0 No Si Calcolo del prodotto di due numeri interi positivi per mezzo di somme successive (2) Supponiamo che tra le istruzioni elementari conosciute dal nostro elaboratore/esecutore non ci sia il prodotto di due numeri interi positivi Inizio Leggi A e B È possibile calcolare un prodotto come somme successive: dati i due numeri A e B si può scegliere di sommare A con se stesso per B volte, oppure, sommare B con se stesso per A volte. r=0 A>0 No Si r=r+B r=r+B Stampa r A=A- 1 Stampa r Per far ciò è possibile riadattare il DF visto prima per il conteggio a ritroso A=A- 1 Fine Informatica 2012/2013 Fine Informatica 2012/2013 - 29 - Calcolo del prodotto di due numeri interi positivi per mezzo di somme successive (3) Inizio Leggi A e B È del tutto corretta anche la soluzione speculare: facciamo sommare A con se stesso per B volte (è sufficiente scambiare il ruolo di A e B) B>0 Si r=r+A Stampa r B=B-1 Fine Informatica 2012/2013 - 30 - Calcolo del prodotto di due numeri interi relativi r=0 No La struttura ciclica che prima era controllata dalla variabile N è ora controllata dalla variabile A In questo modo le istruzioni poste all’interno del ciclo verranno eseguite A volte (nella condizione si usa in questo caso il segno “>”) La variabile r utilizzata per calcolare il risultato finale per passi intermedi viene inizializzata a 0 (elemento invariante per la somma) e ad ogni iterazione del ciclo gli viene sommato il valore di B In questo caso si somma B con se stesso per A volte... Volendo rendere l’algoritmo il più efficiente possibile, si potrebbero controllare i valori iniziali di A e B e fare in modo di scegliere sempre il minore dei due come variabile che controlla il ciclo per eseguire il minor numero possibile di somme I DF appena visti funzionano correttamente solo per numeri A e B entrambi interi positivi Per far funzionare le cose per qualsiasi coppia A-B di numeri interi relativi è necessario modificare i DF appena visti Prima di vedere la versione finale introduciamo due DF che utilizzeremo come “sottoprogrammi” nella versione finale Ricordare che il blocco Sottoprog. ha proprio la funzione di richiamare un “sottoprogramma”, cioè interrompere momentaneamente l’esecuzione del DF corrente per eseguire l’algoritmo associato al sottoprogramma chiamato Informatica 2012/2013 - 31 - - 32 - Pag. 8 8 Sottoprogramma per il Prodotto di due numeri interi positivi Inizio Sottoprogramma per il calcolo del valore assoluto di un numero intero relativo Chiamiamo MUL il DF visto prima per il calcolo del prodotto di due numeri interi positivi Leggi A e B r=0 A>0 Leggi N Supponiamo quindi che una scrittura del tipo N<0 c = MUL(a,b) No Si Stampa r A=A- 1 Fine Informatica 2012/2013 Leggi A e B C = ABS(A) D = ABS(B) R = MUL(C,D) a = ABS(b) Stampa N Fine Informatica 2012/2013 - 33 - - 34 - Calcolo del prodotto di due numeri interi relativi (DF finale) (2) All’inizio vengono chiesti all’utente i due valori AeB Inizio Nelle variabili C e D si salvano, rispettivamente, i valori assoluti di A e B richiamando il Leggi A e B sottoprogramma ABS per calcolarli C = ABS(A) Visto che C e D sono entrambi numeri interi positivi, è quindi possibile richiamare il D = ABS(B) sottoprogramma MUL per calcolarne il prodotto R = MUL(C,D) No No (A<0 AND B>0) OR (A>0 AND B<0) (A<0 AND B>0) OR (A>0 AND B<0) Stampa R Si Il risultato fornito da MUL per R sarà sempre un numero positivo, è quindi necessario cambiargli segno se A e B hanno segno discorde Se A e B hanno segno concorde, il valore di R viene lasiato immutato Si stampa poi il valore finale di R come risultato della moltiplicazione Stampa N Si R=-R R=-R Fine Informatica 2012/2013 Supponiamo quindi che una scrittura del tipo permetta di richiamare questo algoritmo prendendo come valore iniziale di N il dato b passato come argomento della chiamata e fornendo il valore finale di N come risultato da assegnare alla variabile a N=-N Calcolo del prodotto di due numeri interi relativi (DF finale) (1) Inizio No Chiamiamo ABS il DF qui a fianco che calcola il valore assoluto di un numero intero relativo N Si permetta di richiamare tale algoritmo prendendo come valori iniziali di A e B i due dati a e b passati come argomenti della chiamata e fornendo il valore finale di r come risultato da assegnare alla variabile c r=r+B Inizio Fine Informatica 2012/2013 - 35 - - 36 - Pag. 9 9 …. Fine per oggi… Informatica 2012/2013 Pag. 10 10