Tipuri de date simple
13:10
Conceptul de dată
Informația care se păstrează în calculator se numește șir de date.
Data reprezintă o entitate cu care poate opera calculatorul.
Majoritatea limbajelor de programare conțin de introducere a datelor, de prelucrare și de afișare a acestora.
O data se păstreaza in calculator sub formă de variabilă.
Majoritatea limbajelor de programare cer ca variabilele folosite sa fie declarate. La declararea lor se indica 2 caracteristici:
<numele variabilei>:<tipul de date>
Numerele reale de forma 0,1 x …….. x i,part intervalul [½, 1) in 2 subintervale de lungime (1- ½) ∙2 = 2 .
Pentru acest tip de date pot fi utilizate următoarele operații:
Prin tip de date se înţelege modul în care informaţia este reprezentată în memoria
calculatorului. Tipul datei oferă două informaţii esenţiale:
- Mulțimea de valori admisibile;
- Mulțimea de operații care pot fi aplicate la anumite tipuri de date.
- Folosind operația de citire (de exemplu: READ(x));
- Folosind operația de atribuire (<nume variabila> := <expresia>).
Folosirea unor operaţii care nu sunt specifice cu tipul de operanzi, generează o eroare semnalizată la compilarea programului.
La declararea variabilei, tipul de date se indică print-un nume. Și în dependență de acest nume, în memoria operativă a calculatorului se rezervează un anumit spațiu.
TIPUL DE DATE INTEGER
Tipul de date INTEGER se utilizează pentru prezentarea numerelor întregi cu semn.
Exemplu:
VAR A: integer
B: integer
Mulțime de valori admisibile a acestui tip de date se afla pe intervalul
Pentru acest tip de date pot fi utilizate următoarele operații:
TIPUL DE DATE REAL
Tipul real este mulțimea de numere reale
{x |x = + 0 , x x . . . x · b și x sunt cifre în baza b și l < e < l }
unde baza b a sistemului de enumerație, limitele l și l ale exponentului e și numarul n + 1.
Exemplu: b=2, -128<e < 127 iar n = 23.
Elementele tipului real se reprezintă în programe prin literale numerice de formele i . f , i . fEs sau iEs , eventual precedate de semnul + sau - , unde i și f sunt numere zecimale întregi fără semn reprezentînd partea întreagă și respectiv partea fracționara a literalului numeric.
Exemplu: -0,25 al tipului real poate apare în programe Pascal în una din formele -0.25, -25E-2, -25.0E-2.
În programele Pascal elementele tipului real se presupun a fi scrise în baza 10. Reprezentarea sau memorarea acestora în calculator se face în virgulă mobilă pe 2 cuvinte 32 biti – simpla precizie sau pe 4 cuvinte 64 biti – dubla precizie. Pozitie binara 15 prima din stanga, in notatia uzuala a primului cuvant este a semnului, in pozitiile 7 – 14 ale primului cuvant se memoreaza caracteristica exponentului marit cu 128, iar in rest se memoreaza mantisa partea fractionara fara prima pozitie dupa virgula.
Caracteristica este: c= 128 + e = 2 + 1= 10000001
Primul cuvant al reprezentarii in calculator este 0 10000001 000000, iar al doilea cuvant 0000000000000000 in baza 2. Reprezentarea octala este 40200, respectiv 0. In mod analogic, -5.0 se va reprezenta prin numerele octale 140640 si 0.
Cel mai mare numar real reprezentabil in simpla precizie este
0, 111111111111111111111111· 2 1 · 2 10 .
Cel mai mic numar real pozitiv reprezentabil este:
0,1 · 2 = 2 10 .
Numerele reale de forma 0,1 x …….. x i,part intervalul [½, 1) in 2 subintervale de lungime (1- ½) ∙2 = 2 .
Pentru acest tip de date pot fi utilizate următoarele operații:
Operatori
|
Domeniu de definiţie
|
Domeniu de valori
|
+ - / *
|
real x real
|
real
|
= <> < > <= >=
|
real x real
|
boolean
|
TIPUL DE DATE BOOLEAN
Datele de tip Boolean pot avea valorile adevărat sau fals:
Readln – datele nu se introduc de la tastatură.
Writeln – datele de tip logic nu pot fi afişate.
Tabelul de adevăr al operaţiei OR:
- 0 – pentru False
- 1 – pentru True
Declaraţia de tip: <nume>[=<valoare>] [,<nume>[=<valoare>]] : <tip> ;
Declaraţia de tip boolean: <nume>[=<valoare>][,<nume>[=<valoare>]] : boolean;
Exemplu: beta, gamma = true, delta = false : boolean ;
Operaţii corecte şi incorecte
:= – Operaţia de atribuire
Exemplu:
a := True;
b := False;
NOT – operaţie unară, de o singură variabilă. Ea reprezintă operaţia de negare (inversare).
Tabelul de adevăr al operaţiei NOT:
OR – adunarea logică de 2 sau mai multe variabile. Rezultatul este adevărat, dacă măcar o variabilă este adevarată.
AND – înmulţirea logică de 2 sau mai multe variabile. Rezultatul este adevărat, dacă ambelevariabile sunt adevăraţe.
Tabelul de adevăr al oferaţiei AND:
Tipului de date Boolean îi sunt caracteristice următoarele operaţiile relaţionale:
TIPUL DE DATE CHAR
Pentru acest tip de date pot fi utilizate următoarele operații:
type culoare = (rosu, verde, albastru, galben, mov, negru, alb);
culoare = { rosu, verde, albastru, galben, mov, negru, alb }
Tipul boolean din Pascal ar putea fi definit el însuşi astfel:
Operatori
|
Domeniu de definiţie
|
Domeniu de valori
|
= <> < > <= >=
|
char x char
|
boolean
|
succ pred
|
char
|
char
|
ord
|
char
|
integer
|
Tipuri de date ENUMERARE
Pascal pune la dispoziţie programatorului mai multe mecanisme prin care el să-şi construiască noi tipuri. Cel mai simplu dintre acestea este enumerarea. Enumerarea construieşte un nou tip cu un număr finit de elemente descriind între paranteze reprezentarea canonică a fiecărui element.
Exemplu : (rosu, verde, albastru, galben, mov, negru, alb) este descrierea unui nou tip care are 7 elemente cu reprezentările rosu, verde, etc. Putem da acestui tip un nume folosind directiva type din Pascal.
type culoare = (rosu, verde, albastru, galben, mov, negru, alb);
culoare = { rosu, verde, albastru, galben, mov, negru, alb }
Tipul boolean din Pascal ar putea fi definit el însuşi astfel:
type boolean = (false, true);
Pentru acest tip de date pot fi utilizate următoarele operații:
returneaza valorile:
.....49,50,51,...,57.
Efect: incrementeaza variabila data ca prim parametru cu valoarea data de al doilea parametru. Daca nu se precizeaza un al doilea parametru, se realizeaza incrementarea cu o unitate.
Efect: decrementeaza variabila data ca prim parametru cu valoarea data de al doilea parametru. Daca nu se precizeaza un al doilea parametru, se realizeaza decrementarea cu o unitate.
Pentru acest tip de date pot fi utilizate următoarele operații:
Eratori
|
Domeniu de definiţie
|
Domeniu de valori
|
pred succ
|
T
|
T
|
= <> < > <= >=
|
T x T
|
boolean
|
ord
|
T
|
integer
|
Tipuri de date SUBDOMENIU
Există o operaţie prin care dintr-un tip scalar putem extrage o submulţime formată din elemente consecutive. Ea devine un nou tip care se va numi un subdomeniu(``subrange'' în engleză) al celui iniţial. Pentru că pe tipurile scalare există o ordine, submulţimea se indică prin capetele ei.
Exemplu: 1 .. 10 este un tip subdomeniu al integer, avînd 100 de elemente.
Iată un tip subdomeniu al tipului culoare definit mai sus, căruia îi dăm şi un nume:
type CulPrimara = rosu .. albastru;
Tipul numit CulPrimara are 3 elemente:
CulPrimara = {rosu, verde, albastru }.
Tipuri ORDINALE
Tipul de date ordinale cuprinde un domeniu de valori care pot fi ordonate si care pot fi, prin urmare numarate (0, 1, 2, 3...) pâna la valoarea maxima permisa.
Remarca:
În (Borland) PASCAL numaratoarea începe, mai degraba de la 0 decât de la 1; este ceva arbitrar, dar procedeul este obisnuit în stiinta calculatoarelor.
.....ord('1'), ord('2'),..., ord('9')
Exemple:
ord(18)=18
ord(23)=23
Remarca:
Functiile pred si succ pot fi aplicate oricaror date de tip ordinal si vor returna o valoare ordinala de acelasi tip.
returneaza valorile:
.....49,50,51,...,57.
Remarci:
De notat, ca în conformitate cu codul ASCII, orice litera mica are o valoare mai mare cu 32 decât valoarea ordinala a literei mari corespunzatoare.
De exemplu,
ord('D')=68, iar chr(32+68 )='d'.
ord('a') - ord('A')=32
ord('z') - ord('Z')=32
........Deci, putem generaliza:
............literamica:=chr(32+ord(literamare))......
........respectiv:
............literamare:=chr(ord(literamica)-32).
........De exemplu:
............chr(ord('d')-32)=chr(100-32)=chr(68)='D'.
De exemplu:
ord('8')-ord('0')=56-48=8.
|
Exemplu:
......k:=17;
......inc(k);
......
......inc(k,2);
......
|
Exemplu:
......k:=17;
......dec(k);
......
......dec(k,8);
......
| |
Remarca:
Este de remarcat ca apelul procedurilor inc sau dec produce un cod mai bun decât echivalentul:
k:=k+1 sau k:=k-8 (vezi exemplele anterioare). |
Trei din cele patru tipuri de date PASCAL studiate sunt ordinale, si anume: integer, char siboolean. Întregii sunt evident ordinali. Tipul char este un tip ordinal datorita numarului finit al caracterelor si secventei acestora - caracterele sunt ordonate si consecutive. Valorile booleene sunt usor de numarat, din moment ce sunt numai doua; false este zero si true este unu..
Datele de tip real nu sunt de tip ordinal deoarece nici un numar real nu are un predecesor sau un succesor.
Exista patru functii ordinale (predefinite) utilizate frecvent: ord, odd, succ, pred si chr. În completarea functiilor succ si pred, (Borland) PASCAL ofera alte doua proceduri care modifica valorile ordinale: inc si dec.
Functia odd(x) - primeste un argument întreg si returneaza un rezultat boolean, cu valoarea truedaca argumentul (x) este impar (pozitiv sau negativ) si false în caz contrar.
Functia ord(x) - primeste un argument de un tip ordinal si întoarce un rezultat de tip întreg, reprezentând valoarea ordinala a entitatii x. .
În acord cu valorile booleene, ord(false) returneaza 0 si ord(true) are valoarea 1.
Daca pentru functia ord folosim ca argumente întregii, aplicarea acestei functii este fara sens , întrucât ea va returna aceleasi valori (ordinea unui întreg este data de chiar valoarea acelui întreg!). Iata câteva exemple:
Din cauza multitudinii de seturi de caractere folosite, evident nu ne putem astepta ca functia ord('C'), de exemplu, sa returneze aceeasi valoare pe toate tipurile de calculatoare cu care lucram. Ne putem astepta însa ca:
...ord('A') < ord('B')...sau
...ord('d') < ord('e')...sau
...ord('2') " ord('3').
In completarea lui ord, PASCAL-ul are o pereche de functii denimite succ si pred, astfel:
Functia pred(x) - primeste argument de tip ordinal; întoarce un rezultat de acelasi tip ordinal ca si argumentul, reprezentând elementul având valoarea ordinala cu 1 mai mica decât ce a lui x.
Functia succ(x) - primeste argument de tip ordinal; întoarce un rezultat de acelasi tip ordinal ca si argumentul, reprezentând elementul având valoarea ordinala cu 1 mai mare decât ce a lui x.
Este usor de observat ca succ(4) este 5, iar pred(9) este 8, dar aceleasi rezultate le putem obtine si prin adaugarea sau scaderea lui 1 din acel numar al carui succesor sau predecesor îl dorim. Pentru caractere, totusi, lucrurile sunt putin mai complicate ! Evident nu putem adauga 1 unei variabile de tip char, sa zicem aga, dar putem calcula succ(aga) pentru a obtine caracterul a carui valoare ordinala este cu 1 mai mare în secventa comparatoare (în engleza collating sequence).
De exemplu, daca aga este 'c' , atunci succ(aga) este 'd'. Relatia dintre cele doua functii poate fi exprimata astfel:
Functia chr(x) - primeste un argument de tip întreg si întoarce un rezultat de tip char, a carui valoare este caracterul cu numarul de ordine x. Aceasta valoare depinde de implementare.
De exemplu, conform codului ASCII, secventa:
De asemenea, conform codului ASCII, chr(102)='f' si chr(35)='#'.
Deci, numai pentru cazul care implica tipul char functiile ord si chr formeaza o pereche inversa.
.....ord(chr(13))=13, chr(ord('c'))='c'.
Procedura inc - este declarata cu doi parametri formali de tip întreg; al doilea parametru este optional.
Procedura dec - este declarata cu doi parametri formali de tip întreg; al doilea parametru este optional.
Instrucțiunile limbajului Pascal
12:34
Instrucţiuni
Instrucţiuni repetitive:
1.Instrucţiunea repetitivă cu contor
Forma generală:
A) for contor:=val_iniţială_mică to val_finală_mare do instrucţiune;
Se numeşte instrucţiune repetitivă cu contor sau cu număr cunoscut de paşi deoarece este pravăzută cu o variabilă numită contor care pleacă de la o valoare iniţială şi se incrementează în mod repetat până la o valoare finală.Pentru fiecare incrementare a contorului se execută instrucţiuni.Eecuţia instrucţiunii se face de un număr de ori care este cunoscut de la început.
Ex: suma numerelor de la 1 la n(n-citit de la tastatură)
program sumafor_a;
var
n,s,i:integer;
begin
write('n='); readln(n);
s:=0;
for i:= 1 to n do s:=s+i;
writeln('suma este',s);
readln;
end.
B) for contor;=val_iniţială_mare downto val_finală_mică do instrucţiune;
Această formă a instrucţiunii repetitive cu contor este asemănătoare cu prima variantă.Deosebirea constă în faptul că în acest caz contorul pleacă cu o valoare iniţială mai mare şi descreşte prin decrementare în mod automat până la o valoare mai mica.Astfel instrucţiunea se execută în mod repetat pentru fiecare valoare a contorului.
Ex: suma numerelor de la 1 la
program sumafordown;
var
n,s,i:integer;
begin
write('n='); readln(n);
s:=0;
for i:= n downto 1 do s:=s+i;
writeln('suma este',s);
readln;
end.
2.Istrucţiunea repetitivă cu test iniţial
Forma generală:
while(expresie) do instrucţiune;
Cât timp în urma evaluării expresiei se obţine adevărat se va executa în mod repetat instrucţiunea.Dacă încă de la început se obţine fals,în urma evaluării expresiei,atunci instrucţiunea nu se va executa niciodată.Ea este ignorată şi se trece la altă linie de program
EX: suma numerelor de la 1 la n
program sumawhile;
var
n,i,s:integer;
begin
write('n='); readln(n);
s:=0;
i:=0;
while(i<=n) do begin
s:=s+i;
i:=i+1;
end;
write('suma este',s);
readln;
end.
3.Instrucţiunea repetitivă cu test final
Forma generală:
repeat
instrucţiune1;
instrucşiune2;
……………………
instrucşiune n;
until(expresie);
Se repetă execuţia instrucţiunilor de la 1 până la n până când în urma evaluării expresiei se obţine adevărat.Altfel spus instrucşiunile se execută în mod repetat atâta timp cât în urma evaluării expresiei se obţine fals.I se spune instrucţiune repetitivă cu test final pentru că întâi se execută instrucţiunea şi apoi se evaluează expresia.Acesta înseamnă că instrucţiunile se execută cel puţin o dată chiar dacă se obţine adevărat încă de la prima evaluare a expresiei.
Ex: suma numerelor de la 1 la n
program sumarepeat;
var
n,i,s:integer;
begin
repeat
s:=s+i;
i:=i+1;
until(i>n);
writeln('suma este',s);
readln;
end.
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 :
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.
Instructiuni conditionale
Avem la dispozitie doua tipuri de instructiuni conditionale in Pascal: If ... Then ... [Else ... ] si Case.
1.Structura If ... Then ... [Else ... ]
Are doua sintaxe, putin diferite. Cea mai obisnuita este mai jos:
If conditie
Then instructiune1
Else instructiune2;
conditie este o comparatie sau orice altceva care returneaza o valoarea logica (True sau False), cum ar fi suma = 5 ("=" semnifica egalitate, nu atribuire !)
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 :
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:
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 variabile, 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 fara bug-uri, 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".
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 )
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 acestea, 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 ... ]
2.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:
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.
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 : WriteLn('Persoana minora');
18 .. 60 : WriteLn('Persoana majora');
61 .. 150 : WriteLn('Persoana in varsta');
151 .. maxint : WriteLn('Personaj 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).
Sursa: http://pascal-complete.blogspot.com/2011/10/instructiunile-limbajului-pascal.html
Sursa: http://pascal-complete.blogspot.com/2011/10/instructiunile-limbajului-pascal.html
Abonați-vă la:
Postări (Atom)



