vuoi
o PayPal
tutte le volte che vuoi
Diagrammi a blocchi e iterazioni
ITERA PER VERO: Prima Itera poi domanda = Do Until- Prima Domanda e poi itera = Do While
ITERA PER FALSO: Prima itera poi domanda = Loop Until- Prima domanda poi itera = Repeat Until
Diagrammi a blocchi, dove si ritrovano le varie sequenze. Indicano il flusso di esecuzione di qualcosa. Dettagliano il susseguirsi delle operazioni da fare per arrivare ad una soluzione. Sono collegati da frecce che servono a seguire l'ordine. Ogni blocco contiene un'azione. Ogni blocco ha una forma ben precisa:
- Blocco di inizio (trapezio rovesciato)
- Blocco di fine (trapezio normale)
- Blocco di input o output (rombo-parallelogramma)
- Operazioni di tipo operativo (rettangolo)
- Selezione con due rami diversi uscenti in base al risultato (rombo perfetto)
Un diagramma a blocchi descrive un algoritmo se:
- Ha un blocco iniziale e uno finale
- È costituito da un numero finito di blocchi azione e/o blocchi lettura/scrittura
(vero)Prod= 2+b= 2+2= 4A= a-1= 2-1= 11≠0 (vero)Prod= 4+2 = 6A=1-1= 00≠0 (falso) -> fine. 3x2=6
Es2. Voglio sapere il massimo di un insieme di numeri. Supponiamo che mi danno tutti dei numeri positivi ed uno zero.
Es. mi da il numero 4. Per ora il numero massimo è 4
Mi dà il 23. Più grande adesso il 23.
Mi dà il 9 . rimane più grande 23
Mi dà il 59, più grande di 23
Mi dà 0. Ho finito 4 – 23 – 9 – 59 – 0 fare diagramma di flusso che rappresenta questi passaggi per individuare il maggiore.. ??
Es3. Dato un valore N, restituire il fattoriale:
Dato questo diagramma di flusso, si ipotizzi che N=3, Simulare l’esecuzione.
Quale problema risolve questo algoritmo?
Parto:
N=3
N=P=3
3>2 ? (vero)
N=3-1= 2
P= 3*2= 6
2>2? (falso)
Scrivi P = 6 (fine)
Cos’è 6? Il fattoriale = 3*2*1= 6
Es4. N=4 ; dato il diagramma simulare l’esecuzione:
parto:
N=4
P=1
I=1
I<N ?--> 1<4? (vero)
I=1+1= 2
P= 1*2=2
I<N = ...
2<4 (vero)
I= 2+1=3
P= 2*3= 6
I<N= 3<4 (vero)
I=3+1=4
P=6*4= 24
I<N= 4<4? (falso)
Scrivi P : P= 24 (fine)
Es5. N=3
Parto:
n=3
ris=0
i=0
i>n? = 0>3 (falso)
ris= 0+0=0
i=0+1=1
i>n = 1>3 (falso)
ris= 0+1= 1
i= 1+1=2
i>n = 2>3 (falso)
ris= 1+2=3
i=2+1=3
i>n = 3>3 (falso)
Ris=3+3=6
I=3+1= 4
i>n = 4>3 (vero)
Scrivi Ris= 6 (fine) (non mag o uguale)
Es6: N=3 Dato l’istogramma risolvere:
n=3
ris=n=3
n<1= 3<1 (falso)
n=3-1=2
ris= 3+2=5
2<1(falso)
n=2-1=1
ris=5+1=6
1<1(falso) [in realtà n≤1 si ferma qua, ris sempre=6]
n=1-1=0
ris=6+0=6
0<1 (vero)
Scrivi ris= 6 (fine)
È efficiente fare tutti questi passaggi? Teoricamente no, l’algoritmo migliore è quello di trovare la formula più adatta ed applicarla. La somma dei numeri: n= n*(n+1/2).
Es7. Simulare il seguente diagramma con
X= 3
Y=2
X<Y ? = 3<2 (falso)
X= 3-2= 1
1<2 (vero)
Output= x=1
Fare con
X=14
Y=3
14<3 (falso)
X= 14-3= 11
11<3 (falso)
X= 11-3= 8
8<3 (falso)
X= 8-3= 5
5<3 (falso)
X= 5-3= 2
2<3 (vero)
Output: x=2 X= 14-3-3-3-3=2 Come spiegata la divisione ai bambini? Con le sottrazioni, si sottrae fino a che rimane quello che non si può sottrarre. Es8. X=2 Y=18 x>0 (v) y>0 (v) ì=x= 2 i<18, 2<18 (vero) i= 2*2=4 4<18 (v) ì= 4*2=8 8<18 (v) I= 8*2= 16 16<18 (v) ì=16*2= 32 32<18 (f) ì= 32:2= 16 Es.7 X=2 Y=18 X>0 (v) y>0 (v) ì=1 ì*x<y ? = 1*2<18= 2<18 (vero) ì= ì*x = 1*2 = 2 ì= ì+1= 1+1=2 2*2<18 , 4<18 (vero) ì= 2+1= 3 3*2<18, 6<18 (vero) (ad ì aggiungo sempre +1 ad ogni ciclo) 4*2<18 , 8 <18 (vero) ì= 2+1= 3 5*2 <10, 10< 18 6*2 … 7*2 … 8*2.. , 9*2 <18, 18<18 (falso) ì= 9*2= 18 [ multipli di 2 minori di 18 ] Es. 8 N=10 n>0 (vero) ì=1 ì*1≥10 (falso) ì=1+1=2 2*2 ≥10 (falso) ì= 2+1=3 3*3≥10, 9≥10 (falso) ì=3+1=4 4*4, 16≥10 (vero) Output= ì = 4 Da diagramma a VBA o deduzione inversa: es1. Sub Pippo() Dim a Asutilizzo il tag html pre per mantenere la formattazione del testo:
Sub SingleDim() Dim b As Single Dim prod As Single a = InputBox("inserisci a") b = InputBox("inserisci b") Do While a <> 0 prod = prod + b a = a - 1 Loop MsgBox prod End Sub Sub Pippo2() Dim i As Single Dim n As Single Dim p As Single n = InputBox("inserisci n") p = 1 i = 1 Do While i < n i = i + 1 p = p * i Loop MsgBox p End Sub Sub Pippo3() Dim n As Single Dim ris As Single Dim è As Single n = InputBox("leggi n") Do Until è = n è = è + 1 ris = ris + è Loop MsgBox ris End Sub
itera o prima itera poi si fala domanda? Si fa prima la domanda poi itera, quindi è un repeatuntil (perché prima mi chiedo, poi itero)
Repeat Until ì>nris = ris + ìì = ì + 1
Loop
MsgBox ris
End Sub
Gli algoritmi e i diagrammi di flusso visti fino ad ora riguardano algoritmi semplici (dati scalari). Ci sono anche i dati non strutturati (Array e Record).
Algoritmi che riguardano le variabili non scalari: la più semplice è quella di avere un insieme di informazioni omogenee (tutte dello stesso tipo, posso utilizzare il vettore).
Es. Il vettore: insieme di dati dello stesso tipo, tutti ordinati. La dimensione del vettore è la quantità di elementi che contiene.
Cerchiamo di vedere dato questo algoritmo, che cosa fa, simuliamo l'esecuzione e traiamo una conclusione.
Es1. Supponiamo di avere un vettore costituito da numeri interi.
Vettore (6,7,1,3,4,5)
Acquisito come elemento in ingresso, il valore 3.
Dimensione del vettore = 6
(sei elementicontenuti)Simulare l'esecuzione:Ì=00=6 ? (falso)Vettore (0) è 6 = 3 ? (falso)Ì=0+1 =11=6? (F)V(1) è 7 = 3?Ì= 1+1= 22= 6 ? (f)V(2) è 1 = 3? (f)Ì= 2+1= 33=6 ? (F)V(3) è 3= 3 ? (vero)Questo modus operandi va a cercare se un valore è presente o meno in un insieme di altri elementi. (es. unnumero di telefono in un elenco).Ora, riportare in VBA il diagramma precedente: non si può tradurre poiché ha due uscite.Va creata una uscita forzata da un ciclo ( se rischia di continuare il ciclo es. se trovo alla prima ciò checercavo evita che continui a controllare ogni elemento).. esci = GO TOSoluzione migliore, aggiungere una variabile che mi dice se ho trovato il mio oggetto oppure no.--Se programmato in modo strutturato (cioè senza uscite forzate). Es2.Vettore (6,7,1,3,4,5)Acquisito come elemento in ingresso, ilvalore 3.Dimensione del vettore = 6 (sei elementicontenuti)Ì=0trovato =
falso (ancora maglietta nontrovata).0= 6 oppure falso? (falso)
V(0) è 6=3? (F)
È= 0+1= 11=6 oppure falso? (f)
V(1) è 7 = 3? (f)
È=1+1=22=6 oppure falso ?(f)
V(2) è 1 = 3 (F)
È=2+1 = 33 = 6? (f)
V(3) è 3= 3? (vero)
Trovato= veroÈ=3+1=44= 6 oppure vero? (vero che trovato è vero. Ho un vero e un falso vince il vero)
Trovato? VeroFinePossibile tradurre in VBA (usare until)Es.3Simulare operazione:Vettore (6,7,1,3,4,5)Acquisito come elemento in ingresso, il valore 3.Dimensione del vettore = 6 (sei elementi contenuti) È=0V(0) è 6= max0 = 6-1 (F)È=0+1=1V(1) è 7 > 6 (vero)V(1) è 7 = max1=5 ? (f)È=1+1=2V(2) è 1 > 7 ? (falso)2=5 ? (f)È= 2+1=3V(3) è 3 > 7 (fa