come istruire una macchina a prendere decisioni ? if …. then ….. else per prendere una decisione...

58

Upload: edoardo-del-prete

Post on 01-May-2015

218 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare
Page 2: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ?

IF …. THEN ….. ELSE

Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare una espressione booleana attraverso la quale si controlla se le condizioni per applicare quanto descritto dopo il THEN sono verificate. In caso contrario si applica quanto descritto dopo ELSE.

Page 3: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Una espressione booleana rappresenta una condizione che, per quanto il programma ha elaborato fino a quel punto, può essere

dichiarata vera o falsa.

Una espressione booleana semplice effettua il confronto tra due espressioni dello stesso tipo.

Page 4: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Espressione booleana semplice

Operatore relazionaleespressione espressione

Operatore Relazione< minore di<= minore o eguale a= eguale a<> diverso da> maggiore di>= maggiore o eguale a

Page 5: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

3 4 pippoGE StringaXint Yint Ch1 Ch2

Espressione Significato ValoreXint < Yint 3 è minore di 4 VEROYint -3<=Xint 1 è minore o eguale di 3 VEROCh1 = Ch2 E è eguale a G FALSOCh1 <> Ch2 Ch1 è diverso da Ch2 VEROpaolo > pippo pippo è maggiore di paolo FALSOsucc(Ch1) >= pred(Ch2) F è maggiore o eguale a F VERO

Page 6: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

REGOLE SINTATTICHE PER IF …THEN…ELSE

IF … THEN … ELSE ….

espressione booleanaIF THEN istruzioni

istruzioniELSE

IF Voto >= 18 THEN writeln(‘ promosso ‘)ELSEwriteln(‘ bocciato ‘)

IF Voto >= 28 THEN writeln(‘ BRAVO ‘)

Page 7: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

PSEUDO CODICE PER IF …THEN…ELSE

SE la condizione è valuta vera ALLORA esegui l’azione 1ALTRIMENTIesegui l’azione 2

SE la condizione è valuta vera ALLORA esegui l’azione

Page 8: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

bravo

si

no

Voto>=28

bocciato

promosso

si

no

Voto>=18

precondizione

postcondizione

IF IF

ELSE

THEN THEN

Page 9: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

ESEMPIO

Write(‘ Che giorno è oggi ? ‘);readln(Giorno);IF Giorno=‘Venerdì’ THEN

BEGINwriteln(‘Fai attenzione che il ‘);writeln(‘Venerdì e’’ un giorno sfortunato’);writeln(‘resta a casa !!!’)END

ELSEBEGINwriteln(‘Bene il ‘,Giorno);writeln(‘e’’ un giorno fortunato’)END;

Adottare in ogni programma una convenzione per scrivere le istruzioni.

Notare che inqueste posizioni non ci vogliono ;

Page 10: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

ESEMPIO

Introduciamo una procedura che può essere utilizzata in qualunque programma: MostraIstruzioni.Vogliamo poter mostrare le istruzioni di un programma solo se lo riteniamo opportuno.

PROCEDURE MostraIstruzioni;BEGIN ……….END;

PROCEDURE MostraSiNo;{Mostra le istruzioni se lo desideri}VAR

Risposta: char;BEGINwrite(‘Vuoi vedere le istruzioni ? (S/N) ‘);readln(Risposta);IF Risposta=‘S’ THEN

MostraIstruzioniEND;

Page 11: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

UN CASO DI STUDIO

Ordinare in maniera crescente tre numeri assegnati.

Esempio di run:Introduci tre numeri interi : 58 72 33

I numeri ordinati in maniera crescente sono: 33 58 72

Page 12: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Pseudo codice di MostraNumeriOrdinatiIntroduci Numero1, Numero2, Numero3Ordina in maniera crescente Numero1, Numero2, Numero3Mostra i numeri ordinati

PROGRAM MostraNumeriOrdinati(input;output);{Vengono letti tre numeri e ordinati in maniera crescente}VAR

Numero1, Numero2, Numero3 : integer;PROCEDURE Ordina(VAR N1,N2,N3:integer);{in: tre numeri out: i tre numeri ordinati}BEGIN END;{************ MAIN BLOCK*************}BEGINwrite(‘Introduci tre numeri interi : ‘);readln(Numero1, Numero2, Numero3);Ordina(Numero1, Numero2, Numero3);writeln(‘I numeri ordinati in maniera crescente sono: ‘);writeln(Numero1:6:0, Numero2 :6:0, Numero3:6:0)END.

