Sunteți pe pagina 1din 13

Partile unui program Pascal

Cele trei parti principale ale unui program PASCAL sunt: antetul (header-ul) programului, declaratiile in
care se descriu obiectele asupra carora vor avea loc prelucrarile (in cadrul programului pe care il
analizam, vom considera numai declararea variabilelor) si partea principala a programului in care se scriu
instructiunile (ansamblul operatiilor ce urmeaza a fi executate).
Pentru a intelege aceasta structura, deloc complicata, sa analizam fara graba un program (Borland)
PASCAL care calculeaza si afiseaza volumul unui paralelipiped. Este vorba de un program care declara
variabile, citeste valorile acestora, efectueaza un calcul simplu si afiseaza rezultatul.
Cod:
PROGRAM volumul;
{calculeaza si afiseaza volumul unui paralelipiped}
VAR
lungime, latime, inaltime, volum:real;
BEGIN
writeln('Introduceti valori: lungime, latime, inaltime');
readln(lungime, latime, inaltime);
volum:=lungime*latime*inaltime;
writeln('Volumul paralelipipedului= ', volum:9:5,' metri cubi')
END {volumul}

Cand programul este rulat, pe ecran se va afisa:


Cod:

Introduceti valori: lungime, latime inaltime


8.3 7.25 6.29
Volumul paralelipipedului= 378.50075 metri cubi

De remarcat ca sirul "8.3 7.25 6.29" a fost introdus de la tastatura, fiind valorile pentru lungime, latime,
respectiv inaltime.
Examinand acest program, vom putea vedea urmatoarele elemente:
Antetul (header-ul) programului

Prima linie contine antetul programului. Program este un cuvant rezervat cu care incepe (optional) un
program (Borland) PASCAL. El este urmat de numele programului: volumul si de simbolul punct si
virgula. Simbolul punct si virgula (" ; ") este un separator de instructiuni. Este strict necesar, bineinteles,
cu unele mici exceptii, care le voi semnala la momentul potrivit.
O restrictie importanta a identificatorilor este aceea ca nu pot contine in interiorul lor blancuri (spatii).
Orice nume pe care il folositi intr-un program PASCAL se numeste identificator. El desemneaza: etichete, variabile, constante, tipuri de
date, proceduri, functii, programe. Un identificator este o secventa de litere, cifre sau liniute de subliniere, primul caracter fiind obligatoriu
o litera sau o liniuta de subliniere (" _ ").

