prof
.Cleto Azzani
I
PSI A Moretto Brescia http://www.ipsiamoretto.it
(Novembre 1995) azzani@ipsiamoretto.it
Indice
Introduzione
31- Generalitàsuilinguaggi di
programmazione
31.1- Linguaggi Interpretati 5
1.2-Linguaggi Compilati 5
2- Tipidivariabilipreviste
dal Turbo Pascal
63- TipiSemplici 6
3.1- TIPI
ORDINALI 6
Tipi InteriPredefiniti 7
3.2- Tipi
ENUMERATIVI
8Esempio 1 8
Esempio2 8
3.3- Tipi
SUBRANGE
93.4-
Le
variabiliINTEGER
93.5- Interi di tipo
LONGINT
93.6-Divisione fraoperandiInteri 9
3.7-Situazionedi 'Overflow' 10
3.8-
Le
variabili di tipoWORD
103.9-
Le
variabili di tipoCHAR
113.10-
LE VARIABILI REALI
123.11- LimitinellaPrecisione 12
3.12- Tipi di datiinmodalità 8087-80287-80387. 12
3.13-OutputdidatisuVideo 13
3.14-Formattazionedellequantità realiin
modo
"fixed-point" 133.15-Outputdidatisustampante 14
4-
Dati
di tipoStrutturato
144.1-
ARRAY
(vettorialo
più dimensioni) 14NOTE
154.2-
Le
variabili di tipoSTRING 16
4.3-Funzionicheoperanosuvariabili
STRING
164.4- Confrontofra Stringhedi Caratteri
17
4.5-
RECORD 17
L'istruzione
WITH
184.6-
Le
variabili di tipoSET
18Definizionedeglielementiditipo"Set" 19
Istruzione in 19
5-
Le Strutture
Decisionali 215.1- StrutturaDecisionale
IF
..THEN
..ELSE
215.2-
La
StrutturaCASE
..OF
236-
LE STRUTTURE ITERATIVE
246.1-
La
Struttura IterativaFOR
..DO
246.2-
La
Struttura IterativaWHILE
..DO
246.3-
La
Struttura IterativaREPEAT
..UNTIL
257-
FUNZIONI E PROCEDURE
267.2- ChiamateaProcedureeFunzioni
27
7.3-RitornodaunaProcedura o da una Funzione
27
VariabiliLocali 27
VariabiliGlobali 27
TurboPascal
VariabiliFormali 27
7.4-Ricorsione
28
7.5-PassaggiodiParametri
29
7-6-AccessodirettoalleportediI/O
30
8-
GESTIONE DEI FILES O ARCHIVI SU DISCO
318.1-
FILES AD ACCESSO SEQUENZIALE
318.2-
FILES AD ACCESSO RANDOM
328.3-
PROCED URE DI SUPPORTO ALL
'I/OSU DISCO
33ASSIGN
33RESET
33REWRITE
33CLOSE
34APPEND
34FILESIZE 34
SEEK
34EOF
34ESEMPIO
1 35EsempidigestionediI/Oconfilestipizzati(adaccessoRandom) 37
ESEMPIO
2 379 Librerie:
System
unit eUser Unit 40
9-
STRUTTURA COMPLETA DI UN PROGRAMMA PASCAL 40
9.1-
PROGRAM HEADING
Intestazione delProgramma 40
9.2-
DATA SECTION
Sezionedei dati40
9.3-
CODE SECTION
Sezione del codice 419.4-1
Commenti
4110-
CODICE ASCII (American Standard Code for Information Interchange)
41Caratteridicontrollo delcodice
ASCII
42Significato dei caratteri dicontrollo delcodice
ASCII
43Introduzione
Queste
brevi note vogliono essere solamenteuna
sintesi delle nozioni essenziali di cuideve
disporreun programmatore che
si appresta a utilizzareTurbo
Pascal della Borland.Non
intendono in alcunmodo
sostituirsiai manuali:
Turbo Pascal
User'sGuide Turbo Pascal Reference Guide
ai quali si rinvia per gli approfondimenti che si
rendono
necessarimano
amano
ilprogrammatore prende
coscienza delle potenzialità del pacchetto software e diventa diconseguenza
più esigente. L'articolazione di queste noteèlaseguente:• Generalitàsuilinguaggidi
Programmazione
• Tipi di variabilipreviste
da Turbo Pascal
• Tipisemplici Ordinali
Numerici
Reali• Tipi strutturatiArray, String, Record, Set
• StruttureIF..
THEN.
.ELSE
eCASE.
.OF
• Strutture
FOR..DO, WHILE..DO
eREPEAT. UNTIL
•
Funzioni
eProcedure
• Filessu disco
• Struttura di
un Programma Pascal
Si
presuppone che
l'utente abbiauna
certa familiaritàcon
iconcetti base del sistema operativoMS/DOS
in particolarecon
i concetti di "file", "directory", "sub-directory"ed una
certa familiaritàcon
icomandi DOS
fondamentali.
Il riferimento all'ambiente
Turbo
Pascal dellaBorland
è d'obbligo in considerazione del fattoche
esso rappresenta il "linguaggio ufficiale" inambiente MS-DOS
adottato dal Ministero della Pubblica Istruzione perilPNI
(PianoNazionale perl'introduzionedell'InformaticanegliIstituti Superiori).Queste
note tratte inbuona
parteda Turbo
Pascal Tutor 4.0sono
state redatte per fornireun
riferimento scritto agli alunni del4
Aanno
di corso del biennio post-qualificaTIEE che
si apprestano ad affrontare la TeoriadellaProgrammazione
utilizzandocome
strumentodilavoroilpacchettoTurbo
PascaldellaBorland.Ringrazio tutti coloro che volessero cortesemente segnalarmi inesattezze
o
erroricommessi
nella stesura di questi appunti.1-
Generalità sui linguaggi di programmazione
La programmazione
degli elaboratoripuò
essere attuatafacendo uso
del linguaggiomacchina oppure
di linguaggidiprogrammazione
dettiadalto livello.Il linguaggio
macchina
èun
linguaggio specifico diuna
determinataCPU
e quindipresuppone una buona conoscenza
del set di istruzioni delmodo
di indirizzamento, delle modalità di esecuzione delle istruzionida
parte dellaCPU
e dell'architetturadelsistemautilizzato.I linguaggi ad alto livello
sono completamente
indipendenti dal tipo diCPU
su cui operano,sono molto
più aderentialmodo
diesprimersidiun
essereumano
enon
richiedonouna conoscenza
specifica dell'architettura del sistema sucuivieneredattoun
determinatoprogramma.
Tra
ilinguaggi adalto livelloricordiamo :-
FORTRAN (FORmulae TRANslator)
adattoperlarisoluzionediproblemi
ditipo scientifico.TurboPascal
-
COBOL (COmmon
Business OrientedLanguage)
adatto per la risoluzione di problematiche di tipo commerciale.-
PL/1
adattoper applicazionisiadi carattere scientificochecommerciale
(natoincasaIBM) primo esempio
dilinguaggiostrutturato
(MPL
PL-Z).-
BASIC
(Beginner'sAll-purposeSymbolic
InstructionCode)
linguaggio adattoperun primo
impattocon
la realtàdel calcolatore: risolve siaproblemi
ditiposcientificoche
problemidi caratterecommerciale.-PASCAL
linguaggioadattoa risolvere siaproblemi
ditipo scientificoche problemi
di altrogenere.È un
lin-guaggio
strutturatoperdefinizione.-C
linguaggio derivato dalPASCAL ed
utilizzato per la scrittura di sistemi operativio
di altri strumenti software.Il
programma
scritto dalprogrammatore ed
introdotto nellamemoria
dell'elaboratore viene dettoprogramma
SORGENTE (SOURCE-PROGRAM);
quello materialmente eseguito dallaCPU
e perciò codificato in linguaggiomacchina
vienedenominato programma OGGETTO (OBJECT-PROGRAM).
Sarà perciò necessariodisporrediun
traduttoreche
partendoda
istruzioniredatteinlinguaggio ad alto livelloletrasformi inequivalentiistruzioni stese inlinguaggiomacchina.Ogni
linguaggiodispone quindidiun
traduttoreinlinguaggiomacchina.Un
generico linguaggio ad alto livellopuò
essere strutturato per funzionare inmodo INTERPRETE o
inmodo COMPILATORE.
Nel modo INTERPRETE
ilprogramma
sorgentesitrovainmemoria RAM
e viene introdotto attraversouna
tastiera
che
di solitooperain codiceASCII (American
StandardCode
forInformationInterchange);quando
viene attivata la esecuzione delprogramma
l'interprete per ciascuna riga diprogramma
effettua le seguenti operazioni:1)-Controllo sintattico sullarigadi
programma.
2)-
Traduzione
dellarigadiprogramma
inlinguaggiomacchina.
3)-
Esecuzione
di quella rigadiprogramma.
La
fase 1) di controllo sintatticopuò
dare origine a segnalazioni di erroreche appaiono
su terminale videocon
indicazione dellariga diprogramma ove
si è verificato l'errore e del tipo di errore riscontrato (codifica numerica)SYNTAX-ERROR.
Per correggerel'erroreè necessarioriscriverelariga diprogramma
errata.La
fase 2)ditraduzioneinlinguaggiomacchina,può
dareoriginea segnalazionidierrore di tipo
COMPILATION-ERROR
per correggere lequaliènecessariosempre
riscrivereuna o
più righeerratediprogramma.
La
fase 3) di esecuzione delsegmento
diprogramma
oggetto anch'essapuò
dare origine a segnalazioni di errore di tipoRUN-TIME-ERROR
per correggere le quali bisogna analizzarecon
attenzione qual'è la condizionecheha
provocatol'errore.Nel modo COMPILATORE
ilprogramma
sorgente si trovadi solito su disco sottoforma
di "file" (archivio di informazioni su disco); la preparazione del sorgente su disco avviene attraverso l'uso diun
apposito"strumento software"
denominato EDITORE.
Il compilatore fa
una
analisi sintattica di tutto ilprogramma
sorgentefornendo
eventuali segnalazioni diesito positivo, viene effettuata latraduzione in linguaggio
macchina
delprogramma
sorgente, traduzioneche
vieneregistratasu disco sottoforma
di "file".Il
programma
oggetto così prodotto dal compilatore in generenon
è ancora eseguibile inquanto
privodelle necessarie informazioni base per eseguire operazionimatematiche
piùo meno complesse o
operazioni di Input Output. Si rende necessaria un'ultima operazionedenominata
operazione diLINK
delle librerieche
viene attuata permezzo
diun
altro "strumento software"chiamato LINKING-LOADER.
Ilprogramma
oggetto prodotto dal compilatore, "linkato"con
le routine di libreria è quindi ingrado
di funzionareautonomamente;
anch'esso viene salvato su disco e costituisce il prodotto finale e conclusivo della compilazione.1.1-
Linguaggi Interpretati
L'impiego
di linguaggidi tipo interpretepresentapregi edifetti chediseguitovengono
elencati:1. Il
programma
viene modificato inmodo molto
semplice (riscrivendo la riga diprogramma
errata) e inmodo
altrettantosemplice è possibile verificarelavaliditàdellacorrezione.2. Il
programma
sorgente èsempre
presente inRAM
quindi è di solito "listabile" su videoo
stampante(manca
lasegretezzadelcodiceche spessoèun
requisitofondamentale).3.
La
velocità di esecuzione delprogramma
è piuttosto bassa inquanto
ogni volta che viene impartito ilcomando
di esecuzione(RUN
perilBASIC
ePASCAL) vengono sempre
ecomunque
ripetute le fasi di controllo sintatticoe di traduzionein linguaggiomacchina
delprogramma
sorgente inquanto apriorinon
è possibilestabilire selaversionedi
programma
presenteinmemoria
è quella correttaoppure
no.4. L'area di
memoria
a disposizione è piuttostomodesta
in quanto per consentire l'esecuzione diun programma
interpretatodeve
essere presente inmemoria
oltre alprogramma
sorgente, l'interprete (linguaggio-interprete)completo
corredatodiRUN-TIME-PACKAGE
(biblioteca completa).1.2-
Linguaggi Compilati
L'impiegodi
un
linguaggiocompilatore presentapregi e difettichediseguitovengono
elencati:1. Il
programma
sorgentenon può
essere modificatocon
rapidità inquanto
è necessario ricorrereall'EDITORE
perricaricare ilprogramma
inmemoria,
correggere lao
lerighe erratee salvare sudisco ilprogramma
sorgente corretto.La
verifica richiede chevenga
ripetuta la procedura di compilazione alcompleto.
2. Il
programma che
viene eseguitodallaCPU
è redatto inlinguaggiomacchina
equindinon
è "listabile" su videoo
stampante, ilcodice sorgenterimane
perciòsegreto (ciòconsente aiprogettistisoftware dilegarea sé ilcliente cheanche
peruna
piccola modificadovrà
rivolgersi a chiha
prodotto ilprogramma
e quindidovrà
pagare il servizio aggiuntivo richiesto; questa èuno
dei motivi del grande successo di case qualiIBM, HONEYWELL, UNIVAC, MICROSOFT, BORLAND
ecc.).3.
La
velocità di esecuzione delprogramma
èpiù elevata rispetto a quella diun programma
interpretato (ilcontrollo sintattico del
programma
e la traduzioneil linguaggiomacchina
viene effettuatouna
sola volta nelmomento
dellacompilazione).4. L'areadi
memoria
adisposizioneè lamassima
possibilein quanto peril suofunzionamento
ilprogramma
oggettonon ha
bisognoné
del compilatorené
tantomeno
delprogramma
sorgente che in casi diprogrammi
diuna
certalunghezza
addiritturanon
potrebbenemmeno
stare nell'interaRAM
delcalcolatore.
Si conclude perciòche,
ove un
determinato linguaggio abbiala possibilitàdi configurarsi neidue modi
sopra descritti, saràopportuno
operare inambiente
Interprete nella fase di stesura, di correzione e di verifica diTurboPascal
funzionalità (fase di
Debugging)
delprogramma
stesso (sfruttando quindi tutti i vantaggi dell'ambiente Interprete) poi sarà quindiopportuno
trasferirsi inambiente Compilatore
per procedere alla traduzione in linguaggiomacchina
delprogramma
predisposto(con tuttii vantaggi: rapiditàdiesecuzionee segretezza del codice).Va comunque
ribadito che,programmi
dimodeste
dimensioniconsentono
di operare indifferentemente inmodo
Interprete e inmodo Compilatore mentre programmi
di cospicue dimensioni obbligano ad operare inmodo
Compilatore.Gli ambienti
TURBO-PASCAL, TURBO-C, TURBO-BASIC
della Borland;QUICK-C, QUICK-BASIC
dellaMicrosoft
sono
ambientiintegratiincui sipuò
operaresiainmodo
Interpretecheinmodo
Compilatore.In
ambiente TURBO-PASCAL
i "files-sorgenti" redatti in linguaggioPASCAL hanno
estensionePAS
per distinguerli dai "files-eseguibili" contenentiilcodicemacchina 8088-8086 che hanno
estensioneEXE
.Il
FORTRAN
è natoed ha
conservatola suainiziale struttura di linguaggio Compilatore; ilBASIC
invece è natocome
linguaggio Interprete e solo in tempi relativamente recentisono
stati sviluppati CompilatoriBASIC.
2- Tipi di variabili previste dal Turbo Pascal
Turbo
Pascalprevede
cinquetipifondamentalidi variabili su cuioperare:1. TipiSemplici
2. Tipi Strutturati 3. Tipo Stringa
4. Tipo
Puntatore
5. TipoIdentificatore
Inquestarassegnaintroduttivaverrannopresi in
esame
solamenteiTipi Semplici , iTipiStrutturatie ilTipo
Stringa.3- Tipi Semplici
Ai
TipiSempliciappartengono
iTipi Ordinali eilTipo
Reale.3.1-
TIPI ORDINALI
Tutti i possibili valori di
un
dato tipo ordinale costituisconoun
insieme ordinato nel senso che a ogni ele-mento
è possibile associareun
valore intero detto ordinalitàdiquell'elemento.Turbo
Pascalprevede
7tipiordinali predefiniti(dicui 5numerici) :1. Shortlnt
2. Integer
3.
Longlnt
4. Byte
5.
Word
6.
Boolean(
False0;True
1)7.
Char
e
2
classiditipiordinalidefinibilida
partedell'utente: EnumerativieSubrange
Tipi
InteriPredefiniti
Tipi
IntegerRange Cifre Sign. Struttura Bytes Modo SHORTINT -128
..+127
3Signed
8bit 1Normale
BYTE
0 ..255
3Unsigned
8 bit 1Normale
INTEGER -32768
..+32767
5Signed 16
bit 2Normale
WORD
0 ..65535
5Unsigned 16
bit 2Normale
LONGINT
-2147483648.
.+2147483647
10Signed 32
bit4 Normale
COMP
-9.2E18..9.2E18 19-20Signed 64
bit 88087
Le
funzionistandard:Ord, Pred,
Succ,possono
essere utilizzatecon
tutti i tipi ordinali.La
funzioneOrd
restituisce l'ordinalità diun
determinato elemento.La
funzionePred
restituisce il predecessore diuna
determinata variabile ordinale.Provoca un
errore se applicataal
primo
valorediun
tipoordinale.La
funzioneSucc
restituisce il successore diuna
determinata variabile ordinale.Provoca un
errore se applicata all'ultimovalorediun
tipo ordinale.Le
variabiliByte occupano come
le variabiliChar
ottobit (unbyte) inmemoria;
sulle variabili bytepossono
essere effettuate operazioniaritmetichenon
consentite sullevariabiliChar
.Le
variabilidel tipoordinalebooleano possono assumere
ivalori:True
(Vero, 1 ) eFalse
(Falso,0
)Boolean
èun
tipoenumerativo
predefinitonelseguentemodo:
type
boolean =
(False, True);0
1False
< True Ord(
False)= 0 Ord(True) =
1Succ(False)- True Pred(True) =
FalseIn
una
genericaespressione, glioperatori relazionali =, <>, >, <, >=, <=, e la funzioneIN danno
risultati di tipoboolean.TurboPascal
3.2-
Tipi ENUMERATIVI
Un
tipoenumerativo
viene dichiarato attraverso l'elencazione dei valoripossibili chelavariabile di queltipopuò
assumere; gli identificatori presenti nella definizione di tipodivengono
costanti di tipo enumerativo; ilprimo
valoreelencatoha
ordinalità 0, ilsecondo ha
ordinalità 1 e così via. I tipi enumerativi costituisconouna
sottoclassedeitipiordinali.Esempio
1type
Carte
=
(Quadri, Fiori, Cuori, Picche);Cuori
èuna
costante di tipoCarte(tipoenumerativo).La
funzione standardOrd
elaboral'ordinalità diuna
costanteo
variabileditipoenumerativo
percuisiavrà:Ord(Quadri)-0,
Ord(Fiori)-!, ecc.Esempio 2 Type
Giorno- (Domenica,Lunedi,Martedi,Mercoledi,Giovedi,Venerdi,Sabato);
precipitazione
=
(pioggia,neve, nevischio,nessuna);colore
-
(nero,bianco,bleu,verde,rosso,giallo);Definito
un
"tipo-enumerativo",è possibile stendereleseguentidichiarazionidivariabile:Var
Oggi
:giorno;Weather:
precipitazione;Paint: colore;
Per assegnare
un
valoreauna
variabileditipoenumerativo, sidovrà
scrivere a destra dell'operatore:= uno
degli identificatori di tipo,
come
indicato negliesempi
seguenti :Oggi
:—Mercoledì
;Weather
:=
pioggia;Paint :- verde;
I tipi enumerativi
sono
strutturalmente ordinati; fra essi c'èun primo elemento
(lowest),un
ultimoelemento
(highest)oltrecheuna
seriedielementicollocati frailprimo
el'ultimo.La
funzione standardOrd
trasformauna
variabile di tipoenumerativo
inun
valore intero associato a tale variabile.Al primo
valorepresente nellalistaenumerativa
viene associato il valore0,mentre
all'ultimoviene associatoun
valore ordinale pari alnumero
totale di elementi presenti nella dichiarazione di tipomeno
1.Così
ad esempio, peril tipoenumerativo
giornosiavràOrd(Lunedi) =
1;Ord(Domenica) =
7N.B.
Sitenga
presenteche non
è possibile effettuareuna operazione
Writeusando una
delletre variabili di tipoenumerativo
Oggi,Weather, Paint
introdotte; èpermesso unicamente
difare
il Write del valore ordinalead
esse associato (odelprecedente
o delsuccessivo).Write(Oggi,Paint);
ISTRUZIONE ERRATA
Write(Ord(Oggi), Succ(Paint));
ISTR UZIONE CORRETTA
3.3-
Tipi SUBRANGE
Un
tipo subrange è rappresentatoda un
insieme di valori provenientida un
tipo ordinaledenominato
"tipo host".type
Cifre
=
(0..9);La
dichiarazione di tipo subrange specifica ilprimo
e l'ultimoelemento
dell'insieme definito.Le
costanti presenti nella elencazionedevono
appartenere allo stesso tipo ordinale, laprima
costantedeve
avere valore ordinale inferioreo
ugualeallaseconda.La
direttiva di compilazione$R
effettuaun
controllo sui tipi subrange definiti nelprogramma
al fine di segnalareeventuali erroridisconfinamento
dai valoridefiniti.3.4-
Le
variabiliINTEGER
Gli interi previsti dal Pascal
sono numeri
il cui valorenon ha
parte frazionaria.Ad
esempio, 5, 0, e-2209 sono
interi,mentre
13.5 e 12.72non
losono
inquanto
entrambisono
corredati dipartedecimale
(partedopo
la virgola
o punto
decimale). Gli Interi di tipo Integersono
definiti fra-32768
e+32767 (Massimo
valore32767
eminimo
valore-32768).L'uso di variabili intere anziché variabili reali, là
dove
è consentito,permette
di scrivereprogrammi più
efficienti (più veloci infase di esecuzione e
meno
voluminosicome area
dimemoria
occupata)poiché
laCPU
(famiglia8086) opera molto
pivelocemente
sulle variabili intere inquanto
esse richiedono solo2
bytes dimemoria per
essere memorizzate.3.5- Interi di
tipo LONGINT
Gli Interi di tipo
Longlnt
(long integer)sono numeri
dotati diun campo
di definizionemolto
piampio
degli Integer : essisono compresi
fraivalorilimite -2.147.483.648e 2.147.483.647 (circa+/-2
miliardi).GliInteri di tipo
Longlnt vengono
impiegati inquelle situazionidove
richiesta velocità dielaborazioneed un campo
di valori piampio
di quello consentito dagli Interi di tipo Integer.Le
variabili intere di tipoLonglnt
richiedono4
bytesper
esserememorizzate.3.6-
Divisione fra operandi
InteriPereffettuareladivisionefra
due
interi, ènecessario utilizzarel'operatoreDIV.
Si
rammenta che
/,rappresental'operatore didivisioneda
usarecon
lequantitàreali.Percalcolareilresto delladivisionefra
due
valoriinteriusarel'operatoreMOD.
Esempi
:Q
:—A DIV B
; {Q
è ilquozientedelladivisioneA
divisoB
}R
:-A MOD B
; {R
è ilrestodelladivisioneA
divisoB
}TurboPascal
3.7-
Situazione
di'Overflow'
Quando vengono
utilizzate variabili intere, bisogna prestare attenzione inquanto
facileche
si verifichino condizionidi 'overflow'.Questo
accadequando
ilrisultatodiuna
elaborazionecondotta sudue
quantitàintereproduce un
valore troppogrande
per poteresserememorizzato
nell'areariservataalrisultato.Ad esempio
siconsideriilseguenteprogramma:
program
Overflow;var
A,B,C:
integer;begin
A
:=1000;
B
:=1000;
C:=A *B;
Writeln(C);
end. (
Overflow
}Poiché la quantità 1.000.000
non ha
la possibilità di esserememorizzata
entro i2
bytes riservati alla variabile interaC,ilvaloremisterioso assunto dalrisultato16960
rappresenta proprioil valorenumerico
dei 16bitmeno
significativi di 1.000.000quando
essovenga
espressoinforma
binaria.Notare che non
vienegenerato
alcunmessaggio
di errore.3.8-
Le
variabili ditipo WORD
Allo stesso
modo
delle variabili intere, le variabiliword occupano
16-bit (2-byte) inmemoria. A
differenza per degli interi chepossono assumere
sia valori positivi che negativi le"word" assumono sempre
valori positivi evengono
diconseguenza
usate nelle situazionidove
i valori negativinon sono
richiestioppure
in queicasi incuilavariabilerappresentauna
successionedi bitpiuttostoche un
vero valorenumerico. Ivaloripermessi
peruna
variabile"word" sono
pertantocompresi
fra0
e 65535.Turbo
Pascalprevede numerosi
operatori permanipolare
le variabili"word"
; molti di questihanno una
corrispondenza direttacon
operazioni previste dal linguaggiomacchina 8086
e perciò tali operazioni verrannoeseguitemolto
velocemente.Gli operatori
AND, OR,
eXOR
lavorano su operandi"word"
e restituisconoun
risultato"word" dopo
avere effettuatoleopportune
operazioni logiche suciascunacoppiadibitappartenenti aglioperandia 16bit.Ad
esempio, sianoA
eB due
dati a 16bit:A = $5555 = 0101010101010101
inbinarioB = $007F = 0000000001111111
inbinarioL'operazione
A AND B
daràrisultato 1 solamente inquei bitin cui è presente 1 sia inA
che inB
percui siavrà:
A AND B = $0055 = 0000000001010101
inbinarioL'operazione
A OR B
daràrisultato 1 nei bitove
è presente 1o
inA, oppure
inB o
in entrambi per cui siavrà:
A OR B = $557F = 0101010101111111
inbinarioL'operazione
A XOR B
daràrisultato 1 solo neibitove A
è diversoda B
percuisiavrà :A XOR B = $ 552A = 0101010100101010
inbinarioL'operatore
NOT
effettua ilcomplemento (cambia
gli 1 in0
e0
in 1) su ogni singolo bit dell'operando"word", pertanto si avrà :
NOTB = $FF80 = 1111111110000000
inbinarioGli operatori
SHL/SHR
(shift a sinistra/shift a destra)fanno
scorrere i bitdiuna "word"
a sinistraoppure
a destra,con
laintroduzionedi zerisenecessario; ad esempio:A SHL 2 = $5554 = 0101010101010100
inbinario (shifta
sinistra di2posti)B SHR 5 = $0003 = 0000000000000011
inbinario (shifta
destra di5
posti)Le
funzioniHi
eLo
forniscono rispettivamente il bytepi significativo (Hi Byte) e quellomeno
significativo(Lo
Byte)della variabile"word"
su cuioperano; ad esempio:Hi(B) = $00 = 00000000
inbinarioLo(B
)= $7F =01111111
inbinarioLa
funzioneSwap scambia
tradiloroilbyte pi significativocon
quellomeno
significativodell'operando;ad
esempio:Swap(B) = $7F00 = 0111111100000000
inbinario3.9-
Le
variabiliditipo CHAR
Variabili di tipoordinale
CHAR sono
usatepermemorizzare
variabiliespresse incodiceASCII
ossia facenti parte diun
testo.Le
costanti di tipoCHAR sono
scritte fra apici, peresempio
'A', '3',oppure
'*' (l'apiceda
soloviene indicatocome
segue""sequenza
di2
apici fra apici).Le
variabiliditipo "char"occupano un
byte e rappresentanoun
carattere stampabileoppure un
caratteredicontrollo.Ad
esempio:var
C
:char;N
: integer;begin
C:=
A';Può
essere utile passareda un
determinato carattere al suo valorenumerico
intrinseco (definito dal codiceASCII);
questa operazione vieneeffettuatadallafunzioneOrd
:N:= Ord(C);
In
modo
analogo,può
essere utile trasformareun
valorenumerico
ordinale nel carattere corrispondente;questaoperazione vieneeffettuatadallafunzione
Chr
.C:=Chr(3);
Gli "Array di caratteri" (vettori di tipo "char")
sono
strutture di datimolto
utili. InTurbo
Pascal è stato previstoiltipo stringper operarecomodamente con
talistrutture.program CharDemo;
var
C
: char;J
:byte;begin
J:=
50;C:=
Chr(J);Writeln(C);
J:= Ord(C);
Writeln(J);
C:=
'A';J
:=Ord(C);
Writeln(J);
C:=
Chr(2);Writeln(C);
end. {
CharDemo
}TurboPascal
3.10-
LE VARIABILI REALI
Una
quantitàditiporeal ècostituitada un numero
che generalmente contieneanche una
partedecimale(ma non
necessariamentedeve
essere presente).Ad esempio
1.5, 0.33335, e1.987E3 sono
quantitàreali;1.987E3
scrittoinnotazione esponenziale
o
scientificaesilegge: " 1.987per 10elevatoalla3A.
Le
variabiliTurbo
Pascalditipo"real"dispongono
diun ampia gamma
divalorida 2.9E-39
(moltoprossimo
a 0) fino a1.0E+38
(una quantitàenorme
: 1con ben 38
zeri !).Le
quantità realipossono assumere
valori siapositiviche
negativi erichiedono6 bytes peresserememorizzate.3.11-
Limiti nella Precisione
A
differenza delle variabili di tipo "integer" e "long-int" la rappresentazione interna diTurbo
Pascal delle quantitàrealinon
esatta.Nessun numero
realepuò
superare le undici cifre di accuratezzamassima. Ad
esempio
ilnumero,
123.456.654.321 verrà rappresentatocon
la quantità1.234566543E+1
1
(123.456.654.300;le
due
ultimecifremeno
significativevengono
perse durantelaconversione).Inoltre,
va
precisatoche
a causadelmetodo
dirappresentazione interna dellequantitàreali,può
capitarepure chefrazioni decimalicon meno
diundici cifrenon vengano
rappresentateesattamente. Per esempio, 1.49può
solo essere approssimato
da un
valorereale. Ilgrado
diapprossimazionecertamente
buono
(a volte tra1.489999999
e 1.490000001),ma
inevitabilmente si perde la precisione assoluta dellevariabili ditipo "integer".3.12-
Tipi
didati
inmodalità 8087-80287-80387
Turbo
Pascalprevede
tre tipi aggiuntivi perle variabili reali single, doublé, extended, eun
tipo aggiuntivocomp
per le variabili intere. Questi tipi aggiuntivi offronoun
range piùo meno ampio
di valoried una maggiore o minore
accuratezzadeirisultati.Tipi
Range
di valoriCifre Sign Bytes Modo
REAL
2.9E-39..1.7E38 11-12 6Normale
SINGLE
1.5E-45..3.4E38 7-84 8087
DOUBLÉ 5E-324..1.7E308
15-16 88087
EXTENDED 3.4E-4932..1.1E4932
19-20 108087
Tipi
IntegerRange Cifre Sign Struttura Bytes Modo SHORTINT -128
..+127
3Signed
8bit 1Normale
BYTE
0 ..255
3Unsigned
8 bit 1Normale
INTEGER -32768
..+32767
5Signed
16 bit 2Normale
WORD
0 ..65535
5Unsigned 16
bit 2Normale
LONGINT
-2147483648.
.+2147483647
10Signed 32
bit4 Normale
COMP
-9.2E18..9.2E18 19-20Signed 64
bit 88087
Turbo
Pascalsupportadue
modellidigenerazione delsoftwarefloating-point:1. Software Floating point
{$N-}
2. FloatingPoint{
$N+
}
La
direttiva di compilazione$N
vieneusatapercommutare
fraidue
modelli. Nello stato8087
Floating Point{$N+},
la direttiva di compilazione$E
permette di inserire nelprogramma
finale il software diemulazione
delcoprocessorematematico
8087.Ilfile.EXE
così ottenuto è in gradodiessereeseguitosumacchine ove
ilcoprocessore
matematico 8087
è assente.3.13-
Output
didati su Video
Per visualizzare i risultati della elaborazione effettuata
da un programma,
sideve
fareuso
delle procedure interne alTurbo
Pascaldenominate Write
e Writeln. Sipossono
inviare alVideo
dati di tiponumerico
Integero Real o
stringhedi caratteri.Le forme
sintattichesono
diseguitoriportate:WRITE(
<lista deglielementida
visualizzare>);WRITELN(
<listadeglielementida
visualizzare>);la lista
può comprendere
variabilio
costanti siano esse quantitànumeriche o
stringhe di caratteri; i vari elementi della listadevono
essere separatida una
virgola , ; le costanti stringadevono
esserecomprese
fra apici; laproceduraWRITELN dopo
avere inviato suVideo
tutti gli elementida
visualizzare inviapureuna
coppia di caratteri di controllo<CR> + <LF> che provocano
il ritorno a capo, sullarigaimmediatamente
successivadelcursorevideo.Esempì:
Writeln('Risultato
=
\R);I lavariabile
R
viene inviata sul videopreceduta
dallastringa dicaratteri...Risultato
=
...successivamenteilcursore video tornaa capo
sulla rigasuccessiva}Write(
A=
',A,'B=
',B,'C=
',C);II valoriassuntidalle variabiliA,B,C,
vengono
precedutida
brevi stringhedicommento;
ilcursore
non va a capo
}Writeln; { Ilcursore video va
a capo
allariga successiva}3.14-
Formattazione
dellequantità
realiinmodo "fixed-point"
Per visualizzare
una
quantità reale informato
diversoda
quello previsto dalla "notazione scientifica"o
"floating point", si
deve
fareuso
deiparametridiformattazioneprevistinelle istruzioniWrite o
Writeln.Ad esempio:
Writeln(R:12:2);
invia in uscita la variabile reale
R
informato decimale
standard(campo
di 12 colonne,numero
collocato sulladestra,con due
cifredopo
lavirgola).Esempio:
program RealAccuracyDemo;
var
R: real;
begin
R
:-12345654321.0;
{precisionemax.
11 cifre } Writeln(R:15:0);R
:=1234567654321.0;
{valorea 13
cifre } Writeln(R:15:0);R
:=123456787654321.0;
{ valorea 15
cifre } Writeln(R:15:0);end. (
RealAccuracyDemo
}TurboPascal
3.15-
Output
didati su stampante
Per effettuare
una
operazione di output su stampante piuttostoche
su video siuseranno
le procedure predefiniteinTurbo
PascalWRITE
eWRITELN con
l'opportunoparametro
Lstche
identificacome
canale d'uscitaquellodellastampante disistema ("LinePrinter").Le forme
sintattichesono
diseguitoriportate:WRITE(Lst,<lista
deglielementida stampare>);
WRITELN(Lst,<lista
deglielementida stampare>);
Esempi:
Writeln(R:15:4); { lavariabile
R
viene inviata sulvideo}Writeln(Lst,R:15:4); {
ha
variabileR
viene inviatasustampante
}N.B.
Poiché
Lst èuna
variabilepredefinita nelmodulo
Printer, sarà necessario nella sezioneUses
(vedi par. 9.1b) specificare l'opportuno riferimentoa
questomodulo
attraverso la riga diprogramma: Uses
Printer;
4- Dati di tipo Strutturato
Ai
tipi strutturatiappartengono
gliARRAY,
ilTipo STRING
(array di variabili char), iRECORD,
levariabilidi tipo
SET,
iFILES.
4.1-
ARRAY
(vettorialo più dimensioni)
Un
"array" èun
insieme ordinato di variabili tutte dello stesso tipo; ciascuna di esse viene individuata attraverso ilnome
dell'array e la posizioneo
le coordinate della variabile entro l'array. Si consideri la dichiarazione:Var Y
:array
[1..100]of
real;essa significa
che Y
rappresentaun
vettorecostituitoda 100
elementirealiY[l], Y[2], Y[3], ...,Y[100];N.B.
Un
vettorenon può occupare
più di64K-bytes
inmemoria.
Ciascuna
di queste100
variabilipuò
essere usata alla stessa stregua diuna comunissima
altra variabile di tipo "real". Inoltre, e questo è ciòche
rende facile l'uso degli array, il valore dell'indicepuò
essere rap- presentatoda una
qualsiasiespressioneche
diacome
risultatoun
valorecompreso
fra 1 e 100.Bisogna
tuttaviaprestare attenzioneed
evitareche
ivaloriassunti dagli indicidegliarray provochino uno sconfinamento
al difuoridelcampo
di definizionedatoinsededidichiarazione.Ad
esempio,se lavariabile J èditipo integerivaloriassunti dalla J inquestocicloiterativoFor
for J:=
1 to100 do
Y[J] := 0.0;permettono
diazzerare tutto l'array.Gli "array"
possono
essere di tipo multidimensionale; cioè inaltri termini sipossono
avere "arrays di arrays (di arrays...)"- Sisupponga
diavereun
vettore Alfa tridimensionale(omatrice Alfa)costituitoda 50 x 20 x
10 elementireali; ladichiarazionepuò
essere stesaindue modi
distinti:Modo A:
Var
Alfa: array[1..50,1..20,1..10]ofreal;
Modo B
:Da
preferire inquanto
largamente usatonellinguaggioC
Var
Alfa :array[1..50]
of array
[1..20] of
array[1..10] ofreal;È
evidenteche perindividuareun
soloelemento
sarà necessariodare itre valori degliindiciche fornisconolecoordinatedell'elemento entrol'array(matrice atredimensioni).
Alfa[30,5,4]=
-2.5E-10
Glielementidi
un
arrayapiù dimensionivengono
collocatiinmemoria con
ilseguenteordine:Alfa[l,l,l], Alfa[l,l,2], Alfa[l,l,10], Alfa[l,2,l], Alfa[l,2,2], Alfa[l,2,10], Alfa[2,l,l], ...
Alfa[2,20,l], ... Alfa[2,20,10], Alfa[50,20,l],
-
Alfa[50,20,10]oppure
Alfa[50][20][10]N.B.
Varia piùrapidamente
l'ultimoindice.NOTE
a)-
E opportuno
fare alcune riflessioni sulle dichiarazioni diTipo che possono dare problemi quando vengano
inmodo
sistematicousatigliARRAY.
Siconsideri ilprogramma
riportato diseguitoProgram ONE(input,
output);var
A
:array
[1..30]
ofbyte;B
:array
[1..30]
ofbyte;Begin
A:=B;
End.
La
istruzioneA
:-B
viene considerata errata dal compilatore inquanto
le variabiliA
eB vengono
consideratediverse.Program TWO(
input,output);type
Y =
array[1..30] ofbyte;var
A,B
: Y;Begin
A:=B;
End.
TurboPascal
La
istruzioneA
:=B
viene considerata corretta dal compilatore inquanto
le variabiliA
eB vengono
consideratedello stesso tipo.b)- L'indice di
un
arraypuò
avereun
insieme di definizione diverso dal classico [1..N]come
sipuò
osservarenelladichiarazione seguente:Z
:array
[-5..+5Jof
real;4.2-
Le
variabiliditipo STRING
Una
variabiledi tipoSTRING
èuna sequenza
dicaratteridinamicamente
variabile fra 1 e255
caratteri.Una
variabile di tipo
STRING può
essere consideratocome un
vettoremonodimensionale
di elementi di tipoCHAR
(caratteri ASCII). Ilnumero massimo
di caratteripuò
venire indicato fra parentesi quadre.Se
sitentadi assegnare più di
n
caratteri auna
variabile di tipostring[n], la parte eccedente glin
caratteriviene persa.Var
c: string[40];
d
:stringi5
8];r:string[80];
Una
variabile di tipoSTRING
dichiarata senza specificare ilnumero massimo
di caratteripuò
contenere finoaun massimo
di255
caratteri.Var Msg
:string;Le
costanti di tipoSTRING vengono
scritte entro apici 'Turbo', ", 'That"s all'. Si noticome
il carattere ' viene rappresentatodallasequenza
didue
apici consecutivi ".Con
variabili di tipoSTRING possono
essere usatiiseguentioperatori: +, =,<>,<, >, <=,>=
4.3-
Funzioni che operano su
variabiliSTRING
La
funzione Lengtht(St)restituisce lalunghezza dinamica
della stringa di caratteri St.Esempio:
St
:-
'Coca_Cola';Length(St)
= 9
La Funzione
Concat(Stl,St2{,St3,...,Stn}) restituisce la stringa ottenutaconcatenando
nell'ordine Stl, St2, St3, Stn. (È consentitocome
inBASIC
usare l'operatore+).Esempio:
Stl :- 'Saiscrivere' St2
:=
'inPASCAL
?'Stl
+
St2—
'Sai scrivereinPASCAL
?'Concat(Stl,St2)
-
'SaiscrivereinPASCAL
?'St2
+
Stl=
'inPASCAL
?Saiscrivere'La Funzione Copy(St,Pos,Len)
restituisce lastringacostituitada <Len>
caratteri estrattidalla stringa<St>
a partiredal carattere diposto<Pos>.
Esempio:
Stl :— 'Saiscrivere'
St2:=
'inPASCAL
?'Copy(Stl,5,8)
=
'scrivere'Copy
(St2,4,6)= 'PASCAL'
La Procedura Delete(St,Pos,Num)
cancella all'interno della stringa <St>,<Num>
caratteri a partire dal carattere diposizione<Pos>.
Esempio:
Stl :- 'Saiscrivere'
St2:=
'inPASCAL
?'Dopo
avereeseguito:Delete(Stl,5,3);Stl
—
'Saiivere' Delete(St2,l,3);St2= 'PASCAL
?'La Procedura
Insert(Source, Destination, Position) inserisce la stringa<Source>
all'interno della stringa<Destination> a partire dal carattere di posto <Position>.
La Funzione
Pos(Pattern, Target) restituisce la posizione della stringa <Pattern> all'interno della stringa <Target>. Per informazioni più approfondite sulfunzionamento
delleprocedure:Inserì, Pos, Str,
Val
sirinviaallaconsultazionedi
Turbo
PascalReference Manual.
4.4-
Confronto fra Stringhe
diCaratteri
Le
stringhevengono
confrontatetenendo conto inprimo luogo
delvaloreASCII
deicaratteriinessecontenute e successivamentedellalunghezza.Ad
esempio, "cai" è inferiore a"dog" poichéilvaloreASCII
dellalettera'c'è inferiore alvalore
ASCII
dellalettera'd'.Due
stringhesono
ugualisee soltanto se essecontengono
gli stessi caratteri.Se due
stringhehanno lunghezza
diversama sono
identiche fino all'ultimo carattere della stringapiù corta, lastringadi caratteripiù cortaviene consideratainferioredellastringapiù lunga. In questosensolastringa "cai"è consideratainferioreallastringa "cats".Le maiuscole sono
significativequando
siconfrontano stringhedi caratteri.
La
stringa "Cat" è inferiorealla "cat" ilquantoleletteremaiuscolehanno
valoreASCII
inferiore rispetto allecorrispondentiminuscole.Esempio:
procedure ToLower
(varS:MaxString);
{convertemaiuscole
inminuscole
} varIndex
: integer;begin
for Index :-
1 toLength(S)do
ifS[Index]in['A'..'Z']thenS
[Index] :-Chr(Ord(S[
Index])+
32);end; [
ToLower
}4.5-
RECORD
I
Record sono un
tipo di variabile strutturato costituitoda un
insieme di variabili di tipo diverso fra loro (glielementi costituisconoivari
campi
del record).E
possibile accedere alrecordperinteroo
individualmenteai suoi elementicomponenti
chiamati fields (campi).La forma
sintattica per la dichiarazione di tipo è la seguente:Type
RecType — record
<fieldl
>
:< sometype >
;<field2>:
<sometype>;
<fieldn>:
<someType>;
end;
Definita
una
variabile di tiporecord è possibile assegnare ai varicampi
quantità determinate specificando ilnome
della variabile seguitoda un punto
e dalnome
delcampo. E
evidente che le quantità chevengono
assegnate alcampo
diun
recorddevono
esserecompatibilicon
ladichiarazioneditipo delcampo.
Per
esempio
:TurboPascal
type
alfa
= record
nome
: string[40];età: integer;
corso: (amee,
omu,
tiee, tini);end;
var
Studente:alfa;
begin
Studente.
nome :— 'Marco
Rossi';Studente. età:— 17;
Studente.corso :- tiee;
end.
L'istruzione
WITH
L'istruzione Pascal
WITH
consente di accedere inmodo
abbreviato ai varicampi
diun
record. All'interno dell'istruzioneWITH
(chepuò comprendere un
blocco delimitatoreBegin/End) non
è più necessario utilizzareilnome
delrecordper accedereai suoicampi.A
titolodiesempio, leistruzionidiassegnazionepre- sentatenelprecedenteesempio assumono con
l'istruzioneWITH
laseguente forma:begin
WITH
Studentedo
beginnome
:='Marco
Rossi';età
:-
17;corso :- tiee;
end;
end.
4.6-
Le
variabiliditipo SET
Gli Insiemi (o classi), collezioni di oggetti dello stesso tipo ordinale,
sono un
elegante strumento per e- sprimererelazioniesistentifraelementidiun programma.
Iltipo-base degli elementidi tipo "set" (il tipo degli oggetticontenuti in
un
insieme)deve
essere costituitoalmassimo da 256
possibili valori. Perciò sipuò
definireun
insieme dielementidi tipo char,o un
insieme dinumeri
interida 75
a98
(subrange interi 75..98).Non
è possibile definireun
insieme dinumeri
di "tipo integer" poiché tale insieme conterrebbe65536
possibili valori.Un
insieme (set) viene rappresentato racchiudendo all'interno diparentesi quadre l'elenco dioggetti dello stesso tipo ordinale separatida
virgola.Se
l'elencocontieneelementi aventivalore ordinale consecutivosipuò
utilizzare la notazionedei "subrange"(dueespressioni separate
da due
punti).Ecco
alcuni esempi:[]classevuota
[1,3,5,7,9] Classedi valoriinteri (subrange)
['A'..'Z']classedi elementi
char
[Lun,Mar..Ven]
classe digiornidella settimana[Gennaio.
Aprile,Settembre..Dicembre]
classe dimesi
Definizione
deglielementi
ditipo "Set"Perdefinire
un
"tipo-set" sideve
utilizzare laparolariservata "set of", seguitadalnome
del tipobase (tipoa cuiappartengonoglielementicontenuti nell'insieme).Ad esempio
: typeCharSet =
setof
char; {Classedielementidi tipo "char"}MonthDays =
setofL.31;
(Classe dielementi interisubrange 1.31)}
DayType =
(Sun,Mon,
Tue,Wed,
Thur, Fri, Sat);Days =
setof DayType;
{Classedi elementiditipo"DayType"}
Color
s=
setof
(Red, Green, Blue); {Classedi elementidi tipoanonimo enumerativo
(Red, Green, Blue)}var
wd
:Days;
begin
wd =
[Mon..Fri];Gli elementiditipo set
possono
essere elaboraticon un
discretonumero
di operatori speciali.Supponiamo
di disporre deiseguenti elementi:seti
:=
['A', 'B', 'C'];set2
:=
['C, 'D', 'E'];set3
:=
['A', 'B', 'C'];set4
:=
[A', 'B'];L'operatore
unione
(+) effettualasomma
logicafra classidando
origine allaclassesomma
:seti
+
seti=
[A', 'B', 'C, 'D', 'E'];costituitadaglielementi
che appartengono o
asetioppure
a set2(funzioneOR).
Istruzione in
L'operatore di appartenenza
in
ci permette di verificare seun elemento o una
classeA sono
contenuti all'internodiuna
classeB:if(A'
inseti) then. . .A'
rappresentaun
elemento, setiuna
classe; poiché effettivamente l'elementoA'
è contenuto in seti ilrisultatodellaproposizione
che
segueifassume
valoreTRUE.
L'operatore - permettedicostruirelaclassedifferenza:
seti - set2
-
[A', 'B']costituitadai valoridiseti
che non appartengono
aset2.L'operatorediintersezione * effettuailprodotto logicofra classi
dando
origine allaclasseprodotto:seti *seti
=
['C']costituitadaglielementi che
appartengono
siaa seti che a set2 (funzioneAND).
Alcuni degli operatoriusaticon numeri
e stringhepossono
essere utilizzatianche con
elementi di tipo setma con
significato diverso.L'operatore di eguaglianza
=
fornisceun
valoreBooleano
che indica sedue
classisono
esattamente uguali (contengonogli stessielementi):seti
=
set3 restituisceilvaloreTRUE
seti
=
set2 restituisceilvaloreFALSE
L'operatoredidisuguaglianza
<>
fornisceun
valoreBooleano
cheindica sedue
classisono
diverse:seti
< >
set3 restituisce ilvaloreFALSE
seti
<>
set2 restituisceil valoreTRUE
TurboPascal
Gli operatoridi inclusione
<=
e>=
fornisconoun
valoreBooleano
che indica seuna
classe èuna
sottoclasse di un'altra. L'operatore<=
restituisce il valoreTRUE
se laprima
è contenuta nellaseconda mentre
l'operatore>=
sicomporta
inmodo
esattamente opposto.seti
< =
set2 restituisceilvaloreFALSE
set4
< =
seti restituisce ilvaloreTRUE
seti
> =
set2 restituisceilvaloreFALSE
seti
>-
set4 restituisce ilvaloreTRUE
program SetsDemo;
uses Crt;
var
Alphabet, Vowels,
Consonants:
setof
char;C: char;
function
LCase(
C: char): char; {restituisce laversioneminuscola
della variabileC
}begin
ifC
in[A'..'Z']thenLCase := Chr(Ord(C) +
32) elseLCase
:- C;end;{
LCase
} begin{SetsDemo
}Alphabet
:- ['a'., 'z'];Vowels
:= fa', 'e', V, 'o\ 'ù];Consonants
:-Alphabet
- Vowels;repeat
Write('Premi
un
carattere: ');C
:-LCase(ReadKey);
ifC
inVowels
thenWriteln('Ilcarattereè
una
vocale') elseif
C
inConsonants
thenWriteln('Ilcarattereè
una
consonante') elseifC
in[''..'-']then Writeln('IlcarattereèASCII
e stampabile');until
C
in[#3, #27, #13];end. {
SetsDemo
}5- Le Strutture Decisionali
Icostrutturi decisionali di
Turbo
Pascalsono due
: IF ..THEN
..ELSE
eCASE
..OF.
5.1-
Struttura Decisionale IF
..THEN ELSE
L'istruzione IF elabora
una
espressione di tipoBoolean
perdeterminare quale, fradue
possibili alternative,deve
essere seguita.La
clausolaELSE
fa parteopzionalmente
del costrutto.La
struttura sintattica è la seguente:IF <espressione-booleana> THEN
<istruzionel>
[
ELSE
<istruzione2>]Se
l'<espressione-booleana>assume
ilvaloreTrue
(ossia se èvera), alloravieneeseguita l'<istruzionel> edi seguitoverrannoeseguiteleistruzioniche seguono
ilcostruttoIF.Se
l'<espressione-booleana>assume
il valore False (ossia se è falsa), alloranon
viene eseguitadistruzione 1> ma
viene eseguita l'<istruzione2>. Si notiche
l'<istruzionel> e l'<istruzione2>può
essere costituitada un
intero blocco di istruzionicomprese
tra i delimitatoriBegin
End,ma
potrebbeanche
essere un'altraistruzioneIF.Spesso nasce
confusionequando
sideve
correttamente collocare il; inuna
istruzione IF.È opportuno
in proposito ricordareche
lafraseELSE deve
essere considerataparte integrante dell'istruzioneIF (non
si tratta diuna
istruzionea
sé stante) e quindiNON DEVE ESSERE PRECEDUTA DAL
. Infatti ilcompilatore interpretail;
come un
separatoredi istruzioni, e quindinon ha
sensoche ne venga
collocatouno
all'interno diuna
istruzione(ma
questoèproprio
quelloche succede quando
sifa precedere da un
; la fraseELSE).
Esempio
:{Questo
programma
trovalesoluzioni reali diuna equazionedi2.o grado.Idati richiestiiningressosono: icoefficienti reali A, B, C.
I risultatifornitisono:
1-)Lesoluzioni
XI
eX2
oppure 2-)L'unica soluzioneX
nelcasoA=0
3-)Imessaggidiavvertimentonei casiparticolari
(A=0
eB=0)
4-)
La
parte realeR
eimmaginariaM
dellesoluzioni nelcasoD
risultinegativo jProgram
Equaz2(Input,0utput);var
A,B,C,D,X1,X2,X,R,M
: real; {dichiarazionirelative allevariab.jBEGIN
Write(' Coefficiente
A=
');Readln(A);
WritefCoefficiente
B=
');Readln(B);
Write(' Coefficiente
C=
');ReadlnfC);
IfA=0
ThenBegin {Risolviequazionedi 1Agrado}
IfB=0
Then
IfC=0
ThenWriteln('Identità ')Else Writeln('EquazioneImpossibile ') Else
Begin
X
:= -C/B;Writeln('
Una
soluxioneX=
\X:10:3);End; {fine
ELSE
IfB=0
}End
{fineTHEN IfA=0
}Else
fIfA=0
ìTurboPascal
Begin {Equazione di2Agrado }
D
:=B*B-4*A*C
;IfD <
0then BeginR: =
-B/(2*A)M:=
SQRT(-D)/(2*A);Writeln('
Due
soluzionicomplesseconiugate');Writeln('R= ',R:10:3,'M= \M:10:3);
End
{fineTHEN
IfD<0
} ElseBegin
XI
:= (-B+SQRT(D
))/(2*A);X2
:= (-B-SQRT(D
))/(2*A);Writelnf
Due
soluzioni reali ');Writeln('Xl= ',X1:10:3,'
X2=
\X2:10:3);End; {fine
ELSE IfD<0
}End; {
ifA=0
}Readln;
END.
f A.B.C
/
2
Agrado
CALCOLOD
CALCOLO R
CALCOLO M
M
1
CALCOLO X1
CALCOLO X2
7 /
/ X1 ,X2 /
fig.12
Equazione
diSecondo Grado
1A