620 likes | 790 Views
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.
E N D
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 giorni I 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.
BEGIN Inizializza(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.
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.
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.
SET TYPE OF SET VARIABLE : valore assunto da una variabile di un set espression [‘A’..’C’] [‘K’..’Z’] TYPE Numeri=1..100 InsiemeNumeri = SET OF Numeri VAR Universale, AlcuniInteri, Nullo: InsiemeNumeri Universale:=[1..100] ; AlcuniInteri:=[20,40,60,80,100] ; Nullo:=[];
Una SET VARIABLE può contenere solo elementi appartenenti al type del set di definizione. Questo type è detto BASE TYPE. 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) UNIVERSAL SET: l’insieme di tutti i possibili membri definiti dal BASE TYPE (al massimo 256 elementi). EMPTY SET è un insieme che non contiene elementi. TYPE Numeri=1..100 InsiemeNumeri = SET OF Numeri VAR Universale, AlcuniInteri, Nullo: InsiemeNumeri Universale:=[1..100] ; AlcuniInteri:=[20,40,60,80,100] ; Nullo:=[];
SET EXPRESSION : una espressione che opera su SET VARIABLE [‘A’..’C’]+[‘K’..’Z’]
Esempio Si 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 VARIABLE Lettere=[tutte le lettere Maiuscole e tutte le lettere Minuscole] Numeri =[caratteri numerici tra 0 e 9] Punteggiatura=[punto, punto interrogativo e punto esclamativo ]
TYPE CharSet=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;
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.
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;
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. Esempio Testo: La vispa Teresa, avea tra l'erbetta, a volo sorpresa gentil Farfalletta! Risultato: LavispaTeresaaveatral'erbettaavolosorpresagentilFarfalletta
Operatore Operazione Esempio + unione [‘A’..’C’] + [‘1’..’5’] [‘A’..’C’,‘1’..’5’] * intersezione [1,3,5,7] * [1,2,5] [1,5] - differenza [1,3,5,7] - [1,2,5] [3,7] A B A B A B A+B A*B A-B ESPRESSIONI EOPERAZIONI CON INSIEMI Per definire insiemi di oggetti distinti possiamo ricorrere agli Enumerated Type
ESEMPIO TYPE VegType=(Asparagi, Bietole, Broccoli, Carote, Cipolle, Patate, Piselli, Pomodori, Sedano,Spinaci); VegSet=SET OF VegType; VAR Coop, {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]
TutteVerdure Coop Gs Asparagi, Bietole, Broccoli, Carote, Cipolle, Patate, Piselli, Pomodori, Sedano,Spinaci Bietole, Broccoli, Carote, Cipolle, Patate, Spinaci Asparagi, Bietole, Broccoli, Carote, Pomodori, Spinaci 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]
TutteVerdure Coop Gs Asparagi, Bietole, Broccoli, Carote, Cipolle, Patate, Piselli, Pomodori, Sedano,Spinaci Bietole, Broccoli, Carote, Cipolle, Patate, Spinaci Asparagi, Bietole, Broccoli, Carote, Pomodori, Spinaci Verdure:=Coop+Gs [Asparagi..Patate, Pomodori, Spinaci] Tutte le verdure disponibili nei due supermercati Verdure:=Coop*Gs [Bietole..Carote, Spinaci] Tutte le verdure disponibili sia nell’uno che nell’altro supermercato Verdure:=TutteVerdure-Coop [Asparagi,Piselli..Sedano] Tutte le verdure non disponibili alla Coop Verdure:=TutteVerdure-Gs [Cipolle..Piselli,Sedano] Tutte le verdure non disponibili al Gs Verdure:=TutteVerdure-Coop-GS [Piselli,Sedano] Tutte le verdure non disponibili né alla Coop né al Gs Verdure:=Gs-Coop [Asparagi,Pomodori,Spinaci] Tutte le verdure disponibili al Gs ma non alla Coop Verdure:=Coop-GS [Cipolle,Patate] Tutte le verdure disponibili alla Coop ma non al Gs
TutteVerdure Coop Gs Asparagi, Bietole, Broccoli, Carote, Cipolle, Patate, Piselli, Pomodori, Sedano,Spinaci Bietole, Broccoli, Carote, Cipolle, Patate, Spinaci Asparagi, Bietole, Broccoli, Carote, Pomodori, Spinaci OPERATORIRELAZIONALI = eguaglianza tra insiemi [Coop+Gs]*[Piselli,Sedano]=[] <> diseguaglianza tra insiemi Coop<>Gs <= sottoinsieme di altro insieme [Bietole,Carote..Patate]<Coop < sottoinsieme proprio di altro insieme Coop<=TutteVerdure <= soprainsieme di altro insieme Coop+Gs+[Piselli,Sedano]>=TutteVerdure < soprainsieme proprio di altro insieme TutteVerdure >Coop+Gs
[Coop+Gs]*[Piselli,Sedano]=[] Né la Coop né il Gs hanno Piselli e Sedano Coop<>Gs La Coop e il Gs non hanno esattamente le stesse verdure [Bietole,Carote,Patate]<Coop Le Carote, Cipolle e Patate sono tutte vendute alla Coop Coop<TutteVerdure La Coop non ha tutte le verdure possibili Coop+Gs+[Piselli,Sedano]>=TutteVerdure Le 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 SEMANTICA
Alcuni algoritmi per l’elaborazione di insiemi Algoritmo 14.1 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 Codice Accumulatore [] WHILE non si sono generati tutti i numeri DO genera un EventoCasuale IF EventoCasuale appartiene all’AccumulatoreUniversale THEN Accumulatore Accumulatore + [EventoCasuale]
Algoritmo 14.2 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 estrarre Registratore l’insieme di tutti i possibili numeri ancora non estratti EventoCasuale il singolo numero estratto. Pseudo Codice Registratore 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]
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 TRUE Se si elimina un elemento dal SET VARIABLE il flag corrispondente diventa FALSE
Algoritmo 14.3 Supponiamo di voler fare delle elaborazioni su un set variable denominato SomeSet. Chiamiamo SomeSet il set variable su cui si vuole operare Candidato 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 Codice FOR Candidato MinVal TO MaxVal DO IF Candidato IN SomeSet THEN elabora Candidato SomeSet deve essere un sottoinsieme di un UNIVERSAL SET mentre la Base Type è determinata dal sub-range MinVal..MaxVal
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 InsiemeMaiuscole InsiemeMinuscole Pseudo codice Inizializza(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}
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); BEGIN reset(Teresa); InsiemeMinuscole:=[‘a’..’z’]; InsiemeMaiuscole:=[] END; …………………………………...
RegistraInformazioni WHILE NOT eof(Teresa) DO read(Teresa,Ch) IF Ch IN [‘a’..’z’] THEN InsiemeMinuscole InsiemeMinuscole - [Ch] ELSE IF Ch IN [‘A’..’Z’] THEN InsiemeMaiuscole InsiemeMaiuscole + [Ch] Domanda: perché non è necessario controllare l’eoln?
PROCEDURE RegistraInformazioni(VAR InsiemeMinuscole: MinuSetType; VAR InsiemeMaiuscole: MaiuSetType; VAR Teresa:text); {} VAR Ch:char; BEGIN WHILE NOT eof(Teresa) DO BEGIN read(Teresa,Ch); IF Ch IN [‘a’..’z’] THEN InsiemeMinuscole:=InsiemeMinuscole - [Ch] ELSE IF Ch IN [‘A’..’Z’] THEN InsiemeMaiuscole:=InsiemeMaiuscole + [Ch] END END;
MostraInformazioni mostra testo esplicativo FOR Ch ‘A’ TO ‘Z’ DO IF Ch IN InsiemeMaiuscole THEN write(Ch) writeln mostra testo esplicativo FOR Ch ‘a’ TO ‘z’ DO IF Ch IN InsiemeMinuscole THEN write(Ch) writeln
PROCEDURE MostraInformazioni(VAR InsiemeMinuscole: MinuSetType; VAR InsiemeMaiuscole: MaiuSetType; {} VAR Ch: char; BEGIN write(‘ Lettere maiuscole presenti: ‘); FOR Ch ‘A’ TO ‘Z’ DO IF Ch IN InsiemeMaiuscole THEN write(Ch); writeln; write(‘ Lettere minuscole assenti: ‘); FOR Ch ‘a’ TO ‘z’ DO IF Ch IN InsiemeMinuscole THEN write(Ch); writeln END;
{BODY} BEGIN Inizializza(InsiemeMinuscole, InsiemeMaiuscole, Teresa); RegistraInformazioni(InsiemeMinuscole, InsiemeMaiuscole, Teresa); MostraInformazioni(InsiemeMinuscole, InsiemeMaiuscole); END.
SET VARIABLE [ ] INSIEME VUOTO SET 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 parola memorizzarla in un file memorizzarla in un array
Pseudo codice GetAWord(Word, ChSet, SomeFile) IF VocaliMancanti(Vocali, ChSet) THEN Process(Word) 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
Prima di lanciare GetAWord e VocaliMancanti supponiamo di avere eseguito il seguente codice: TYPE ChSet Type= SET OF char; VAR Wordset, 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; BEGIN VocaliMancanti:=(Vocali*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. FUNCTION NoConsonant(Vocali,WordSet:ChSetType):boolean; VAR ConSet:ChSetType; BEGIN ConSet:=[‘a’..’z’;’A’..’Z’]- Vocali; NoConsonant :=(ConSet*WordSet=[]) END;
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 e o 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) )
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; BEGIN Valido:=(TotPresenti>TotaleMembri DIV 2) AND ( ([P,S]< Presenti) OR ([P,T]< Presenti) OR ([VP,S,T]< Presenti) ) END;
StringADT Chars Len UNIT STRINGHE Si vuole creare una UNIT che operi sulle stringhe e che sia il più possibile indipendente dal dialetto PASCAL adoperato. Adoperiamo una struttura a RECORD per il data Type Array
UNIT Stringa; INTERFACE CONST MaxLength=80; TYPE SysString=STRING[MaxLength]; StringADT=RECORD Chars:ARRAY[1.. MaxLength] OF char; Len:0.. MaxLength END;
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.
IMPLEMENTATION PROCEDURE NullString(VAR OutStr:StringADT); BEGIN END; ritorna una la stringa nulla ‘’. Primitive constructor PROCEDURE ConvertSysString(StrValue:SysString; VAR OutStr:StringADT); VAR Position:1..MaxLength; BEGIN WITH OutStr DO BEGIN Len:=length(StrValue); FOR Position:=1 TO Len DO Chars[Position]:=StrValue[Position] END END; converte una stringa rappresentata in un qualche sistema nella stringa equivalente di type StringADT
Primitive constructor PROCEDURE 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
Primitive constructor PROCEDURE ReadlnString (Sentinel:char; VAR OutStr:StringADT;VAR InFile:text); VAR Ch:char; BEGIN WITH 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
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.
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.Len END; ritorna la lunghezza della stringa Primitive selector
Non-primitive selector - ritorna il valore che non è relativo ad uno dei componenti della variabile astratta ma ciò nonostante è utile al client.
PROCEDURE WriteString (InStr:StringADT; VAR OutFile:text); VAR Position:integer; BEGIN WITH InStr DO FOR Position:=1 TO Len DO write(OutFile,Chars[Position]) END; scrive una stringa in un file Non-primitive selector 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
FUNCTION StartPos((Substr, SearchStr:StringADT):integer; VAR SLen,Pos: integer; Found: Boolean; CandStr: StringADT; BEGIN SLen:=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 ELSE Pos:=Pos+1 END; IF Found THEN StratPos:=Pos ELSE StratPos:=0 END; Selector operations Ritorna la posizione di partenza di una data sub-stringa nell’ambito di una preassegnata stringa
PREDICATE - è una funzione booleana che ritorna informazioni sul valore o lo stato di una variabile astratta.
FUNCTION StrEqual(Instr1, Instr2:StringADT):boolean; VAR Pos, TotalChars:integer; StillEqual:boolean; BEGIN IF Instr1.Len<>Instr2.Len THEN StillEqual:= FALSE ELSE 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:= FALSE ELSE Pos:=Pos+1; StrEqual:=StillEqual END; ritorna TRUE se due stringhe hanno gli stessi caratteri e la stessa lunghezza Predicate operations
Predicate operations FUNCTION StrLessThan(InStr1, InStr2:StringADT):boolean BEGIN ………………. END; ritorna TRUE se la prima stringa precede alfabeticamente la seconda