Le strutture strutture di di controllo controllo Le STRUTTURE (O COSTRUTTI) DI CONTROLLO •determinano l’ordine con cui devono essere eseguite le istruzioni •sono indipendenti dalla natura delle istruzioni •sono strumenti logici universali utilizzabili in qualunque problema Classificazione delle delle strutture strutture di di controllo controllo Classificazione Algoritmo per il cambio della ruota inizio V Ruota di scorta bucata? F Solleva l’auto •sequenza svita un bullone •selezione •iterazione o ripetizione F Tutti svitati? Chiama il V Togli la ruota meccanico Metti la ruota di scorta Avvita un bullone Tutti avvitati? F V Abbassa l’auto fine 1 V Togli la ruota Ruota di scorta bucata? F Chiama il meccanico Metti la ruota di scorta SEQUENZA DI ISTRUZIONI STRUTTURA DI SELEZIONE Sequenza di di istruzioni istruzioni Sequenza Avvita un bullone Istruzione 1 F FLOWCHART Tutti avvitati? Istruzione 2 V Istruzione 3 STRUTTURA DI ITERAZIONE PASCAL-LIKE Istruzione 1 Istruzione 2 Istruzione 3 … 2 Struttura di di selezione selezione Struttura FLOWCHART V condizione Istruzioni 1 Esempio: algoritmo per il calcolo del massimo tra due numeri reali F begin MASSIMO var: a, b, max : real Istruzioni 2 read a,b if (a>b) then PASCAL-LIKE max:=a else max:=b endif print max end MASSIMO if (condizione) then Istruzioni 1 else Istruzioni 2 endif Esempio: algoritmo per il calcolo del valore assoluto di un numero reale Osservazione Osservazione La struttura di selezione può anche essere del tipo: F begin VALASS var: a: real read a condizione FLOWCHART if (a<0) then V Istruzioni a:= -a endif print a end VALASS PASCAL-LIKE if (condizione) then Istruzioni endif 3 Struttura di di iterazione iterazione di di tipo tipo for for Struttura Esempio: algoritmo per il calcolo della somma di N numeri reali begin SOMMA FLOWCHART Istruzioni N volte var: i,N: integer var: numero,sum: real read N sum:=0. for i=1,N do read numero for i =1,N do istruzioni endfor PASCAL-LIKE sum:=sum+numero endfor print sum end SOMMA Esempio: algoritmo per il calcolo di n! con n>1 begin FATTORIALE Esempio: algoritmo per il calcolo di n! con n>1 (seconda versione) begin FATTORIALE var: n,i,fatt:integer var: n,i,fatt:integer read n read n fatt:=1 fatt:=n for i=2,n do for i=n-1,2,-1 do fatt:=fatt*i incremento del contatore fatt:=fatt*i endfor endfor print fatt print fatt end FATTORIALE end FATTORIALE 4 Esempio: algoritmo per il calcolo del prodotto di N numeri reali begin PRODOTTO var: i,N: integer Osservazione Osservazione Se un numero è nullo il prodotto è nullo var: numero,prod: real read N,numero prod:=numero for i=1,N-1 do Prevedere il caso in cui un numero sia nullo ed in tal caso arrestare il procedimento read numero prod:=prod*numero Arrestare il procedimento quando sono stati moltiplicati tutti i numeri oppure quando un dato è nullo endfor print prod end PRODOTTO Struttura di di iterazione iterazione di di tipo tipo while while Struttura FLOWCHART F Esempio: algoritmo per il calcolo del prodotto di N numeri reali begin PRODOTTO condizione var: i,N: integer var: numero,prod: real V Istruzioni PASCAL-LIKE while (condizione) do istruzioni endwhile read N,numero i:=1 prod:=numero while (prod≠0 and i<n) do read numero i:=i+1 prod:=prod*numero endwhile print prod end PRODOTTO 5 Struttura di di iterazione iterazione di di tipo tipo repeat-until repeat-until Struttura Esercizio: riscrivere l’algoritmo per il calcolo del prodotto di N numeri reali utilizzando la struttura iterativa repeat-until Istruzioni FLOWCHART condizione F V PASCAL-LIKE repeat istruzioni until (condizione) Algoritmo per il calcolo del prodotto di N numeri reali (versione con il repeat-until) Differenze tra tra le le strutture strutture iterative iterative Differenze begin PRODOTTO var: i,N: integer var: numero,prod: real read N,numero i:=1 prod:=numero repeat read numero i:=i+1 prod:=prod*numero until (prod=0 or i≥n) print prod end PRODOTTO •Il for richiede che sia noto a priori il numero di iterazioni da effettuare •Il while ed il repeat non richiedono tale informazione •Nel while se la condizione è falsa non si esegue alcuna istruzione del ciclo •Nel repeat le istruzioni del ciclo sono eseguite almeno una volta •Nel while la condizione determina l’entrata nel ciclo •Nel repeat-until la condizione determina l’uscita dal ciclo 6 Esempio: algoritmo per il calcolo del MCD tra due numeri interi Come si calcolano il quoziente ed il resto della divisione tra due numeri interi? Esempio: MCD (24,15) x: y= 24 : 15 = 9 1 15 : 9 = 6 1 r q q=x/y r=x-y*q MCD 9: 6= 3 1 6: 3= 0 2 Algoritmo per il calcolo del MCD tra due numeri interi begin MCD var:x,y,r,q,t:integer read x,y if (x <y) then t =x scambio dei valori x =y delle variabili y =t endif repeat q:=x/y r:=x-q*y x:=y y:=r until (r=0) print x end MCD Le strutture di controllo possono essere innestate l’una nell’altra while (condizione) do for i = m, n, k do if (condizione)then Istruzioni endif endfor endwhile 7 Esempio: algoritmo per il calcolo del massimo tra N numeri reali begin MASSIMO var: num, max : real var: i, N: integer read N,num max:=num for i=2, N do read num if (num>max) then max:=num endif endfor print max Esempio: algoritmo per la ricerca di un dato elemento in un insieme di N numeri interi •dati di input : N, numeri, elemento da cercare •dati di output: variabile logica che indica se l’elemento è stato trovato, posizione Esempio: dati di input: 4, 2, 1, 10, 5 10 dati di output: vero, 3 end MASSIMO begin RICERCA_SEQ var:N, num,elem, i, pos: integer var: trov: logical read N,elem trov=.false. i=0 pos=0 while (i<N and .not.trov) do read num i:=i+1 Esercizio: riscrivere l’algoritmo per la ricerca di un dato elemento in un insieme di N numeri interi utilizzando la struttura iterativa repeat-until if (elem=num) then trov:=.true. pos:=i endif endwhile print trov,pos end RICERCA_SEQ 8 begin RICERCA_SEQ var:N, num,elem, i, pos: integer var: trov: logical read N,elem trov=.false. i=0 pos=0 repeat read num i:=i+1 if (elem=num) then trov:=.true. pos:=i endif until (i≥N or trov) print trov,pos Esercizio: algoritmo per il calcolo della divisione intera tra due numeri naturali con il metodo delle sottrazioni successive •dati di input: due numeri naturali x e y •dati di output: parte intera di x/y Esempio: x=26, y=7 parte intera di x/y = 3 end RICERCA_SEQ Algoritmo Strategia Strategia •Si sottrae y da x e si assegna a x il valore della differenza fino al verificarsi della condizione x<y •Il numero delle sottrazioni eseguite è la parte intera di x/y Esempio: x=26, y=7 begin DIVISIONE var: x,y,cont,diff: integer read x,y cont:=0 diff:=x while (diff≥y) do 26-7 = 19 1 19-7 = 12 2 12-7 = 5 3 diff:=diff-y cont:=cont+1 risultato 5<7 ⇒ il procedimento termina endwhile print cont end DIVISIONE 9 Algoritmo Esercizio: scrivere l’algoritmo per la conversione di un intero dalla base decimale a quella binaria begin CONVERSIONE var: n, q, r: integer var: bin, stringa: character read n bin:= ‘’ repeat q:= n/2 r:= n-2*q stringa:= ‘r’ bin:= stringa//bin n:= q until (q=0) print bin end CONVERSIONE 10