CAPITOLO 5.

Slides:



Advertisements
Presentazioni simili
INFORMATICA Altre Istruzioni di I/O
Advertisements

LINGUAGGIO DI PROGRAMMAZIONE C
INFORMATICA Strutture condizionali
Esercizio Usate il ciclo repeat until (controllo post condizionale) per simulare il prodotto N x M con M somme di N. Esempio: 5 x 3 equivale a fare 5 +5.
Informatica 22/03/2012.
CAPITOLO 2.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Selezione - approfondimento
LS Tron Classe 4TC – as 2006/07 LORGANIZZAZIONE DEI PROGRAMMI UD. 8 p. 282.
PROGRAMMARE IN PASCAL (le basi)
Le funzioni UD. 8 – Lorganizzazione dei programmi p. 309 LS Tron 4TC 06/07.
EP 11/12 - PBLezione 31 Elementi di Programmazione Tipi di Dati e Conversioni Istruzioni di controllo del flusso.
Algoritmi e Programmazione
Informatica Generale Marzia Buscemi
Fondamenti di Informatica
Dall’Algoritmo al Programma
Programmazione Procedurale in Linguaggio C++
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
Introduzione agli algoritmi. Definizione Sistema di regole e procedure di calcolo ben definite che portano alla soluzione di un problema con un numero.
Algoritmi Politecnico di Milano C Primi programmi Politecnico di Milano.
Università degli Studi di Bergamo Facoltà di Lingue e Letterature Straniere Facoltà di Lettere e Filosofia A.A Informatica generale 1 Appunti.
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
Ricorsione e Debug.
Primo esercizio Scrivere un programma che legge da input
CORSO DI PROGRAMMAZIONE II
CORSO DI PROGRAMMAZIONE II
Algoritmi e Strutture Dati (Mod. B)
Introduzione alla programmazione lll
APPUNTI SUL LINGUAGGIO C
Somma = A + B start Stampa Somma Leggi A,B stop Sub SOMMA( ) Dim A, B as Integer A = InputBox("Immetti un numero") B = InputBox(Immetti un secondo numero)
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
Fondamentidi Programmazione Corso: Fondamenti di Programmazione Classe: PARI-DISPARI Docente: Prof. Luisa Gargano Testo: Aho, Ulman, Foundations of Computer.
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.
Organizzazione del corso
Algoritmi su Tipi Semplici
Istruzioni Decisionali
Istruzioni Iterative Nicola Fanizzi
Strutture di controllo in C -- Flow Chart --
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
CAPITOLO 7.
CD Free Pascal prof. Tramontano AULA A5 NON VERRANNO CORRETTI ESERCIZI A CHI NON E IN ELENCO LE ISCRIZIONI NELLELENCO SI CHIUDONO IL 6 NOVEMBRE p.v. PER.
CAPITOLO 6.
Programmazione in Java Claudia Raibulet
Elementi di Informatica
ELEMENTI DI PROGRAMMAZIONE
CODIFICA Da flow-chart a C++.
TURBOPASCAL …. ripassiamo - prof. V. Riboldi -.
Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.
Si vuole che lesecutore coniughi non solo il presente indicativo ma anche limperfetto e il passato remoto Acquisisci tempo presente imperfetto passato.
Lordinamento di tre numeri interi. acquisisci a,b,c (a > b) AND (a > c)(b > a) AND (b > c) (c > a) AND (c > b) Scrivi c,b,aScrivi b,c,aScrivi c,a,bScrivi.
Lo sviluppo del software e i linguaggi di programmazione
La comunicazione uomo … macchina
Problema: come dividere due numeri
14 marzo 2002 Avvisi:.
Programma di Informatica Classi Prime
ND-partizione (A) n   A  somma  0 M  1/2 (  a i ) for i  1 to n do S[i]  choice ({true, false}) if S[i] then somma  somma + a i if somma > M then.
Anno accademico Le istruzioni di controllo in C.
TURBOPASCAL …. ripassiamo - prof. V. Riboldi -.
Programmazione imperativa
Lz. 3 (13/14)Elementi di Programmazione1 Istruzioni (strutture) di controllo 1.
ESERCIZIO Assegnata una lista L di caratteri ed un carattere k, scrivere una procedura che cancelli tutte le occorrenze di k in L. PROGRAM Liste(output,input);
Strutture di controllo Esercizi!. Utilizzare i metodi: I modi per poter richiamare un metodo, di una classe (ad esempio SavitchIn) sono due. 1) E’ sempre.
1 Parte 2 Fondamenti di programmazione. 2 Definizione intuitiva di algoritmo Elenco finito di istruzioni che specificano una serie di operazioni, eseguendo.
Lez. 9 (13/14)Elementi di Programmazione1 Lezione 9 Valutazione di espressioni File di testo sequenziali.
PROVA INTERCORSO MOD.B a.a RICORSIONE ESERCIZI A1.1-A1.6.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Informatica e Informatica di Base
Problemi, algoritmi e programmazione
Ciclo for nei linguaggi di programmazione. Nei linguaggi di programmazione, il ciclo for è una struttura di controllo iterativa che determina l'esecuzione.
Transcript della presentazione:

