Programmazione Mod. B - prof. Burattini - Cap 17 1.

58
Programmazione Mod. B - p rof. Burattini - Cap 17 1

Transcript of Programmazione Mod. B - prof. Burattini - Cap 17 1.

Page 1: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

1

Page 2: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

2

GLI INSIEMI

Un insieme è una collezione di oggetti aventi in comune determinate proprietà.

Per determinare se una espressione assume un valore che appartiene ad un certo insieme si è finora adoperata l’espressione

IF Variabile IN [‘xx’,’yy’,…..,’zz’] THEN

Per meglio lavorare con gli insiemi in Pascal si introducono variabili ed espressioni definite specificamente per essi.

Page 3: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

3

Il valore che può assumere una espressione di insiemi deve appartenere ad un preciso insieme.

Esempio

Insieme delle vocali maiuscole e dei primi dieci digiti decimali (0-9)

[‘A’,’E’,’I’,’O’,’U’,’0’..’9’]

[‘A’,’E’ ,’0’..’9’,’I’,’U’,’O’]

L’ordine con cui sono elencati gli elementi appartenenti ad un insieme è non significativo.

Page 4: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

4

SET VARIABLE : valore assunto da una variabile di un set espression[‘A’..’C’][‘K’..’Z’]

TYPENumeri=1..100InsiemeNumeri = SET OF Numeri

VARUniversale, AlcuniInteri, Nullo: InsiemeNumeri Universale:=[1..100] ; AlcuniInteri:=[20,40,60,80,100] ;Nullo:=[];

SET OF TYPE

Page 5: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

5

TYPENumeri=1..100InsiemeNumeri = SET OF Numeri

VARUniversale, AlcuniInteri, Nullo: InsiemeNumeri Universale:=[1..100] ; AlcuniInteri:=[20,40,60,80,100] ;Nullo:=[];

UNIVERSAL SET: l’insieme di tutti i possibili membri definiti dal BASE TYPE (al massimo 256 elementi).

Un SET VARIABLE può contenere solo elementi appartenenti al type del set di definizione. Questo type è detto BASE TYPE.

EMPTY SET è un insieme che non contiene elementi.

BASE TYPE: un ordinal type che definisce tutti i possibili membri che un set variable può assumere.Ordinal type: type dove ciascun valore, escluso il primo e l’ultimo ha un valore precedente o seguente riconoscibile (Meyers pg.191)

Page 6: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

6

SET EXPRESSION : una espressione che opera su SET VARIABLE

[‘A’..’C’]+[‘K’..’Z’]

Page 7: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

7

EsempioSi vuole realizzare un correttore di testi che controlli se i caratteri letti appartengono a Lettere, Numeri o caratteri speciali come quelli usati per la Punteggiatura di fine frase.

Introduciamo le seguenti SET VARIABLELettere=[tutte le lettere Maiuscole e tutte le lettere Minuscole]Numeri =[caratteri numerici tra 0 e 9]Punteggiatura=[punto, punto interrogativo e punto esclamativo ]

Page 8: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

8

TYPECharSet=SET OF char;……….VAR

{variabili globali}Lettere,Numeri,Punteggiatura: CharSet;………………………….PROCEDURE InizializzaSet(VAR Lettere, Numeri, Punteggiatura:

CharSet);BEGIN

Lettere:=[‘A’..’Z’,’a’..’z’];Numeri:=[‘0’..’9’];Punteggiatura:=[‘.’,’?’,’!’]

END;

Page 9: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

9

ESEMPIO

Dato un testo, su un file, vogliamo estrarre da questo le parole.

Quando si giunge a fine rigo allora al posto dell’eoln si mette un

blank.

Soluzione

Leggiamo le parole del testo carattere per carattere e ricostruiamole

mediante una operazione di concatenazione. Controlliamo ad ogni

lettura che il carattere letto appartenga all’insieme Lettere e che non

siamo giunti alla fine della linea (eoln). Se siamo in questo caso

sostituiamo eoln con un blank.

Page 10: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

10

