Istruzioni Iterative Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari
Istruzione for Si usa quando occorre eseguire un'istruzione (o una serie di istruzioni) un determinato numero di volte esempio: somma := 0; somma := somma + 7; somma := somma + 7; somma := somma + 7; usando un ciclo for: somma := 0; for i := 1 to 3 do somma := somma + 7; inizializzazione
Istruzione for Sintassi completa for <var.> := <val.iniziale> to <val.finale> do <istruzione>; 1. inizializza la variabile <var.> a <val.iniziale>; 2. confronta la variabile con <val.finale>; 3. se <= allora esegui istruzione incrementa <var.> torna al passo 2 altrimenti esci dal ciclo
Istruzione for Diagramma di flusso inizializzazione variabile variabile <= val.finale vero istruzione/i falso
Esempio di ciclo for program somma (input, output); var i, somma, numero: integer; begin writeln('SOMMA 5 NUMERI'); writeln; somma := 0; for i := 1 to 5 do write('Inserire un intero: '); readln(numero); somma := somma + numero; end; writeln('Somma: ', somma); readln; end.
for i := 5 downto 1 do <istruzione>; Varianti di ciclo for for i := 16 to 24 do ... for i := -20 to -16 do ... for i := -3 to 1 do ... for i := 5 to 5 do ... l'istruzione nel ciclo viene eseguita solo 1 volta for i := 5 to 4 do ... non esegue l'istruzione nel ciclo cicli a decremento: for <var.> := <val.iniziale> downto <val.finale> do <istruzione>; esempio: for i := 5 downto 1 do <istruzione>;
Esempio Calcolo del fattoriale il fattoriale di un numero n intero è definito: n! = 1 * 2 * … * (n-1) * n program fattoriale (input, output); var n, fat, aus: integer; begin writeln('CALCOLO DI N!'); writeln; write('Inserire n: '); readln(n); fat := 1; for aus := 2 to n do fat := fat*aus; writeln(n,'! = ', fat); readln; end.
Istruzione while Si usa quando occorre ripetere un'istruzione (o una serie di istruzioni) mentre una condizione resta vera: while <espressione logica> do <istruzione>; Può essere considerata una generalizzazione del ciclo for ovvero questo ne è una abbreviazione Una istruzione while può far ciclare per un numero di volte non determinato a priori
Esempio di ciclo while program somma2 (input, output); var i, somma, numero: integer; begin writeln('SOMMA 5 NUMERI'); somma := 0; writeln('PROVA WHILE'); writeln; i := 1; while i <= 5 do write('Inserire un intero: '); readln(numero); somma := somma + numero; i := i+1; end; writeln('Somma: ', somma); readln; end.
Confronto tra cicli while e for while i <= 5 do begin write('intero: '); readln(numero); somma:=somma+numero; i := i+1; end; for i := 1 to 5 do begin write('intero: '); readln(numero); somma:=somma+numero; end;
Istruzione while Diagramma di flusso espressione logica vero istruzione/i falso
Esempio ripetizione con valore di sentinella program somma3 (input, output); var somma, numero: integer; begin writeln('SOMMA di NUMERI'); writeln('inserire 0 per terminare'); writeln; somma := 0; numero := 1; while numero<>0 do write('Inserire un intero: '); readln(numero); somma := somma + numero; end; writeln('Somma: ',somma); readln; end.
Esempio ripetizione con condizione complessa program sommaMax (input, output); var somma, numero, max, i: integer; begin writeln('SOMMA E MAGGIORE'); writeln('Inserire zero per terminare'); numero := 1; somma := 0; max := 0; i := 1; while (numero<>0) and (i<=10) do write('Inserire intero positivo: '); readln(numero); if numero > max then max := numero; somma := somma + numero; i := i+1; end; writeln('Somma: ', somma); writeln('Maggiore: ', max); readln; end.
Esempio somma e max con interi anche negativi program sommaMax2 (input, output); var ancora: char; somma, numero, max, i:integer; begin writeln('SOMMA E MAGGIORE'); writeln('Inserire zero per terminare'); ancora := 'S'; somma := 0; max := -MAXINT-1; i := 1; while ((ancora='S') or (ancora='s')) and (i<=10) write('Valore intero: '); readln(numero); if numero>max then max := numero; somma := somma+numero; i := i+1; write('Vuoi continuare (S/N) ? ' ); readln(ancora); end; writeln('Somma: ', somma); writeln('Maggiore: ', max); readln; end.
Esempio ciclo potenzialmente infinito program sommaN (input, output); var n, i, somma: integer; begin writeln('SOMMA DEI PRIMI N NUMERI INTERI'); writeln; write('Valore di n ? '); readln(n); somma := 0; i := 0; while i<>n do i := i+1; somma := somma+i; end; writeln('Somma: ', somma); readln; end.
Istruzione repeat-until Si usa quando, in un ciclo, un'istruzione (o una serie di istruzioni) debba essere ripetuta almeno una volta: repeat <istruzione> until <espressione logica>; diversamente dalla while si esce dal ciclo quando la condizione risulta verificata tra repeat e until può essere messo direttamente un blocco di istruzioni (senza begin..end)
Esempio somma e max con repeat-until program sommaMax3 (input, output); var somma, numero, max,i:integer; begin writeln('SOMMA E MAGGIORE'); writeln('Inserire zero per terminare'); somma := 0; max := 0; i := 1; repeat write('Valore intero'); readln(numero); if numero>max then max := numero; somma := somma+numero; i := i+1; until (numero=0) or (i>10); writeln('Somma: ', somma); writeln('Maggiore: ', max); readln; end.
Istruzione repeat-until Diagramma di flusso istruzione/i espressione logica falso vero
Cicli annidati uno dei cicli mostrati può essere considerato come una singola istruzione e perciò può essere posto all'interno di un altro ciclo: i:=1; while i <= n do begin for j:=1 to m do writeln('i: ', i, ' j: ', j); i:=i+1; end; for i :=1 to n do for j:=1 to m do writeln('i: ', i, ' j: ', j);
Esempio stampa quadrato di + program lineeColonne (input, output); var n, m, i, j: integer; begin write('Inserire il numero di linee: ') readln(n); write('Inserire il numero di colonne: ') readln(m); for i := 1 to n do {inizio blocco ciclo esterno } writeln; for j := 1 to m do write('+'); end; { fine blocco ciclo esterno } readln; end.
<mantissa>*10<caratteristica> Tipo real possibilità di memorizzare numeri non interi var x, y, z: real; rappresentazione interna a 6 byte range valori positivi e negativi tra 10-38 e 1038 notazione esponenziale normalizzata: <mantissa>*10<caratteristica> <mantissa> (39+1 bit) <caratteristica> (7+1 bit) assegnamento: x:=145.34; y:=0.0008; z:=7E+20; {notazione scientifica} notazione scientifica nEm: indica che n va moltiplicato per 10 elevato a m
Operazioni sul tipo real writeln(x:5:2); il valore reale sarà scritto in un campo numerico allineato a destra di 5 cifre con 2 cifre decimali operatori: + - * / regole: un operando integer può essere usato in luogo di un real se almeno un operando è real il risultato è un valore real round() e trunc() convertono da real a integer funzioni trigonometriche: sin(), cos() e arctan() funzioni logaritmico/esponenziali: sqr(), sqrt(), ln() e exp()
Esempio metodo dicotomico per il calcolo degli zeri f(b) a b f(a)
Esempio metodo dicotomico per il calcolo degli zeri program ricercaZero (input, output); const err=0.001; var a, b, m : real; fa, fb, fm : real; begin repeat write('Inserire a: '); readln(a); write('Inserire b: '); readln(b); fa := 2*a*a*a-4*a+1; fb := 2*b*b*b-4*b+1; until fa*fb <= 0; repeat m:=(a+b)/2; fm:= 2*m*m*m-4*m+1; if fa*fm<0 then begin fb:=fm; b:=m; end else begin fa:=fm; a:=m; end; until abs(fm)<err; write ('Zero di f in ', m:0:3); readln; end.