Sunteți pe pagina 1din 5

PRELEGERE V

PROGRAMAREA CALCULATOARELOR ŞI LIMBAJE DE PROGRAMARE

Studiul elementelor de bază din limbajul C++ - continuare


Elemente de bază
În redactarea unui program se utilizează următoarele elemente de bază: vocabular, tip de
dată, constantă, variabilă, tablou, structură, listă, arbore, cîmp, uniune, expresie,
instrucţiune, fişier, obiect, funcţie, directivă şi macroinstrucţiune. Ordinea în care se vor
descrie acestea nu coincide neapărat cu cea dată în înşiruirea de mai sus.

I. Vocabularul limbajului
Vocabularul cuprinde simboluri şi identificatori (nume simbolice).
Setul de simboluri este format din următoarele categorii:
- litere (26 de litere ale alfabetului englez) majuscule şi minuscule. Spre deosebire de
alte limbaje de programare de nivel înalt se face distincţie înte literele mici şi
corespondentele lor mari;
- cifre zecimale (de la 0 la 9);
- caractere speciale şi de punctuaţie. Majoritatea caracterelor speciale şi de punctuaţie sînt
formate dintr-un singur caracter. Acestea sînt prezentate în tabelul 2.1.1. Secvenţele de
evitare (escape sequences) sau secvenţele de ESC-ape se descriu prin concatenarea a
două sau mai multe caractere speciale. Lista lor se prezintă în tabelul 2.1.2. De
asemenea, o parte din operatorii aritmetici, relaţionali şi logici sînt combinaţii de două
caractere speciale concatenate. Lista operatorilor, în totalitate, se prezintă în cursurile
următore.
Secvenţele de evitare se recunosc prin primul caracter component care este
backslash-ul. Acestea sînt utilizate pentru specificarea caracterelor de control netipăribile
(sau a aşa-ziselor caractere whitespace) care pot fi transmise către perifericele de
intrare/ieşire şi pentru precizarea caracterelor care, normal, au un înţeles special (cum ar
fi, de exemplu, apostroful).
Caracter Semnificaţie Caracter Semnificaţie
+ plus - Minus
* asterisc / Slash
. punct ; punct şi virgulă
, virgulă : două puncte
‘ apostrof “ Ghilimele
( paranteză stînga ) paranteză dreapta
{ acoladă stînga } acoladă dreapta
[ paranteză pătrată ] paranteză pătrată
stînga dreapta
> mai mare < mai mic
= egal ^ săgeată sus
? semnul întrebării ! semnul exclamării
# diez % procent
$ dolar & umpersand
~ tilda \ backslash

1
| bară verticală _ underscore
(liniuţa de subliniere)
blanc (spaţiu liber)
Tabelul 5.1.1
Saltul la linie nouă (new line sau linefeed), returul de car (carriage return), indentarea pe
orizontală sau pe verticală (horisontal tab sau vertical tab), spaţiu liber şi saltul la pagină
nouă (formfeed) sînt numite caractere whitespace.
Secvenţa de evitare Semnificaţie
\n linie nouă (NL sau LF)
\r retur de car (CR)
\t tabulare orizontală (HT)
\v tabulare verticală (VT)
\f salt la pagină nouă (FF)
\\ caracterul backslash
\b caracterul backspace (BS)
\? semnul întrebării
\’ caracterul apostrof
\a genratorul de sunet (BELL)
\0O O - un număr octal
\0xH sau \0XH H - un număr hexazecimal
\c caracterul c
Tabelul 5.1.2
După cum se observă, efectul lor este de a spaţia şi de a alinia diverse entităţi de tip
utilizator din structura unui program C. Dacă nu sînt folosite ca separatori sau drept
componente în şiruri de caractere sau în constante C, caracterele whitespace sînt ignorate
de compilator.
Cu secvenţe de evitare de tipul \ddd sau \xdd se poate reprezenta oricare caracter din
codificarea ASCII, prezentată în anexa 1, ca un număr octal din trei cifre sau ca un număr
hexezecimal din două cifre. De exemplu, returul de car poate fi interpretat în octal ca \
015 (sau \15) şi în hexazecimal ca \x0D (sau \xD). Se recomandă ca zeroul din faţa cifrei
semnificative să nu se omită, mai ales, în situaţia secvenţelor de evitare din componenţa
şirurilor de caractere. Altfel, interpretarea lor poate genera greşeli.
Este interesant de adăugat că, intern, sfîrşitul unui şir de caractere se marchează cu
caracterul NULL \0 sau \x0.
b) Identificatorii sînt înşiruiri de maxim 32 caractere care încep cu o literă şi
conţin litere, cifre sau liniuţa de subliniere (underscore).
Indentificatorii îşi află utilitatea în desemnarea oricărei entităţi de bază dintr-un program
C++. Se recomandă pentru uşurinţa manevrării acestora ca lungimea unui indentificator
să se limiteze la cel mult 6 caractere.
Partea de identificatori folosită în principal la desemnarea entităţilor C sau la descrierea
sintaxei declaraţiilor de tip şi a instrucţiunilor nu poate fi folosită în alte scopuri. Aceşti
identificatori constituie cuvintele cheie sau cuvintele rezervate (keywords) ale limbajului
şi sînt cuvinte sau acronime ale unor cuvinte din limba engleză. În anexa 2 se prezintă
setul de cuvinte cheie al limbajului Turbo C++.
Exemple: - de identificatori: axZ, axz, Axz, v, V, t_3, pp_Q_5, etc.;
- de cuvinte cheie: for, if, int, continue, while, etc.