PROCEDURE ReadInCh(VAR Ch.char; VAR InFile:text);{}BEGIN

IF NOT eoln(InFile) THEN read(InFile,Ch)ELSE Ch:=‘ ‘

END;

PROCEDURE GetWord(VAR Word:StringType; VAR LastCh:char; VAR InFile:text);

{}BEGIN

Word:=‘’;ReadInCh(LastCh, InFile);WHILE LastCh IN Letters DO

BEGIN Word:=Word+Ch; ReadInCh(LastCh, InFile)END

END;

Page 11: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

11

Esercizio

Dato un testo, su un file, vogliamo estrarre da questo le parole escludendo numeri e punteggiatura o altri tipi di caratteri. Quando appare un carattere non appartenente a Lettere questo viene ignorato, e la parola viene scritta su un file.

EsempioTesto: La vispa Teresa,

avea tra l'erbetta,a volo sorpresagentil Farfalletta!

Risultato: LavispaTeresaaveatral'erbettaavolosorpresagentilFarfalletta

Page 12: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

12

ESPRESSIONI E OPERAZIONI CON INSIEMI

Per definire insiemi di oggetti distinti possiamo ricorrere agli Enumerated Type

Operatore Operazione Esempio

+ unione [‘A’..’C’] + [‘1’..’5’] [‘A’..’C’,‘1’..’5’]

A B

A+B

* intersezione [1,3,5,7] * [1,2,5] [1,5]

BA

A*B

- differenza [1,3,5,7] - [1,2,5] [3,7]

BA

A-B

Page 13: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

13

ESEMPIO

TYPEVegType=(Asparagi, Bietole, Broccoli, Carote, Cipolle, Patate,

Piselli, Pomodori, Sedano,Spinaci);VegSet=SET OF VegType;

VARCoop, {verdure per la Coop}Gs, {verdure per il GS}TutteVerdure, {insieme di tutte le verdure}Verdure: {verdure per la Coop e GS}

VegSet;TutteVerdure:=[Asparagi..Spinaci];Coop:=[Bietole..Patate, Spinaci];Gs:=[Asparagi..Carote,Pomodori,Spinaci]

Page 14: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

14

Coop:=[Bietole..Patate, Spinaci];Gs:=[Asparagi..Carote,Pomodori,Spinaci]TutteVerdure:=[Asparagi..Spinaci]; Nella set variable Verdure possiamo mettere il risultato delle operazioni insiemistiche che si possono applicare agli insiemi Coop e Gs e TutteVerdure

Verdure:=Coop+Gs [Asparagi..Patate, Pomodori, Spinaci]Verdure:=Coop*Gs [Bietole..Carote, Spinaci]

Verdure:=TutteVerdure-Coop [Asparagi,Piselli..Sedano]Verdure:=TutteVerdure-Gs [Cipolle..Piselli,Sedano]

Verdure:=TutteVerdure-Coop -GS [Piselli,Sedano]Verdure:=Gs-Coop [Asparagi,Pomodori,Spinaci]Verdure:=Coop-GS [Cipolle,Patate]

Asparagi, Bietole, Broccoli, Carote, Cipolle, Patate, Piselli, Pomodori, Sedano,SpinaciBietole, Broccoli, Carote, Cipolle, Patate, Spinaci

Asparagi, Bietole, Broccoli, Carote, Pomodori, Spinaci

TutteVerdureCoop

Gs

Page 15: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

15

Verdure:=Coop+Gs [Asparagi..Patate, Pomodori, Spinaci]

Verdure:=Coop*Gs [Bietole..Carote, Spinaci]

Verdure:=TutteVerdure-Coop [Asparagi,Piselli..Sedano]

Verdure:=TutteVerdure-Gs [Cipolle..Piselli,Sedano]

Verdure:=TutteVerdure-Coop-GS [Piselli,Sedano]

Verdure:=Gs-Coop [Asparagi,Pomodori,Spinaci]

Verdure:=Coop-GS [Cipolle,Patate]