CAPITOLO 5

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.

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.

Operatore relazionale Espressione booleana semplice Operatore relazionale espressione Operatore Relazione < minore di <= minore o eguale a = eguale a <> diverso da > maggiore di >= maggiore o eguale a

Espressione Significato Valore Xint < Yint 3 è minore di 4 VERO pippo Xint 3 Yint 4 Ch1 E Ch2 G Stringa Espressione Significato Valore Xint < Yint 3 è minore di 4 VERO Yint -3<=Xint 1 è minore o eguale di 3 VERO Ch1 = Ch2 E è eguale a G FALSO Ch1 <> Ch2 Ch1 è diverso da Ch2 VERO paolo > pippo pippo è maggiore di paolo FALSO succ(Ch1) >= pred(Ch2) F è maggiore o eguale a F VERO

IF … THEN … ELSE …. THEN IF ELSE IF Voto >= 18 THEN REGOLE SINTATTICHE PER IF …THEN…ELSE IF … THEN … ELSE …. espressione booleana IF THEN istruzioni ELSE IF Voto >= 18 THEN writeln(‘ promosso ‘) ELSE writeln(‘ bocciato ‘) IF Voto >= 28 THEN writeln(‘ BRAVO ‘)

SE la condizione è valuta vera ALLORA esegui l’azione 1 ALTRIMENTI PSEUDO CODICE PER IF …THEN…ELSE SE la condizione è valuta vera ALLORA esegui l’azione 1 ALTRIMENTI esegui l’azione 2 SE la condizione è valuta vera ALLORA esegui l’azione

precondizione THEN IF THEN IF ELSE postcondizione bocciato promosso si no Voto>=18 bravo si no Voto>=28 precondizione THEN IF THEN IF ELSE postcondizione

ESEMPIO Write(‘ Che giorno è oggi ? ‘); readln(Giorno); IF Giorno=‘Venerdì’ THEN BEGIN writeln(‘Fai attenzione che il ‘); writeln(‘Venerdì e’’ un giorno sfortunato’); writeln(‘resta a casa !!!’) END ELSE writeln(‘Bene il ‘,Giorno); writeln(‘e’’ un giorno fortunato’) END; Notare che in queste posizioni non ci vogliono ; Adottare in ogni programma una convenzione per scrivere le istruzioni.

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; BEGIN write(‘Vuoi vedere le istruzioni ? (S/N) ‘); readln(Risposta); IF Risposta=‘S’ THEN MostraIstruzioni END;

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