Page 13: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Pseudo codice di OrdinaSe Numero1 > Numero2 allora scambia Numero1 con Numero2 Se Numero1 > Numero3 allora scambia Numero1 con Numero3Se Numero2 > Numero3 allora scambia Numero2 con Numero3

Pseudo codice di OrdinaSe Numero1 > Numero2 allora Scambia(Numero1,Numero2) Se Numero1 > Numero3 allora Scambia(Numero1,Numero3) Se Numero2 > Numero3 allora Scambia(Numero2,Numero3)

MostraNumeriOrdinati

Ordina Mostra i numeriIntroduci Numeri

Scambia

Numero1Numero2Numero3

Numero1Numero2Numero3

Numero1Numero2Numero3

Numero1Numero2Numero3

N1N2

N1N2

Page 14: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

PROCEDURE Ordina(VAR N1,N2,N3:integer);{in: tre numeri out: i tre numeri ordinati}BEGINIF N1>N2 THENScambia(N1,N2);IF N1>N3 THENScambia(N1,N3);IF N2>N3 THENScambia(N2,N3)END;

PROCEDURE Scambia(VAR Num1,Num2:integer);{in: due numeri out: i due numeri invertiti}VARTemp :integer;BEGINTemp:=Num1;Num1:=Num2;Num2:=TempEND;

Page 15: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

CASO DI STUDIO

Supponiamo di volere cambiare un assegno di una certa cifra in moneta.Supponiamo siano assegnati i tagli delle monete e le quantità che la banca possiede per ogni taglio.Vogliamo sapere, la cifra assegnata in quali e quanti tagli di monete sarà convertita.

Page 16: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Esempio:I tagli disponibili sono: da 100 da 500 da 1000 da 5000 da 10000

Dammi pezzi presenti per ogni taglioPezzi da 100: 500Pezzi da 500: 1000Pezzi da 1000: 100Pezzi da 5000: 1000Pezzi da 10000: 1000Dammi la cifra da cambiare:12.370.400

La cifra di 12.370.400 e' cambiata in 1000 monete da 10.000 Lit. pari a 10.000.000 474 monete da 5.000 Lit. pari a 2.370.000 0 monete da 1.000 Lit. pari a 0 0 monete da 500 Lit. pari a 0 4 monete da 100 Lit. pari a 400

Sono rimaste 0 monete da 10.000 Lit.Sono rimaste 526 monete da 5.000 Lit.Sono rimaste 100 monete da 1.000 Lit.Sono rimaste 1000 monete da 500 Lit.Sono rimaste 496 monete da 100 Lit.

Page 17: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

ESEMPIO

I tagli disponibili sono: da 100 da 500 da 1000 da 5000 da 10000

Dammi i pezzi presenti per ogni taglioPezzi da 100: 100Pezzi da 500: 1000Pezzi da 1000: 10000Pezzi da 5000: 1000Pezzi da 10000: 1000Dammi la cifra da cambiare:89.458.700

ATTENZIONE NON HO MONETA SUFFICIENTE !!!!!

Page 18: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Pseudo Codice

•Acquisire la cifra da cambiare•Per ogni taglio cerca quanti pezzi sono necessari compatibilmente con le quantità disponibili•Mostra il risultato

L100L500L1000L5000L10000

CifraPezzi100Pezzi500Pezzi1000Pezzi5000Pezzi10000ContrMoneta

CifraPezzi100Pezzi500Pezzi1000Pezzi5000Pezzi10000ContrMoneta

CifP10000

Cif CifP1000

Cif CifP100

Cif

CercaTaglio CercaTaglio CercaTaglio Pzi100Pzi500Pzi1000Pzi5000Pzi10000Pt10000

Pzi100Pzi500Pzi1000Pzi5000Pzi10000Pt10000

Pzi100Pzi500Pzi1000Pzi5000Pzi10000Pt10000

Pzi100Pzi500Pzi1000Pzi5000Pzi10000Pt10000

