Asa cum s-a vazut în lectiile anterioare un program realizeaza o prelucrare de informatie. Termenul de prelucrare trebuie sa fie considerat într-un sens foarte general (de exemplu prelucrarea sepoate referi la un text si consta în afisarea lui). În program datele apar fie sub forma unor constante (valori cunoscute anticipat, care nu se modific?), fie sub forma de variabile. Constantele si variabilele sunt obiectele informationale de baza manipulate într-un program.
Fiecare categorie de date este caracterizata de atributele:
De primele trei tipuri de atribute ne vom ocupa în continuare, urmând ca de atributul clasa de memorare sa ne ocupam mai tarziu.
- Nume;
- Valoare;
- Tip;
- Clasa de memorare.
Numele unei date
Numele unei date este un identificator si, ca urmare,
trebuie sa respecte regulile specifice identificatorilor. Deasemenea, numarul
de caractere care intra în compunerea unui identificator este nelimitat,
însa, implicit, numai primele 32 de caractere sunt luate în
considerare. Aceasta înseamna ca doi identificatori care au primele
32 de caractere identice, diferentiindu-se prin caracterul 33, vor fi considerati
identici.
Tipul unei date
Tipul unei date consta într-o multime de
valori pentru care s-a adoptat un anumit mod de reprezentare
în memoria calculatorului si o multime de operatori care pot
fi aplicati acestor valori. Tipul unei date determina lungimea zonei
de memorie ocupata de acea data. În general, lungimea zonei de
memorare este dependenta de calculatorul pe care s-a implementat compilatorul.
Tipurile de baza sunt:
1. TIPURILE INTREGIIn header-ul <values.h> sunt definite constantele simbolice (cum ar fi: MAXINT, MAXSHORT, MAXLONG, MINDOUBLE, MINFLOAT, etc.) care au ca valoare limitele inferioara si superioara ale intervalului de valori pentru tipurile de date enumerate. (de exemplu MAXINT reprezinta valoarea intregului maxim care se poate memora, etc. )
Obs:
NUME TIP DIMENSIUNE IN BITI DOMENIU unsigned char 8 0..255 char 8 -128..127 unsigned int 16 0..65535 short int 16 -32768..32767 int 16 -32768..32767 unsigned long 32 0..4294967295 long 32 -2147483648..2147483647
a) In C++ nu exista tipul boolean. In acest caz, orice valoare diferita de 0 este considerata ca fiind TRUE si orice valoare 0 este considerata ca fiind FALSE.
b) Tipul caracter este asimilat tipurilor intregi. Memorarea unui caracter se face folosind codul ASCII al acestuia. In operatiile referitoare la caractere ne putem referi atat la caracter cat si la codul sau ASCII (conversia se face automat, in functie de context).
De ex:
char a='c',b=99;
cout<<a<<" "<<b; //Se tipareste de 2 ori caracterul 'c' (care are codul ASCII 99)
cout<<a+101; //Se tipareste 200 (a fost adunat codul ASCII al caracterului 'c' cu 101)2. TIPURILE REALE
NUME TIP DIMENSIUNE IN BITI MAXIMA (in valoare absoluta) float 32 3.4*pow(10,38) double 64 1.7*pow(10.308) long double 80 1.1*pow(10,4932)
Constante
O constanta este un literal (o forma externa de
reprezentare) numeric, caracter sau sir de caractere. Numele si valoarea
unei constante sunt identice. Valoarea unei constante nu poate fi schimbata
in timpul executiei programului in care a fost utilizata. Tipul si valoarea
ei sunt determinate in mod automat, de catre compilator, pe baza caracterelor
care compun literalul.
Constante intregi
Constantele intregi sunt literali numerici (compusi din cifre), fara punct zecimal.
Constante numerice, reale
Daca o constanta numerica contine punctul zecimal, ea este de tipul
double.
Exemplu:
3.1459 //tip double
Daca numarul este urmat de F sau f, constante este de tip float.
Daca numarul este urmat de L sau l, este de tip long double.
Exemplu:
0.45f //tip float
9.788L //tip long double
Constante reale in format stiintific
Numarul poate fi urmat de caracterul e sau E si de un numar intreg,
cu sau fara semn. In acest caz, constanta este in notatie stiintifica.
In aceasta forma externa de reprezentare, numarul din fata literei E reprezinta
mantisa, iar numarul intreg care urmeaza caracterului E reprezinta exponentul.
In forma externa de reprezentare, baza de numeratie este 10, deci valoarea
constantei va fi data de mantisa 10 .
Exemplu:
1.5e-2 //tip double, in notatie stiintifica, valoare 1.5 10
Exercitiu: Sa se scrie urmatorul program si sa se urmareasca
rezultatele executiei acestuia.
#include <iostream.h>
#include <values.h>
#define PI 3.14359
int main()
{
cout<<"Tipul int memorat pe: "<<sizeof(int)<<" octeti\n";
cout<<"Tipul int memorat pe: "<<sizeof(23)<<" octeti\n";
//23-const. zecimala int
cout<<"Int maxim="<<MAXINT<<\n;
//const. simbolice MAXINT, MAXLONG, etc. - definite in <values.h>
cout<<"Const. octala 077 are val decimala:"<<077<<\n;
cout<<"Const. hexagesimala d3 are val decimala:"<<0xd3<<\n;
cout<<"Tipul unsigned int memorat pe:"<<sizeof(unsigned
int)<<" octeti\n";
cout<<"Tipul unsigned int memorat pe: "<<sizeof(23U)<<"
octeti\n";
cout<<"Tipul unsigned int memorat pe: "<<sizeof(23u)<<"
octeti\n";
cout<<"Tipul long int memorat pe: "<<sizeof(long int)<<"
octeti\n";
cout<<"Tipul long int memorat pe: "<<sizeof(23L)<<"
octeti\n";
cout<<"Tipul long int memorat pe: "<<sizeof(23l)<<"
octeti\n";
//23L sau 23l-const. decimala long int
cout<<"Long int maxim="<<MAXLONG<<\n;
cout<<"Tipul unsigned long memorat pe:";
cout<<sizeof(unsigned long int)<<" octeti\n";
cout<<"Tipul unsigned long memorat pe: "<<sizeof(23UL)<<"
octeti\n";
cout<<"Tipul unsigned long memorat pe: "<<sizeof(23ul)<<"
octeti\n";
//23UL sau 23ul-const. decimala unsigned long int
cout<<"Tipul long long int memorat pe: ";
cout<<sizeof(long long int)<<" octeti\n";
cout<<"Tipul long long int memorat pe: "<<sizeof(d)<<"
octeti\n";
cout<<"Tipul short int memorat pe: "<<sizeof(short int)<<"
octeti\n";
cout<<"Short int maxim="<<MAXSHORT<<\n;
cout<<"Tipul float memorat pe: "<<sizeof(float)<<"
octeti\n";
cout<<"Tipul float memorat pe: "<<sizeof(23.7f)<<"
octeti\n";
//23.7f-const. decimala float
cout<<"Float maxim="<<MAXFLOAT<<\n;
cout<<"Float minim="<<MINFLOAT<<\n;
cout<<"Tipul double memorat pe: "<<sizeof(double)<<"
octeti\n";
cout<<"Tipul double memorat pe: "<<sizeof(23.7)<<"
octeti\n";
//23.7-const. decimala double
cout<<"Const. decim. doubla in notatie stiintifica:"<<23.7e-5<<\n;
cout<<Const. PI este:<<PI<<\n;
cout<<Constanta PI este memorata pe:<<sizeof(PI)<<octeti\n:
cout<<"Double maxim="<<MAXDOUBLE<<\n<<"Double
minim="<<MINDOUBLE<<\n;
cout<<"Tipul long double memorat pe: "<<sizeof(long double)<<"
octeti\n";
cout<<"Tipul long double memorat pe: "<<sizeof(23.7L)<<"
octeti\n";
//23.7L-const. decimala long double
cout<<"Cifra A din HEXA are val.:"<<0xA<<"\n";
cout<<"Cifra B din HEXA are val.:"<<0XB<<"\n";
cout<<"Cifra C din HEXA are val.:"<<0xc<<"\n";
cout<<" Cifra D din HEXA are val.:"<<0xD<<"\n";
cout<<" Cifra E din HEXA are val.:"<<0XE<<"\n";
cout<<" Cifra F din HEXA are val.:"<<0xf<<"\n";
cout<<"Val. const. hexa 0x7ac1e este: "<<0x7ac1e<<'\n';
cout<<"Val. const. octale 171 este: "<<0171<<'\n';
cout<<"O const. octala se memoreaza pe "<<sizeof(011)<<"
octeti\n";
cout<<"O const.oct.long se mem pe ";cout<<sizeof(011L)<<"
octeti\n";}
Constante caracter
Constantele caracter sunt incadrate intre apostroafe.
Exemplu:
'a' //tip char
O constanta caracter are ca valoare codul ASCII al caracterului pe
care il reprezinta.
Acest set de caractere are urmatoarele proprietati:
Fiecarui caracter ii corespunde o valoare intreaga distincta (ordinala);
Valorile ordinale ale literelor mari sunt ordonate si consecutive ('A'
are codul ASCII 65, 'B' - codul 66, 'C' - codul 67, etc.);
Valorile ordinale ale literelor mici sunt ordonate si consecutive ('a'
are codul ASCII 97, 'b' - codul 98, 'c' - codul 99, etc.);
Valorile ordinale ale cifrelor sunt ordonate si consecutive ('0' are
codul ASCII 48, '1' - codul 49, '2' - codul 50, etc.).
Constante caracter corespunzatoare caracterelor imprimabile
O constanta caracter corespunzatoare unui caracter imprimabil se reprezinta
prin caracterul respectiv inclus intre apostroafe.
Exemplu:
Constanta caracter Valoare
A 65
a 97
0 48
* 42
Exceptii de la regula de mai sus le constituie caracterele imprimabile
apostrof (') si backslash (\).
Caracterul backslash se reprezinta: '\\'. Caracterul apostrof se reprezinta:
'\''.
Constante caracter corespunzatoare caracterelor neimprimabile
Pentru caracterele neimprimabile, se folosesc secvente escape. O secventa
escape furnizeaza un mecanism general si extensibil pentru reprezentarea
caracterelor invizibile sau greu de obtinut. In continuoare sunt
prezentate cateva caractere escape utilizate frecvent:
\n 10 LF rand nou (Line Feed)
\t 9 HT tabulator orizontal
\r 13 CR pozitioneaza cursorul in coloana 1 din randul curent
\f 12 FF salt de pagina la imprimanta (Form Feed)
\a 7 BEL activare sunet
O constanta caracter pentru o secventa escape poate apare insa, si
sub o forma in care se indica codul ASCII, in octal, al caracterului dorit:
\ddd unde d este o cifra octala.
Exemple:
\11 (pentru \t)
reprezinta constanta caracter backspace, cu codul 9 in baza 10, deci
codul 11 in baza 8.
\15 (pentru \r)
reprezinta constanta caracter CR, cu codul 13 in baza 10, deci codul
11 in baza 8.
Exercitiu: Sa se scrie urmatorul program si sa se urmareasca rezultatele
executiei acestuia.
#include <iostream.h>
void main(void)
{
cout<<"Un caracter este memorat pe "<<sizeof(char)<<"
octet\n";
cout<<"Caracterul escape \\n este memorat pe ";
cout<<sizeof('\n')<<" octet\n";
cout<<"Caracterul escape '\\n\' este memorat pe "<<sizeof('\n');
cout<<" octet\n";
cout<<"Caracterul '9' este memorat pe "<<sizeof('9')<<"
octet\n";
cout<<'B';cout<<' ';cout<<'c';cout<<'\t';
cout<<'\t';cout<<'9';cout<<'\b';cout<<'\a';
cout<<'L';cout<<'\v';cout<<'L';
cout<<'\'';cout<<'\t';cout<<'\"';cout<<'\\';cout<<'\n';
cout<<'\a';cout<<'\7';
}
Constante sir de caractere
Constanta sir este o succesiune de zero sau mai multe caractere, incadrate de ghilimele. In componenta unui sir de caractere, poate intra orice caracter, deci si caracterele escape. Lungimea unui sir este practic nelimitata. Daca se doreste continuarea unui sir pe randul urmator, se foloseste caracterul backslash.
Caracterele componente ale unui sir sunt memorate
intr-o zona continua de memorie (la adrese succesive). Pentru fiecare caracter
se memoreaza codul ASCII al acestuia. Dupa ultimul caracter al sirului,
compilatorul plaseaza automat caracterul NULL (\0), caracter care reprezinta
marcatorul sfarsitului de sir. Numarul de octeti pe care este memorat un
sir va fi, deci, mai mare cu 1 decat numarul de caractere din sir.
Exemple:
Acesta este un sir de caractere //constanta sir memorata pe 32 octeti
Sir de caractere continuat\
pe randul urmator! //constanta sir memorata pe 45
octeti
Sir \t cu secvente escape\n //constanta sir memorata
pe 26 octeti
\n //constanta caracter memorata
pe un octet
\n //constanta sir memorata pe 2 octeti (codul caracterului
escape si terminatorul de sir)
a\a4 /*Sir memorat pe 4 octeti:
Pe primul octet: codul
ASCII al caracterului a
Pe al doilea octet: codul
ASCII al caracterului escape \a
Pe al treilea octet: codul ASCII al
caracterului 4
Pe al patrulea octet: terminatorul
de sir NULL, cod ASCII 0 */
\\ASCII\\ /*Sir memorat pe 8 octeti:
Pe primul octet: codul ASCII al caracterului backslah
Pe al doilea octet: codul ASCII
al caracterului A
Pe al treilea octet: codul ASCII
al caracterului S
Pe al patrulea octet: codul ASCII al caracterului S
Pe al 6-lea octet: codul ASCII al
caracterului I
Pe al 7-lea octet: codul ASCII al
caracterului I
Pe al 8-lea octet: codul ASCII
al caracterului backslah
Pe al 9-ea octet: terminatorul de sir NULL, de cod ASCII 0 */
1\175a /*Sir memorat pe 4 octeti:
Primul octet: Codul ASCII al caracterul 1
Al 2-lea octet: codul ASCII 125 (175 in octal) al
caracterului }
Al 3-lea octet: codul ASCII al caracterului
a
Al 4-lea octet: codul ASCII 0 pentru terminatorul sirului */
Exercitiu: Sa se scrie urmatorul program si sa se urmareasca
rezultatele executiei acestuia.
#include <iostream.h>
void main()
{ cout<<"Sirul \"Ab9d\" este memorat pe:"<<sizeof("Ab9d")<<"
octeti\n";
cout<<"Sirul \"Abcd\\t\" este memorat pe:"<<sizeof("Abcd\t")<<"
octeti\n";
cout<<"Sirul \"\n\" este memorat pe "<<sizeof("\n")<<"
octeti\n";
cout<<"Sirul \"\\n\" este memorat pe "<<sizeof("\n")<<"
octeti\n";
cout<<"Sirul \"ABCDE\" se memoreaza pe "<<sizeof("ABCDE")<<"
octeti\n";}
Variabile
Spre deosebire de constante, variabilele sunt date (obiecte informationale) ale caror valori se pot modifica in timpul executiei programului. Si variabilele sunt caracterizate de atributele nume, tip, valoare si clasa de memorare. Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor. Daca la o constanta ne puteam referi folosind caracterele componente, la o variabila ne vom referi prin numele ei. Numele unei variabile ne permite accesul la valoarea ei, sau schimbarea valorii sale, daca este necesar acest lucru. Numele unei variabile este un identificator ales de programator. Ca urmare, trebuie respectate regulile enumerate in sectiunea identificatori.
Daca o data nu are legaturi cu alte date (de exemplu, relatia de ordine), vom spune ca este o data izolata. O data izolata este o variabila simpla. Daca datele se grupeaza intr-un anumit mod (in tablouri - vectori, matrici - sau structuri), variabilele sunt compuse (structurate).
In cazul constantelor, in functie de componenta literalului, compilatorul stabilea, automat, tipul constantei. In cazul variabilelor este necesara specificarea tipului fiecareia, la declararea acesteia. Toate variabilele care vor fi folosite in program, trebuie declarate inainte de utilizare.
Declararea variabilelor
Modul general de declarare a variabilelor este:
tip_variabile lista_nume_variabile;
Se specifica tipul variabilei(lor) si o lista formata
din unul sau mai multi identificatori ai variabilelor de tipul respectiv.
Intr-un program in limbajul C++, declaratiile de variabile pot apare in
orice loc in programul sursa. La declararea variabilelor, se rezerva in
memorie un numar de octeti corespunzator tipului variabilei, urmand ca
ulterior, in acea zona de memorie, sa fie depusa (memorata, inregistrata)
o anumita valoare.
Exemple:
int i, j;/*declararea var. simple i, j, de tip int. Se
rezerva pentru i si j cate 16 biti (2octeti)*/
char c; /* declararea variabilei simple c, de tip char.
Se rezerva un octet. */
float lungime; /* declararea variabilei simple lungime;
se rezerva 4 octeti */
Initializarea variabilelor in declaratii
In momentul declararii unei variabile, acesteia i se poate da (asigna, atribui) o anumita valoare. In acest caz, in memorie se rezerva numarul de locatii corespunzator tipului variabilei respective, iar valoarea va fi depusa (memorata) in acele locatii.
Forma unei declaratii de variabile cu atribuire este:
tip_variabila nume_variabila=expresie;
Se evalueaza expresia, iar rezultatul acesteia este
asignat variabilei specificate.
Exemple:
char backslash=\\; //declararea si initializarea variabilei simple
backslash
int a=7*9+2; /* declararea variabilei simple a, de tip int si
initializarea ei cu valoarea 65*/
float radiani, pi=3.14;/*declararea variabilei radiani;declararea
si initializarea var. pi*/
short int z=3; //declararea si initializarea variabilei
simple z
char d=\011;
char LinieNoua=\n;
double x=9.8, y=0;