2
II. Tipuri de date
Prin tipul unei date se înţelege o mulţime finită şi ordonată de valori de acelaşi tip
desemnată printr-un identificator. Numărul valorilor din tipul unei date constituie
cardinalul sau puterea tipului. O variabilă se asociază în mod explicit cu un anumit tip de
date prin construcţii sintactice de declarare, care vor fi descrise în secţiunea 2.4. În
funcţie de această declaraţie se stabileşte dimensiunea locaţiei de memorie afectată
variabilei precum şi modul de reprezentare a valorii furnizate. Pe parcursul execuţiei unui
program variabila trebuie să primească valori numai din mulţimea corespunzătoare
tipului de date atribuit.
Există două categorii de tipuri de date: de bază (fundamentale) şi derivate. Prin
tip de bază se înţelege fie un tip aritmetic, fie tipul void. Tipurile standard char, int,
float şi double formează categoria tipurilor aritmetice. De asemenea, programatorul
are posibilitatea să definească tipuri proprii reuşind, astfel, să gestioneze structuri de
date complexe şi potrivite informaţiilor prelucrate, care împreună cu tipurile standard
tablou, pointer şi enumerare formează categoria tipurilor derivate. Tipurile aritmetice,
pointer şi enumerare se găsesc şi sub denumirea de tipuri scalare. În această secţiune vom
prezenta doar tipurile de bază şi enum. Restul tipurilor derivate se vor prezenta ulterior.
Tip de dată aritmetic Spaţiul ocupat Domeniul de valori
char = signed char 8 biţi -128 .. 127
unsigned char 8 biţi 0 .. 255
int = signed int = 16 biţi -32768 .. 32767
= short int =
= signed short int
unsigned int = 16 biţi 0 ..65535
= unsigned short int
long int = 32 biţi -2147483648 ..
= signed long int 2147483647
unsigned long int 32 biţi 0 .. 4294967295
float 32 biţi +/-(3.4E-38 .. 3.4E+38)
precizie: 7 cifre
double 64 biţi +/-(1.7E-308 .. 1.7E+308)
precizie: 15 cifre
long double 80 biţi +/-(3.4E-4932 .. 1.1E4932)
precizie: 19 cifre
Tabelul 5.2.1
Tabelul 5.2.1 reliefează pe lîngă combinaţiile permise, spaţiul de memorie necesar
şi domeniul de valori în forma zecimală pentru fiecare combinaţie în parte.
Cuvîntul rezervat int poate să lipsească în combinaţiile short int, long int şi
unsigned int.
Exemple: short k, m;
float prod;
long double t;
Varibilele k şi m sînt de tip întreg scurt şi ocupă fiecare cîte 2 octeţi. Variabila prod este
raţională în simplă precizie (ocupă 8 octeţi), iar t este raţională dublă precizie forma
lungă (ocupă 10 octeţi).

3
Spaţiul de memorie ocupat la un moment dat de o variabilă, indiferent de tip, se poate
afla prin intermediul operatorilor unari de lungime size(tip) sau sizeof(tip). Astfel,
particularităţile de reprezentare a tipurilor de date predefinite din tabelul 5.2.1 în
implementare limbajelor C şi C++ pe diverse calculatoare, pot fi determinate cu sizeof().
În programul 5.2.1 se aplică operatorul sizeof() doar la cîteva tipuri de date. Rezultatele
furnizate de program se pot corela cu cele din tabelul prezentat mai sus.
*/ Operatorul sizeof */
#include <stdio.h>
#include <conio.h>
void main(void)
{ clrscr();
printf("\n Tipul int :%d\n Tipul long int :%d\
\n Tipul char :%d ",sizeof(int),sizeof(long int),
sizeof(char));
printf("\n Tipul float :%d\n Tipul double :%d \
\n Tipul long double :%d",sizeof(float),
sizeof(double),sizeof(long double));
printf("\n "); }
Tipul int : 2 Tipul float : 4
Tipul long int : 4 Tipul double : 8
Tipul char : 1 Tipul long double : 10