Asparagi, Bietole, Broccoli, Carote, Cipolle, Patate, Piselli, Pomodori, Sedano,SpinaciBietole, Broccoli, Carote, Cipolle, Patate, Spinaci

Asparagi, Bietole, Broccoli, Carote, Pomodori, Spinaci

TutteVerdureCoop

Gs

Tutte le verdure disponibili nei due supermercati

Tutte le verdure disponibili sia nell’uno che nell’altro supermercato

Tutte le verdure non disponibili alla Coop

Tutte le verdure non disponibili al Gs

Tutte le verdure non disponibili né alla Coop né al Gs

Tutte le verdure disponibili al Gs ma non alla Coop

Tutte le verdure disponibili alla Coop ma non al Gs

Page 16: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

16

OPERATORI RELAZIONALI

= eguaglianza tra insiemi

<> diseguaglianza tra insiemi

<= sottoinsieme di altro insieme

< sottoinsieme proprio di altro insieme

<= soprainsieme di altro insieme

< soprainsieme proprio di altro insieme

Asparagi, Bietole, Broccoli, Carote, Cipolle, Patate, Piselli, Pomodori, Sedano,SpinaciBietole, Broccoli, Carote, Cipolle, Patate, Spinaci

Asparagi, Bietole, Broccoli, Carote, Pomodori, Spinaci

TutteVerdureCoop

Gs

[Coop+Gs]*[Piselli,Sedano]=[]

Coop<>Gs

[Bietole,Carote..Patate]<Coop

Coop<=TutteVerdure

Coop+Gs+[Piselli,Sedano]>=TutteVerdure

TutteVerdure >Coop+Gs

Page 17: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

17

SEMANTICA

[Coop+Gs]*[Piselli,Sedano]=[]

Né la Coop né il Gs hanno Piselli e Sedano

Coop<>GsLa Coop e il Gs non hanno esattamente le stesse verdure

[Bietole,Carote,Patate]<CoopLe Carote, Cipolle e Patate sono tutte vendute alla Coop

Coop<TutteVerdureLa Coop non ha tutte le verdure possibili

Coop+Gs+[Piselli,Sedano]>=TutteVerdureLe verdure della Coop più quelle del Gs più i Piselli e il Sedano rappresentano tutte le verdure del mercato

TutteVerdure >Coop+Gs

Le verdure disponibili sul mercato sono di più di quelle vendute dalla Coop e dal Gs

Page 18: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

18

Sia dato un insiemi di possibili eventi, esempio tutti i numeri interi tra 1 e 100. Si vuole costruire l’insieme di tutti i numeri estratti a caso da un generatore random in 50 chiamate.

Chiamiamo AccumulatoreUniversale l’insieme di tutti i possibili numeri da estrarre,Accumulatore l’insieme in cui mettiamo i numeri estratti,EventoCasuale il singolo numero estratto.

Pseudo CodiceAccumulatore []WHILE non si sono generati tutti i numeri DO

genera un EventoCasualeIF EventoCasuale appartiene all’AccumulatoreUniversale THEN

Accumulatore Accumulatore + [EventoCasuale]

Alcuni algoritmi per l’elaborazione di insiemi

Algoritmo 14.1

Page 19: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

19

Sia dato un insiemi di possibili eventi, esempio tutti i numeri interi tra 1 e 100. Si vuole costruire l’insieme di tutti i numeri non estratti da un generatore random in 150 chiamate.

Chiamiamo RegistratoreUniversale l’insieme di tutti i possibili numeri da estrarreRegistratore l’insieme di tutti i possibili numeri ancora non estrattiEventoCasuale il singolo numero estratto.

Pseudo CodiceRegistratore RegistratoreUniversale {insieme universale degli eventi}WHILE non si sono generati tutti i numeri DO genera un EventoCasuale IF EventoCasuale appartiene al Registratore THEN Registratore Registratore - [EventoCasuale]

Algoritmo 14.2

Page 20: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

20