Pzi100Pzi500Pzi1000Pzi5000Pzi10000Pt10000

Pzi100Pzi500Pzi1000Pzi5000Pzi10000Pt10000

P100P500P1000P5000P10000

Pezzi100Pezzi500Pezzi1000Pezzi5000Pezzi10000

RAPPRESENTAZIONE GRAFICA

P100P500P1000P5000P10000Cifra

Pezzi100Pezzi500Pezzi1000Pezzi5000Pezzi10000ContrMoneta

Mostra ilrisultatoIntroduci

cifra da cambiaree N° pezzi disponibili

e controlla se il cambio è possibile

Mostra tagli

monete

Calcola Tagli

Disponibilità Disponibilità Disponibilità

Page 19: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

PROGRAM Monete(input,output);

CONST

L100=100; {Introduci valori delle valute}

L500=500;

L1000=1000;

L5000=5000;

L10000=10000;

VAR

ContrMoneta: boolean;

Cifra, P100, P500,P1000,P5000,P10000, Pezzi100, Pezzi500,Pezzi1000,Pezzi5000,Pezzi10000: real;

{ *************************** MAIN BLOCK ************************************}

BEGIN

MostraTagliMonete(L100, L500,L1000,L5000,L10000);

IntroduciCifra(Cifra,Pezzi100,Pezzi500,Pezzi1000,Pezzi5000,Pezzi10000,ContrMoneta);

CalcolaTaglio(Cifra, P100, P500,P1000,P5000,P10000,

Pezzi100,Pezzi500,Pezzi1000,Pezzi5000,Pezzi10000,ContrMoneta);

MostraRisultato(P100, P500,P1000,P5000,P10000,Cifra,

Pezzi100,Pezzi500,Pezzi1000,Pezzi5000,Pezzi10000,ContrMoneta);

readln

END.

Page 20: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

PROCEDURE MostraTagliMonete (L100, L500,L1000,L5000,L10000: real);{in: tagli out:mostra i tagli}BEGIN writeln(' I tagli disponibili sono: ');writeln(' da ', L100:5:0);writeln(' da ', L500:5:0);writeln(' da ', L1000:5:0);writeln(' da ', L5000:5:0);writeln(' da ', L10000:5:0);END;PROCEDURE IntroduciCifra(VAR Cif,Pzi100,Pzi500,Pzi1000,Pzi5000,Pzi10000:real;

VAR CMon:boolean);{Introduci la cifra da cambiare e le monete disponibili per ognitaglio}BEGINCMon:=TRUE;writeln(' Dammi pezzi presenti per ogni taglio');write('Pezzi da 100: ');readln(Pzi100);write('Pezzi da 500: ');readln(Pzi500);write('Pezzi da 1000: ');readln(Pzi1000);write('Pezzi da 5000: ');readln(Pzi5000);write('Pezzi da 10000: ');readln(Pzi10000);writeln('Dammi la cifra da cambiare: ');readln(Cif);IF 100*Pzi100+500*Pzi500+Pzi1000*1000+5000*Pzi5000+10000*Pzi10000 <= Cif THENBEGIN writeln('ATTENZIONE NON HO MONETA SUFFICIENTE !!!!!'); CMon:=FALSE;ENDEND;

BEGINMostraTagliMonete(L100, L500,L1000,L5000,L10000);IntroduciCifra(Cifra,Pezzi100,..,Pezzi10000,ContrMoneta); CalcolaTaglio(Cifra, P100, ..,P10000,Pezzi100,..,Pezzi10000,ContrMoneta); MostraRisultato(P100, ..,P10000,Cifra, Pezzi100,..,Pezzi10000,ContrMoneta);readlnEND.

Page 21: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

PROCEDURE Disponibili(VAR PzPresenti,PzPresi:real);{Dai pezzi disponibili sottrae i pezzi richiesti se la richiesta eccede l'offerta gli da quelli che puo'}{in: pezzi disponibili out: pezzi effettivamente presi}BEGINIF PzPresenti>PzPresi THEN PzPresenti:=Pzpresenti-PzPresiELSE BEGIN PzPresi:=PzPresenti; PzPresenti:=0 ENDEND;