Pseudo codice di MostraNumeriOrdinati Introduci Numero1, Numero2, Numero3 Ordina in maniera crescente Numero1, Numero2, Numero3 Mostra 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*************} BEGIN write(‘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.

MostraNumeriOrdinati Pseudo codice di Ordina Se Numero1 > Numero2 allora scambia Numero1 con Numero2 Se Numero1 > Numero3 allora scambia Numero1 con Numero3 Se Numero2 > Numero3 allora scambia Numero2 con Numero3 Pseudo codice di Ordina Se Numero1 > Numero2 allora Scambia(Numero1,Numero2) Se Numero1 > Numero3 allora Scambia(Numero1,Numero3) Se Numero2 > Numero3 allora Scambia(Numero2,Numero3) MostraNumeriOrdinati Ordina Mostra i numeri Introduci Numeri Scambia Numero1 Numero2 Numero3 Numero1 Numero2 Numero3 Numero1 Numero2 Numero3 Numero1 Numero2 Numero3 N1 N2 N1 N2

PROCEDURE Scambia(VAR Num1,Num2:integer); {in: due numeri out: i due numeri invertiti} VAR Temp :integer; BEGIN Temp:=Num1; Num1:=Num2; Num2:=Temp END; PROCEDURE Ordina(VAR N1,N2,N3:integer); {in: tre numeri out: i tre numeri ordinati} BEGIN IF N1>N2 THEN Scambia(N1,N2); IF N1>N3 THEN Scambia(N1,N3); IF N2>N3 THEN Scambia(N2,N3) END;

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.

Esempio: I tagli disponibili sono: da 100 da 500 da 1000 da 5000 da 10000 Dammi pezzi presenti per ogni taglio Pezzi da 100: 500 Pezzi da 500: 1000 Pezzi da 1000: 100 Pezzi da 5000: 1000 Pezzi da 10000: 1000 Dammi 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.

ESEMPIO I tagli disponibili sono: da 100 da 500 da 1000 da 5000 da 10000 Dammi i pezzi presenti per ogni taglio Pezzi da 100: 100 Pezzi da 500: 1000 Pezzi da 1000: 10000 Pezzi da 5000: 1000 Pezzi da 10000: 1000 Dammi la cifra da cambiare: 89.458.700 ATTENZIONE NON HO MONETA SUFFICIENTE !!!!!

RAPPRESENTAZIONE GRAFICA Pseudo Codice Acquisire la cifra da cambiare Per ogni taglio cerca quanti pezzi sono necessari compatibilmente con le quantità disponibili Mostra il risultato RAPPRESENTAZIONE GRAFICA Mostra il risultato Introduci cifra da cambiare e N° pezzi disponibili e controlla se il cambio è possibile Mostra tagli monete Calcola Tagli L100 L500 L1000 L5000 L10000 Cifra Pezzi100 Pezzi500 Pezzi1000 Pezzi5000 Pezzi10000 ContrMoneta Cifra Pezzi100 Pezzi500 Pezzi1000 Pezzi5000 Pezzi10000 ContrMoneta P100 P500 P1000 P5000 P10000 Pezzi100 Pezzi500 Pezzi1000 Pezzi5000 Pezzi10000 P100 P500 P1000 P5000 P10000 Cifra Pezzi100 Pezzi500 Pezzi1000 Pezzi5000 Pezzi10000 ContrMoneta Cif P10000 CercaTaglio Cif P1000 Cif P100 Pzi100 Pzi500 Pzi1000 Pzi5000 Pzi10000 Pt10000 Disponibilità

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, readln END.

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} BEGIN CMon:=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 THEN writeln('ATTENZIONE NON HO MONETA SUFFICIENTE !!!!!'); CMon:=FALSE; END END; BEGIN MostraTagliMonete(L100, L500,L1000,L5000,L10000); IntroduciCifra(Cifra,Pezzi100,..,Pezzi10000,ContrMoneta); CalcolaTaglio(Cifra, P100, ..,P10000,Pezzi100,..,Pezzi10000,ContrMoneta); MostraRisultato(P100, ..,P10000,Cifra, Pezzi100,..,Pezzi10000,ContrMoneta); readln END.

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} BEGIN IF PzPresenti>PzPresi THEN PzPresenti:=Pzpresenti-PzPresi ELSE PzPresi:=PzPresenti; PzPresenti:=0 END END; 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} BEGIN IF CMon THEN 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); END END;

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} BEGIN IF CMon THEN writeln('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; readln (Monete4) BEGIN MostraTagliMonete(L100, L500,L1000,L5000,L10000); IntroduciCifra(Cifra,Pezzi100,..,Pezzi10000,ContrMoneta); CalcolaTaglio(Cifra, P100, ..,P10000,Pezzi100,..,Pezzi10000,ContrMoneta); MostraRisultato(P100, ..,P10000,Cifra, Pezzi100,..,Pezzi10000,ContrMoneta); readln END.

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

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(???).

Pseudo codice IF Anni < 14 THEN scrivi “Non può andare a lavorare.” ELSE mostra un altro messaggio IF Anni < 14 THEN scrivi “Non puoi andare a lavorare.” ELSE IF Anni < 18 THEN scrivi “Non puoi votare.” IF Anni < 65 THEN scrivi “Non puoi andare in pensione.” scrivi “Sei nell’età d’oro(???).”

Anni Anni<14 Anni<18 Anni<65 Età d’oro No pensione No voto No lavoro Si No N° confronti Minore di 14 1 Minore di 18 2 Minore di 65 3 Caso peggiore 3 confronti Media 6/3=2

Quando gli IF annidati sono del tipo IF …. THEN …… ELSE …… IF non appena troviamo una condizione vera allora usciamo dal gruppo di IF e il cammino che possiamo percorrere è uno solo. In generale IF condizione1 THEN azione1 ELSE IF condizione2 THEN azione2 ………... ELSE IF condizioneM THEN azioneM ELSE IF condizione(N-1) THEN azione(N-1) ELSE azione(N)

Il problema dell’età può essere riformulato in un’altra maniera Pseudo codice IF Anni < 65 THEN scrivi “Non sei nell’età d’oro(???).” ELSE mostra 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” scrivi “non puoi andare in pensione” scrivi “Sei nell’età d’oro(???).”

Anni N° confronti Minore di 14 3 Minore di 18 3 Minore di 65 2 Caso peggiore 3 confronti Media 8/3=2,6 Anni<65 No Si Anni<18 Anni<14 Si Si No No No pensione No voto no lavoro Età d’oro

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.

Usando lo schema IF - ELSE - IF possiamo scrivere il seguente codice: Voto <18 <21 <24 E Si <27 D C B A no If Voto <18 THEN write('il risultato dell''esame e'' E '); ELSE IF Voto<21 THEN write(' D '); IF Voto<24 THEN write(' C '); IF Voto<27 THEN write(' B ') write('A') Numero di confronti meno di 18 1 fra 18 e 20 2 fra 21 e 23 3 fra 24 e 26 4 fra 27 e 30 4 Media 2,8 confronti

Un altro approccio al problema è il seguente: Voto >=21 >=24 >=27 E Si >=18 D C B A no If Voto >=21 THEN BEGIN write('il risultato dell''esame e'' '); IF Voto>=24 THEN write(' pari a '); IF Voto>=27 THEN write(' A '); ELSE write(' B ') END write(' C '); write(' valutazione '); IF Voto >=18 THEN write(' D '); write(' E '); END; Numero di confronti meno di 18 2 fra 18 e 20 2 fra 21 e 23 2 fra 24 e 26 3 fra 27 e 30 3 Media 2,4 confronti

Esercizio Supposto che ogni studente abbia fatto 5 esercizi ciascuno valutato in maniera diversa: esempio Esr1=A, Eser2=C, Eser3=D, Eser4=B, Eser5=E determinare 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

LEGGIBILITA’ vs EFFICIENZA Procedure con manutenzione frequente Tempo di calcolo critico

Esercizi dal testo pag. 182 n.5, 6, 7

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. Chiamiamo discriminante il valore della espressione

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

Prima osservazione: se A=0 allora l’equazione non è quadratica. Pseudo-codice Introduci A, B, C Se A=0 allora MostraEqNonQuadr(B,C) altrimenti gestisci l’equazione quadratica Pseudo-codice Introduci A, B, C Se A=0 allora MostraEqNonQuadr(B,C) altrimenti Se C=0 allora MostraRadiciDegenerate(A,B) MostraDueRadici(A,B,C)

MostraRadiciDegeneri Soluzione di equazioni quadratiche RAPPRESENTAZIONE GRAFICA Introduci valori A, B, C MostraRadiciDegeneri A B C MostraDueRadici MostraEqNonQuadr Soluzione di equazioni quadratiche

Pseudo-Codice MostraEqNonQuadr scrivi: ‘ equazione non quadratica ‘ Se B=0 allora NonEquazione altrimenti 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’ scrivi ‘esiste una radice pari a ‘ -C/B

Pseudo-Codice MostraRadiciDegenerate precondizioni 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 MostraDueRadici precondizioni A,C <>0 B qualunque Discrim  sqr(B) - 4*A*C Se Discrim >=0 allora RadiciReali altrimenti RadiciComplesse

RAPPRESENTAZIONE GRAFICA Soluzione di equazioni quadratiche A B C A B C A B B C Introduci valori A, B, C MostraRadiciDegeneri MostraDueRadici MostraEqNonQuadr A B Discrim A B Discrim MostreRadiciReali MostraRadiciComplesse

Pseudo-Codice RadiciReali precondizioni 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’

{********MAIN**********} BEGIN IntroduciValori(A,B,C); IF A=0 THEN MostraEqNonQuadr(B,C) ELSE IF C=0 THEN MostraRadiciDegenerate(A,B) MostraDueRadici(A,B,C); readln; END. PROGRAM EquazioneIIGrado(input,output); {Soluzione dell’equazione Ax2+Bx+C=0 assegnati A, B e C} VAR A, B, C : real; {coefficienti} PROCEDURE MostraRadiciReali(A1,B1, Discrim1 :real); {Caso in cui A<>0 B<>0 C<>0. Le radici so reali} VAR PrimoTermine, {-B/2A} RadiceDiscrim :real; {radice quadrata del discriminante (sqrt(Discrim/2A)} BEGIN writeln('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 MostraRadiciDegenerate(A1,B1:real); {Caso in cui A<>0 B qualunque C=0} BEGIN IF B=0 THEN writeln('L''equazione ha due radici degeneri pari a 0.') ELSE writeln('L''equazione ha una radice degenere pari a 0 ', 'e una radice paria a: ',-B1/A1:5:3); END 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') writeln('L''equazione e'' lineare e ha una radice pari a: ',-C1/B1:5:3) END; PROCEDURE MostraRadiciComplesse (A1,B1,Discrim1:real); {Caso in cui A<>0 B<>0 C<>0. Le radici sono complesse} VAR PrimoTermine,RadiceDiscrim:real; BEGIN writeln('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; PROCEDURE MostraDueRadici(A1,B1,C1:real); {Caso in cui A<>0 B<>0 C<>0. Le radici potranno essere reali o complesse} VAR Discrim:real; {discriminante dell'equazione = B2-4*A*C)} BEGIN Discrim:=sqr(B1)-4*A1*C1; writeln(Discrim); IF Discrim >=0 THEN MostraRadiciReali(A1,B1,Discrim) ELSE MostraRadiciComplesse (A1,B1,Discrim); END;

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 THEN prendi adeguati accorgimenti ELSE elabora i dati

Esercizio per i più bravi Scrivere una procedura che controlli che il dato introdotto sia del tipo previsto per la variabile adoperata

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.

OF CASE : END , ; REGOLE SINTATTICHE PER CASE Case selector espressione OF CASE END costante : istruzioni , ; Case selector Ordinal Type (integer, char) CASE Voto OF 18,19,20: writeln(‘D’); 21,22,23: writeln(‘C’); 24,25,26: writeln(‘B’); 27,28,29,30: writeln(‘A’); END; N.B. non c’è il BEGIN

CASE Voto OF 18,19,20: writeln(‘D’); 21,22,23: writeln(‘C’); If Voto >=21 THEN BEGIN write('il risultato dell''esame e'' '); IF Voto>=24 THEN write(' pari a '); IF Voto>=27 THEN write(' A ') ELSE write(' B ') END write(' C ') write(' valutazione '); IF Voto >=18 THEN write(' D ') write(' E ') END; If Voto <18 THEN write('il risultato dell''esame e'' E '); ELSE IF Voto<21 THEN write(' D ') IF Voto<24 THEN write(' C ') IF Voto<27 THEN write(' B ') write('A') CASE Voto OF 18,19,20: writeln(‘D’); 21,22,23: writeln(‘C’); 24,25,26: writeln(‘B’); 27,28,29,30: writeln(‘A’); END;

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. CASE Figura OF ‘A’: Triangolo; ‘B’: Quadrato; ‘C’: rettangolo; ……………... ‘Z’: ellisse; END; 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.

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;

Esercizio Completare la descrizione del problema per almeno 5 figure geometriche a scelta. Fare la rappresentazione grafica. Scrivere il codice Pascal. Esercizi dal libro pag. 195 n.6, 7

ERRORI FREQUENTI 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 THEN Somma:=Somma+Numero; writeln(‘Somma= ‘,Somma:5:2); Errore logico Mancano i limitatori BEGIN END

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 THEN writeln(‘Troppo piccolo’); IF Numero < =25 THEN writeln(‘Giusto’); ELSE writeln(‘Troppo grande’);

Esercizi dal libro pag. 202 n. 9 pag. 204 n. 23