Un SET VARIABLE può essere interpretato come una astrazione capace di caratterizzare uno o più oggetti di un array di variabili booleane.Quando un SET VARIABLE è inizializzato a [ ] questo implica che tutti i flag booleani che riguardano i suoi elementi nell’array sono posti a FALSE.In altre parole è falso che un qualunque elemento X appartenga all’insieme vuoto.

Quando un SET VARIABLE è inizializzato all’UNIVERSAL SET questo implica che tutti i flag booleani che riguardano i suoi elementi nell’array sono posti a TRUE.In altre parole è vero che qualunque elemento X dell’UNIVERSAL SET appartiene all’insieme.Se si aggiunge un nuovo elemento al SET VARIABLE il flag corrispondente diventa TRUESe si elimina un elemento dal SET VARIABLE il flag corrispondente diventa FALSE

Page 21: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

21

Supponiamo di voler fare delle elaborazioni su un set variable denominato SomeSet.

Chiamiamo SomeSet il set variable su cui si vuole operareCandidato il singolo elemento di SomeSet. MinVal e MaxVal i valori minimo e massimo assunti dagli elementi di SomeSet tra i quali si vuole fare l’elaborazione

{Elabora gli elementi di SomeSet}Pseudo CodiceFOR Candidato MinVal TO MaxVal DO IF Candidato IN SomeSet THEN elabora Candidato

Algoritmo 14.3

SomeSet deve essere un sottoinsieme di un UNIVERSAL SET mentre la Base Type è determinata dal sub-range MinVal..MaxVal

Page 22: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

22

Caso di studio 14.1

Scrivere un programma che mostri tutte le lettere maiuscole presenti in un preassegnato testo e tutte le minuscole non presenti.

Abbiamo bisogno di due SET VARIABLE InsiemeMaiuscoleInsiemeMinuscole

Pseudo codiceInizializza(InsiemeMinuscole, InsiemeMaiuscole, File){assegna gli insiemi universali a InsiemeMinuscole=[‘a’..’z’], InsiemeMaiuscole=[] e reset File}

RegistraInformazioni(InsiemeMinuscole, InsiemeMaiuscole, File){legge i caratteri da File li cancella da InsiemeMinuscole se minuscoli, se maiuscoli li aggiuge a InsiemeMaiuscole}

MostraInformazioni(InsiemeMinuscole, InsiemeMaiuscole){mostra il contenuto di InsiemeMinuscole e InsiemeMaiuscole al termine dell’elaborazione}

Page 23: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

23

PROGRAM MostraCaratteri(output,Teresa){}TYPE

MinuSetType=SET OF ‘a’..’z’;MaiuSetType=SET OF ‘A’..’Z’;

VAR Teresa :text; InsiemeMaiuscole: MaiuSetType; InsiemeMinuscole: MinuSetType;

PROCEDURE Inizializza(VAR InsiemeMaiuscole: MaiuSetType; VAR InsiemeMinuscole: MinuSetType; VAR Teresa:text);

BEGINreset(Teresa);InsiemeMinuscole:=[‘a’..’z’];InsiemeMaiuscole:=[]

END;…………………………………...

Page 24: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

24

RegistraInformazioni

WHILE NOT eof(Teresa) DOread(Teresa,Ch)

IF Ch IN [‘a’..’z’] THENInsiemeMinuscole InsiemeMinuscole - [Ch]

ELSE IF Ch IN [‘A’..’Z’] THEN

InsiemeMaiuscole InsiemeMaiuscole + [Ch]

Domanda: perché non è necessario controllare l’eoln?

Page 25: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

25

PROCEDURE RegistraInformazioni(VAR InsiemeMinuscole: MinuSetType; VAR InsiemeMaiuscole: MaiuSetType; VAR Teresa:text);{}VAR

Ch:char;BEGIN

WHILE NOT eof(Teresa) DOBEGIN read(Teresa,Ch);

IF Ch IN [‘a’..’z’] THENInsiemeMinuscole:= InsiemeMinuscole - [Ch]

ELSE IF Ch IN [‘A’..’Z’] THEN

InsiemeMaiuscole:= InsiemeMaiuscole + [Ch]END

END;

Page 26: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

26