Programul 5.2.1
Categoria tipurilor aritmetice (caracter, întreg, raţional simplă precizie şi raţional dublă
precizie) este extinsă în Turbo C++ prin următorii modificatori de tip: signed, unsigned,
short şi long. Modificatorii de tip se aplică, fără excepţie, tipurilor char şi int. Tipul float
nu admite nici un modificator de tip, iar tipul double permite doar ultimul modificator de
tip (long).
Tipul void este tipul de dată vid. Acest tip s-a utilizat în programele exemplificate
la începutul lucrării, în precizarea că funcţia main() (modulul principal) este fără
parametri şi fără rezultat.
Tipul enum are următorul format general:
enum [nume_tip] {id_0[ =val_0], id_1 [= val_1], … ,id_n[=val_n]};
Argumentele plasate între metasimbolurile paranteze pătrate sînt opţionale.
Numele de recunoaştere al tipului enumerare este nume_tip, iar id_0, id_1, … şi id_n
sînt identificatorii simbolici prin care se desemnează valorile întregi val_0, val_1, … şi
respectiv val_n. Valorile implicite denumite prin id_i, cu i=0, 1, …, n, sînt 0, 1, …, n. O
valoare lipsă din şirul val_0, val_1, … , val_n se obţine incrementînd cu 1 valoarea
imediat anterioară.
Exemple: enum număr { zero, unu, doi, trei };
enum { şapte=7, opt=8, nouă, zece };
Tipul enumerare numar este format din valorile întregi 0, 1, 2 şi 3. Definiţia a doua
precizează un tip enumerare, fără nume, în care se enumeră valorile 7, 8, 9 şi 10.
Ultimele două, nefiind explicitate, se obţin prin incrementarea cu 1 a valorilor 8 şi
respectiv 9. Spre deosebire de limbajul C, unde unei variabile de tip enumerare i se poate
atribui orice valoare întreagă, sintaxa limbajului C++ nu permite decît membri ai
enumerării.

4
Între tipul de dată definit şi descriptorul (specificatorul) de formatare pentru
citirea/scrierea unei valori din mulţimea corespunzătoare tipului de dată respectiv este o
corespondenţă biunivocă. În tabelul 5.2.2 numărul total de poziţii necesare tipăririi s-a
notat cu m, iar numărul cifrelor din partea fracţionară cu r şi sînt opţionale.
Descriptorul de formatare Tip de dată
%[m]d Int
%[m.r]f Float
%[m.r]lf double
%c char
%[m]s sir de caractere
%[m]o Valori de tip octal
%[m]x Valori de tip hexazecimal
Tabelul 5.2.2
La scriere, alinierea valorilor întregi pe cele m poziţii precizate prin descriptorul
de formatare se face la dreapta, iar a celor raţionale la punctul zecimal, cu rotunjirea, prin
adaos, a părţii fracţionare. Dacă sînt prea multe poziţii la dispoziţie, atunci se
completează, după cum este cazul, în stînga cu spaţii libere sau cu zerouri la dreapta. În
caz contrar, se ignoră descriptorul de formatare.
În absenţa descriptorului de formatare, valorile raţionale se tipăresc cu o parte
fracţionară formată din 6 cifre.
Programul 5.2.2 află soluţia unei ecuaţii de gradul I, ax+b=0, unde a,b ∈ ℜ.
Citirea valorilor a şi b se descriu cu specificatorii de format %d şi respectiv %f, iar la
scrierea soluţiei se foloseşte specificatorul de format %6.2f.
/* Programul rezolva ecuatia ax+b=0 */
#include <stdio.h>
#include <conio.h>
void main(void)
{ int a; float b, x; clrscr();
printf("\n Introduceti a=”); scanf(“%d’, &a);
printf("\n Introduceti b=”); scanf(“%f’, &b);
if (a != 0) printf(“\nSolutia este: x=%6.2f”, -b/a);
else printf (“\n a este zero”); getch(); }
Introduceti a= 25
Introduceti b=5.
Solutia este:x= 5.00
Programul 5.2.2
Observaţie. Metasimbolurile [ şi ] utilizate în sintaxa tipului enum sau a
specificatorilor de formatare fac parte din simbolistica Bachus-Naur. Metalimbajul BNF
(Bachus Naur Form) a fost creat pentru descrierea sintaxei elementelor limbajului de
programare ALGOL. De fapt, în lucrare folosim o simbolistică Bachus-Naur parţială. Pe
lîngă utilizarea celor două metasimboluri se procedează la tipărirea cu caractere bold a
cuvintelor rezervate, a identificatorilor utilizator şi a datelor de test, mai ales, în textele
explicative aferente unui program.