62

Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Embed Size (px)

Citation preview

Page 1: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)
Page 2: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Successione di Fibonacci

Pseudo CodiceAssegna il numero della successioneAssegna Fn1, Fn, Fn2 per N=2Calcola la successioneStampa la Somma=Fn1*Fn2-sqr(Fn)

FOR I=3 TO NAggiorna Fn1, Fn, Fn2 al variare di NCalcola la successione

Fn1 Fn Fn2 Somma1 2 3 -1

2 3 5 1

3 5 8 -1

Page 3: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

PROGRAM FibonacciSucc(input,output);VARPrecedente,Attuale:real;N:integer;

PROCEDURE Inizializza(VAR Xn1,Xn:real;VAR Nx:integer);BEGINwriteln(' Calcolo della successione Fn1*Fn2-sqr(Fn) per i primi N valori');

write('Dammi il numero N: ');readln(Nx);Xn1:=1;Xn:=2END;

PROCEDURE NuovoNumero(VAR Prec,Att:real);VAR

Temp:real;BEGINTemp:=Prec+Att; Prec:=Att; Att:=TempEND;

{*************** MAIN ********************}BEGINInizializza(Precedente,Attuale,N);CalcolaSuccessione(Precedente,Attuale,N);readlnEND.

Page 4: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

{*************** MAIN ********************}BEGINInizializza(Precedente,Attuale,N);CalcolaSuccessione(Precedente,Attuale,N);readlnEND.

PROCEDURE CalcolaSuccessione(Prec,Att:real;Nx:integer);VAR Fn1,Fn,Fn2,Somma:real;Conta:integer;BEGINSomma:=0;Fn1:=Prec;Fn:=Att;NuovoNumero(Prec, Att);Fn2:=Att;Somma:=Fn1*Fn2-sqr(Fn);writeln('Per N=', 2,' valore successione: ',Somma:3:0);FOR Conta := 3 TO N DO

BEGINPrec:=Fn;Att:=Fn2;Fn1:=Fn;Fn:=Fn2;NuovoNumero(Prec, Att);Fn2:=Att;Somma:=Fn1*Fn2-sqr(Fn);writeln;

writeln('Per N=', Conta,' valore successione: ',Somma:3:0);END;

END;

Page 5: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

FUNZIONIUna funzione può avere diversi argomenti ma restituisce uno e un solo valore.

Esistono funzioni standard del Pascal

Nome Funzione TipoArgomento

TipoRisultato

Esempio

abs Valoreassolutodell’argomento

Numerico Comel’argomento

ValAss=abs(-3) 3

sqr Quadratodell’argomento

Numerico Comel’argomento

Quadr=sqr(5) 25

sqrt Radicequadratadell’argomento

Numerico Reale RadQuad=sqrt(16) ) 4

Page 6: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESEMPIO

Ipotenusa:=sqrt(sqr(Lato1)+sqr(Lato2));

Carattere12:=succ(Carattere11);

Page 7: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Differenza tra funzione e procedura.

PROCEDURE NomeProcedura (VAR Inp1,….., Out1,….:real);……………………………………………………….

FUNCTION NomeFunzione (Arg1, Arg2, ……): type;…………………………………….

BEGIN……………………..Inp1:= 33;………..NomeProcedura(Inp1,………,Out1,..);X:=Out1*2;……………Y:=VariabileK + NomeFunzione(X,Arg2,….)*4 - VariabileZ;…………….

END.

Page 8: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Sintassi di FUNCTION

FUNCTION NomeFunzione ( Arg1,… ) :

FUNCTION ( )Lista parametriformali

identificatore :

TYPEidentificatore Blocco ;

Le chiamate delle variabili sono quasi sempre fatte per valore.

real ; BEGIN ………………………END.

Page 9: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Chiamata di FUNCTION

NomeFunzione ( Arg1,… )

( )Lista parametriattuali

identificatore

Suggerimento: Scrivere le funzioni in modo tale che l’ultima istruzione rappresenti sempre il valore che la funzione deve assumere.

Page 10: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESEMPIO

FUNCTION AreaCoronaCircolare(RaggioMax,RaggioMin: real):real;

BEGINAreaCoronaCircolare:=PiGreco*sqr(RaggioMax)-PiGreco(RaggioMin)END;

PROGRAM……write(‘Dammi RaggioMax e RaggioMin: ‘);readln(R1, R2);Area:= AreaCoronaCircolare(R1,R2);writeln(‘L’’area della corona circolare è: ‘, Area:4:2);……….

N.B.In ogni funzione deve sempre esserci una istruzione del tipo:

identificatore espressione

Page 11: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Esercizio per il laboratorio

Trasformare l’esercizio sull’area di diverse figure geometriche in una funzione.

Page 12: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESEMPIO FUNZIONE COMBINAZIONI

Calcolare il numero di combinazioni di N oggetti presi M alla volta.

Combinazioni =!)!(

!

MMN

N

Attenzione: Non usare il nome della funzione nel corso della elaborazione ma usarlo solo per raccogliere il risultato finale

FUNCTION Combinazioni(N,M :integer) : integer;{descrizione}

BEGIN Combinazioni:=Fattoriale(N) DIV (Fattoriale(N-M)*Fattoriale(M)END.

Page 13: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

FATTORIALEFUNCTION Fattoriale(N:integer):real;VARConta: integer;Prodotto: real;

BEGINProdotto:=1;FOR Conta:=1 TO N DO

Prodotto:=Prodotto*Conta;

Fattoriale:=ProdottoEND;

Variabile locale usataper il processo di accumulazione. E’ dettavariabile dummy.

FOR Conta:=1 TO N DO Fattoriale := Fattoriale *Conta;

Non può essere usata inquesta posizione perchéqui rappresenta una chiamataalla funzione e quindi necessitadi un argomento.ERRORE DI COMPILAZIONE

Page 14: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESEMPIO FUNZIONE POTENZA

Problema - Calcolare la potenza di un numero reale con esponente intero

Risolviamo il problema mediante una funzione Potenza(Base,Esponente)

Traccia della soluzionemetti in Prodotto il valore della Base elevato al

valore assoluto dell’Esponente)

Page 15: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Pseudo codiceAccumula la Base nella variabile Prodotto, usa come esponente il valore assoluto dell’esponente, così da poter calcolare anche le potenze negative

IF Esponente >=0 THENPotenza Prodotto

ELSEPotenza 1/Prodotto

FUNCTION Potenza(Base:real; Esponente:integer):real;VARConta: integer; {conta quante volte Prodotto è moltiplicato per Base}Prodotto: real;BEGINProdotto:=1;FOR Conta:=1 TO abs(Esponente) DOProdotto:=Prodotto*Base;IF Esponente>=0 THEN

Potenza:=ProdottoELSE

Potenza:=1/ProdottoEND;

Page 16: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESEMPIO FUNZIONE MAIUSCOLE

Problema - Se abbiamo un carattere minuscolo trasformarlo in maiuscolo

Risolviamo il problema mediante una funzione Maiuscolo(Carattere)

Traccia della soluzionemetti in Maiuscolo il valore di Carattere solo se esso è un carattere alfabetico ed è minuscolo usando le funzioni su stringhe chr e ord.

Page 17: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

FUNCTION Maiuscolo(Carattere:char):char;

BEGINIF Carattere IN [‘a’..’z’] THEN

Maiuscolo:=chr(ord(Carattere) + ord(’A’) - ord(‘a’))ELSE

Maiuscolo:=CarattereEND;

Page 18: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

GENERAZIONE DI NUMERI CASUALI

Un numero casuale è un numero generato da un evento non prevedibile.Ad esempio l’uscita di un lancio di dadi.

Con il calcolatore possiamo generare solo numeri pseudo-casuali.Essi si ottengono mediante funzioni che sono attivate sulla base diun numero detto seme.

In PASCAL esiste la funzione Random(X) che produce numericasuali tra 0 e X.

Vi sono diverse maniere per generare numeri pseudo-casuali.Dalla Teoria dei Numeri si ha che a partire da un valore detto seme è possibile ottenere K numeri casuali compresi fra 0 e K.

Page 19: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

GENERAZIONE DI NUMERI CASUALI

Dalla Teoria dei Numeri si dimostra che il codice che segue produce 2187 diversi valori per il seme prima che la sequenza si ripete:

readln(Seme);Seme:=abs(Seme MOD Modulo);FOR Contatore:=1 TO Modulo DO

Seme:=NumeroCasuale(Seme);

FUNCTION NumeroCasuale(Seme:integer):integer;CONSTModulo=2187;Moltiplicatore=10;Incremento=10891;BEGINNumeroCasuale:=(Moltiplicatore*Seme+ Incremento) MOD ModuloEND;

Page 20: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESEMPIO USO DEL GENERATORE DI NUMERI CASUALI

Problema - Simulare il lancio di un dado

Risolviamo il problema mediante il nostro generatore di numeri casuali.Poiché esso opera nell’intervallo 0..2186 dobbiamo dividere questo intervallo in sei sottointervalli. Ad ognuno dei sei sottointervalli assegniamo un valore tra 1 e 6.

0-363 1364-727 2728-1091 31092-1455 41456-1819 51820-2183 6

Page 21: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Pseudo codice

Fornisci un valore del seme minore di 2184Lancio Seme DIV 364 + 1

PROCEDURE FaiUnLancio(VAR Seme, Lancio:integer);

CONSTNumeroMassimo=2183;IntervalloLancio=364;BEGIN

REPEAT Seme:=NumeroRandom(Seme);UNTIL Seme <= NumeroMassimo;Lancio:=Seme DIV IntervalloLancio+1

END;

Page 22: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

PROGRAM LancioDado(input,output);VARSeme,Lancio:integer;

FUNCTION NumeroCasuale(Seme:integer):integer;CONSTModulo=2187;Moltiplicatore=10;Incremento=10891;BEGINNumeroCasuale:=(Moltiplicatore*Seme+ Incremento) MOD ModuloEND;PROCEDURE FaiUnLancio(VAR Seme, Lancio:integer);

CONSTNumeroMassimo=2183;IntervalloLancio=364;BEGIN

REPEAT Seme:= NumeroCasuale(Seme);UNTIL Seme <= NumeroMassimo; Lancio:=Seme DIV IntervalloLancio+1

END;

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

BEGINWrite('Seme = ');readln(Seme);Seme:=abs(Seme) MOD 2187;FOR Nprova:=1 TO 120 DOBEGINFaiUnLancio(Seme,Lancio);write(Lancio:2);IF Nprova MOD 20=0 THEN

WritelnEND;END.

Page 23: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESERCIZIO E12

Gioco della Tombola

Simulare il gioco della tombola utilizzando una funzione random.Evitare che un numero venga estratto più di una volta.

Page 24: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Una variabile booleana può assumere solo due valoriTRUE e FALSE

Esempio di dichiarazione:VAR

Numero, Contatore: integer;Alto, Basso, Bianco, Nero, NonColorato : boolean;

E’ possibile assegnare un valore ad una variabile booleana:Nero:=FALSE

VARIABILI BOOLEANE

Se alla variabile Numero è stato assegnato un valore allorapotremo dire che la variabile Alto è vera solo se il valore dinumero è maggiore ad esempio di 2:Alto:= Numero>2;

Se ad esempio Numero vale 5 allora Alto è TRUE.

Page 25: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Alle variabili booleane possono essere applicati gli operatoribooleani AND, OR, NOT.

Ad esempio variabili booleane e operatori possono essere usateper il controllo decisionale o dei cicli.

IF Alto OR Basso THEN Contatore:=Contatore+1;

WHILE Alto OR Basso DO BEGIN …………… END;

VARIABILI BOOLEANE

Page 26: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Una variabile booleana può anche essere istanziata con una istruzionedel tipo:

Bianco:= Alto OR Basso;Nero:= Alto AND Basso;

Di solito le variabili booleane si usano come flag, cioè per memorizzareun evento e poi controllare uno o più istruzioni decisionali o di ciclo.

VARIABILI BOOLEANE

Page 27: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Esempio: Supponiamo di voler ordinare in maniera crescente duenumeri interi Int1 e Int2.

PROCEDURE SortDue(VAR Int1,Int2:integer; OrdineErrato: boolean); {Scambia i valori di Int1 e Int2 se OrdineErrato è vero}BEGIN If OrdineErrato THEN

Scambia(Int1,Int2)END;

La chiamata alla procedura è la seguente:

SortDue(Int1, Int2, (Int1>Int2))

VARIABILI BOOLEANE

Page 28: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

E’ possibile usare variabili booleane per controllare cicli e condizionidi uscita da cicli.Le variabili adoperate a questo scopo prendono il nome di Flag.

{Cicla e decidi usando una variabile Flag}Flag False;WHILE NOT Flag AND NOT (una qualunque condizione di uscita) DO esegui l’elaborazione prevista, nell’ambito della quale il Flag potrebbe cambiare valoreIF Flag THEN esegui altra elaborazione{fine dell’algoritmo}

VARIABILI BOOLEANE

Page 29: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ProblemaSupponiamo di voler calcolare la media dei voti che ogni studente presenta sul suo libretto. Per essere sicuri di non commettere errori grossolani dobbiamo evitare che nella lista dei voti non esistano valori inferiori a 18 o superiori a 30. Se ciò accade interrompiamola lettura dei dati e non calcoliamo la media. Supponiamo infine che il numero di esami superati sia N.

VARIABILI BOOLEANE

Page 30: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Pseudo-codiceSomma 0Contatore 0VotoErrato falseWHILE NOT VotoErrato AND NOT (Contatore=N) DO read(Voto) IF (Voto<18) OR (Voto>30) THEN VotoErrato true ELSE Somma Somma + Voto Contatore Contatore + 1IF VotoErrato THEN Media 0ELSE Media Somma/Contatore

VARIABILI BOOLEANE

Page 31: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

FUNZIONI BOOLEANE

L’uso delle funzioni booleane serve a realizzare meglio controlliche potrebbero essere altrimenti molto complessi da implementare.

ESEMPIO

Controlla che tre Numeri siano in ordine crescente.

FUNCTION Ordinati(X1, X2, X3: real): boolean;{è vera se X1<=X2<=X3}BEGIN

Ordinati:=(X1<=X2) AND (X2<=X3)END;

chiamataIF NOT Ordinati(X1,X2,X3) THEN

Ordinare(X1,X2,X3);

Page 32: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESEMPIO

Controlla che dati tre numeri essi costituiscano i lati di un triangolo.

FUNCTION NonTriangolo(Lato1, Lato2, Lato3: real): boolean;{è vera se i tre lati non formano un triangolo}BEGIN

NonTriangolo := (Lato1 > Lato2+Lato3) OR (Lato2 > Lato1 +Lato3) OR (Lato3 > Lato2 + Lato1)

END;

chiamatareadln(Lato1, Lato2, Lato3);WHILE NonTriangolo (Lato1, Lato2, Lato3) DO

readln(Lato1, Lato2, Lato3);

Page 33: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

FUNZIONI BOOLEANE

Problema:Dato un Array di numeri interi realizzare una funzione che controlli che questi numeri siano ordinati in maniera crescente.

Pseudo-codiceChiamiamo con ArrayOrdinato la funzione, con ArrayC l’array da controllare, con ElementiTotali il numero di elementi contenuti nell’array.

Ordinato trueWHILE sono richiesti altri confronti AND Ordinato DO fai un altro confronto per cercare di rendere Ordinato FALSEArrayOrdinato Ordinato

Page 34: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

FUNCTION ArrayOrdinato(VAR ArrayC: IntsArray; ElementiTotali: integer): boolean;

{è vera se l’ArrayC è ordinato }VARIndice: integer;Ordinato:boolean;BEGINIndice:=1;Ordinato:=TRUE;WHILE (Indice <> ElementiTotali) AND Ordinato DO

IF ArrayC[Indice]> ArrayC[Indice+1] THENOrdinato:=FALSE;

ELSE Indice:=Indice+1;

ArrayOrdinato:=OrdinatoEND;

Page 35: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

FUNCTION ArrayOrdinato(VAR ArrayC: IntsArray; ElementiTotali: integer): boolean;

{è vera se l’ArrayC è ordinato }VARIndice: integer;

BEGINArrayOrdinato :=TRUE; FOR Indice :=1 TO ElementiTotali DO

IF ArrayC[Indice]> ArrayC[Indice+1] THENArrayOrdinato:=FALSE;

END;

Codice corretto ma da non usare perché con FOR si fanno più confronti in media e perché il valore della funzione cambia continuamente.

Page 36: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

TIPI ENUMERATIVI

I tipi standard previsti dal Pascal non coprono tutte le possibili esigenze di un programmatore.Ad esempio una variabile potrebbe voler assumere solo un valore nell’ambito di una lista finita.Es. colore (blu, giallo, verde, rosso).

Si definisce Tipo Enumerativo (Enumerated Type) un insieme ordinato di valori necessari al programmatore.

TYPETipoColore = (NessunColore, Rosso, Grigio, Blu)

VARColore : TipoColore

Colore:=Rosso;Colore:=succ(Colore); {Grigio}Colore:=‘Blu’; SINTAX ERROR!

Perché il type di Colore non è una stringa

Page 37: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

TIPI ENUMERATIVI

Se si deve assegnare un valore ad una variabile il cui tipo è enumerativo bisogna usare solo i valori della lista del tipo mai una stringa.

Le funzioni Pascal ord, pred e succ sono applicabili ai tipi enumerativi.

Esempio

FOR Colore:=Rosso TO Blu DOwrite(ord(Colore):5);

writeln:

1 2 3

Se le funzioni pred e succ vengono applicate rispettivamente al primo o all’ultimo elemento della lista dei tipi si ha un ERRORE.

Page 38: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

TIPI ENUMERATIVI

Poiché non tutti i dialetti Pascal permettono istruzioni del tipowriteln(Colore) dove colore è di tipo enumerativo allora è necesssario scrivere una procedura del tipo:

PROCEDURE MostraColore(Colore: TipoColore);{in: Colore -- Valore del TipoColore che si vuole avere a video out: la stringa corrispondente a Colore viene mostrata}BEGIN

CASE Colore OFRosso: write(‘rosso’);Grigio: write(‘grigio’);Blu: write(‘blu’);

ENDEND;

N.B. Un enumerated type è un ordinal type, cioè un tipo per il quale è noto il successore e il predecessore di ogni valore escluso il primo e l’ultimo.

Page 39: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

TIPI ENUMERATIVI

PROCEDURE LeggiColore(VAR Colore: TipoColore);{restituisce un valore per Colore in funzione di un carattere letto}VAR Ch:char;BEGIN readln(Ch); Ch:=Maiuscolo(Ch);IF Ch IN [‘R’, ‘G’, ‘B’] THEN

CASE Ch OF ‘R’: Colore:=Rosso; ‘G’: Colore:= Grigio; ‘B’: Colore:= Blu;END

ELSEColore:=NessunColore

END;

EsempioLeggere un carattere e mostrare il colore corrispondente.

TYPE TipoColore = (NessunColore, Rosso, Grigio, Blu)VAR Colore : TipoColore

E’ sempre opportuno mettere nei tipi enumerativi un valore “nullo” per poter gestire le condizioni di errore.

Page 40: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

TIPI ENUMERATIVI

Altri Esempi

Funzione per controllare che il Colore appartenga ai tipi previsti

FUNCTION ColoreValido(Colore: TipoColore): boolean;{restituisce vero se Colore<>NessunColore}BEGIN

ColoreValido:=Colore<>NessunColoreEND;

Mostriamo un frammento di programma che usa le procedure e funzioni sopra definite

REPEATwrite(‘Introduci un colore (Rosso, Grigio, Blu): ‘;LeggiColore(Colore);

UNTIL ColoreValido(Colore);

Page 41: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESEMPIOTIPI ENUMERATIVI

Problema: si vogliono mostrare i giorni di un mese, settimana per settimana, conoscendo con quale giorno della settimana inizia il mese.

Esempio di input output:Dammi il numero di giorni del mese: 30Dammi il primo giorno del mese: Martedì

DOM LUN MAR MER GIO VEN SAT1 2 3 4 5

6 7 8 9 10 11 1213 14 15 16 17 18 1920 21 22 23 24 25 2627 28 29 30

Page 42: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESEMPIOTIPI ENUMERATIVI

Pseudo-codice

PrendiDati

MostraIntestazione

MostraMese

PROGRAM CalendarioMensile(input;output);CONST

Spazi=8;TYPE

TipoGiorno= (Niente, DOM, LUN, MAR, MER, GIO, VEN, SAB);VAR

GiorniTotali: integer;GiornoIniziale:TipoGiorno;

FINE

RAPPRESENTAZIONE GRAFICA

Page 43: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

RAPPRESENTAZIONE GRAFICA

PrendiDati

GiornoValido

LeggiGiornoIniziale

Maiuscolo

MostraIntestazione MostraMese

Domani

GiorniTotaliGiornoIniziale

GiornoIniziale

GiornoIniziale

Carattere

GiorniTotaliGiornoIniziale

Oggi Domani

Page 44: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESEMPIOTIPI ENUMERATIVI

PrendiDati

REPEATreadln(GiorniTotali)

UNTIL GiorniTotali IN [28..31]

REPEATpromptLeggiGiornoIniziale(GiornoIniziale)

UNTIL GiornoValido(GiornoIniziale)

Si vuole introdurre il giorno della settimana usando solo i primi due caratteri del nome del giorno come abbreviazione.Es. ME sta per Mercoledì; VE sta per Venerdì

Page 45: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

MostraIntestazione

PROCEDURE MostraIntestazione;{mostra l'intestazione del mese}

BEGINwriteln(' DOM ':Spazi, ' LUN ':Spazi, ' MAR ':Spazi, ' MER

':Spazi, ' GIO ':Spazi, ' VEN ':Spazi, ' SAB ':Spazi);

writelnEND;

Page 46: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

ESEMPIOTIPI ENUMERATIVI

MostraMese

write 1usa il valore Oggi per determinare il giorno di partenza

FOR Data 2 TO GiorniTotaliOggi Domani(Oggi)write(Data)IF Oggi = SAB THEN writeln;

writeln

Page 47: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

PROCEDURE PrendiDati(VAR GiorniTotali: integer; VAR GiornoIniziale: TipoGiorno);{legge i giorni totali del mese e il primo giorno}BEGIN

REPEATwrite(' Di quanti giorni e'' composto il mese?

');readln(GiorniTotali)

UNTIL GiorniTotali IN [28..31]; REPEAT

write(' Primo giorno del mese: '); LeggiGiornoIniziale(GiornoIniziale)

UNTIL GiornoValido(GiornoIniziale)

END;

Page 48: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

PROCEDURE MostraMese(GiorniTotali: integer; Oggi: TipoGiorno);{................................} VAR

Data: integer;

BEGINwrite (1 : ord(Oggi)*Spazi); IF Oggi=Sab THEN

Writeln;FOR Data:=2 TO GiorniTotali DOBEGIN

Oggi:=Domani(Oggi);Write(Data:Spazi);IF Oggi=Sab THENWriteln

END;END;

Page 49: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

FUNCTION Domani(Giorno: TipoGiorno);{ritorna il giorno successivo a quello di input}

BEGIN IF Giorno<> SAB THEN Domani:=succ(Giorno)ELSE Domani:=DOM

END;

Page 50: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

PROCEDURE LeggiGiornoIniziale(VAR Giorno: TipoGiorno);VARCarat1, Carat2: char; {primo e secondo carattere letto}

BEGIN readln(Carat1,Carat2);maiuscolo(Carat1);maiuscolo(Carat2);IF (Carat1='D') AND (Carat2='O') THEN

Giorno:=DomELSE IF (Carat1='L') AND (Carat2='U') THEN

Giorno:=LunELSE IF (Carat1='M') AND (Carat2='A') THEN

Giorno:=MarELSE IF (Carat1='M') AND (Carat2='E') THEN

Giorno:=MerELSE IF (Carat1='G') AND (Carat2='I') THEN

Giorno:=GioELSE IF (Carat1='V') AND (Carat2='E') THEN

Giorno:=VenELSE IF (Carat1='S') AND (Carat2='A') THEN

Giorno:=SabEND;

Page 51: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

FUNCTION GiornoValido(Giorno: TipoGiorno);{ritorna vero se il giorno è <> Niente}

BEGIN GiornoValido:=Giorno<>Niente

END;

Page 52: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

SUGGERIMENTI E CONSIGLI

• Non usare nelle FUNCTION la chiamata per VAR perché può generare side effects pericolosi.

• Se si deve usare una chiamata per VAR allora scrivere un PROCEDURE invece di una FUNCTION

•Usare i Flag con criterio

read(Numero);Finito:=Numero<=0;WHILE NOT Finito DO

BEGIN read(Numero) Finito:=Numero<=0END;

read(Numero);WHILE Numero>0 DO

BEGIN read(Numero)END;

PESSIMO STILE

Page 53: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Quando si usa un FLAG per controllare un evento che capita all’interno di un ciclo assicurarsi di aver posto il FLAG fuori del ciclo uguale al valore complementare a quello interno al ciclo.

In alcuni calcolatori se una variabile booleana non è aggiornata per default assume il valore FALSE.

Page 54: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Usare sempre una istruzione IF per controllare con un FLAG eventi che capitano all’interno di un ciclo.

FUNCTION ArrayOrdinato(VAR ArrayC: IntsArray; ElementiTotali: integer): boolean;

{è vera se l’ArrayC è ordinato }VARIndice: integer; BEGINArrayOrdinato :=TRUE;FOR Indice :=1 TO ElementiTotali-1 DO

ArrayOrdinato:= ArrayC[Indice]> ArrayC[Indice+1]END;

Essendoci il FOR la funzione potrebbe diventare primafalse e poi true.

Page 55: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

FUNCTION NonValido(VAR AnArrayC: IntsArray; Basso,Alto:integer; ElementiAssegnati : integer): boolean;

{è vera se almeno uno degli elementi in AnArray è minore di Basso o maggiore di Alto }VARIndice: integer; BEGINNonValido :=FALSE;FOR Indice :=1 TO ElementiTotali DO

IF ( AnArray[Indice] < Basso) OR AnArray[Indice] > Alto) THEN NonValido :=TRUE

END;

DOMANDAIl codice che segue è corretto?

Esercizipag. 357 n. 20, 21, 25

{è vera se nessuno degli elementi in AnArray è minore di Basso o maggiore di Alto }

Page 56: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)
Page 57: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)
Page 58: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)
Page 59: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Gestione vendite in euroProgetto a.a. 2001-2002

( Modulo A ).

Un file di testo ARTICOLI.DAT contiene dei prodotti da vendere (max 10) con le seguenti caratteristiche:ogni riga rappresenta un articolo; i primi caratteri rappresentano la descrizione ( fino al simbolo ^), i due successivi l’unità di misura (PZ per pezzo, KG per chilogrammo), gli ultimi due numeri rappresentano rispettivamente il costo in lire e la percentuale d’iva.

Esempio:bicchiere di plastica^PZ 8 20piatto di plastica^PZ 24 20arance ^KG 2500 4patate ^KG 3000 4

Si vuole implementare un programma che mostri a video il corpo di una fattura riportando i dati sia in lire che in euro secondo le seguenti modalità:

Il sistema stampa ogni prodotto presente nel file, chiedendo all’utente la quantità desiderata.In seguito viene stampato il corpo di una fattura: la descrizione, la quantità, il prezzo unitario in lire ed in euro, il totale in lire ed in euro, e la percentuale iva presente nell'articolo. Totale in lire = Quantità per prezzo unitario in lireTotale in euro = Quantità per prezzo unitario in euroL’ultima riga conterrà il totale della spesa senza iva (detto Totale Imponibile), il Totale dell’imposta Iva e il Totale della fattura.Totale Imponibile in euro= Somma di tutti i totali in euroTotale Imposta in euro= Somma di tutti le imposte in euroTotale generale in euro= Somma dei due totali precedenti

Page 60: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

•Nel passaggio da lire ad euro tenere presente la seguente circolare ministeriale ( 1 euro=1936,27 lire ).Circolare del 23/12/1998 n. 291 - Emanato da Ministero delle Finanze…………………………..In presenza delle condizioni sopra evidenziate l'articolo in rassegnaimpone di utilizzare l'importo convertito in euro con almeno: - cinque cifre decimali per gli importi originariamente espressi in unita' di lire (da 1 a 9 lire); - quattro cifre decimali per gli importi originariamente espressi in decine di lire (da 10 a 99 lire); - tre cifre decimali per gli importi originariamente espressi in centinaia di lire (da 100 a 999 lire); - due cifre decimali per gli importi originariamente espressi in migliaia di lire (da 1.000 lire in poi).

N° Pezzi Tagli in Euro10 20010 10010 5050 1050 5100 1200 0.5200 0.1200 0.05

Si simuli ancora il pagamento della fattura mediante contanti presso una cassa. Al momento del pagamento il cliente può pagare a fronte del totale fattura con le seguenti modalità:· Totale esatto in euro (aggiornare solo i tagli in cassa)· Cifra superiore in euro (calcolare il resto e aggiornare i tagli in cassa)· Totale esatto in lire (aggiornare una cassa in lire solo per totali e non per tagli)· Cifra superiore in lire (calcolare il resto in euro e aggiornare i tagli in cassa euro e il totale cassa lire)Prevedere i casi di mancanza di resto per mancanza dei tagli giusti invitando il cliente a cambiare lui o a comprare altri prodotti.A fine giornata (dopo ad esempio 5 clienti) fare il bilancio di cassa mostrando:Valore di partenzaTotale acquistiValore finale (Questo valore deve essere esposto anche per tagli)

La cassa ogni giorno è dotata delle seguenti quantità di tagli in euro:

Page 61: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Esempio di esecuzione.I prodotti in vendita oggi sono:bicchiere di plastica^PZ 8 20piatto di plastica^PZ 24 20arance ^KG 2500 4patate ^KG 3000 4

Acquisti Cliente N.1bicchiere di plastica PZ: quantità=500piatto di plastica PZ: quantità=200arance 100 KG: quantità=0arance 120 KG: quantità=10

FATTURA N.1Descrizione Quantità Prezzo U L Prezzo U E Totale L Totale E IVA %bicchiere di plastica 500 8 0,00413 4000 2,07 20piatto di plastica 200 24 0,0124 4800 2,48 20arance 120 10 3000 1,55 30000 15,50 4

Totale Imponibile=20,05 € Imposta Iva=1,53 € Totale Fattura=21,58 €

Acquisti Cliente N.2………………………..

FATTURA N.2Descrizione Quantità Prezzo U L Prezzo U E Totale L Totale E IVA %…………………………………………………………………………………………………………..

Totale Imponibile=….. € Imposta Iva=….. € Totale Fattura=….. €

…………………………………………………………………………………………………………..

Apertura Cassa:N° Pezzi Tagli in Euro

N° Pezzi Tagli in Euro10 20010 10010 5050 2050 10100 5200 2200 1200 0.5200 0.250 0.150 0.0510 0.0210 0.01

Page 62: Successione di Fibonacci Pseudo Codice Assegna il numero della successione Assegna Fn1, Fn, Fn2 per N=2 Calcola la successione Stampa la Somma=Fn1*Fn2-sqr(Fn)

Chiusura Cassa:Totale apertura Cassa= xxxxxxxxx Totale fatturato= yyyyyyyyy Totale chiusura cassa= zzzzzzSituazione Cassa

N° Pezzi Tagli in Euro…... 200…... 100…... 50…... 10…... 5…... 1…... 0.5…... 0.1…... 0.05

Totale Lire in cassa= wwwwww