P.S. Unde a scris Dumnezeu (God) e LEGE (it's a rule)


Cuvintele program, begin, end, var - se numesc cuvinte cheie (keywords) sau cuvinte rezervate (reserved words) deoarece sunt foarte
importante si sunt definite sa aiba anumite semnificatii.

PASCAL are peste 50 de cuvinte rezervate.


Comentariile

A doua linie a programului volumul este numita un comentariu.


Orice sir de caractere delimitat de acolade reprezinta un comentariu. Comentariile sunt folosite pentru a
mari inteligibilitatea programelor (ele sunt ignorate de compilatorul PASCAL!).

Remarcati in ultima linie a programului prezenta comentariului {volumul}, tocmai pentru a reaminti
cititorului numele programului care s-a incheiat. Comentariile pot fi plasate oriunde in cadrul
programului, dar nu in interiorul identificatorilor.
In lipsa acoladelor de pe tastatura pe care lucrati, puteti folosi perechi de paranteze si asteriscuri: " (* " si " *) ".
Declararea variabilelor

Cuvantul cheie var(prescurtare de la variables) incepe actiunea de declarare a variabilelor. Fiecare


variabila trebuie sa poarte un nume. Programul volumul foloseste patru variabile (lungime, latime,
inaltime, volum) identificate in faza de analiza structurata a programului. Acestea sunt grupate astfel.
Variabile de intrare:

* lungime: lungimea paralelipipedului


* latime: latimea paralelipipedului
* inaltime: inaltimea paralelipipedului
Variabile de iesire :

* volum: volumul paralelipipedului


Nu va speriati de denumirea pompoasa (de intrare, de iesire), se declara la fel, denumirea aceasta e
folosita doar pentru a usura intelegerea rolului lor in program.
Tipuri de date

In PASCAL exista doua tipuri (simple) de date pentru variabile numerice: intregi si reale.
Variabilele intregi pot lua valori numai numere intregi (pozitive sau negative) ca: 8, 23, 0 sau 8700.
Un calculator poate reprezenta numai o submultime finita de intregi. Un intreg poate fi reprezentat in
memoria unui calculator numai daca valoarea sa apartine intervalului (-maxint-1, maxint), unde maxint
este o constanta predefinita. In implementarile uzuale ale limbajului PASCAL maxint are valoarea
32767.
(Borland) PASCAL 7, in afara de tipul integer, pentru valorile intregi, permite si utilizarea tipurilor: byte, shortint, word, longint, comp.
MaxInt si MaxLongInt reprezinta valorile maxime pentru datele de tip intreg (32767) respectiv longint (2147483647).

Daca o variabila PASCAL va avea o valoare fractionara sau mai mare decat maxint (maxlongint),
variabila trebuie sa fie de tip real.
(Borland) PASCAL 7, in afara de tipul real, pentru valorile reprezentate in virgula mobila, permite si utilizarea tipurilor: single, double,
extended.

Intr-un program (Borland) PASCAL tipul fiecarei variabile utilizate trebuie sa fie declarat. Omiterea
declararii unei variabile folosite in partea principala a programului va genera o eroare. In programul pe
care-l analizam (volumul), declararea variabilelor s-a facut utilizand enuntul:
Cod:
VAR lungime,latime,inaltime,volum:real;

Odata intalnit acest enunt, compilatorul afla ca toate cele patru variabile sunt de tip real.
Zona de memorie alocata variabilelor

Fiecarei variabile din program i se asociaza o locatie de memorie pe care v-o puteti imagina ca pe o cutie
avand inscriptionate: nume si tip. Continutul cutiei este dat de valoarea curenta a variabilei.
Tipul defineste categoria valorii din cutie. Programul refera variabila prin nume.
O variabila poate avea numai o singura valoare, la un moment dat, dar, in urma operatiilor ce se efectueaza asupra ei, in timpul executiei
programului, poate sa isi schimbe valoarea.

Partea principala a programului reprezinta zona activa, executabila a programului. Cuvintele rezervate
BEGIN si END delimiteaza instructiunile care descriu algoritmul principal al problemei de rezolvat.

Dupa ultimul END urmeaza intotdeauna un punct.


Begin-End
* Daca nu exista cel putin un enunt intre BEGIN si END programul nu va face nimic (aceasta situatie nu deranjeaza, incercati! );
* Cuvintele cheie BEGIN si END sunt exemple de delimitatori (cuvinte sau simboluri care delimiteaza inceputul si sfarsitul unor zone ale
programului);
* Spre deosebire de separatori (virgula, punct si virgula), delimitatorii se gasesc in pereche. Exemplu: BEGIN-END.
Enunturile (instructiunile) writeln

Enunturile writeln sunt utilizate pentru afisarea pe un suport de informatie (de regula monitorul) a
rezultatelor obtinute in urma prelucrarilor, a mesajelor catre utilizator etc.
WriteLn reprezinta in PASCAL un identificator predefinit (standard).
Spre deosebire de cuvintele cheie, identificatorii predefiniti (standard) pot fi redefiniti in cadrul programului (intelesul lor poate fi schimbat
de programator).

De remarcat ca daca dati unui program numele "write", nu mai aveti voie sa folositi in program nici un
enunt write cu sensul predefinit (adica sa afiseze un text, variabila, etc).
Ori de cate ori se va executa un enunt writeln, calculatorul va afisa ad litteram tot ceea ce este inclus intre
apostrofuri, precum si valorile oricarei variabile sau expresii aflate intre paranteze. Pentru separarea
elementelor din corpul instructiunii se folosesc virgulele.
Primul enunt din programul analizat (volumul) determina calculatorul sa scrie pe ecran mesajul:
Cod:
Introduceti valori: lungime, latime inaltime

dupa care va muta cursorul la inceputul liniei urmatoare.


Fara un astfel de mesaj este greu sa ne dam seama ca este timpul sa se tasteze ceva. Writeln forteaza
calculatorul sa afiseze tot ceea ce s-a specificat in interiorul parantezelor si sa treaca la linie noua. La un
enunt write, cursorul va ramane pe pozitia imediat urmatoare ultimul caracter scris cu acest enunt.
Writeln poate fi folosit si fara parametri pentru a muta cursorul cu o linie mai jos.
Enuntul readln

In momentul in care s-a executat instructiunea


Cod:
readln(lungime, latime, inaltime);

calculatorul asteapta de la utilizator sa introduca trei numere. Primul va fi atribuit variabilei lungime, cel
de-al doilea variabilei latime si in sfarsit cel de-al treilea variabilei inaltime. Nu uitati ca toate cele trei
variabile sunt de tip real!
Aceste valori pot fi tastate pe o singura linie, cu spatii intre ele, sau cate una pe linie.
De remarcat ca valorile (folosind instructiunile Read / ReadLn) nu sunt citite pana la apasarea tastei
Enter.
* Readln permite utilizatorului sa introduca valorile variabilelor de intrare in timpul executiei programului;
* Dupa executia unui enunt readln, cursorul se pozitioneaza la inceputul urmatoarei linii de pe ecran;
* Diferenta dintre read si readln este similara celei dintre write si writeln.
Utilizarea combinatiei write-readln in locul combinatiei writeln-readln

De foarte multe ori, in programarea calculatoarelor se foloseste combinatia write-readln in locul


combinatiei writeln-readln.
Avantajul combinatiei write-readln este acela ca valoarea care se introduce va aparea pe aceeasi linie a
ecranului cu cererea, in loc sa apara pe o linie proprie, cum s-ar fi intamplat in cazul folosirii combinatiei
writeln-readln.
Enuntul de atribuire (asignare)

Enuntul ce urmeaza dupa enuntul readln


Cod:
volum :=lungime*latime*inaltime;

se numeste enunt de atribuire intrucat el calculeaza ceva (produsul dintre lungime, latime si inaltime) si
atribuie (asigneaza, afecteaza) rezultatul variabilei din stanga simbolului ":=". Partea dreapta a acestui
enunt este un exemplu de expresie aritmetica.
Formatarea la iesire (iesire)

Ultimul enunt din programul volumul:


Cod:

writeln(Volumul paralelipipedului= ,volum:9:5, metri cubi);

afiseaza intr-o forma explicita rezultatul:


Cod:
Volumul paralelipipedului= 378.50075 metri cubi

Remarcati forma de prezentare a rezultatului. Pentru inceput, sirul de caractere "Volumul


paralelipipedului", urmat de rezultatul propriu-zis, afisat insa intr-un sablon de 9 caractere, dintre care
cinci reprezinta cifre zecimale. Acest mod de afisare a fost stabilit de specificatorul de format ":9:5" (9
caractere, din care 5 cifre zecimale). In cazul in care rezultatul ar fi avut 10 caractere (4 cifre inaintea
virgulei, 5 cifre zecimale), specificatia ":9" nu era luata in seama. In cazul in care ar fi fost mai putine
caractere (8 sau 7), atunci primul / primele caractere erau completate cu spatii. Specificatia de format " :
x : y " este facultativa, dar fara acest specificator de format, volumul calculat ar fi fost afisat in notatie
exponentiala (stiintifica), care este mai greu de citit. In sfarsit, sirul de caractere "metri cubi"
completeaza imaginea rezultatului.
* Specificatorii de camp pot fi folositi pentru controlul formei de editare a rezultatelor, fie prin determinarea largimii zonei de scriere, fie
prin declararea numarului de zecimale ce vor fi folosite la scrierea valorilor reale;
* Pot fi formatate: valorile intregi, reale, sirurile de caractere etc., dar numai la numere reale se vor declara numarul de zecimale

Tipuri de date in Pascal


In Pascal, tipurile de date sunt de 2 feluri: simple si structurate.
Tipuri de date simple sunt impartite in tipuri ordinale si reale.
Cele ordinale sunt:
tipuri intregi:
shortint
poate lua valori intre (-128, 127) sau ($80, $7F) in hexazecimal
stocat intern pe: 1 byte
byte
poate lua valori intre (0, 255) sau ($00, $FF) in hexazecimal
stocat intern pe: 1 byte
integer
poate lua valori intre (-32768, 32767) sau ($8000, $7FFF) in hexazecimal
stocat intern pe: 2 bytes
word
poate lua valori intre (0, 65535) sau ($0000, $FFFF) in hexazecimal
stocat intern pe: 2 bytes
longint
poate lua valori intre (-2147483648, 2147483647) sau ($80000000, $7FFFFFFF) in hexazecimal
stocat intern pe: 4 bytes
tipul logic: boolean
poate lua ca valori doar TRUE sau FALSE
stocat intern pe: 1 byte
tipul caracter char
poate lua ca valoare orice caracter din ASCII (American Standard Code for Information Interchange)
stocat intern pe: 1 byte
tipul enumerare
tipul subdomeniu

Cele reale sunt


single
poate lua valori intre (1.5E-45, 3.4E38)
stocat intern pe: 4 bytes
real
poate lua valori intre (2.9E-39, 1.7E38)
stocat intern pe: 6 bytes
double
poate lua valori intre (5.0E-324, 1.7E308)
stocat intern pe: 8 bytes
extended
poate lua valori intre (3.4E-4932, 1.1E4932)
stocat intern pe: 10 bytes
comp
poate lua valori intre (-2^63+1, 2^63-1)
stocat intern pe: 8 bytes
"E" din notatiile de mai sus inlocuieste exponentul si este citit "10 la puterea" numarului care urmeaza.
Ex. 1.5E-5 se citeste 1,5 ori 10 la puterea (-5) si este egal cu 0,000015.
"^" de mai sus este o conventie pentru a simboliza ridicarea la putere si este citit "la puterea" numarului care urmeaza.
Ex. 2^5 se citeste 2 la puterea a 5-a si este egal cu 32.
Tipurile de date structurate sunt:
tipul tablou: array (tablou)
folosit pentru a memora un sir de valori
tipul sir de caractere: string
este o secventa dinamica (ca lungime) de caractere.
poate lua ca valori un sir de caractere din ASCII (maxim 255 de caractere)
stocat intern pe: maxim 256 de bytes (primul e pentru a stoca lungimea sirului (spre deosebire de C / C++, unde sirul se termina cu caracterul #0 null terminated strings)
tipul inregistrare: record (inregistrare)
folosit pentru a memora valori de mai multe tipuri in acelasi loc
tipul obiect: object
folosit in programarea pe obiecte (OOP)
tipul multime: set
folosit pentru a desemna o multime (ca in matematica) de elemente de acelasi tip
tipul fisier: text, file
folosit la prelucrarea fisierelor
tipul referinta: pointer
folosit la prelucrarea dinamica a memoriei
tipurile procedurale: function, procedure
extensie a Pascalului standard, pentru a putea folosi subprogramele ca variabile
Tipuri ordinale

Exista 3 functii standard care se pot folosi cu toate tipurile ordinale. Acestea sunt:
ORD = returneaza valoarea ordinala a unei expresii de tip ordinal
PRED = returneaza valoarea ordinala a predecesorului ordinal a unei expresii de tip ordinal
SUCC = returneaza valoarea ordinala a succesorului ordinal a unei expresii de tip ordinal
Ex. Ord('A') returneaza 65 (codul ASCII)
Pred(14) returneaza 13
Succ('A') returneaza B
Succ(FALSE) returneaza TRUE

Toate tipurile ordinale pot fi puse in relatie.


Ex. 6 > 4
'A' < 'B'
'Asta' <> 'asta'
ORD(A) >= 60
'pascal' <= 'pascal'
"<>" se citeste "diferit de"

Cum am aratat mai sus, tipurile ordinale de date sunt shortint, byte, integer, word , longint, boolean, char.

In operatii, toate tipurile intregi de date sunt compatibile intre ele. Operatorii aritmetici care se pot folosi sunt:
+
pentru adunare
pentru scadere
*
pentru inmultire
DIV
impartire intreaga - se obtine catul
MOD
impartire intreaga - se obtine restul
/
impartire reala - se poate aplica asupra operanzilor intregi, dar rezultatul este real.

Expresie - forma lexicala asemanatoare expresiilor matematice ce se construieste folosind operanzi (constante, nume de variabile, apel de
functii), operatori (operaii) corespunzatoare tipului de expresie si eventual paranteze pentru definirea prioritatilor operatiilor.
Ex. 2 + 2 * 2, unde "2" este operand, iar "+" si "*" sunt operatori.
Tipul Boolean
Tipul boolean este ordinal, enumerativ: (FALSE, TRUE).
Operatorii logici care i se pot aplica sunt:
NOT
operatia logica "nu"
AND
operatia logica "si"
OR
operatia logica "sau"
XOR
operatia logica "sau exclusiv" - un "sau exclusiv" este adevarat daca un operand este adevarat, dar nu amandoi. A XOR B inseamna "A sau B, dar nu
amandoua".
Tipul Char
Tipul char este ordinal.
Valoarea unei variabile de acest tip se va scrie intre ghilimele.
Ex. 'A' sau 'a' (sunt distincte)
Operatorii si functiile care se pot aplica asupra acestui tip de data sunt:
+
concateneaza 2 sau mai multe caractere, dar rezultatul este de tip string
CHR
este o functie care se aplica datelor de tip intreg, dar rezultatul este de tip Char. Returneaza caracterul cu codul respectiv din codul ASCII
Tipuri reale
Tipurile reale de date sunt single, real, double, extended si comp.
Datele sunt memorate intern in virgula mobila (Tutorial virgula mobila - by suri)
Tipul comp desemneaza o data reala particulara, avand numai valori intregi. In operatii, intra ca o data reala, cu partea zecimala egala cu zero.
Operatorii aritmetici care se pot folosi la tipurile reale sunt:
+
pentru adunare
pentru scadere
*
pentru inmultire
/
impartire reala (cu virgula)
Instructiuni conditionale si bucle in Pascal
La inceputurile informaticii, programarea se facea mai mult dupa ureche, programatorul fiind liber sa foloseasca orice structuri oferite de limbajul de
programare in care lucra, fara sa tina cont de posibilitatea ca un alt programator ar avea mari dificultati daca ar incerca sa corecteze / dezvolte
programul facut de el. Salturile neconditionate (GOTO) si structurile cu mai multe puncte de intrare sau iesire erau un lucru foarte obisnuit.
In mai 1966, Bohm si Jacopini au demonstrat ca orice algoritm poate fi compus din numai trei structuri de calcul:
- structura secventiala
- structura alternativa
- structura repetitiva
In 1968, Dijkstra a publicat un articol denumit "Un caz impotriva structurii GOTO" (A Case against the GO TO Statement), care de fapt este
metodologia a ceea ce astazi numim programare structurata.

Programarea structurata este, in conceptia celor mentionati mai sus, cel mai simplu mod de a crea un program care este usor de inteles si usor de
corectat / dezvoltat. In ultima instanta, este modul prin care putem face ce ar denumi un prieten de al meu prin initialele K.I.S.S. (keep it simple,
stupid) - se simte el, daca vrea
Sa luam cele trei structuri de mai sus in ordine.
Structura secventiala
Este cea mai usoara structura intalnita intr-un program. In programul de mai jos (care face suma a doua numere citite de la tastatura) :
Cod:

var a, b : integer;
begin
write('Dati a: '); readln(a);
write('Dati b: '); readln(b);
write('Suma celor doua numere este ', a+b);
readln;
end.
, nu intalnim alta structura de calcul decat cea secventiala. Cu asta vreau sa spun ca toate instructiunile vor fi folosite, pe rand, in ordine, fara ca
vreuna din instructiuni sa se repete. Suna ca o reteta usoara de mancare, nu ? Exact asta si este.
Structura alternativa
Este o structura de calcul care permite, in functie de anumite conditii, executarea (sau neexecutarea) unei anumite instructiuni sau secventa de
instructiuni. Programul de mai jos vrea sa faca suma a doua numere, in afara de cazul in care primul numar este 0 (zero), caz in care aduna al doilea
numar cu el insusi :
Cod:

var a, b : integer;
begin
write('Dati a: '); readln(a);
write('Dati b: '); readln(b);
If a <> 0 Then write('Suma celor doua numere este ', a+b)
Else write('Suma celor doua numere este ', b+b);
readln;
end.
Deci, am pus o conditie si in functie de ea executam o parte sau alta a codului. Parca suntem in viata. Ne ofera cineva ceva, dar noi nu acceptam
decat daca pretul e mai mic sau egal cu o anumita suma, pentru ca altfel ni se pare prea mare pretul.
Structura repetitiva
Este o structura de calcul care permite, in functie de anumite conditii, executarea unei anumite instructiuni sau secventa de instructiuni de N ori
(unde N poate fi 0, 1 sau mai mult). Programul de mai jos citeste doua numere de la tastatura si va aduna primul numar cu el insusi de atatea ori cat e
valoarea celui de-al doilea :
Cod:

var a, b, suma : integer;


begin
write('Dati a: '); readln(a);
write('Dati b: '); readln(b);
suma := 0;
For b := 1 To b Do
suma := suma + a;
write('Suma este ', suma);
readln;
end.
Este simplu, doar adunam valoarea din A de B ori, altfel spus inmultim A cu B. Totusi, scopul acestui program nu e de a face inmultirea, ci de a
explica structura repetitiva
Aceste trei structuri de calcul s-au dovedit de-a lungul timpul a fi, intr-adevar, singurele strict necesare crearii unui program, motiv pentru care nici
nu o sa explic in aceste tutoriale cum se folosesc, in Pascal, salturile neconditionate (desi exista aceasta posibilitate).

Instructiuni conditionale
Avem la dispozitie doua tipuri de instructiuni conditionale in Pascal: If ... Then ... Else si Case.
Sa incepem cu inceputul.
Structura If ... Then ... Else
Are doua sintaxe, putin diferite. Cea mai obisnuita este mai jos:
Cod:

If conditie Then instructiune1


Else instructiune2;
Conditie este o comparatie sau orice altceva care returneaza o valoarea logica (True sau False), cum ar fi valoare = 5.
Instructiune1 si instructiune2 pot fi orice fel de instructiuni, inclusiv instructiunea compusa.
Atentie:: In cazul folosirii acestei sintaxe, semnul " ; " (punct si virgula) nu numai ca nu este necesar dupa instructiune1, ci este interzis sa fie pus
acolo.
A doua varianta a acestei structuri conditionale este cea in care nu avem ramura de else :
Cod:

If conditie Then instructiune1;


Atentie:: In cazul folosirii acestei sintaxe, semnul " ; " (punct si virgula) este strict necesar dupa instructiune1.
Sa exemplificam aceste structuri prin programul de mai jos:
Cod:

var varsta : integer;


sex : char;
begin
write('Ce varsta aveti ? '); readln(varsta);
write('Sunteti baiat sau fata ? (M / F) : '); readln(sex);
If (sex = 'f') or (sex = 'F') Then WriteLn ('Sex feminin')
Else WriteLn ('Sex masculin');
If varsta > 17 Then WriteLn('Persoana majora');
ReadLn;
End.
Pentru a intelege programul, sa-l luam pas cu pas. Am definit doua variabila, una de tip integer (valoare numerica) denumita varsta si una de tip
Char (un singur caracter) denumita sex.
Dupa citirea de la tastatura a valorilor pentru aceste doua variabile, verificam daca variabila sex e cumva litera F. De remarcat ca am folosit
operatorul logic OR pentru a verifica daca variabila are valoarea f sau F, ambele insemnand faptul ca sexul este feminin, caz in care afisam acest
lucru. Pe ramura de Else, stiind ca sexul nu este feminin, am pus direct afisare ca sexul este masculin, ceea ce nu este tocmai corect. Trebuia facuta o
verificare si daca valoarea variabilei sex este m sau M, pentru a asigura acuratetea programului. In programul de mai sus, daca pentru variabila sex
introducem litera c, progamul va afisa tot "Sex masculin", dar momentan scopul meu nu e de a crea programe fool-proof, ci doar de a va explica
modul de functionare a structurilor conditionale.
Pentru varsta facem o singura verificare, anume daca varsta este strict mai mare decat 17 (adica minim 18), caz in care afisam "Persoana majora"
(pretty self-explaining, nu ?

Sa refacem programul pentru a lua in calcul si alte cazuri (cum ar fi verificarea pentru sexul masculin, varste negative sau peste 150 de ani
Cod:

var varsta : integer;


sex : char;
begin
write('Ce varsta aveti ? '); readln(varsta);
write('Sunteti baiat sau fata ? (M / F) : '); readln(sex);
If (sex = 'f') or (sex = 'F') Then WriteLn ('Sex feminin')
Else
If (sex = 'm') or (sex = 'M') Then WriteLn ('Sex masculin')
Else WriteLn ('Sex necunoscut, probabil neutru');

If (varsta < 0) Then WriteLn ('Persoana care este inca in planuri de viitor')
Else
If (varsta < 18) Then WriteLn ('Persoana minora')
Else
If (varsta < 60) Then WriteLn ('Persoana majora')
Else
If (varsta < 150) Then WriteLn ('Persoana in varsta')
Else WriteLn ('Personaj biblic');
ReadLn;
End.
Dupa cum vedeti, in noul program am luat in calcul ca variabila sex poate reprezenta sex feminin, sex masculin sau un caracter care nu reprezinta
nici unul din acestea doua cazuri. Pentru aceasta, am folosit instructiuni conditionale imbricate (adica una in interiorul alteia). Arata urat, nu ? In
plus, e si destul de greu de inteles.
Cu toate astea, pentru variabila varsta am facut chiar si mai multe verificari, folosind multiple instructiuni conditionale imbricate. E deja mai urat si
chiar si mai greu de inteles. Nu am de facut decat sa va recomand multa atentie cand creati sau recititi programul ... si sa va prezint instructiunea
conditionala multipla, ca o alternativa la instructiunea If ... Then ... Else
Structura Case
Instructiunea Case, denumita si instructiune alternativa multipla, ofera posibilitatea verificarii unei variabile pe un set mai intins de valori, fara a da
dureri de cap la crearea sau recitirea programului.
Sintaxa generala:
Cod:

Case variabila_simpla Of
val_posibile1 : instructiune1;
val_posibile2 : instructiune2;
...
val_posibileX : instructiuneX;
Else instructiuneY;
End;
Sa incercam sa intelegem aceasta sintaxa, care pare a fi ceva mai complicata decat sintaxa instructiunii dinainte.
Variabila_simpla desemneaza orice variabila de un tip simplu de date (vedeti tutorialul anterior). Nu poate fi folosit aici, de exemplu, tipul String,
el nefiind un tip simplu de date.
Val_posibile1, Val_posibile2 si Val_posibileX tin locul unei (sau a mai multor) valori posibile pentru variabila_simpla. Daca valoarea variabilei
variabila_simpla e egala (sau inclusa) cu vreuna din valorile posibile, atunci va fi executat setul corespunzator de instructiuni.
Instructiune1, instructiune2 si instructiuneX pot fi orice fel de instructiuni, inclusiv cele compuse.
Pe ramura de Else avem acelasi lucru ca si la instructiunea If ... Then ... Else, adica o anumita instructiune care se executa in cazul in care valoarea
variabilei variabila_simpla nu se regaseste in optiunile de mai sus (Val_posibile1, Val_posibile2, Val_posibileX). Aceasta ramura, ca si la If ...
Then ... Else, poate ramane nefolosita.
Sa refacem programul de mai sus, folosind aceasta noua instructiune.
Cod:

var varsta : integer;


sex : char;
begin
write('Ce varsta aveti ? '); readln(varsta);
write('Sunteti baiat sau fata ? (M / F) : '); readln(sex);
Case sex Of
'f','F' : WriteLn ('Sex feminin');
'm','M' : WriteLn ('Sex masculin');
Else Writeln ('Sex necunoscut, probabil neutru');
End;
Case varsta Of
0 .. 17
18 .. 60
61 .. 150
151 .. maxint

:
:
:
:

WriteLn
WriteLn
WriteLn
WriteLn

('Persoana
('Persoana
('Persoana
('Personaj

minora');
majora');
in varsta');
biblic');

-maxint .. -1 : WriteLn ('Persoana care este inca in planuri de viitor');


End;
ReadLn;
End.
Dupa cum vedeti, e mult mai usor de folosit si este mult mai clara. Singurul lucru care cred ca mai e necesar sa vi-l explic este ce inseamna, 'f','F' si
18 .. 60. Structura Case, dupa cum am explicat anterior, permite ca, pentru o anumita instructiune, sa verificam mai multe valori posibile. Aceste
valori pot fi scrise una cate una si despartite prin virgula (cum a fost in cazul variabilei sex) sau pot fi scrise ca un sir de valori, in care se ofera
valoarea minima si apoi valoarea maxima, aceste doua valori fiind despartite prin " .. " (doua puncte unul dupa celalalt).
Cam asta ar fi toata partea de instructiuni conditionale in Pascal. Sa trecem la ...
Bucle (instructiuni repetitive)
Buclele (instructiuni de ciclare) sunt niste instructiuni care asigura repetarea pe un anumit numar de pasi a unor anumite instructiuni.
Sa ne imaginam ca vrem sa facem un program care sa afiseze crescator, de la 1 la 20, toate numerele. E destul de simplu sa le afisam cu o
instructiune Write (sau mai multe). Dar sa presupunem ca vrem sa facem acelasi lucru pana la 1.000 ... sau pana la 1.000.000 ... cred ca sunteti de
acord ca ar fi "cam" mult de lucru.
Aici apare nevoia de bucla, pentru a repeta afisarea unui numar (de fiecare data cu o unitate mai mare).
In Pascal, sunt trei tipuri de instructiuni de ciclare: While, Repeat si For.
Bucla While
Sintaxa generala a acestei instructiuni este:
Cod:

While conditie Do instructiune;


Conditie poate fi orice comparatie sau orice altceva ce are ca rezultat True sau False. Se poate apela si
Cod:

While True Do instructiune;


, caz in care nu se poate iesi din bucla din cauza conditiei. Daca nu exista in interiorul acestei bucle o instructiune de iesire (cum ar fi Break), atunci
bucla va fi infinita (nu va mai iesi din ea, programul se va bloca si va trebui terminat cu Ctrl + Break, sau si mai rau, din Task Manager sau reboot).
In general, conditia va face referire la o conditie care va deveni adevarata, pe masura bucla lucreaza sau este o simpla verificare a unui contor, caz in
care putem calcula dinainte exact cate ciclari va face bucla (de cate ori va repeta instructiunile aflate in interior).
De remarcat ca iesirea din bucla se va face doar cand conditia va returna valoarea False. E si destul de usor de inteles asta : While conditie Do
instructiune care in limbaj natural ar suna Cat timp conditia_mea_e_adevarata Fa ceva.
Instructiune poate fi orice fel de instructiune, inclusiv instructiunea compusa.
Sa vedem cum am putea face in Pascal, folosind bucla While, programul de mai sus care afiseaza pana la 20.

Cod:

var cnt : integer;


begin
cnt := 1;
While cnt <= 20 Do
Begin
WriteLn(cnt);
cnt := cnt + 1;
End;
ReadLn;
end.
Sa analizam programul. Prima oara am declarat o variabila de tip integer (care poate lua valori intre -32768 si 32767), care va fi ceea ce denumim
contorul buclei. Initializam contorul cu 1, aceasta fiind prima valoare ce va trebui afisata, apoi afisam contorul, care apoi va fi marit cu o unitate.
Pe masura ce avansam, ajungem cu Cnt = 20. Ce se va intampla atunci : va fi afisat (20), contorul va fi crescut la 21 si programul va reveni la
conditia de la inceputul buclei : este Cnt mai mic sau egal cu 20 ? Evident, nu mai este cazul, motiv pentru care se trece la executarea urmatoarei

instructiuni din program, anume ReadLn.


Sa vedem cum am putea face programul daca am initializa Cnt cu valoarea 0.

Cod:

var cnt : integer;


begin
cnt := 0;
While cnt < 20 Do
Begin
cnt := cnt + 1;
WriteLn(cnt);
End;
ReadLn;
end.
Ok, ar trebui sa fie evident. Tot ce am facut a fost
[list][*]sa schimb conditia de iesire din bucla, din <= in simplul <
[*]sa inversez instructiunea de crestere a contorului cu cea de afisare[/list]
De ce am facut asta ? In primul rand, trebuia sa inversam instructiunile, fiindca altfel ar fi inceput afisarea cu 0, nu cu 1, cum se cerea. Cealalta
modificare se refera la faptul ca in momentul care am afisat 20, trebuie iesit din bucla. Inca un ciclu (determinat de o conditie cnt <= 20 ar rezulta in
afisarea lui 21, lucru pe care iar nu-l vrem.
Cred ca acum ati inteles cum sta treaba cu While, so ... next one
Bucla Repeat
Sintaxa general a instructiunii Repeat este:
Cod:

Repeat
instructiune;
until conditie;
Spre deosebire de While, iesirea din aceasta bucla se face atunci cand valoarea conditiei este True. Pentru o bucla infinita se va folosi:
Cod:

Repeat
instructiune;
until False;
De remarcat ca instructiune nu e necesar sa fie instructiune compusa. Cu alte cuvinte, nu este necesar sa puneti Begin ... End pentru a delimita
bucla, acest lucru fiind facut de Repeat ... Until.
Sa rescriem programul initial folosind aceasta instructiune.

Cod:

var cnt : integer;


begin
cnt := 1;
Repeat
WriteLn(cnt);
cnt := cnt + 1;
Until cnt > 20;
ReadLn;
end.
De remarcat conditia de iesire din bucla, care este exact opusul celei folosite in cazul buclei While (desi e destul de simplu de inteles, avand in
vedere motivele terminarii fiecarei bucle).
Singurul lucru care il am de adaugat (fiindca e destul de usor de inteles, avand in vedere explicatiile anterioare) e faptul ca dupa ce cnt are valoarea

20 si este afisat, va fi crescut cu 1 (devenind 21), caz in care conditia devine adevarata (cnt > 20), motiv pentru care se iese din bucla.
Daca am initializa contorul cu 0, programul ar fi asa:

Cod:

var cnt : integer;


begin
cnt := 0;
Repeat
cnt := cnt + 1;
WriteLn(cnt);
Until cnt >= 20;
ReadLn;
End.
Din nou, avem conditia de la While, dar inversata. Cam asta ar fi si Repeat-ul ... easy, nu ?
Atentie: Inversa conditiei > este <=, iar a conditiei < este >=.
Bucla For
Sintaxa generala la For cunoaste 2 cazuri (crescator sau descrescator):
Cazul crescator:
Cod:

For contor = val_initiala To val_finala Do instructiune;


Cazul descrescator:
Cod:

For contor = val_initiala DownTo val_finala Do instructiune;


Motivul pentru care avem aceasta distinctie e faptul ca nu mai avem direct controlul asupra contorului buclei, acesta fiind crescut / scazut de bucla,
scapandu-ne astfel de o grija. Din pacate, in felul acesta nu putem decat sa mergem cu pasi de cate o unitate (crescator sau descrescator). In cazurile
While sau Repeat, puteam creste contorul cu cat vroiam noi (am ales sa-l cresc cu 1 doar pentru exemplificare).
Dupa cum ati observat, aici nu mai avem nici o conditie de iesire din bucla. Iesirea din aceasta bucla se face in momentul in care val_initiala devine
mai mare / mai mica cu o unitate decat val_finala. De asemenea, daca se folosesc sintaxa cu To se sare peste bucla in cazul in care val_initiala este
mai mare decat va_finala si invers.
De remarcat e faptul ca nu mai trebuie sa initializam contorul inaintea buclei (il initializam de fapt direct in bucla).
Programul de mai sus, scris cu o bucla For ar arata in felul urmator:
Cod:

var cnt : integer;


begin
For cnt := 1 To 20 Do
WriteLn(cnt);
ReadLn;
End.
Dupa cum vedeti, contorul nu prea mai e in grija noastra (iar unele compilatoare chiar dau eroare daca veti incerca sa-i modificati valoarea in
interiorul buclei).
Sa incercam acum sa lucram cu varianta descrescatoare pentru a face acelasi program ;
Cod:

var cnt : integer;


begin
For cnt := 20 DownTo 1 Do

WriteLn(20 - cnt + 1);


ReadLn;
End.
Ok, programul merge ... dar de ce am pus formula aceea ciudata acolo ? Trebuie sa tineti cont de faptul ca acum contorul merge de la 20,
descrescator, spre 1, exact invers de cum ne-am obisnuit, asa ca prima valoare a lui cnt este 20. Pentru prima afisare, daca scadem 20 din 20 si
adaugam 1 (ca in formula), ne da 1, exact ce trebuie afisat. Sa incercam pentru cazul in care cnt este 2 ... 20 - 2 + 1 = 19, deci asta e penultimul
numar care va fi afisat, ultimul fiind, evident, 20.

S-ar putea să vă placă și