PROCEDURE CercaTaglio(T:real;VAR C,NT,PezziDisp:real);{in: il taglio e la cifra out: il numero di pezzi compatibilmente con al

disponibilità e la cifra ancora da cambiare}BEGIN

NT:=Int(C / T);Disponibili(PezziDisp,NT);C:=C-NT*T;

END;

PROCEDURE CalcolaTaglio(Ci:real;VAR P100, P500,P1000,P5000,P10000,Pzi100,Pzi500,Pzi1000,Pzi5000,Pzi10000:real;CMon:boolean);

{in: la cifra e i pezzi disponibili out il numero di pezzi per ogni taglio e la possibilità di cambiare}BEGINIF CMon THENBEGIN

CercaTaglio(L10000,Ci,P10000,Pzi10000);CercaTaglio(L5000,Ci,P5000,Pzi5000);CercaTaglio(L1000,Ci,P1000,Pzi1000);CercaTaglio(L500,Ci,P500,Pzi500);CercaTaglio(L100,Ci,P100,Pzi100);

ENDEND;

Page 22: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

BEGINMostraTagliMonete(L100, L500,L1000,L5000,L10000);IntroduciCifra(Cifra,Pezzi100,..,Pezzi10000,ContrMoneta); CalcolaTaglio(Cifra, P100, ..,P10000,Pezzi100,..,Pezzi10000,ContrMoneta); MostraRisultato(P100, ..,P10000,Cifra, Pezzi100,..,Pezzi10000,ContrMoneta);readlnEND.

PROCEDURE MostraRisultato(P100,P500,P1000,P5000,P10000,Ci,Pzi100,Pzi500,Pzi1000,Pzi5000,Pzi10000:real;CMon:boolean);

{Mostra il risultato}{in: pezzi ottenuti, cifra disponibile, pezzi restanti, cambio effetuato}

BEGINIF CMon THENBEGINwriteln('La cifra di ',Ci:5:0,' e'' divisa in ');writeln(P10000:5:0,' monete da 10.000 Lit. pari a ',P10000*10000:8:0);writeln(P5000:5:0,' monete da 5.000 Lit. pari a ',P5000*5000:8:0);writeln(P1000:5:0,' monete da 1.000 Lit. pari a ',P1000*1000:8:0);writeln(P500:5:0,' monete da 500 Lit. pari a ',P500*500:8:0);writeln(P100:5:0,' monete da 100 Lit. pari a ',P100*100:8:0);writeln('Sono rimaste ',Pzi10000:5:0,' monete da 10.000 Lit.');writeln('Sono rimaste ',Pzi5000:5:0,' monete da 5.000 Lit.');writeln('Sono rimaste ',Pzi1000:5:0,' monete da 1.000 Lit.');writeln('Sono rimaste ',Pzi500:5:0,' monete da 500 Lit.');writeln('Sono rimaste ',Pzi100:5:0,' monete da 100 Lit.')END;readlnEND;

(Monete4)

Page 23: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

ESERCIZIO

Assegnata una figura geometrica composta dalla sovrapposizione di un rettangolo e di quattro triangoli (v. figura) calcolare l’area totale e elencare le varie figure geometriche in ordine decrescente di area.

•Descrivere in ordine:•Il problema a parole•L’input e l’output atteso•Lo pseudo codice•La rappresentazione grafica•Il codice Pascal

Page 24: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

IF annidati

Si hanno strutture di decisione annidate quando si presentano più di due possibili azioni da intraprendere in una data situazione.

Esempio•Se si ha un età inferiore ai 14 anni non si può andare a lavorare.•Se si ha un età inferiore ai 18 anni non si può votare.•Se si ha un età tra i 18 anni e i 65 anni non si può andare in pensione.•Se si ha un età superiore ai 65 anni si è nell’età d’oro(???).

Page 25: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Pseudo codiceIF Anni < 14 THEN scrivi “Non può andare a lavorare.”

ELSEmostra un altro messaggio

IF Anni < 14 THEN scrivi “Non puoi andare a lavorare.” ELSE

IF Anni < 18 THEN scrivi “Non puoi votare.” ELSE

IF Anni < 65 THEN scrivi “Non puoi andare in pensione.” ELSE scrivi “Sei nell’età d’oro(???).”

Page 26: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Anni