MostraInformazioni

mostra testo esplicativoFOR Ch ‘A’ TO ‘Z’ DO

IF Ch IN InsiemeMaiuscole THENwrite(Ch)writeln

mostra testo esplicativoFOR Ch ‘a’ TO ‘z’ DO

IF Ch IN InsiemeMinuscole THENwrite(Ch)writeln

Page 27: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

27

PROCEDURE MostraInformazioni(VAR InsiemeMinuscole: MinuSetType; VAR InsiemeMaiuscole: MaiuSetType;

{}VARCh: char;BEGIN

write(‘ Lettere maiuscole presenti: ‘);FOR Ch ‘A’ TO ‘Z’ DO

IF Ch IN InsiemeMaiuscole THENwrite(Ch);writeln;

write(‘ Lettere minuscole assenti: ‘);FOR Ch ‘a’ TO ‘z’ DO

IF Ch IN InsiemeMinuscole THENwrite(Ch);writeln

END;

Page 28: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

28

{BODY}

BEGIN

Inizializza(InsiemeMinuscole, InsiemeMaiuscole, Teresa);

RegistraInformazioni(InsiemeMinuscole, InsiemeMaiuscole, Teresa);

MostraInformazioni(InsiemeMinuscole, InsiemeMaiuscole);

END.

Page 29: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

29

SET VARIABLE [ ] INSIEME VUOTOSET VARIABLE [X,Y,…... ] INSIEME UNIVERSALE

Problema n. 14.2

Sistema per evidenziare l’eventuale assenza di vocali nell’ambito di una parola. Se c’è almeno una vocale va bene altrimenti il sistema deve eseguire la seguente procedura:

mostrare la parolamemorizzarla in un filememorizzarla in un array

Page 30: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

30

Dove

SomeFile è un file testo da cui si legge la parola

Vocali è il valore che assume un insieme inizializzato con tutte le vocali

ChSet è l’insieme di caratteri che costituiscono la parola contenuta nella

variabile Word

VocaliMancanti è una funzione booleana che ritorna TRUE se mancano

le vocali in Word

Pseudo codice

GetAWord(Word, ChSet, SomeFile)IF VocaliMancanti(Vocali, ChSet) THEN

Process(Word)

Page 31: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

31

Prima di lanciare GetAWord e VocaliMancanti supponiamo di avere eseguito il seguente codice:

TYPEChSet Type= SET OF char;

VARWordset, Vocali: ChSetType;

{inizializza Vocali}Vocali:=[‘A’,’E’,’I’,’O’,’U’,’a’,’e’,’i’,’o’,’u’];

se ora facciamo l’intersezione tra Vocali e WordSet e troviamo che l’intersezione è vuota questo significa che nella parola non ci sono vocali.

FUNCTION VocaliMancanti(Vocali,WordSet:ChSetType):boolean;BEGINVocaliMancanti:=(Vocali*WordSet=[]) END;

Page 32: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

32

FUNCTION NoConsonant(Vocali,WordSet:ChSetType):boolean;VAR

ConSet:ChSetType;BEGIN

ConSet:=[‘a’..’z’;’A’..’Z’]- Vocali; NoConsonant :=(ConSet*WordSet=[])

END;

Se vogliamo una funzione che controlli che ci sia almeno una consonante nella nostra parola basterà definire un inseme di consonanti ottenuto per differenza tra tutte le lettere dell’alfabeto e Vocali.

Page 33: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

33

Problema del Consiglio di Amministrazione

Supponiamo che un Consiglio di Amministrazione possa tenere riunioni valide solo quando:la metà più uno dei suoi membri è presente eo il presidente (P) e la segretaria (S) sono presenti o il presidente (P) e il tesoriere (T) sono presenti o il vice-presidente (VP) e la segretaria (S) e il tesoriere (T) sono presenti

Valido=(TotMembri/2) AND (

(P AND S) OR (P AND T) OR

(VP AND S AND T) )

Page 34: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

34

TYPE ConsiglioType=(P,S,T,M1,M2,M3,M4,M5,M6,M7,M8,M9);InsiemePresenti=SET OF ConsiglioType;

CONST TotaleMembri:=9;VAR

Presenti: InsiemePresenti;TotPresenti:integer;

………………..

FUNCTION Valido(Presenti: InsiemePresenti; TotPresenti:integer):boolean;

BEGINValido:=(TotPresenti>TotaleMembri DIV 2) AND ( ([P,S]< Presenti) OR

([P,T]< Presenti) OR ([VP,S,T]< Presenti) )

END;

Page 35: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

35

UNIT STRINGHE

Si vuole creare una UNIT che operi sulle stringhe e che sia il più possibile indipendente dal dialetto PASCAL adoperato.

StringADTLenChars

Adoperiamo una struttura a RECORD per il data Type

Array

Page 36: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

36

UNIT Stringa;

INTERFACE

CONSTMaxLength=80;

TYPESysString=STRING[MaxLength];StringADT=RECORD

Chars:ARRAY[1.. MaxLength] OF char;Len:0.. MaxLength

END;

Page 37: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

37

Constructor - cambia o inizializza i valori di una variabile astratta

Primitive constructor - assegna un valore ad una variabile astratta senza fare uso di altre variabili astratte dello stesso tipo. Ha una sola variabile di output e quelle di input servono per costruire l’output.

Page 38: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

38

IMPLEMENTATION

PROCEDURE NullString(VAR OutStr:StringADT);BEGINEND;

ritorna una la stringa nulla ‘’.

Primitive constructor

PROCEDURE ConvertSysString(StrValue:SysString;VAR OutStr:StringADT);

VARPosition:1..MaxLength;

BEGINWITH OutStr DO BEGIN

Len:=length(StrValue);FOR Position:=1 TO Len DO Chars[Position]:=StrValue[Position]

ENDEND;

converte una stringa rappresentata in un qualche sistema nella stringa equivalente di type StringADT

Page 39: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

39

Primitive constructorPROCEDURE ReadString(Sentinel:char;VAR OutStr:StringADT;

VAR InFile:text);VAR

Ch:char;BEGIN

WITH OutStr DO BEGIN

Len:=0;ReadCh(Sentinel,Ch,Len,InFille)WHILE Ch<>Sentinel DO BEGIN

Len:=Len+1;Chars[Len]:=Ch;ReadCh(SentinelCh,Len,InFile)

END END

END;

legge la stringa da un file escludendo eventuali caratteri sentinella

Page 40: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

40

PROCEDURE ReadlnString (Sentinel:char;VAR OutStr:StringADT;VAR InFile:text);

VARCh:char;

BEGINWITH InString DO BEGIN

Len:=0;WHILE NOT eoln(InFile) AND NOT (Len=MaxLength) DO BEGIN

Read(Infile,Ch);Len:=Len+1;Chars[Len]:=Ch;

END END

END;

legge una stringa da una linea di un file predeterminato

Primitive constructor

Page 41: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

41

SELECTOR - fornisce informazioni su una variabile di input ADT ad un parametro di uscita. Spesso è una funzione (il parametro di uscita in tal caso è la funzione stessa).

Primitive selector - ritorna il valore di uno dei componenti della variabile astratta.

Page 42: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

42

FUNCTION ACh(Instr:StringADT;Position:integer):char;BEGIN

IF Position>InStr.Len THEN Ach:=chr(0)ELSE Ach:=InStr.Chars[Position]

END;

ritorna il carattere N-esimo di una stringa

Primitive selector

FUNCTION StrLength(Instr:StringADT):integer;BEGIN

StrLength:=Instr.LenEND;

ritorna la lunghezza della stringa

Primitive selector

Page 43: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

43

Non-primitive selector - ritorna il valore che non è relativo ad uno dei componenti della variabile astratta ma ciò nonostante è utile al client.

Page 44: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

44

PROCEDURE WritelnString(InStr:StringADT; VAR OutFile:text);BEGIN

WriteString(Instr,OutFile); writeln(OutFile)

END;

scrive una stringa in un file seguita da un <eoln>

Non-primitive selector

PROCEDURE WriteString (InStr:StringADT; VAR OutFile:text);VAR

Position:integer;BEGIN

WITH InStr DOFOR Position:=1 TO Len DO write(OutFile,Chars[Position])

END;

scrive una stringa in un file

Non-primitive selector

Page 45: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

45

Ritorna la posizione di partenza di una data sub-stringa nell’ambito di una preassegnata stringa

Selector operations

FUNCTION StartPos((Substr, SearchStr:StringADT):integer;VAR

SLen,Pos: integer;Found: Boolean;CandStr: StringADT;

BEGINSLen:=SubStr.Len;Found:=FALSE;Pos:=1;WHILE NOT (SearchStr.Len+1-Pos>SLen) AND NOT Found DO BEGIN

StrExtract(SearcStr,Pos,SLen,CandStr);IF StrEqual(CandStr,SearchStr) THEN Found:=TRUE

ELSEPos:=Pos+1

END;IF Found THEN StratPos:=PosELSE StratPos:=0

END;

Page 46: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

46

PREDICATE - è una funzione booleana che ritorna informazioni sul valore o lo stato di una variabile astratta.

Page 47: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

47

FUNCTION StrEqual(Instr1, Instr2:StringADT):boolean;VAR

Pos,TotalChars:integer;StillEqual:boolean;

BEGINIF Instr1.Len<>Instr2.Len THEN StillEqual:= FALSEELSE StillEqual:= TRUE;TotalChars:= Instr1.Len;Pos:=1;WHILE NOT(Pos>TotalChars) AND StillEqual DO

IF Minuscole(InStr1.Chars[Pos])<> Minuscole(InStr2.Chars[Pos]) THEN StillEqual:= FALSEELSE Pos:=Pos+1;

StrEqual:=StillEqualEND;

ritorna TRUE se due stringhe hanno gli stessi caratteri e la stessa lunghezza

Predicate operations

Page 48: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

48

Predicate operations

FUNCTION StrLessThan(InStr1, InStr2:StringADT):booleanBEGIN……………….END;

ritorna TRUE se la prima stringa precede alfabeticamente la seconda

Page 49: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

49

Non-primitive constructor -. Ha almeno una variabile di input il cui tipo è uguale a quello dell’output.

Page 50: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

50

PROCEDURE ChConcat (Ch; VAR InOutStr:StringADT);BEGIN

WITH InOutStr DO IF Len<MaxLength THEN

BEGIN Len:=Len+1; Chars[Len]:=ChEND

END;

concatena un singolo carattere ad una stringa

Non-primitive constructor

Page 51: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

51

Non-primitive constructor

PROCEDURE StrConcat (InStr1, InStr2:StringADT Ch; VAR InOutStr:StringADT);VAR

PosStr2:integer;BEGIN

OutStr:=Instr1;PosStr2=0;WITH OutStr DO WHILE NOT (PosStr2=Instr2.Len) AND NOT (Len=MaxChars) DO

BEGIN PosStr2:= PosStr2+1; Len:=Len+1; Chars[Len]:=InStr2.Chars[PosStr2]END

END;

concatena due stringhe

Page 52: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

52

Non-primitive constructor

PROCEDURE StrExtract(InStr:StringADT; Start, TotalChs:integer; VAR OutStr: StringADT);VAR

InStrPos,OutStrPos

:integer;BEGIN WITH OutStr DO BEGIN

IF Start > Instr.Len THEN Len:=0ELSE IF TotalChs > InStr.Len+1-Start THEN

Len:=InStr.Len+1-Start ELSE

Len:=TotalChs; InStrPos:=Start; FOR OutStrPos:=1 TO Len DO

BEGIN Chars[OutStrPos]:=InStr.Chars[InStrPos]; InStrPos:=InStrPos+1END

ENDEND;

copia una stringa di una predeterminata lunghezza a partire da unadeterminata posizione in una stringa di output

Page 53: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

53

Non-primitive constructor

PROCEDURE StrRemove(Start, TotalChs:integer; VAR InOutStr: StringADT);

PredString,SuccString:

StringADT;BEGIN

IF NOT (Start>InOutStr.Len) THEN BEGIN

StrExtract(InOutStr,1,Start-1,PredString);StrExtract(InOutStr,1,Start+TotalChs,InOutStr.Len,SuccString);StrConcat(PredString, SuccString,InOutStr)

ENDEND;

rimuove un predeterminato numero di caratteri a partire da una certa posizione di una stringa di input/output

PROCEDURE StrInsert(InStr:StringADT; Start:integer; VAR InOutStr: StringADT);BEGINEND;

inserisce un predeterminata stringa di caratteri a partire da una certa posizione in una variabile stringa.

Page 54: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

54

PROCEDURE ReadCh(Sentinel:char;PresentLength:integer;VAR Ch:char;VAR InFile:text);

BEGINIF NOT(eoln(InFile) OR (PredsentLength= MaxLength)) THEN Read(InFile,Ch);ELSE Ch:=Sentinel

END;

legge i caratteri di una stringa da un file e se supera la lunghezza prefissata o trova eoln restituisce un carattere sentinella

Non-primitive constructor

Page 55: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

55

FUNCTION Minuscole(Ch:char):char;BEGIN

IF Ch IN ['A'..'Z'] THEN Minuscole:=chr(ordCh)+ord('a')-ord('A'))ELSE Minuscole:=Ch

END;

trasforma le maiuscole in minuscole

Page 56: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

56

PROCEDURE ChConcat (Ch; VAR InOutStr:StringADT);BEGIN

WITH InOutStr DO IF Len<MaxLength THEN

BEGIN Len:=Len+1; Chars[Len]:=ChEND

END;

concatena i caratteri in una stringa controllando che la lunghezza massima non venga superata

Page 57: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

57

Dato il tipo astratto lista utilizzare le routine elencate per sviluppare il seguente algoritmo:date tre liste di interi L1, L2, L3, aggiungere in L1 solo gli elementi di L2 presenti in L3 e non in L1, eliminando tutti gli altri.

Function Lung(L:tipolista): integer; (*valuta la lunghezza della lista*)

Function estrai(L:tipolista, n:integer): integer; (* fornisce il valore dell’ennesimo intero della lista, se esiste, maxint altrimenti*)

Procedure aggiungi(L:tipolista, n:integer; k:integer): integer; (* aggiunge nella posizione n della lista, l’elemento k*)

Procedure cancella(var L:tipolista; n: integer);(*cancella l’ennesimo elemento della lista, se esiste*)

Es.L1 8 4 2 5 6L2 2 1 7 4 3 6L3 2 5 7 1 3RisultatoL1 1 7 3

Page 58: Programmazione Mod. B - prof. Burattini - Cap 17 1.

Programmazione Mod. B - prof. Burattini - Cap 17

58

Utilizzare le seguenti routine per il tipo astratto lista per sviluppare il seguente algoritmo:date tre liste L1, L2, L3, contenenti lettere dell’alfabeto, lasciare in L1 tutte le vocali presenti in L1, L2 e L3, senza ripetizioni, ordinate in maniera crescente, in L2 tutte le consonanti presenti in L1, L2 e L3, senza ripetizioni, ordinate in maniera decrescente in L3, tutti caratteri, presenti in L1, L2 e L3, senza ripetizioni, ordinate in maniera crescente.

Function Lung(L:tipolista): integer; (*valuta la lunghezza della lista*)

Function estrai(L:tipolista, n:integer): char; (* fornisce il valore dell’ennesimo carattere della lista, se esiste, ‘?’ altrimenti*)

Procedure cancella(var L:tipolista; n: integer); (*cancella l’ennesimo elemento della lista, se esiste*)

Procedure aggiungi(var L:tipolista; n: integer; lettera:char); (*aggiunge dopo l’ennesimo elemento della lista il carattere lettera*)Es.L1 b a z e f o a e i oL2 i q w e a z z w q f bL3 f b o a a b e f i o q w z