Documentos de Académico
Documentos de Profesional
Documentos de Cultura
htmlTABLOURI
UNIDIMENSIONALE
Structura de date este o colecie de date nzestrat cu informaii structurale care permit identificarea i selecia componentelor. Componentele unei structuri de date pot fi identificate si selectate fie prin numele, fie prin intermediul relaiilor structurale. Cea mai simpla relaie structurala este poziia fiec rei componente in cadrul structurii. Asupra unei structuri de date se pot aplica mai multe tipuri de operaii :vizualizarea elementelor structurii sub diferite forme, actualizarea(adugarea, modificarea sau tergerea unei componente), mbogirea structural(prin adugarea unor informaii de legtura) sortare(aranjarea componentelor intr-o anumita ordine stabilita de un anumit criteriu de ordonare. Din punct de vedere al coninutului, structurile pot fi: -omogene(toate componentele structurii sunt de acelai tip) -neomogene(componentele structurii sunt de tipuri diferite) in funcie de modul in care sunt memorate structurile de date se mpart in doua mari categorii: -Structuri interne, sunt create in memoria interna RAM a sistemului, i au un caracter temporar, datorit faptului ca memoria interna este volatila. -Structuri externe, sunt depozitate pe un suport de memorie externa (hard-disk.floppy-disk), avnd astfel un caracter permanent.
TABLOURI
Un sir de elemente de acelai tip, n care conteaz ordinea elementelor, se nume te vector sau tablou unidimensional. Un tablou(array) este o structura formata dintr-un numr fixat de componente de acela i tip, numit tip de baza. Numrul de componente este determinat de numrul de valori ale indicilor, care sunt obligatoriu tipuri ordinale. Poziia unui element se mai numete si indicele sau rangul elementului, iar elementele se mai numesc si componente ale vectorului. Sintaxa declarrii tipului tablou este : type_nume=array[tip_ordinal1,......tip_ordinaln] of tip_oarecare unde: n-reprezinta dimensiunea tabloului tip_ordinal1,...tip_ordinaln reprezinta tipul indicilor tabloului
tip_oarecare reprezinta tipul componentelor tabloului !Obervatii.In cazul in care tip_ordinal este unul din tipurile intregi,este obligatoriu sa folosim subdomeniile lui Exemplu: type vector=array[1..100] of integer; var v:vector; variabila v este un tablou de dimensiune 1 cu 100 componente intregi identificate prin indici din subdomeniul 1..100. Aici tipul ordinal este subdomeniu al tipului integer, iar tipul oarecare este ineger. Componentele unui tablou sunt memorate pe zone de memorii consecutive. Adresarea unei componente a tabloului se face prin indice (o valoare a tipului ordinal) care se specifica dup numele tabloului, ntre paranteze drepte. Tipul tablou array[tip_ordinal] of tip poate rmne si anonim. Astfel, putem scrie ceva de genul type vector=array ...si var x:vector pe scurt prin var x:array...Adic , tipul tablou r mne anonim, nu trebuie neaprat s primeasc un nume(aici cel de vector). tip_ordinal si tip pot fi att tipuri anonime, ct si identifictori de tip. Limbajul Turbo Pascal nu ne permite sa declaram o variabila de tip array cu un num r variabil de componente. De multe ori nu tim cate componente vor fi necesare pentru o anumita rulare a programului. Orice problema n care se lucreaz cu variabila de tip array si in care se cere prelucrare a n componente constituie un exemplu in acest sens .In acest caz ideea este sa rezervam un numr maxim de componente, att cat este necesar pentru rulare atunci cnd n este maxim. la fiecare rulare a programului se cere numrul de componente. De cele mai multe ori o parte dintre cele rezervate rmn neutilizate. Prin declararea unui vector vom nelege numrul maxim de elementele acestuia. Num rul elementelor efective folosite, care difer de la o execuie la alta se numete numr real (efectiv de elemente). "Vizualizarea" tuturor elementelor pe rnd si prelucrare acestora se numete parcurgere. Parcurgerea intr-un ciclu poziiile elementelor din vector i=1,2,3,...,n si pentru fiecare valoare a lui i, "vizitm" si prelucram elementul v[i], adic elementul aflat pe poziia i: secven a de program for i:=1 to n d0 <prelucrarea v[i] urmarirea ciclului pas cu pas Pasul 1:i:=1,prelucreza v[1] Pasul 2:i:=2,prelucreza v[2] ------------------------------------Pasul n:i:=n,prelucreza v[n]
OPERAII CU VECTORI O variabila de tip tablou nu poate fi citita sau scrisa in ntregime. In Turbo Pascal7.0 Se pot face atribuiri intre variabile de acelai tablou. Dar, e preferabil sa se lucreze pe componente .Cu componentele unui tablou Se pot face toate operaiile ce Se pot face cu orice variabil de acel tip (afiare, citire, atribuire etc) 1.citirea unui vector Aceasta nseamn citirea numrului n de componente, intr-un ciclu for, de pilda. De fapt avem de citit componenta numrului i, cu i de la 1 la n. Deci putem scrie: for i:= 1 to n do begin write('dati x[',x,']='); readln(x[i]); end; 2.Srierea unui vector cnd trebuie sa afim vectorul, adic toate componentele sale efective numrul acestora este cunoscut. Afiarea se realizeaz ciclic si poate fi astfel: -fiecare element pe un rnd(folosita mai ales cnd avem vectori si iruri de caractere) for i:1to n do writeln(x[i]); -toate elementele pe acelai rnd, desprite de virgula si/sau spatii(in cazul valorilor numerice) for i:=1 to n do write(x[i],','); writeln; 3.inversarea unui vector in alt vector vom inversa vectorul x in vectorul y, de acelai tip cu x, deci vom pune in componenta y[1] pe x[n],in componenta y[2] pe x[n-1]...,im componenta y[n] pe x[1] for i :=1 to n do y[i]:=x[n+1-i] 4.inversarea unui vector in el insasi
Va trebui sa schimbam prima componenta cu ultima,pe a doua cu penultima s.a.m.d.,pana la mijloc vom intelege n div 2 indiferent daca n este par sau impar.Asadar,va trebui sa parcurgem vectorul pana la n div 2 intershimband pe x[i] cu x[n+1-i]; for i:=1 to n do div 2 do begin aux:=x{i]; x[i]:=x [n+1-i]; x[n+1-i]:=aux; end; 5.determinarea elementului minim dintr-un vector Aceasta problema se rezolva astfel:consideram minim primul element,apoi parcurgem restul vectorului si,ori de cate ori gasim un element mai mic actualizam minimul la valoarea acelui element minim:=x[1] for i:=2 to n do if x[i]<x[1] then minim:=x[i]; In acest moment,la sfarsitul ciclului,variabila minim(de acelasi tip ca si componentele x) contine cel mai mic element din vector 6.determinarea elementului maxim dintr-un vector Se actualizeaza maximul intr-o variabila max.Algoritmul este asemanator cu cel de minim.Initializam maximul cu primul element.Parcurgem intr-un ciclu pozitiile celorlalte elemente i pentru fiecare element v[i],daca v[1] mai mic decat v[i],atunci v[i] devine noul maxim. 7.determinarea simultana a minimului si maximului dintr-un vector Pentru a realiza aceste lucruri simultan se procedeaza dupa cum urmeaza: minim:=x[1];maxim:=x[1]; for i:= 2 to n do begin if x[i]<minim then minim:=x[i] if x[i]>maxim then maxim:=x[i] end; Evident daca vectorul contine doar un singur element acela va fi si maxim si minim
8.insumarea componentelor unui vector de numere Suma componentelor unui vector se calculeaza ca orice suma,se pleaca cu suma nula,apoi la fiecare pas i (i de la 1 la n),suma creste cu elementul curent,care este x[i]. suma:=0; for i:= 1 to n do suma:=suma+x[i]; 9.Afisarea elementelor pare dintr-un vectorde numere intregi. sa consideram var x:=array{1..20] of integer,si var n,i:integer.Vom parcurge vectorul si vom afisa doar numerele pare: for i:=1 to n do if not odd(x[i]) then writeln(x[i]) 10.afisarea elementelor impare de pe pozitii pareale unui vector de intregi Vectorul are componentele intregi.Consideram aceleasi variabile ca si la problema anterioara.Daca spunem pozitie trebuie sa ne gandimla indice,iar dac spunem element trebuie sa ne gandim la elementul de pe pozitia i,deci la x[i].Asadar va trebui sa avem not odd )i)si oddx[i] for i:=1 to ndo if (not odd[i]) and odd(x[i]) writeln(x[i]) 11.numararea elementelor negative si a celor pozitive dintr-un vector de numere. Fie NN Si NP cele doua numere.Acestea se comporta ca doua contoare,initial nule,De fiecare data cand gasim in sirul de numere un element negativ se incrementeazaNN,NN:=NN+1,altfel NP. NN=0;NP=0; for i:=1to n do if x[i]<0 then inc(NN) else inc(NP); writeln('Exista',NN,'elemente negative'); writeln('Exista,'NP',elemente pozitive'); 12cautare secventiala a unui element intr-un vector
Aceasta problema necesita pentru a putea fi reolvata si o parcurgere a vectorului de la prima pozitie pana la sfarsit sau pana s-a gasit elementul cautat.Gasirea elementului cautat este marcat de o variabila logica gasit,pozitionata initial pe fals.Fie x vectorul,iar a elementul cautat gasit:=false; i:=1 while(i:=n) and (not gasit) do if x[i]:=a then gasit:=true else inc(i) 12.inserarea unui element dintr-un vector. sa inseram,pe poozitia p intr-un vector,un element nou m.Pentru aceasta vom deplasa elementele de pe pozitiile de la p la n,unde n ete numarul de elemente ale vectorului,cu o pozitie mai incolo spre dreapta.Deplasare se vaface de la pozitia ultima inspre pozitia p.In final vom pune elementul m pe pozitia p.Fireste numarul de elemnte ale vectorului vor creste cu o unitate:n:=n+1 for i:=n+1 downto p+1 do x[i]:=x[i-1]; x[p]:=m; n:=n=1; Ordonarevectorilor Metoda seleciei directe. Consideram ca avem un vector de elemente comparabile intre ele, s ordonam cresc tor elementele vectorului. Metoda este urmtoarea il punem pe cel mai mai in fata ,apoi procedam la fel cu restul elementelor .Aceasta metoda se implementeaz astfel: vom compara pe x[1] cu toate elementele de dup el. Dac gsim un element x[j] care e mai mic dect x[1],atunci interschimbam pe x[1] cu x[j] .Cnd am ajuns la ultimul element nseamn ca pe prima pozi ie va fi sigur cel mai mic element din vector(noul x[1]) in continuare, ne ocupam doar de elementele de pe pozi ia doi ncolo si vom parcurge vectorul pana la x[n] ca si in primul caz. Aceste traversri ale vectorului ,nso ite de eventualile interschimbari au loc pana la penultima poziie, cnd mai are loc doar o singura comparare, intre x[n-1] si x[n] Metoda bubble-sort se compara fiecare element x[i] cu elementul de pe poziia succesoare, deci cu elementul x[i+1].Daca elementele nu sunt puse in ordine cresctoare, se vor schimba intre ele. Procesul se repeta pana cnd la o traversare a lui x nu mai are loc nici o interschimbare Sortare prin numrare
Pentru fiecare element din vector se numra cate elemente mai mici dect el exista in vector. program ordonare alfabetica; var x:array[1..20] of string; i,j,n:integer;aux:string; begin write ('cati elevi sunt?='); readln ;
for i:=1 to n do; begin write('nume elev x ',i,':'); readln(x[i]); end; for i:=1 to n-1 do for j:=i+1 to n do if x[i]<x[j] then begin aux:=x[i];x[i]:=x[j];x[j]:=aux; end; writeln ('ordinea alfabetica este:'); for i:= 1 to n do writeln(i,'',x[i]); readln; end. Interclasareaa doi vectori Presupunem ca dispunem de doi vectori( eventual de dimensiuni diferite) ordona i, s ob inem vectorul reuniune ordonat. Fie a si b doi vectori, iar in vectorul c sa punem rezultatul. Vom proceda in felul urmtor 1 vom compara primul element din vectorul a cu primul element din vectorul b si pe cel mai mic l vom pune in c, eliminndu-l din vectorul de unde provine; 2 procesul se repeta pana cnd se epuizeaz unul din vectori;
3 Se copiaz la sfritul lui c toate elementele din vectorul rmas neterminat, care firete vor fi deja ordonate, ct i mai mari ca ultimul element din vectorul care s-a epuizat primul. Cutarebinara Cutarea binara se folosete pentru a determina existenta unui element intr-un vector. Dac elementele vectorului sunt deja ordonate cresctor sau descresctor, atunci procesul c ut rii poate deveni mai rapid, daca se aplica cutarea binara . Se compara elementul cuta cu elementul din mijloc si, daca ele nu coincid, se va trece la c utare doar in acea jumtate a vectorului in care in mod logic, elementul cutat s-ar putea gsi, in stnga sau in dreapta, dup cum elementul din mijloc este mai mare sau mai mic dect elementul c utat s.a.m.d. pana cnd domeniul in care trebuie sa mai caute sa terminat.
PROGRAM nouasuma-.
const n2-777. var a,array(<..n) of integer. i,suma,integer. begin suma,27. 5 initiali!are suma 6 for i,2< to n do begin read(a(i)). suma,2suma3a(i). end. /rite(suma). end 5nouasuma-6. 4e pune urmtoarea ntrebare, a ost necesar de inirea unui array; =aspunsul este, nu. Argumentul este simplu - nu a ost e>ploatat proprietatea de acces direct a array-ului. Pentru aceast problem, soluia pre erat este cea ilustrat n programul pre!entat mai #os, care olose$te o singur variabil de intrare a, PROGRAM suma. var s,a,integer. begin s,27. while NOT eo do begin read(a). s,2s3a. end. /rite(s). end 5suma6. 3. Managementul indicilor Presupunem c a este de tip array (7..n) of integer. unde n este o constant, iar i unnteger. Pentru a atribui iecrui element a(i) valoarea indicelui este usor.
for i,27 to n do a(i),2i. Pentru a atribui iecrui element a(i) valoarea n-i procedam ca n e>emplul urmator, Exemplu: for i,27 to n do a(i),2n-i. for i,27 to n do a(n-i),2i. "n iecare ca! a trebuit s descoperim cte o relaie ntre a[i], a[n-i] $i i $i ntre a[i] $i n-i. 1ata un e>emplu mai interesant. Presupunem c procedura exchan e este corespun!tor de init ca un array ce conine cteva valori $i c dorim s inversm ordinea acelor valori. a[!]"-#a[n] a[$]"-#a[n-$] a[%]"-#a[n-%] =elaia dintre indicii succesivi este u$or de stabilit, a[i]"-#a[n-i] 'ar ce limit superioar ar trebui s ie olosit de ciclul for ast el nct s minimali!m numrul de sc9imbri necesare ; 8>primarea din e>emplul urmator, dupa cum se poate constata u$or, nu ace mai nimic& Exemplu: for i,27 to n do exchange(a(i),a(n-i)). +eea ce ne trebuie este soluia urmtoare, care lucrea! att pentru o valoare para a lui n, ct $i pentru o valoare impar. Exemplu: for i,27 to (n-<) &i' ? do exchange(a(i),a(n-i)). 8>emplele pre!entate sunt tipice utili!rii array-ului cu o dimensiune. +9eia succesului const n managementul indicilor.
ntroducere
Avantajele folosirii unui limbaj puternic tipizat sunt apreciate de orice programator experimentat. Printre ele sunt:
uureaz nelegerea programului de ctre om; ncurajeaz o gndire i formulare disciplinat a problemei; uureaz munca de optimizare a compilatorului; permit depistarea erorilor ntr o faz timpurie.
!n limbaj se numete ""puternic tipizat## dac n faza de execuie a unui program nu pot aprea erori cauzate de tipuri incorecte ale expresiilor. Acest articol i propune s explice ntr un cadru ct se poate de riguros o colecie foarte simpl de fapte care descrie semnificaia noiunii de ""tip de date##.
ipuri enumerate
Pascal pune la dispoziie programatorului mai multe mecanisme prin care el s i construiasc noi tipuri. (el mai simplu dintre acestea este enumerarea. $numerarea construiete un nou tip cu un numr finit de elemente descriind ntre paranteze reprezentarea canonic a fiecrui element. $xemplu ,tipic- :
(rosu, verde, albastru, galben, mov, negru, alb)
este descrierea unui nou tip care are 8 elemente cu reprezentrile Putem da acestui tip un nume folosind directiva type din Pascal.
type
rosu% verde%
etc.
2in punct de vedere matematic am putea scrie culoare 5 6 rosu% verde% albastru% galben% mov% negru% alb 7 +ipul boolean din Pascal ar putea fi definit el nsui astfel:
type boolean ! (false, true)"
2e ce ne este oferit ns de a gata vom afla din urmtoarea seciune i din cele consacrate operatorilor.
ipuri fundamentale
9imbajul Pascal ,standard- conine patru tipuri gata construite. Pe acestea le numim tipuri fundamentale. $le sunt:
real, integer, #ar, boolean
Pentru boolean am vzut boolean 5 6 false% true 7 Pentru integer am putea scrie ceva de genul
limitajos i limitasus depind de dialectul de Pascal folosit. Pentru +urbo ele sunt ,dup cum am zis- -32768% respectiv 32768. Pentru #ar lucrurile sunt grele pentru c exist unele caractere care nu au o reprezentare evident* +ot ce putem spune este c aceast mulime include mulimea
$%a%, %b%, &&&%'%, %(%, &&&, %0%, &&&, %)%, &&&*
a caracterelor care pot fi tiprite. :ar pentru real lucrurile sunt i mai nclcite% pentru c% dei real se dorete o imagine a mulimii ! a numerelor reale% n realitate real este finit i are elementele distribuite ntr un mod foarte ciudat pe axa real ,nici mcar dou elemente ale ei nu sunt ec3idistante-* Aceasta mulime este subiectul analizei numerice% care studiaz cum putem face calcule cnd putem manipula numai aproximri ale valorilor.
"eri#area tipurilor
Pascal ,i nu numai el- pune la dispoziie nite puternice mecanisme prin care putem construi noi tipuri plecnd de la cele existente. ,Prin enumerare putem construi tipuri plecnd de la nimic.- 2erivarea d natere unei noi mulimi de elemente combinnd elementele unor tipuri deja existente. $xist o interesant clas de tipuri numite tipuri scalare. +ipurile boolean, #ar, integer i toate tipurile construite prin enumerare sunt scalare. Aceste tipuri au ntotdeauna un numr finit de elemente i dup cum vom vedea mai trziu% exist ,datorit operatorilor de comparaie- o relaie de ordine total pe ele ,adic dintre dou elemente unul e mai mare i cellalt mai mic- ;.
$u%domeniu
$xist o operaie prin care dintr un tip scalar putem extrage o submulime format din elemente consecutive. $a devine un nou tip care se va numi un subdomeniu,""subrange## n englez- al celui iniial. Pentru c pe tipurile scalare exist o ordine% submulimea se indic prin capetele ei. $xemplu:
1 && 100
este un tip subdomeniu al integer% avnd ;<< de elemente. :at un tip subdomeniu al tipului culoare definit mai sus% cruia i dm i un nume:
type +ul,rimara ! rosu && albastru"
&rticol 'record(
2ac avem la dispoziie tipurile +;% +=% ... +n putem forma un nou tip cu construcia:
re ord 1 - .1" 2 - .2" &&&& n - .n" end
(e mulime reprezint noul tip) & valoare de tip record subsumeaz n valori% fiecare din tipul +i respectiv. (u alte cuvinte putem asimila un record cu un tuplu ,o mulime ordonat- cu n elemente ,v;% v=%... % vn-% unde > dm un nume tipului de mai sus:
type / ! re ord 1 - .1" 2 - .2" &&& n - .n end"
atunci
unde
!n tip construit cu re
nu este scalar.
)ot*: pentru deplina rigoare ar trebui s includem n mulimea ? i numele cmpurilor c;% c=% ...% cn. & definiie complet ar fi: produsul cartezian al tipurilor componente%
avnd fiecare component etic3etat cu numele corespunztor. $tic3etarea se poate defini i ea perfect riguros% dar o lsm pe seama cititorului.
+ector 'matrice(
2ac avem un tip oarecare @ i un tip scalar > ,cu excepia lui integer- putem forma din ele un nou tip cu operaia ,dnd i nume tipului-:
type ' ! array 012 of ("
'u este prea complicat de vzut c asta nseamn A 5 @ x @ x ... x @ 5 @A>A unde produsul este luat de cardinal din > ,numrul de elemente al lui >- ori. Aceasta pentru c un array012 of ( este o colecie de attea valori de tipul @ cte valori conine tipul >. !n tip construit cu array nu este scalar. 'ot: (a mai sus% fiecare component a unui element din produsul @ n este etic3etat cu o valoare corespunztoare din >.
,ul-ime
2ac avem un tip scalar > putem forma tipul ,dac > nu are prea multe elemente-:
set of 1
(e valori are acest nou tip) !n element al tipului set elemente din >. 2eci dac avem declaraia:
type / ! set of 1"
of 1
atunci
adic mulimea prilor lui >. !n tip construit cu set nu este scalar.
.i/ier
Biierul este un tip interesant. $ste prima metod de a construi un tip care teoretic vorbind este infinit* ,+oate tipurile de pn acum sunt finite pentru c sunt
construite prin combinaii finite ale unor mulimi finite-. @ine neles c practic i acest tip este finit% dar cu o dimensiune maxim neprecizat. Biind dat un tip + ,care nu e fiier la rndul su- ce face operaia:
file of .
) !n fiier este asemnator unui array% dar are o lungime neprecizat. $l conine la un moment dat < sau ; sau =% ... valori de tipul +. 2eci dac B e definit
type F ! file of ."
atunci ca mulime
unde ) este mulimea numerelor naturale. ,& astfel de operaie aplicat lui + ,reuniunea tuturor puterilor- se numete operaia lui Cleene% i se noteaz cu +D-.
!ecord cu case
Ajungem la o operaie mai puin omogen de combinare a tipurilor. > considerm directiva Pascal:
type /+ 1 ase v1 v2 end ! re .1" 2 - ( - ( ord .2 of 3 - .3 )" 3 - .3 )"
pentru c o valoare de tip ?( are primele dou cmpuri de tipurile +;% respectiv +=% i un alt cmp dintr unul din tipurile +1 sau +E. :n realitate ?( nu este att de vast% pentru c nu orice combinaie din mulimea indicat este n ?(. (nd cmpul al doilea are valoarea v;% cmpul al treilea nu poate fi de tipul +E* 2eci corect este:
6v;7 este mulimea format din elementul v; aparinnd lui +=. !n astfel de tip nu este scalar.
0ointer
!ltimul mod de derivare a tipurilor n Pascal este prin luarea referinei la ele. !n tip
type ,. ! 4."
are printre valorile sale o valoare special nil% i apoi valori care arat spre valori din tipul +. +ipul P+ este deci izomorf ,corespondent unu la unu- cu tipul + la care se adaug un nou element:
+ipul pointer din Pascal este singurul tip care poate s includ n definiia sa pe sine nsui% ca n:
type ,' ! 4'" ' ! re ord i - 5" n - ,'" end"
'u este nimic contradictoriu n aceast formul* (ele dou mulimi sunt ntr adevr egale% n sensul c fiecare element care se afl n PA este fie nil fie se poate scrie sub forma ,i% pa- unde i .
2e fapt aceasta este definiia ,recursiv- a unei liste ,ai recunoscut probabil tipul PA ca fiind tipul celulei de baz care compune o list simplu nlnuit-: & list ,de tipul :- este sau
)umele tipurilor
Am folosit adesea n exemplele anterioare nume asociate tipurilor cu ajutorul directivei type. n construcia:
type t ! re ord a - array01&&102 of integer" - #ar" end"
/. una care i d un nume acestei construcii: Acestea sunt dou operaii distincte. Fai mult% n Pascal tipurile t i re ord a-array01&&102 of integer" - #ar" end sunt n realitate distincte dei au aceeai structur ,sunt formate prin produsele acelorai mulimi: integer ;< x c3ar Asta putem vedea dac scriem:
var 7, 8- t" y- re ord array01&&102 of integer" #ar" end" -! y
2eci: dou tipuri nu sunt compatibile c3iar dac au aceeai structur. $le trebuie s aib acelai nume% i atunci de fapt sunt o aceeai mulime.
1peratori
.n realitate orice definiie a unui tip ca mulime trebuie s includ i o mulime de operaii pe valorile sale% care iau natere automat odat cu crearea sa. (e este o operaie) Aparent banal ntrebarea nu are un rspuns evident. div este o operaie ntre doi ntregi. (e nseamn asta) $a combin cele dou valori ntregi crora li se aplic pentru a genera una nou. $ste deci o funcie definit astfel:
$a asociaz perec3ii ,a%b- de numere ntregi numrul ""ctul mpririi lui a la b##. este o funcie care nu se poate calcula pentru toate perec3ile de ntregi. 2ac al doilea este < atunci operaia nu are sens. 2eci funcia este parial% adic nu este definit pentru toate valorile posibile ale argumentelor.
div
2e ce sunt tipurile att de legate de operatori) Pentru c crearea unui nou tip prin oricare din operaiile de mai sus d natere n mod automat unor operatori care lucreaz cu valori din acel tip. 2e exemplu definirea unui tip enumerare ca cel uloare de mai sus d natere urmtorilor operatori:
operatori
9 : 9! :! 9: ! su pred ord
culoare
integer
:at mai jos pentru fiecare tip ce operatori are ,dac este fundamental- i cror operatori le d natere:
boolean
operatori
! 9: 9 : 9! :! boolean and or not su pred ord integer boolean boolean boolean boolean
operatori
su pred ord
! 9: 9 : 9! :! integer
x integer integer
boolean
operatori
! 9: 9 : 9! :! su pred ord #r real
x #ar
operatori
; - = <
x real x real
real boolean
! 9: 9 : 9! :! real
= array[S] of B
+x>
-.
= set of S
+ +
,discutabil- >
0s, s1,
unde
-.
R = record e1:T1; ... en:Tn; end
domeniu de valori
? x mulimea etic3etelor
r&e
unde
unde
.-
= file of T
unde
.-
.n plus pe lng operaiile descrise anterior o valoare din orice tip poate fi atribuit ,-!- unei variabile de acelai tip ,cu excepia fiierelor-.
0olimorfism /i supra2nc*rcare
2up cum vedei anumii operatori sunt definii pentru mai multe tipuri. 2e exemplu su merge pe orice tip scalar% dnd un rezultat de acelai tip. n realitate i sunt doi operatori diferii dar care au acelai nume. !n astfel de operator% care funcioneaz pe mai multe tipuri de date simultan i a crui comportare depinde de tipul la care se aplic se
numete suprancrcat. Adesea astfel de operatori sunt binevenii% adesea ns pot s dea natere la probleme. 2e exemplu teoretic exist patru operatori H astfel: H : integer x integer I integer H : real x real I real H : integer x real I real H : real x integer I real
+oi acetia sunt suprancrcri ale lui H. ,(a s nu vorbim de folosirea lui H ca reuniune de mulimi-. Putem s aplicm unul i s ne gndim la altul% cum ar fi n urmtorul exemplu:
var i,> - integer" r - real" i -! > ; r"
&ri asta nu se poate% pentru c aici H este presupus a fi H : integer x real I integer care nu exist* $xist un gen special de operatori care seamn cu cei suprancrcai dar care nu sunt suprancrcai ci polimorfici. 2istincia ntre ei nu este cteodat foarte precis. .n Pascal la acest titlu aspir de pild operatorii "" &## ,pentru selecie-% ""02## ,pentru indexare-% etc. 2e ce) Pentru c operatorul 02 este definit pentru orice tipuri /,
/ ! array 012 of ( 02 - / 7 1 -: ( 1, (:
i opereaz la fel independent de natura tipurilor 1 ,scalar- i (% extrgnd din valoarea de tipul / ,un arraJ- pe cea etic3etat cu valoarea dat de tipul 1. Putem spune c 02 este un singur operator% oricare ar fi tipul / format ca mai sus. 02 este atunci un operator polimorfic pentru c lucreaz cu mai multe tipuri dar n exact acelai mod. ,> observm c mai exist un operator notat tot cu 02 pentru construit mulimi% care este tot polimorfic* (ei doi operatori sunt distini dup modul n care se scriu n expresie. Acesta este tot o suprancrcare*-
.ootnotes ... mic-; ?aportul Pascal marc3eaz i tipul real ca fiind scalar% dar din motive de omogenitate noi nu l vom considera astfel% pentru c el nu se comport n nici o privina ca un tip scalar
Un program in limbajul Pascal contine o descriere a actiunilor ce trebuie sa fie executate de calculator si o descriere a datelor ce sint manevrate de aceste actiuni. Actiunile sint descrise prin instructiuni, iar datele prin declaratii sau definitii. Prin tip de date intelegem o multime de valori. Se disting trei categorii de tipuri de date: simple elementare; compuse structurate; de referinta pointer.
In general, tipurile de date sint definite explicit prin declaratii type iar operatiile asociate prin declaratiifunction sau procedure sint specifice programului in care apar. xista insa tipuri de date elementare de interes mai general, numite tipuri predefinite. !alorile unui tip de date sint referite prin variabile sau constante. Anumite constante sint predefinite. type I " #; unde I este un identificator numit numele tipului, iar # specificatia sa. $eclaratia variabilelor este precedata de cuvantul c%eie var , a constantelor de cuvant c%eie const , iar a etic%etelor, de cuvant c%eie label . &umele I poate fi folosit pentru referirea la tipul # in declaratiile ulterioare de variabile sau pentru definirea altor tipuri. xista tipuri de date anonime, definite implicit prin declaratii de variabile de forma: var v ' ( , ).. , v ' n : # ; x: label (, (* ; type bin " * . . ( ; var bit : bin ; cifra : * . . + ; const ,ero " * ; var i : integer ;
etic%etele ( si (* , tipul bin cu elementele * si (, variabila bit de tipul bin, variabila I de tipul predefinit integer precum si constanta zero avand valoarea *. #ipuri de date simple si predefinite. #ipurile simple sant de trei categorii: predefinite, subdomeniu. #ipurile simple se mai numesc si tipuri scalare. enumerare si
xista cinci tipuri de date predefinite: integer , real , boolean , char si text. Tipul integer este o multime de numere intregi cuprinse intre cel mai mic si cel mai mare numar intreg ce se pot repre,enta pe un calculator ga,da al limbajului. xemplu: elementul -(- al tipului integer poate fi repre,entat prin literele -(- sau -(./. 0ie x repre,entarea in ba,a 1 a unui numar intreg . 2epre,entarea in cod complementar a lui x este:
unde ba,a b a sistemului de enumeratie, limitele l si l ale exponentului e si numarul n 3 (. xemplu: b"1, -(145e 5 (1. iar n " 16. lementele tipului real se repre,inta in programe prin literale numerice de formele i . f , i . f s sau i s , eventual precedate de semnul 3 sau - , unde i si f sint numere ,ecimale intregi fara semn repre,entand partea intreaga si respectiv partea fractionara a literalului numeric. xemplu : -*,1- al tipului real poate apare in programe Pascal in una din formele -*.1-, -1- -1, -1-.* -1. In programele Pascal elementele tipului real se presupun a fi scrise in ba,a (*. 2epre,entarea sau memorarea acestora in calculator se face in virgula mobila pe 1 cuvinte 61 biti 7 simpla preci,ie sau pe 8 cuvinte 98 biti 7 dubla preci,ie. Po,itie binara (- prima din stanga, in notatia u,uala a primului cuvant este a semnului, in po,itiile . 7 (8 ale primului cuvant se memorea,a caracteristica exponentului marit cu (14, iar in rest se memorea,a mantisa partea fractionara fara prima po,itie dupa virgula. :aracteristica este: c" (14 3 e " 1 3 (" (******( Primul cuvant al repre,entarii in calculator este * (******( ******, iar al doilea cuvant **************** in ba,a 1. 2epre,entarea octala este 8*1**, respectiv *. In mod analogic, --.* se va repre,enta prin numerele octale (8*98* si *. :el mai mare numar real repre,entabil in simpla preci,ie este *, (((((((((((((((((((((((( 1 ( 1 (* .
:el mai mic numar real po,itiv repre,entabil este: *,( 1 " 1 (* . intervalul ;<, (= in
&umerele reale de forma *,( x )).. x i,part 1 subintervale de lungime >(- <= ?1 " 1 .
Tipul boolean contine doua elemente referite prin constantele predefinite false si true . @peratiile predefinite ale aceluiasi tip and, or , not definesc o structura de algebra booleana . Tipul char este o multime finita si ordonata de caractere ce contine, printre altele, litere, cifre, si caracterul spatiu.
2epre,entarea interna a unui element de acest tip se face pe ( bAte si are ca valoare codul AS:BII al caracterului respectiv. In implementarea Pascal C si r se calculea,a prin instructiunile urmatoare:
C :" a
div b;
C : " C 3 ( else
C:"C7(
In limbajul standard, C si r se calculea,a prin: C : " a div b; if. >a 5 * = and if b D * r :"a mod b;
else begin C : " C 3 ( ; r : " r 7 1 E b end EXEMP !" begin Friteln > G 4 div 6 " G , Friteln > G -4 div 6 " G , Friteln >G 4 div -6 "G , Friteln >G -4 div -6 "G , Friteln >G 4 mod 6 "G , Friteln >G -4 mod 6 "G , Friteln #G 4 mod 76="G, Friteln >G -4 mod -6 " G, end. 4 div -4 div 4 div -4 div 4 mod -4 mod 6 =; 6 =; >-6= =; >-6= =; 6 =; 6 =;
$peratori rationali u,uali " , 5 D , 5 , 5" , D, D" conduc la re,ultate de tip boolean. @peran,ii pot fi de tip integer prin repre,entari binare bit cu bit. x: not ( este 71 , 9 or 6 este . , 9 and 6 este 1 . Pentru tipurile integer , c%ar si boolean exista functiile succ >succesor= si pred >predecesor=. Pred >c= " c%r >ord >c= 7(= si succ >c= " c%r >ord >c= 3 (=. @peratii si functii predefinite asociate. x: var a : integer ; b : real ; c : c%ar ; d : boolean ; begin c:"GxG; a:"(; b : " (.- ; a : " a 3 trunc > -b= 3 round > b= ; a : " a mod a div a 3 ord > G x G= ; b : " succ >a= 3 b H b - pred > succ >a= =; c : " c%r >ord >c= =; d : " > b 5 " b = and true ; Frite > a , b , c , d = end.
Acum, cind am v!ut care-s dimensiunile pe care le ocupa n memorie, s trecem mai departe Ii s a lm cum putem
stoca o variabil, cum o putem a iIa, atribuire, etc. Rea&ln ,i 0riteln *ulte programe pe care le vom concepe vor interacJiona cu utili!atorul programului. +9iar Ii la un program de tipul, aria unui patrat vom KvorbiL cu utili!atorul programului cerndu-i valoarea laturii patratului. Pentru a putea primi datele corecte, trebuie sa acem pe persoana cu care KvorbimL s nteleag ce dorim. 1n Pascal, avem instructiunea )rite. Tot ce este ntre parante!e va i a iIat undeva. Pentru nceput este bine sa ItiJi c )rite a iIea! mesa#e pe ecranul calculatorului. Atunci cnd vrem s a iIm un te>t vom pune tot Iirul de caractere ntre ? semne apostro . Pentru programul nostru de calculat aria patratului, vom a isa K'ati latura patratuluiL. +um vom ace asta ; )rite+12ati latura patratului3-4 Trebuie reJinut aptul c ntotdeauna dupa instrucJiunea )rite trebuie s punem semnul punct Ii virgula 4 . Acum avem nevoie de valoarea ntrodus de la tastatur. Aceasta valoare o vom stoca ntr-o variabil numita lat. +a s nmaga!inm valoarea ntrodus de utli!ator n variabila lat, avem nevoie de instrucJiunea rea&. +are i spune compilatorului, citeIte ce s-a scris de la tastatura, iar i momentul n care s-a apasat tasta Enter toat linia
ce s-a scris de ctre utli!ator este stocata n variabila pe care i-o indicm noi instrucJiunii rea&. rea&+lat-4 AIadar, dupa ce a ost a iIat mesa#ul K'aJi latura patratuluiL, compilatorul gaseIte instrucJiunea rea& Ii aIteapt pn este ntrodus de la tastatur o valoare Ii se apas tasta Enter. +nd s-a apsat tasta Enter , tot ce s-a scris dupa mesa#ul de mai sus se stoc9ea! n variabila lat. 'ac variabila lat a ost declarat ca iind detip inte er Ii noi introducem de la tastatur altceva decat un numar intreg, vom primi o eroare. Avem, deci, valoarea laturii patratului stocata n variabila lat. Pentru ca programul nostru sa a ise!e aria patratului, trebuie s o calculam. Mormula patratului dupa cum stim este latura N latura . 'eci, vom avea nevoie de o alta variabila numita aria care s stoc9e!e valoarea ariei. Asadar, n variabila aria trebuie sa punem valoarea produsului latura ori latura. Oom avea urmatoarea linie, aria :5 lat 6 lat4 'upa cum observam avem pentru atribuire :5 . Jinia de mai sus se traduce in limba# natural cam aIa, in variabila aria stocam valoarea produsului dintre latura ori latura sau variabilei aria i este atribuit patratul dintre laturi. +e ne mai rmne s acem, trebuie doar s a iIm aria pe care tocmai am calculat-o. 'esigur, vom a isa cu a#utorul instructiunii )rite.
)rite+1Aria patratului e,te 1, aria-4 1ntre parante!e vedem c avem o porJiune ntre apostro uri, o virgula Ii un cuvant. +um va interpreta compilatorul; Trebuie s a iIe! un mesa# -G PAria patratului este Q, apoi ntlneIte virgula Ii spune c urmea! altceva dect un Iir de caractere pe care l-am introdus noi manual, n ca!ul nostru o variabil Ii a iIea! Ii valoarea variabilei aria. 'eci, mesa#ul inal va i PAria patratului este <AR. <A va a isa daca valoarea ntrodus de la tastatura va i C. 4a scriem acum programul inal, pr* ram 'ar be in )riteln+12ati rea&ln+lat-4 aria )rite+1Aria en&8 lat, aria: latura :5 patratului lat e,te 6 1, arie7patrat4 inte er4 patratului3-4 lat4 aria-4
Asupra valorilor de tipul inte er se pot ace urmtoarele operaJii, 1peratori "omeniu de defini-ie "omeniu de #alori ! 9: 9 : 9! :! integer x integer boolean su pred integer integer ord ; - < div mod integer
integer
integer integer
x integer
odd
integer
boolean
Concept de date
Srice algoritm prime$te date de intrare, le prelucrea! $i obine date de ie$ire. "n iecare ca!, datele de intrare, datele intermediare - cele create n timpul prelucrrii - $i datele de ie$ire sunt structurate (organi!ate) ntr-un anumit el care corespunde intrrii, necesitilor de prelucrare sau a celor de utili!are ulterioar. Hotiunea de date are ntelesul de in ormatii urni!ate unui program n scopul obJinerii de noi in ormaJii. "n general, datele se ntroduc sub orma de te>t. Prelucrrile cele mai simple ale acestor in ormatii sunt repre!entate de operatiile de inite asupra lor. S caracteristic important a datelor este tipul acestora.
'e iniJie, Pr* ramul p*ate c*n%ine anumite &ate a c9r*r 'al*are nu ,e m*&i:ica, numite c*n,tante8 +onstantele n limba#ul Pascal sunt de A tipuri, T constante ntregi. T constante reale. T constante caracter. T constante sir de caractere. T constante simbolice. T constante logice. +onstantele ntregi sunt numere ntregi ce pot i repre!entate n ba!a <7 sau <A. +onstantele reale sunt numere reale cuprinse ntre %.CN<7-C%-? si <.<N<7CU%?. +onstantele caracter, orice limba# de programare contine un set de caractere propriu. 4etul de caractere olosit de limba#ul Pascal se numeste setul A4+11 si contine litere, ci re si caractere speciale. +onstantele sir de caracter sunt sirurile de caractere de orice el din setul A4+11, care se pot scrie n ? orme. +onstantele simbolice sunt numele care se pot atribui unor valoriconstante de orice tip. +onstantele logice, - T=U8 va repre!inta valoarea de adevar A'8OV=AT. - MAJ48 W repre!inta valoarea de adevar MAJ4. +onstantele se declara cu a#utorul cuvantul c9eie c*n,t8 const nume 2 valoare. Exemplu: c*n,t P/ 5 38$;4
'e obicei, constantele se notea!a cu litere mari pentru a se di erentia de variabile. 8>ista o categorie de date a cror valoare trebuie modi icata n cadrul programului. Acest lucru se reali!ea!a cu a#utorul variabilelor. 'e iniJie, .ariabila e,te * entitate c9reia i ,-a a,*ciat un i&enti:icat*r &i care p*ate lua 'al*ri c*re,pun<at*are unui anumit tip8 Oariabilele se declara cu a#utorul cuvantul c9eie 'ar. var identi icator, tip. Exemplu: 'ar x: inte er4 +onceptul de tip de date este unul din conceptele undamentale ale programrii. 1n matematic, stiint, te9nic, economie Ii alte domenii ale activitJii umane se lucrea! cu date, care sunt numere ntregi, numere reale, Iiruri de caractere, valori logice sau structuri de date construite cu a#utorul acestora. 4e admite c, att mulJimea numerelor ntregi, ct Ii cea a numerelor reale, sunt mulJimi in inite. 1n programare, se are ns n vedere c este necesar s se respecte anumite restricJii, legate de modul de repre!entare a datelor n calculator. 4 considerm, de e>emplu, mulJimea numerelor ntregi. 1n matematic, aceasta este o mulJime in init. 1n calculator nsa, numarul ntreg se repre!int ntr-o !on de memorie de lungime init, de e>emplu C octeJi (%? biJi), ceeace nseamna c :multimea numerelor de tip ntreg:, care pot i ast el repre!entate, este init, conJinnd ? la puterea %? valori. Trebuie avute n vedere, de asemenea,
restricJiile privind operaJiile care pot i e ectuate pe calculator asupra acestei multimi de valori. =*nceptul &e &at9 n limba#ul PA4+AJ presupune, <. iecare mrime (variabil sau constant) ntr-un program n mod obligatoriu se asocia! cu un anumit tip de date. ?. tipul unei variabile de ineIte mulJimea de valori Ii operaJii care pot i e ectuate cu aceste valori. %. e>ist tipuri de date de interes general, di initia carora se consider cunoscuta, inte er, real, char (caracter), b**lean (logic). C. pe ba!a tipurilor cunoscute, programatorul poate crea tipuri noi.
"n tabelul de mai #os sunt pre!entate tipurile de date real si e>tensiile sale. Tip .al*area .al*area Numar Numar ci:re Minima Maxima *cteti ,emni:icati'e >ingle ?eal 2ouble $xtended (omp ;.0$ E0 =.L$ 1L 0.<$ 1=E =/13; 1.E$1K ;.8$1K ;.8$1<K =/1 ; E / K ;< K 8K ;; ;= ;0 ;/ ;L =< ;K ;L
Asupra valorilor de tip real se pot e ectua operaJiile, 1peratori "omeniu de defini-ie "omeniu de #alori ; - = < real real x real ! 9: 9 : 9! :!
real
x real
boolean
Oariabilele reale sunt caracteri!ate de, domeniul de valori, preci!ie, precum Ii de repre!entare. Speratorii care pot i utili!aJi n cone>iune cu tipul real sunt, 3. -. N. Y Ii repre!int operatiile de adunare, scdere, nmulJire Ii mprJire."ntr-o e>presie reala pot e>ista valori ntregi. 'ac unul dintre operan!i este real, atunci Ii cellalt opernd, va i convertit n mod automat, la tipul real. Oariabila creia i se atribuie re!ultatul unei e>presii reale trebuie sa ie de tip real. Speratorul 0Y0 ortea!a ambii operan!i la tipul real. Programatorul are obligatia de a asigura o preci!ie re!onabil pentru calculele ce intervin n programele PA4+AJ. n acest scop va urmri re!ultatele intermediare.
Pentru datele de tip numeric (real) pot i considerate o serie de unctii speci ice, trunc, round, abs, sZr, sZrt etc.. Ja a isarea valorilor reale trebuie s avem n vedere att preci!ia, ct Ii Iablonul de editare. =ealii nu pot i utili!ati pentru, inde>area tablouri, de inirea tipurilor subdomeniu, mulJime, n enunturile MS= Ii +A48.
Oariabilele de tip b**lean (boolean vine de la numele matematicianului [eorge Doole) pot avea una din valorile prede inite, true(adevarat) Ii :al,e ( als). *odul de repre!entare n calculator este (de regul) !pentru alse Ii $ pentru true ( alse \ true). 8>presiile booleene, precum ! G y, intervin mult mai des n programele PA4+AJ dec]t variabilele booleene declarate n cadrul acestor programe. Hu putine sunt ca!urile c]nd o valoare logic, re!ultat n urma evaluarii unor e>presii booleene urmea! sa ie olosit pentru di erite teste, ca n programul urmator.
pr* ram te,t4 'ar be in )rite +3/ntr*&uceti rea&ln+'ar,ta-4 i: 'ar,ta #5 el,e )riteln+maj*r-4 en&8 'ar,ta $>
maj*r:5true maj*r:5:al,e4
Introduceti varsta dumneavoastra: 14... false Introduceti varsta dumneavoastra: 18 true Introduceti varsta dumneavoastra: 22 true "n acest program, ma#or a ost declarat ca variabil de tip b**lean, prin enunJul, 'ar maj*r:b**lean4 Asupra valorilor de tipul urmtoarele operaJii, Operat*ri ! 9: 9 : 9! :!
b**lean se pot
ace
> boolean
boolean
4 scriem acum programul , pr* ram caractere A@=//4 'ar i, j:inte er4 be in :*r i:5$ t* A &* )rite+i:%,B:B,chr+i-:%,B4B-4 )riteln4 :*r i:5$; t* %3 &* )rite+i:3,B:B,chr+i-:%,B4B-4 )riteln4 rea&ln4 :*r i:5% t* %; &* :*r j:5$!6iC; t* $!6iC$3 &* )rite+j:3,B:B,chr+j-:%,B4B-4 )riteln4 en&4 :*r i:5%D; t* %DD &* )rite+i:3,B:B,chr+i-:%,B4B-4 )riteln4rea&ln4 en&8 Asupra valorilor de tipul operaJii, 1peratori
char se pot
ace urmtoarele
! 9: 9 : 9! :! su pred ord #r
#ar
integer
Miecare caracter are o anumit repre!entare intern -valoarea caracterului Ii o anumit po!iJie. 'in punct de vedere e>tern o valoare de tip char se repre!int prin caracterul respectiv inclus ntre apostro uri. Po!iJia sau numrul de ordine al unui caracter se obJine cu uncJia OR2. MuncJia invers este =ER. 2e exemplu: OR2+BAB- :5 AD4 =ER+AD- :5 BAB4 MuncJiile standard PRE2 Ii @F== se de inesc ast el, PRE2+c- :5 =ER+OR2+c--$-4 @F==+c- :5 =ER+OR2+c-C$-4 +ei A operatori relaJionali se pot se pot aplica pentru a compara operan!i de tip char obt inndu-se re!ultate b**leene.