Anni<14

Anni<18

Anni<65

Età d’oro No pensione No voto No lavoro

Si

Si

Si

No

No

No

N° confrontiMinore di 14 1Minore di 18 2 Minore di 65 3

Caso peggiore 3 confrontiMedia 6/3=2

Page 27: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Quando gli IF annidati sono del tipoIF …. THEN …… ELSE …… IFnon appena troviamo una condizione vera allora usciamo dal gruppo di IFe il cammino che possiamo percorrere è uno solo.

In generaleIF condizione1 THEN azione1ELSE IF condizione2 THEN

azione2………...ELSE IF condizioneM THEN

azioneM ………...ELSE IF condizione(N-1) THEN

azione(N-1)ELSEazione(N)

Page 28: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Il problema dell’età può essere riformulato in un’altra maniera

Pseudo codiceIF Anni < 65 THEN scrivi “Non sei nell’età d’oro(???).”

ELSEmostra un altro messaggio

IF Anni < 65 THEN IF Anni < 18 THEN

IF Anni < 14 THEN scrivi “Non puoi andare a lavorare.” ELSE scrivi “Non puoi andare a votare”

ELSEscrivi “non puoi andare in pensione”

ELSEscrivi “Sei nell’età d’oro(???).”

Page 29: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Anni

Anni<65

Anni<18 Anni<14

No votoNo pensione Età d’oro

No

Si Si

Si

NoNo

no lavoro

N° confrontiMinore di 14 3Minore di 18 3 Minore di 65 2

Caso peggiore 3 confrontiMedia 8/3=2,6

Page 30: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

CASO DI STUDIO

I vostri elaborati sono valutati con il seguente criterio:A=ottimo tra 27-30 (media 28,5)B=buono tra 24-26 (media 25)C=sufficiente tra 21-23 (media 22)D=appena sufficiente tra 18-20 (media 19)E=insufficiente

Scrivere un programma che sulla base della valutazione ottenuta mostri il giudizio indicato sopra.

Page 31: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Usando lo schema IF - ELSE - IF possiamo scrivere il seguente codice:

Numero di confrontimeno di 18 1fra 18 e 20 2fra 21 e 23 3fra 24 e 26 4fra 27 e 30 4

Media 2,8 confronti

If Voto <18 THEN write('il risultato dell''esame e'' E ');ELSE IF Voto<21 THEN write(' D '); ELSE IF Voto<24 THEN write(' C '); ELSE IF Voto<27 THEN write(' B ') ELSE write('A')

Voto

<18

<21

<24

ESi

<27

DSi

CSi

BSi

Ano

no

no

no

Page 32: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Un altro approccio al problema è il seguente:

Numero di confrontimeno di 18 2fra 18 e 20 2fra 21 e 23 2fra 24 e 26 3fra 27 e 30 3

Media 2,4 confronti

If Voto >=21 THEN BEGIN write('il risultato dell''esame e'' '); IF Voto>=24 THEN BEGIN write(' pari a '); IF Voto>=27 THEN write(' A '); ELSE write(' B ') END ELSE write(' C '); ENDELSE BEGIN write(' valutazione '); IF Voto >=18 THEN write(' D '); ELSE write(' E '); END;

Voto

>=21 >=24 >=27

E

Si

>=18 D

Si

C

Si

B

SiA

no

nonono

Page 33: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

EsercizioSupposto che ogni studente abbia fatto 5 esercizi ciascuno valutato in maniera diversa:esempio Esr1=A, Eser2=C, Eser3=D, Eser4=B, Eser5=Edeterminare il voto sia in trentesimi che simbolico corrispondente alla media delle valutazioni ricevute.

Es. A=28,5 B=25 C=22 D=19 E=0 media 18,9 => D

Page 34: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

LEGGIBILITA’ vs EFFICIENZA

Procedure con manutenzionefrequente

Tempo di calcolo critico

Page 35: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Esercizi dal testo

pag. 182 n.5, 6, 7

Page 36: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

L’equazione di 2° grado

Problema

Assegnata la generica equazione di 2° grado

Ax2 + Bx + C = 0

dove A, B e C sono numeri reali

trovare le soluzioni.

A2

AC4BB 2 A2

AC4BB 2

