Laboratorio di programmazione Corso A - A.A. 2000/2001 Docente: A. Lanza Il tipo boolean Il tipo real Tipi definiti dall utente: il tipo enumerato Editazione a cura di A. Cappelli, N. Alba, R. De Palo 1
TIPI PREDEFINITI: Tipo BOOLEAN: Operatori relazionali Tutti gli operatori relazionali danno un valore booleano quando vengono usati con espressioni (compatibili) di ogni tipo in cui sia definito un ordine. = uguaglianza <> disuguaglianza < minore di > maggiore di <= minore di o uguale >= maggiore di o uguale IN appartenenza ad un insieme Es. 2<3 è true 3<-5 è false A < Z true FUNZIONE BOOLEANA STANDARD odd Tipo dell argomento Tipo della funzione odd ritorna true integer boolean se l argomento è dispari, false altrimenti eof(f) eoln(f) end_of_file su f end_of_line su f 2
TIPI PREDEFINITI Tipo CHAR: Un valore di tipo char è un elemento dell insieme finito ed ordinato del set di caratteri dipendente dall implementazione (*). Un carattere racchiuso tra apici denota una costante di tipo char. Ad ogni carattere corrisponde un distinto numero ordinale che appartiene ad un sottoinsieme dei numeri naturali. Il tipo char contiene un carattere di spazio (invisibile) b Es. * A a b blank 3 (*) alcuni caratteri possono non avere una forma stampabile Sicuramente ci sono le cifre, le lettere e i simboli di punteggiatura, oltre a b ASCII = American Standard Code for Information Interchange Se assumiamo il sistema di codifica ASCII, si hanno 128 caratteri. Ogni carattere è codificato da un numero compreso fra 0 e 127 detto il suo codice ASCII 3
FUNZIONI PREDEFINITE PER IL TIPO CHAR: Ordinali Sia i un espressione integer e c un espressione ordinale ord(c) (tipo integer) fornisce il numero ordinale (codice ASCII) di c (n 10 d ordine nella tavola di codifica) Ord: char 0..127 X<=Y SSE ord(x)<=ord(y) X<Y SSE ord(x)<ord(y) X>=Y SSE ord(x)>=ord(y) X>Y SSE ord(x)>ord(y) X<>Y SSE ord(x)<>ord(y) a b ord(a) R ord(b) N.B. chr(ord(c))= c ord(chr(x))= x x integre Sia il set di caratteri che il loro ordinamento dipendono dall implementazione. chr(i) fornisce il carattere avente numero ordinale (codice (tipo char) ASCII) i. (dà errore se non esiste il valore di tipo char corrispondente chr(300) ) chr è usata per indicare i caratteri non denotati da costanti Es: chr(13) è il carriage return succ(c) successore di c (dà errore se non esiste) ord (succ(x)) = ord(x)+1 4
pred(c) predecessore di c (dà errore se non esiste) ord (pred(x)) = ord(x) 1 Lo standard Pascal prevede per i valori (*) ordinali del tipo char, le seguenti relazioni: ø < 1 A < B a < b 1 < 2 B < C b < c............ 8 < 9 W < Z w < z i valori ordinali sono consecutivi non necessariamente contigue A dati di tipo char si possono applicare i 6 operatori relazionali : = <> < <= >= >. Il risultato di una relazione avente operandi di tipo char è determinata applicando la relazione matematica ai numeri ordinali corrispondenti agli operandi. Così per qualunque operatore relazionale R e operandi c1 e c2 di tipo char: c1 R c2 è equivalente a: ord(c1) R ord(c2) c1 >= c2 A < C ord( A ) < ord( C ) (*) rispettate oltre che da ASCII anche da EBCDIC (Extended Binary Coded Decimal Information Code) 5
STAMPA DEL SET DI CARATTERI DELL ELABORATORE CHE SI STA UTILIZZANDO PROGRAM CharacterSet ( output); VAR i: 0..127 ; BEGIN Writeln( :20, ASCII Character Set from Code 32 ); FOR i: = 32 to 127 do BEGIN write ( i: 5, chr(i):2); IF I mod 10 = 0 THEN writeln; END; END. I primi 32 non sono visualizzabili: caratteri speciali e di controllo Linefeed, Carriage Return, Bell, etc. chr (32) è il blank 128 7 bit 256 8bit dopo il codice 127 ci sono caratteri/lettere accentate, con dieresi, cediglie, simboli matematici :,,, (non standardizzato) 6
ESEMPIO: 2 char 2 integer - Per convertire dalla rappresentazione interna di caratteri numerici in sequenze di cifre e viceversa, si usano: ord(c) - ord(0) è la posizione di c (variabile di tipo char) tra le cifre. Chr(i + ord(0)) è l i-esima cifra (i è di tipo intero) ES: 7 7 integer Char - Conversione di una lettera da maiuscola in minuscola IF ch IN [ A.. Z ] THEN Minus:= chr(ord(ch) ord( A ) + ord( a )); Questa formula è generale poiché non richiede la conoscenza né dei valori ordinali di A e di a, né del fatto che le lettere minuscole seguono quelle maiuscole 7
TIPI PREDEFINITI TIPO REALE (real) Un valore di tipo real è un elemento del sottoinsieme (finito e limitato) dei numeri reali definito dall implementazione. Un valore reale in Pascal è rappresentato come una sequenza di cifre contenente un punto decimale (in tal caso il punto decimale deve essere preceduto e seguito da almeno una cifra) oppure in notazione scientifica. Sono applicabili gli operatori aritmetici e gli operatori relazionali. Sono definite numerose funzioni standard. ES: 3.1415-0.015-2.345E2 (valore di 234.5) -15E-04 (valore di 0.0015) N.B. Questo tipo primitivo non è ordinale le funzioni prec, succ e ord non sono applicabili ai real. Sebbene i reali sono inclusi nei tipi scalari, non possono essere usati nello stesso contesto degli altri tipi scalari. Valori di tipo reale non possono essere usati come indici di vettori, né nel controllo di istruzioni di tipo FOR, né per definire il tipo base di un SET, né per definire tipi SUBRANGE. I valori reali che possono essere gestiti da un elaboratore sono solo un approssimazione dei loro corrispondenti matematici. 8
REALI Grandezze numeriche per calcoli scientifici valori più grandi/più piccoli dell intervallo degli INTEGER. Costante reale Notazione decimale 0.000001 Notazione scientifica 0.1E-5 (E rappresenta la base 10) INTERVALLO DI DEFINIZIONE Se 32 bit esponente Segno segno mantissa mantissa esponente SINGOLA PRECISIONE Esponente: compreso fra 38 e +38 Numero di cifre di precisione: 6 Due valori che differiscono per la settima cifra decimale non sono distinguibili una volta memorizzati. 9
OPERATORI ARITMETICI + addizione - sottrazione * moltiplicazione / divisione (tra numeri reali e produce un risultato reale) integer real Tipo del risultato degli operatori integer integer real + - e * (è intero se ambedue gli gli operandi sono interi, altrimenti real real real è real) integer real Tipo del risultato dell operatore / integer real real (è sempre real) real real real I simboli + e sono usati anche per indicare gli operatori unari di identità e di inversione di segno che danno risultati dello stesso tipo dell operando a cui sono applicati. N.B. Se il divisore è 0 sia per DIV che per / viene segnalato errore. Osservazione: Il Pascal non prevede un operatore predefinito per l elevamento a potenza: Y yln(x) x = e = exp(y*ln(x)) 10
ESEMPIO ln(a) e = a b ln a =b ln a Se y è un intero, si può eseguire l elevamento a potenza con un loop: x*x*x* *x y volte LETTURA E SCRITTURA DI VALORI REAL Read e readln consentono di leggere valori reali espressi in una qualsiasi delle 2 forme permesse. Ogni valore deve essere separato dal successivo tramite almeno un b o linea vuota. Write e writeln se non specificata una formattazione tramite ampiezza di campo, il valore è stampato in notazione esponenziale, altrimenti il primo valore specifica l ampiezza per il numero completo, il secondo valore specifica le posizioni decimali. ES: writeln(pi:5:3) 3.142 writeln(pi:7) 3.142E0 (notazione floating) writeln(10/3*3).999e1 writeln(10/3*3:8:1) 10.0 (produce per arrotondamento in fase di stampa) 11
Sintassi della parte dichiarativa di tipo TYPE TYPE identification tipo ; 12
TIPI DEFINITI DALL UTENTE In Pascal si ha la possibilità di definire nuovi tipi (elementari e non) e di assegnare esplicitamente dei nomi ai nuovi tipi (per appositi costrutti linguistici Algol68, Pascal, Ada) Si possono definire nuovi tipi ordinali in due modi: - per enumerazione di tutti i valori possibili - specificando un sotto-intervallo di valori di un tipo ordinale esistente TIPO ORDINALE In Pascal un tipo ordinale è un insieme totalmente ordinato posto in corrispondenza con un intervallo del tipo integer dalla funzione iniettiva ord. Ogni elemento di un tipo ORDINALE ha un unico predecessore ed un unico successore. Sono tipi ordinali i seguenti: integer char sono pre-definiti boolean ENUMERATI INTERVALLO ord : TO integer Tipo Ordinale succ: TO TO succ(x) succ ( A ) = B 13
ESEMPIO: < < < TYPE semi = ( cuori, quadri, fiori, picche ) VAR carta : semi ord ( cuori ) vale 0 ord ( quadri ) vale 1 ord ( fiori ) vale 2 ord ( picche ) vale 3 succ ( quadri ) è fiori pred ( picche ) è fiori danno errore succ ( picche ) pred ( cuori ) non sono definiti 14
TIPO ENUMERATO: Un tipo enumerato è definito semplicemente elencando gli identificatori mediante i quali devono essere denotati i valori del tipo. Gli identificatori sono racchiusi in parentesi tonde e separati da virgole. Esempi. Maggiore leggibilità dei programmi. 1. I semi delle carte da gioco francesi potrebbero essere definiti come : ( cuori, quadri, fiori, picche ). 2. I giorni della settimana potrebbero essere definiti come: ( Lun, Mart, Merc, Giov, Ven, Sab, Dom ). Nota: l ordine in cui sono elencati i valori del pito definisce anche il loro ordinamento. Esempio: Ord ( cuori ) < ord ( picche ) Cuori < picche da true Mart >= Ven da false TYPE t = ( w0, w1,,wn ) Per ogni tipo t deve valere 1. wi wj per i j relazione di ordinamento 2. wi < wj per i < j tra le costanti 3. solo wi per i= 0,1,,n appartiene al tipo t. wi sono identificatori sono tutte e sole le costanti del tipo t 15
OPERATORI E FUNZIONI DEL TIPO ENUMERATO: Ord : t integer ha immagine 0 n ed è così definita Ord ( wi ) = i per i 0 n succ pred operazioni funzionali per il confronto assegnamento Nessun identificatore wi può appartenere a più di un tipo! ESEMPIO: TYPE giorni = ( lunedi, martedi, mercoledi,, domenica ) FUNCTION giorno_dopo ( g : giorni ) : giorni ; BEGIN IF END g = domenica THEN giorno_dopo := lunedi ELSE giorno_dopo := succ ( g) 16
LETTURA E SCRITTURA CON IL TIPO ENUMERATO: Operazioni di lettura e di scrittura di valori appartenenti al tipo enumerato (è un tipo interno ) indirettamente: ES: VAR semaforo: (verde, giallo,rosso); LETTURA (per codifica) fornendo da INPUT valori interi del tipo: 1, verde; 2, giallo; 3, rosso. Read(num); CASE num OF END 1: semaforo=verde; 2: semaforo=giallo; 3: semaforo=rosso SCRITTURA Sul file OUTPUT dobbiamo far corrispondere le tre stringhe verde, giallo e rosso. CASE semaforo OF END verde: write( verde ); giallo: write( giallo ); Rosso: write( rosso ) 17