Istruzioni Decisionali Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari
Istruzione if Sintassi semplice Si usa quando occorre eseguire un'azione secondo il verificarsi di una condizione esempio: write('inserisci un numero'); readln(i); if i < 100 then writeln('i minore e'' di 100'); sintassi semplificata: if <espressionelogica> then <istruzione> <espressionelogica> denota una espressione booleana che può assumere i valori true o false;
Istruzione if Sintassi completa NB: senza separatore ; if <espressionelogica> then <istruzione1> [else <istruzione2>] il ramo [else <istruzione2>] è opzionale vero espr. logica falso istruzione1 istruzione2
Uso di if-then-else program provaIf2(input, output); var i: integer; begin write('Inserisci un numero intero: '); readln(i); if i<100 then writeln('minore di 100') else writeln('maggiore o uguale a 100'); end.
Istruzioni composte A volte è necessario effettuare una sequenza di istruzioni (ad esempio in base ad una condizione) esempio: if i < 100 then writeln('minore di 100'); writeln('istruzione successiva'); oppure if i < 100 then writeln('minore di 100') else writeln('maggiore o uguale a 100'); writeln('istruzione successiva'); writeln('istruzione successiva') viene eseguita indipendentemente dalla verità della condizione
Blocco di istruzioni program prova_if3 (input, output); var i: integer; mag_100: integer; min_100: integer; begin mag_100 := 0; min_100 := 0; write('Inserisci un numero intero: '); readln(i); if i<100 then writeln('minore di 100'); min_100 := 1; end else writeln(' maggiore o uguale a 100'); mag_100 := 1; end.
Comporre con begin-end Le parole chiave begin e end si usano come parentesi per delimitare un blocco di una o più istruzioni in sequenza sarebbe errato scrivere: if i<100 then writeln('minore di 100'); min_100 := 1; else writeln(' maggiore o uguale a 100'); mag_100 := 1; un blocco può comparire dovunque possa comparire un'istruzione semplice (indipendentemente dal particolare costrutto, es. if-then-else)
If annidati if-then-else è a sua volta un'istruzione: può quindi comparire all'interno di un'altra if esempio: if i < 100 then if i > 0 then writeln('minore di 100 e maggiore di 0'); se vogliamo anche il ramo else: if i < 100 then if i > 0 then writeln('minore di 100 e maggiore di 0') else writeln('minore di 100 ma non maggiore di 0'); NB: else si riferisce all'ultimo if incontrato!
If annidati (2) se vogliamo anche il ramo else riferito al primo if: if i < 100 then begin if i > 0 then writeln('minore di 100 e maggiore di 0') end else writeln('maggiore o uguale a 100'); volendo l'else anche per l'if interno begin-else son superflui: if i < 100 then if i > 0 then writeln('minore di 100 e maggiore di 0') else writeln('minore di 100 ma non maggiore di 0')
If annidati (3) anche il ramo else può fare annidare un altro if: if i < 100 then if i > 0 then writeln('minore di 100 e maggiore di 0') else writeln('minore di 100 ma non maggiore di 0') else if i = 100 then writeln('uguale a 0') else writeln('maggiore di 100'); si noti l'uso dell'operatore relazionale =
Variabili boolean È possibile dichiarare variabili che assumono uno dei due valori logici true o false : il tipo di queste variabili si denota con la keyword boolean es. di dichiarazione: var a,b,c: boolean; è consentito assegnare risultati di espressioni come: a := i < 100; b := x = y; dato che la if testa una espressione logica si possono usare simili espressioni: if a = true then … ovvero if a then ...
Variabili boolean test di variabili logiche program provaIf4 (input, output); var i: integer; a: boolean; begin write('Immetti un numero intero: '); readln(i); a := i<100; if a=TRUE then writeln('minore di 100'); end.
Variabili boolean funzioni predefinite write(·) OK: stampa false o true read(·) NO: in molti compilatori odd(n) dispari su argomenti interi restituisce un valore boolean esempio: write('immettere un numero'); read(n); if odd(n) then write('numero dispari') else write('numero pari'); vale la relazione false < true
Espressioni logiche si possono definire utilizzando operatori relazionali: < (minore) > (maggiore) = (uguale) <> (diverso) >= (maggiore o uguale) <= (minore o uguale) espressioni semplici possono essere concatenate con gli operatori logici: not a (negazione: tramuta nel valore duale) a and b (congiunzione: vero sse entrambi veri) a or b (disgiunzione: vero sse almeno uno vero) non standard: a xor b (differenza: vero sse diversi)
Espressioni logiche si possono utilizzare le parentesi ed anche relazioni su variabili di altri tipi: ((nx1<>nx2) or (cx1>cx2)) and (presenti <524) in istruzioni condizionali: if (x=y) and (alfa>beta) then writeln('x uguale a y e alfa maggiore di beta') else writeln('x diverso da y o alfa minore o uguale a beta'); operandi misti: if i + 52 < x * a then writeln('espr. aritm. Nelle espr. logiche');
Variabili di tipo char Tipo carattere alfanumerico esempio: var x, y, z : char; Occupazione in memoria: 1 byte => 256 codici carattere distinti assegnamento: x := 'A'; operatori relazionali: si possono usare dato che è implicito un ordinamento (dato dal codice) funzioni: ord() / chr(), pred() / succ() '0' = chr(48) - 'Z' = chr(57) 'A' = chr(65) - 'Z' = chr(90) 'a' = chr(98) - 'Z' = chr(122)
Istruzione case Abbreviazione di if in cascata if <espressione logica1> then <istruzione 1> else if <espressione logica2> then <istruzione 2> else if <espressione logica3> then <istruzione 3> ... else <istruzione N> quando una stessa espressione (integer o char) viene confrontata con un insieme di espressioni costanti case <espressione> of <lista costanti 1>: <istruzione 1>; <lista costanti 2>: <istruzione 2>; <lista costanti 3>: <istruzione 3>; … [else <istruzione N>;] end;
Istruzione case esempio (1) program provaCase (input, output); var x: integer; begin write('Digita una cifra compresa fra 1 e 4: '); readln(x); case x of 1: writeln(' uno'); 2: writeln(' due'); 3: writeln(' tre'); 4: writeln(' quattro'); else writeln(' cifra fuori intervallo'); end end.
Istruzione case esempio (2) program provaCase2 (input, output); var x: char; begin writeln('Ins. una cifra: '); read(x); case x of '0','2','4','6','8': writeln(' pari'); '1','3','5','7','9': writeln(' dispari'); else writeln(' non hai inserito una cifra'); end end.