Chiamiamo discriminante il valore della espressione

AC4B2

Page 37: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Input : A, B, C

Output:•Caso equazione non quadratica

•Se A=B=C=0 questa è una tautologia•Se A=B=0 e C<>0 questa non è una equazione•Se A=0 e B e C <>0 questa è una equazione lineare che ammette una radice pari a -C/B.

•Caso equazione quadratica degenere•Se A<>0 e B e C=0 questa equazione ammette una soluzione pari a 0 •Se A e B <>0 e C=0 questa equazione ammette due soluzioni: una pari a 0 e la seconda pari -B/A

•Caso equazione quadratica con due radici•Se A, B e C <> da 0 e >0 ammette due radici reali distinte•Se A, B e C <> da 0 e <0 ammette due radici immaginarie •Se A, B e C <> da 0 e =0 ammette due radici reali uguali e coincidenti pari a -B/2A

Page 38: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Prima osservazione: se A=0 allora l’equazione non è quadratica.

Pseudo-codiceIntroduci A, B, CSe A=0 allora

MostraEqNonQuadr(B,C)altrimenti

gestisci l’equazione quadratica

Pseudo-codiceIntroduci A, B, CSe A=0 allora

MostraEqNonQuadr(B,C)altrimenti

Se C=0 alloraMostraRadiciDegenerate(A,B)

altrimentiMostraDueRadici(A,B,C)

Page 39: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

RAPPRESENTAZIONE GRAFICA

Introduci valori A, B, C MostraRadiciDegeneri

ABC

MostraDueRadici

MostraEqNonQuadr

BC

AB

ABC

Soluzione di equazioni quadratiche

Page 40: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Pseudo-Codice MostraEqNonQuadr

scrivi: ‘ equazione non quadratica ‘Se B=0 allora

NonEquazionealtrimenti scrivi ‘esiste una radice pari a ‘ -C/B

Pseudo-Codice NonEquazione

Se C=0 allora scrivi ‘tautologia’altrimenti scrivi ‘non è una equazione’

Pseudo-Codice MostraEqNonQuadr

scrivi: ‘ equazione non quadratica ‘Se B=0 allora

Se C=0 allora scrivi ‘tautologia’

altrimenti scrivi ‘non è una equazione’ altrimenti scrivi ‘esiste una radice pari a ‘ -C/B

Page 41: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Pseudo-Codice MostraRadiciDegenerateprecondizioni C=0 A<>0 B qualunque

Se B=0 allora scrivi ‘due radici degenerate’altrimenti scrivi ‘una radice degenere pari a 0 ’ scrivi ‘un’altra radice pari a ’, -B/A

Pseudo-Codice MostraDueRadiciprecondizioni A,C <>0 B qualunque

Discrim sqr(B) - 4*A*CSe Discrim >=0 allora

RadiciRealialtrimenti RadiciComplesse

Page 42: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

RAPPRESENTAZIONE GRAFICA

Introduci valori A, B, C MostraRadiciDegeneri

ABC

MostraDueRadici

MostraEqNonQuadr

BC

AB

ABC

Soluzione di equazioni quadratiche

MostreRadiciReali MostraRadiciComplesse

ABDiscrim

ABDiscrim

Page 43: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Pseudo-Codice RadiciRealiprecondizioni Discrim>0

PrimoTermine -B/ (2*A)DiscrimTerm sqrt(Discrim)/(2*A)Se DiscrimTerm =0 allora

scrivi ‘due radici uguali e pari a ‘, PrimoTermine altrimenti scrivi ‘una radice pari a ‘, PrimoTermine + DiscrimTerm scrivi ‘una radice pari a ‘, PrimoTermine - DiscrimTerm

Pseudo-Codice RadiciComplesse

precondizioni Discrim<0

TermineReale -B/ (2*A)TermineImmaginario sqrt(-Discrim)/(2*A)

scrivi ‘una radice pari a ‘, TermineReale, ‘+’, TermineImmaginario,’i’ scrivi ‘una radice pari a ‘, TermineReale, ‘-’, TermineImmaginario,’i’

Page 44: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

PROGRAM EquazioneIIGrado(input,output);{Soluzione dell’equazione Ax2+Bx+C=0

assegnati A, B e C}VAR A, B, C : real; {coefficienti}

