capitolo 14
DESCRIPTION
CAPITOLO 14. Primo progetto intercorso. Simulare l’attività di un distributore automatico di generi alimentari in cui sono in vendita prodotti con data di scadenza. Siano tre le linee di prodotti: A, B, C. I prodotti possono essere venduti solo se non sono scaduti. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/1.jpg)
![Page 2: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/2.jpg)
Primo progetto intercorso
Simulare l’attività di un distributore automatico di generi alimentari in cui sono in vendita prodotti con data di scadenza. Siano tre le linee di prodotti: A, B, C.I prodotti possono essere venduti solo se non sono scaduti.I prodotti vengono ritirati e aggiornati ogni 7 giorniI prodotti vengono dati al pubblico in funzione della data di scadenza, prima quelli più antichi.Simulare il caricamento di ogni prodotto con un massimo numero di pezzi (maxA, maxB, maxC).Simulare la vendita dei tre prodotti con segnalazione di fine prodotto.Simulare la raccolta a fine settimana dei prodotti scaduti tenendo presente che essi vanno riconsegnati a diversi fornitori. Poiché i fornitori sono in luoghi diversi verranno caricati sui camion prima i prodotti di tipo B, poi quelli C e infine quelli A.Simulare infine la consegna dei prodotti ai fornitori.
![Page 3: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/3.jpg)
BEGINInizializza(DataNum,DistA,DistB,DistC,Camion);
writeln(' *********** MENU ***********');writeln(' 1- Carica Prodotti ');writeln(' 2- Vendi Prodotti ');writeln(' 3- Ritira Prodotti ');writeln(' 4- Fine lavoro ');readln(Scelta);
CASE Scelta OF 1: CaricaProdotti(DistA,DistB,DistC,MaxA,MaxB,MaxC);2: VendiProdotti(DistA,DistB,DistC,DataOdierna);3: RitiraProdotti(Camion,DistA,DistB,DistC, DataOdierna);4: writeln('ARRIVEDERCI')END;
END.
![Page 4: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/4.jpg)
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 5: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/5.jpg)
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 6: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/6.jpg)
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 7: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/7.jpg)
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).
Una 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 8: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/8.jpg)
SET EXPRESSION : una espressione che opera su SET VARIABLE
[‘A’..’C’]+[‘K’..’Z’]
![Page 9: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/9.jpg)
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 10: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/10.jpg)
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 11: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/11.jpg)
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 12: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/12.jpg)
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 13: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/13.jpg)
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 14: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/14.jpg)
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 15: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/15.jpg)
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 16: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/16.jpg)
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 17: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/17.jpg)
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 18: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/18.jpg)
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 19: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/19.jpg)
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 20: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/20.jpg)
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 21: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/21.jpg)
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 22: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/22.jpg)
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 23: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/23.jpg)
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 24: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/24.jpg)
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 InsiemeMinuscole se minuscoli, se maiuscoli li aggiuge a InsiemeMaiuscole}
MostraInformazioni(InsiemeMinuscole, InsiemeMaiuscole){mostra il contenuto di InsiemeMinuscole e InsiemeMaiuscole al termine dell’elaborazione}
![Page 25: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/25.jpg)
PROGRAM MostraCaratteri(output,Teresa){}TYPE
MinuSetType=SET OF ‘a’..’z’;MaiuSetType=SET OF ‘A’..’Z’;
VAR Teresa :text; InsiemeMaiuscole: MaiuSetType; InsiemeMinuscole: MaiuSetType;
PROCEDURE Inizializza(VAR InsiemeMaiuscole: MaiuSetType; VAR InsiemeMinuscole: MinuSetType; VAR Teresa:text);
BEGINreset(Teresa);InsiemeMinuscole:=[‘a’..’z’];InsiemeMaiuscole:=[]
END;…………………………………...
![Page 26: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/26.jpg)
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 27: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/27.jpg)
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 28: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/28.jpg)
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 29: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/29.jpg)
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 30: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/30.jpg)
{BODY}
BEGIN
Inizializza(InsiemeMinuscole, InsiemeMaiuscole, Teresa);
RegistraInformazioni(InsiemeMinuscole, InsiemeMaiuscole, Teresa);
MostraInformazioni(InsiemeMinuscole, InsiemeMaiuscole);
END.
![Page 31: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/31.jpg)
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 32: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/32.jpg)
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 33: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/33.jpg)
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 34: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/34.jpg)
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 35: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/35.jpg)
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 36: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/36.jpg)
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 37: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/37.jpg)
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 38: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/38.jpg)
UNIT Stringa;
INTERFACE
CONSTMaxLength=80;
TYPESysString=STRING[MaxLength];StringADT=RECORD
Chars:ARRAY[1.. MaxLength] OF char;Len:0.. MaxLength
END;
![Page 39: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/39.jpg)
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 40: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/40.jpg)
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 41: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/41.jpg)
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 42: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/42.jpg)
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 43: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/43.jpg)
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 44: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/44.jpg)
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 45: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/45.jpg)
Non-primitive selector - ritorna il valore che non è relativo ad uno dei componenti della variabile astratta ma ciò nonostante è utile al client.
![Page 46: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/46.jpg)
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 47: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/47.jpg)
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; Ritorna la posizione di partenza di una data sub-stringa nell’ambito di una preassegnata stringa
![Page 48: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/48.jpg)
PREDICATE - è una funzione booleana che ritorna informazioni sul valore o lo stato di una variabile astratta.
![Page 49: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/49.jpg)
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 50: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/50.jpg)
Predicate operations
FUNCTION StrLessThan(InStr1, InStr2:StringADT):booleanBEGIN……………….END;
ritorna TRUE se la prima stringa precede alfabeticamente la seconda
![Page 51: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/51.jpg)
Non-primitive constructor -. Ha almeno una variabile di input il cui tipo è uguale a quello dell’output.
![Page 52: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/52.jpg)
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 53: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/53.jpg)
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 54: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/54.jpg)
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 55: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/55.jpg)
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 56: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/56.jpg)
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 57: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/57.jpg)
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 58: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/58.jpg)
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 59: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/59.jpg)
ESERCIZIO
Sia assegnato un file così caratterizzato
<Indirizzo Mittente>
Informazioni Varie
<Fine Indirizzo>Testo Messaggio………………….<Indirizzo Mittente >
Informazioni Varie
<Fine Indirizzo>Testo Messaggio………………….<Indirizzo Mittente >
Informazioni Varie
<Fine Indirizzo>Testo Messaggio………………….
Estrarre per ogni mittente soloil testo del messaggio.Costruire un array con gli indirizzidei mittenti.Mostrare per ogni mittente il messaggio
![Page 60: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/60.jpg)
From - Thu Aug 26 07:09:19 1999Return-Path: <[email protected]>Received: from di.unito.it (pianeta.di.unito.it) by sole.cib.na.cnr.it (4.1/SMI-4.1)
id AA29055; Sun, 1 Aug 99 06:10:35 +0200Received: from cs.CS.NMSU.Edu by di.unito.it (8.9.1a/SMI-INFODIP)
id FAA23820; Sun, 1 Aug 1999 05:50:02 +0200 (MET DST)Received: from cs.nmsu.edu (epontell@pippo [128.123.64.31])
by cs.CS.NMSU.Edu (8.8.6/8.8.6) with ESMTP id VAA27225;Sat, 31 Jul 1999 21:53:44 -0600 (MDT)
Sender: [email protected]: <[email protected]>Date: Sat, 31 Jul 1999 21:53:46 -0600From: Enrico <[email protected]>Organization: Laboratory for Logic & DatabasesX-Mailer: Mozilla 4.05 [en] (X11; I; Linux 2.0.32 i686)Mime-Version: 1.0To: [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]: Research Assistantships at NMSUContent-Type: text/plain; charset=us-asciiContent-Transfer-Encoding: 7bitX-UIDL: b0fa9065af5ad288d1475b519b3ad95bStatus: UX-Mozilla-Status: 0001
Applications are invited for several Research Assistant Positionsin the Laboratory for Logic and Databases of the Dept. of ComputerScience at New Mexico State University.
![Page 61: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/61.jpg)
From - Thu Aug 26 07:09:19 1999Return-Path: <[email protected]>................................................X-Mozilla-Status:
messaggio
From - Thu Aug 26 07:09:19 1999Return-Path: <[email protected]>................................................X-Mozilla-Status:
messaggio
![Page 62: CAPITOLO 14](https://reader035.vdocuments.pub/reader035/viewer/2022062315/56814e42550346895dbbb596/html5/thumbnails/62.jpg)
Usare le definizioni precedenti prevede la scrittura di più linee di
codice, nella fase di definizione, di quante ne sarebbero necessario se
usassimo un set expression “anonimo” invece di un “named set”.
Questo tipo di definizione torna utile però quando la stessa set
expression è richiamata frequentemente nel corso del programma.