{********MAIN**********}BEGINIntroduciValori(A,B,C);

IF A=0 THEN MostraEqNonQuadr(B,C)

ELSE IF C=0 THEN

MostraRadiciDegenerate(A,B)ELSE

MostraDueRadici(A,B,C);readln;END.

PROCEDURE MostraEqNonQuadr(B1,C1: real);{Caso in cui A=0}

BEGIN writeln('Questa non e'' una equazione quadratica.');IF B=0 THEN IF C=0 THEN

writeln(' E'' una tautologia') ELSE

writeln(' e non e'' nemmeno un''equazione')ELSE writeln('L''equazione e'' lineare e ha una radice pari a: ',-C1/B1:5:3)END;

PROCEDURE MostraRadiciDegenerate(A1,B1:real);{Caso in cui A<>0 B qualunque C=0}

BEGINIF B=0 THEN writeln('L''equazione ha due radici degeneri pari a 0.')ELSE BEGIN writeln('L''equazione ha una radice degenere pari a 0 ',

'e una radice paria a: ',-B1/A1:5:3); END END;

PROCEDURE MostraDueRadici(A1,B1,C1:real);{Caso in cui A<>0 B<>0 C<>0. Le radici potranno essere reali o complesse}VARDiscrim:real; {discriminante dell'equazione = B2-4*A*C)}

BEGINDiscrim:=sqr(B1)-4*A1*C1;writeln(Discrim); IF Discrim >=0 THEN

MostraRadiciReali(A1,B1,Discrim) ELSE

MostraRadiciComplesse (A1,B1,Discrim);END;

PROCEDURE MostraRadiciReali(A1,B1, Discrim1 :real);{Caso in cui A<>0 B<>0 C<>0. Le radici so reali}VARPrimoTermine, {-B/2A}RadiceDiscrim :real; {radice quadrata del discriminante (sqrt(Discrim/2A)}BEGINwriteln('Le radici sono reali. ');PrimoTermine:=-B/(2*A);RadiceDiscrim:= sqrt(Discrim1/(2*A)); IF RadiceDiscrim =0 THEN

writeln('L''equazione ha una radice doppia pari a : ', PrimoTermine:5:3) ELSE writeln('La prima radice vale: ', PrimoTermine + RadiceDiscrim:5:3,

' la seconda radice vale: ', PrimoTermine - RadiceDiscrim:5:3)END;

PROCEDURE IntroduciValori(VAR Ax,Bx,Cx:real);BEGIN write('Introduci i coefficienti A, B, C: '); readln(A, B, C);END;

PROCEDURE MostraRadiciComplesse (A1,B1,Discrim1:real);{Caso in cui A<>0 B<>0 C<>0. Le radici sono complesse}VAR PrimoTermine,RadiceDiscrim:real;BEGINwriteln('Le radici sono complesse. ');PrimoTermine:=-B/(2*A);RadiceDiscrim:= sqrt(-Discrim1/(2*A)); writeln('La prima radice vale: ', PrimoTermine + RadiceDiscrim:5:3,

' la seconda radice vale: ', PrimoTermine - RadiceDiscrim:5:3,'i')END;

Page 45: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Generalizzazione per una algoritmo di salvaguardia

Se il nostro problema prevede situazioni che non possono essere elaborate ad esempio divisioni per zero o quando si introduce un carattere al posto di un numero e viceversa bisogna utilizzare algoritmi del tipo:

IF dato impossibile da elaborare THENprendi adeguati accorgimenti

ELSEelabora i dati

Page 46: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Esercizio per i più bravi

•Scrivere una procedura che controlli che il dato introdotto sia del tipo previsto per la variabile adoperata

Page 47: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

L’istruzione CASE

Quando è necessario gestire situazioni in cui molte alternative sono presenti è possibile usare al posto di una serie di IF annidati l’istruzione CASE.L’espressione che viene valutata per gestire il CASE deve preferibilmente essere singola e non booleana, inoltre con IF possono essere accettate diverse condizioni mentre con CASE solo una sarà presa in considerazione, cioè le condizioni sono mutuamente esclusive.

Page 48: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

REGOLE SINTATTICHE PER CASE

espressione CASE OF

istruzionicostante : END

,

;

CASE Voto OF18,19,20: writeln(‘D’);21,22,23: writeln(‘C’);24,25,26: writeln(‘B’);27,28,29,30: writeln(‘A’);

END;

Case selector

Ordinal Type(integer, char)

N.B. non c’è il BEGIN

Page 49: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

If Voto >=21 THEN BEGIN write('il risultato dell''esame e'' '); IF Voto>=24 THEN BEGIN write(' pari a '); IF Voto>=27 THEN write(' A ') ELSE write(' B ') END ELSE write(' C ') ENDELSE BEGIN write(' valutazione '); IF Voto >=18 THEN write(' D ') ELSE write(' E ') END;

If Voto <18 THEN write('il risultato dell''esame e'' E ');ELSE IF Voto<21 THEN write(' D ') ELSE IF Voto<24 THEN write(' C ') ELSE IF Voto<27 THEN write(' B ') ELSE write('A')

CASE Voto OF18,19,20: writeln(‘D’);21,22,23: writeln(‘C’);24,25,26: writeln(‘B’);27,28,29,30: writeln(‘A’);

END;

Page 50: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

CASO DI STUDIO

Note le regole per il calcolo delle aree di N figure geometriche scrivere una procedura per il loro calcolo

Indichiamo con le lettere dell’alfabeto le diverse figure geometriche.Es. A=triangolo, B=quadrato, C=rettangolo, D=cerchio, etc.

Pseudo codice

Istruzioni

Introduci la lettera che individua la figura di cui vuoi conoscere l’area.

A seconda della lettera introdotta chiedi i parametri necessari e calcola l’area.

CASE Figura OF ‘A’: Triangolo; ‘B’: Quadrato; ‘C’: rettangolo;

……………...

‘Z’: ellisse;END;

Page 51: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Attenzione quando si usa CASE se il valore del case selector non è tra quelli previsti il programma va in errore. (Non in tutti i dialetti)

In Turbo Pascal si può concludere il CASE con un ELSE

CASE Figura OF ‘A’: Triangolo; ‘B’: Quadrato; ‘C’: rettangolo; ‘Z’: ellisse;ELSE writeln(‘figura non prevista’)END;

Page 52: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

EsercizioCompletare la descrizione del problema per almeno 5 figure geometriche a scelta.Fare la rappresentazione grafica.Scrivere il codice Pascal.

Esercizi dal libropag. 195 n.6, 7

Page 53: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

ERRORI FREQUENTI

IF Numero:=0 THEN …..

Errore di sintassi

IF Numero>0 THEN ;Somma:=Somma+Numero

Errore logico (esegue comunque l’operazione)

IF Numero<0 THEN Somma:=Somma+Numero

ELSE;K: =K+1;

Errore logico (esegue comunque l’operazione)

IF Numero>0 THENSomma:=Somma+Numero;writeln(‘Somma= ‘,Somma:5:2);

Errore logico

Mancano i limitatoriBEGIN

END

Page 54: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

SUGGERIMENTI PER TESTARE I PROGRAMMI

Per testare le istruzioni di decisione (IF o CASE) bisogna mettere delle scritte di controllo sulle precondizioni all’ingresso del controllo e analoghe scritte sulle postcondizioni all’uscita del ciclo di controllo.

Non limitarsi a testare il programma con dati considerati “tipici” ma fare anche verifiche con dati “al limite” o dati “impossibili” o “errati”.Esempio: Dato un Numero scrivere “Troppo piccolo” se è <0; “Giusto” se è tra 10 e 25, “Troppo grande” se è maggiore di 25. Dire per quali valori di Numero le seguenti istruzioni danno una risposta errata.

IF Numero < 10 THENwriteln(‘Troppo piccolo’);

IF Numero < =25 THENwriteln(‘Giusto’);

ELSEwriteln(‘Troppo grande’);

Page 55: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare

Esercizi dal libro

pag. 202 n. 9pag. 204 n. 23

Page 56: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare
Page 57: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare
Page 58: COME ISTRUIRE UNA MACCHINA A PRENDERE DECISIONI ? IF …. THEN ….. ELSE Per prendere una decisione usando il costrutto IF…THEN….ELSE è necessario usare