Sunteți pe pagina 1din 80

PROGRAMAREA

CALCULATOARELOR - LIMBAJE

Curs 2 - Elemente de bază ale


limbajului C/C++
ÎN ACEST CURS...
1. Istoric
2. Elemente sintactice de bază
3. Structura unui program C/C++
4. Funcţii
5. Directive preprocesor
6. Comentarii
7. Exemple de programe C/C++
8. Tipuri de date
9. Constante
10. Variabile simple
11. Tablouri
12. Şiruri de caractere
2
ISTORIC
Limbajul C - Dennis Ritchie si Ken Thompson
1972 la AT&T Lab ; prima implementare - pe
calculatoate PDP-11 sub SO UNIX
1978 - prima ediţie a cărţii de referinţă The C programming Language
de Brian Kernighan si Dennis Ritchie (2nd ed -‘88, 2012-
eBook, K&R)
1988 - apare standardul ANSI C (proces început în 1983)
1981 - este creat limbajul C++ de către Bjarne Stroustroup la AT&T
Lab (inceput la1979, numit C++ in 1983, 1995 – primul draft al
standardului, apoi 1998 – early C++).
din 2003 → C++0x – new C++
2011 - C++11 (din seria C++1y); 2014 - C++14 ; 2017 - C++17,
2020 - C++20 – corutine, programare concurenta, programare in retea etc
Versiunea următoare – C++23
3
Limbajul C a fost folosit la implementarea SO UNIX, iar compilatorul C
a fost scris în mare parte chiar în limbajul C
Ken Thompson Dennis M. Ritchie Brian W. Kernighan Bjarne Stroustrup

https://en.wikipedia.org/wiki/Ken_Thompson
https://en.wikipedia.org/wiki/Dennis_Ritchie
https://en.wikipedia.org/wiki/Brian_Kernighan
https://en.wikipedia.org/wiki/Bjarne_Stroustrup

4
5
 Caracteristici:
 asigură o foarte bună portabilitate a codului

 combină avantajele limbajelor de nivel înalt cu


funcţionalitatea limbajelor de asamblare
 limbaj de asamblare portabil

 C/C++ se folosesc la o gamă largă de aplicaţii: SO,


grafică, baze de date,...
 limbaje de bandă largă

 C e un limbaj structurat - asignare, condițional,


repetitivă condiționată anterior
 C/C++ limbaj procedural - organizare în blocuri de
6
instrucțiuni și funcții
Caracteristici (continuare):

 Limbaj compact (operatori folosind simboluri, nu


cuvinte cheie, ++/--, operatori compuşi, funcţii macro,
etc.)

 Oferă mai multe reprezentări datelor funcție de


hard/mediu

 Cod reutilizabil - biblioteci de funcţii, clase (C++),


template-uri (C++) - software-ul cel mai mult reutilizat

7
2. ELEMENTE SINTACTICE DE BAZĂ

 Cuvinte cheie

 Identificatori

 Date → Variabile

→ Constante

 Operatori

 Delimitatori

8
ELEMENTE SINTACTICE DE BAZĂ

 Cuvinte cheie (keywords)

 Sunt rezervate pentru declaraţii de date şi pentru


instrucţiuni
 Standardul ANSI C prevede 32 de cuvinte cheie, la care
s-au adaugat încă 12 la ultimele revizii, în standardele ISO
C99, ISO 11.
https://learn.microsoft.com/en-us/cpp/c-language/c-keywords?view=msvc-170

Implementările C/C++ pot aduce extensii setului de cuvinte


cheie
 Toate cuvintele cheie folosesc litere mici
 Limbajul C/C++ face distincţie între litere mici şi litere mari
( "case-sensitive") (Cod este diferit de cod) 9
ELEMENTE SINTACTICE DE BAZĂ
 Identificatori

 Sunt secvenţe de caractere folosite pentru nume de:


- constante, variabile, funcţii, tipuri de date utilizator

 Un identificator este compus din litere mici sau mari,


cifre şi caracterul underscore (_)

 Un identificator nu poate să înceapă cu o cifră

 Lungimea maximă a unui identificator depinde de


implementare

 Identificatorii trebuie să difere de cuvintele cheie


10
ELEMENTE SINTACTICE DE BAZĂ
 Date – informaţia cu care lucrează un program
 Datele utilizate trebuie declarate, specificând tipul lor şi
un identificator
 Tipurile de date se precizează prin cuvinte cheie
Exemple: char, int, float, double
 Datele dintr-un program pot fi variabile sau constante

 Variabile
 Permit reprezentarea în program a valorilor unor date,
valori ce pot fi modificate pe parcursul execuţiei
programului

11
ELEMENTE SINTACTICE DE BAZĂ

 Constante

 Permit reprezentarea unor date ale căror valori nu se


modifică în timpul execuției programului
 Au valori fixe, reprezentând numere întregi sau reale,
caractere sau şiruri de caractere
 Identificatorul unei constante se scrie de obicei cu litere
mari
 Exemple de scriere in program a unor valori constante:
 12

 23.45

 ‘A‘

 "RRRYYY"
12
ELEMENTE SINTACTICE DE BAZĂ

 Operatori

 Sunt simboluri utilizate pentru specificarea unor


operaţii de efectuat asupra unor variabile sau
constante

 In urma aplicării unui operator se obţine un rezultat

 O combinaţie validă de operatori, variabile, constante,


apeluri de funcţii formează o expresie
 cea mai simplă expresie conţine doar o variabilă sau o
constantă

 Exemple operatori: de atribuire, aritmetici, logici,


relaţionali, etc. 13
ELEMENTE SINTACTICE DE BAZĂ
 Delimitatori
 Sunt simboluri care separă diverse entităţi
 In limbajul C/C++ unele simboluri au dublă semnificaţie,
de operator şi delimitator, în funcţie de context
spaţiul alb (spaţiu simplu, tab, newline sau LF, comentarii),
{, } delimitarea instrucţiunilor compuse
(, ) compunerea expresiilor;
definirea şi apelul funcţiilor
[, ] declarare tablou; referire element de tablou
<, > directive preprocesor sau ca operatori relaţionali
" delimitarea şirurilor de caractere
' constante caracter sau secvenţe de evitare
/*, */ comentarii pe mai multe linii
// comentarii pe o singură linie
14
; marcare sfârşit de instrucţiune
IDENTIFICARE ELEMENTE SINTACTICE IN
PRIMUL PROGRAM C

/* program care afiseaza


un mesaj pe ecran */
// directive preprocesor
#include <stdio.h>

// functia main
int main(void)
{
printf("Hello world");
return 0; 15

}
3. STRUCTURA UNUI PROGRAM C/C++

 In limbajul C/C++, programul este o colecţie de unităţi distincte


numite funcţii - limbaj procedural

!!! Orice program C/C++ trebuie să aibă cel puţin o funcţie


→ funcţia main()

!!! Structura generală a unui program C/C++:


1. comentarii inițiale
2. directive preprocesor, include, define
3, prototipuri de functii
4. declaraţii/definitii globale
5. functia main()
16
6. definire funcţii
STRUCTURA UNUI PROGRAM C/C++

 Execuţia programului începe cu funcţia main(), iar la


terminarea execuţiei acestei funcţii se încheie şi
execuţia programului

 In funcţia main() pot fi apelate alte funcţii (proprii sau din


biblioteci), care la rândul lor pot apela alte funcţii,
ş.a.m.d.

 !!!
Un program C/C++ nu poate avea mai multe funcţii
main()

17
Structura generală a unui program C/C++:
1. comentarii inițiale
2. directive preprocesor, include, define
3, prototipuri de funcţii
4. declaraţii/definiţii globale
5. funcţia main()
6. definire funcţii

18
4. FUNCŢII C/C++

Structura unei funcţii Antet

[tip_rezultat] <nume_functie>([lista_parametri_formali])
{
[declaratii_locale]
Corp → blocul
[instructiuni]
asociat
}

 antet: defineşte interfaţa cu restul programului


 blocul asociat (corpul funcției): descrie operaţiile efectuate
19
STRUCTURA UNUI PROGRAM C/C++

 Tip rezultat:
 specifică tipul de date returnat de funcţie
 poate să fie un tip predefinit sau un tip definit de
utilizator
 dacă nu este specificat se consideră implicit că este tipul
int
 dacă funcţia nu returnează nici un rezultat, se specifică
acest lucru prin tipul void (vid, lipsă)

 Nume funcţie:
 este un identificator:
 se face distincţie între litere mici şi litere mari

 funcţiile Fact() şi fact() sunt diferite 20


STRUCTURA UNUI PROGRAM C/C++
 Parametri formali:

 o listă de variabile asociate datelor ce urmează a fi


prelucrate, folosită la definirea funcţiei
 numele acestora trebuie să fie cât mai sugestiv
pentru rolul sau conţinutul acestora
 lipsa parametrilor formali se specifică prin cuvântul
cheie void, sau nimic

21
STRUCTURA UNUI PROGRAM C/C++

 Delimitatorii {…} încadrează o construcţie numită


instrucţiune compusă (sau bloc), alcătuită din declaraţii
şi instrucţiuni → corpul funcției

Tip returnat Nume functie Lista param formali

int main(void) // antet functie


{
printf("Hello world");
Corp functie
return 0;
}

22
STRUCTURA UNUI PROGRAM C/C++

 Declaraţiile în cadrul unui bloc se numesc declaraţii


locale şi sunt valabile numai până la sfârşitul blocului

 Limbajul C++ permite declaraţii şi în interiorul unui bloc,


de exemplu înainte de utilizare:
 domeniul unei astfel de declaraţii este cuprins între
poziţia acesteia şi sfârşitul blocului – în bloc, în
instructiuni cum este for(), pentru identificatori locali
valizi doar aici, etc.

23
STRUCTURA UNUI PROGRAM C/C++

Declaraţia şi definiţia unei funcţii

 Declaraţia (prototipul) este formată din antetul funcţiei


(nume funcţie, tip rezultat, tipul şi eventual numele
fiecărui parametru formal) şi se încheie obligatoriu cu
caracterul ‘;’
Ex: int suma(int a, int b) ;
 Definiţia cuprinde antetul (inclusiv numele parametrilor
formali, dar fără caracterul ‘;’ urmat de blocul funcţiei
Ex: int suma(int a, int b)
{
return a+b;
}
24
!!! Semnificaţia lui return va fi explicată ulterior
Obs!!!
De regulă, prototipul apare la începutul programului, a.î.
compilatorul poate verifica corectitudinea apelurilor
funcţiei, indiferent unde se află definiţia acesteia

25
STRUCTURA UNUI PROGRAM C/C++
 Observaţii:

 In interiorul unei funcţii nu se admit alte definiţii de


funcţii
 In limbajul C/C++ nu există funcţii încorporate în limbaj
(predefinite):
• funcţiile unui program sunt definite de utilizator sau
sunt luate din biblioteci de funcţii C/C++ (*.h)
 Funcţiile unui program pot fi amplasate în mai multe
fişiere (module):
 în acest caz se crează un proiect ("project") folosind facilităţile
mediului de programare
 funcţiile definite într-un modul şi folosite în alte module trebuie

declarate înainte de folosire direct sau prin includerea unor


fişiere antet cu prototipurile acestora
26
 Se poate folosi și mecanismul extern
APELUL UNEI FUNCŢII

 In limbajul C nu există o instrucţiune specială de apel


 Apelul unei funcţii se face prin nume astfel:

nume_functie([lista_param_actuali]);

 Noţiuni: funcţie apelantă, funcţie apelată


 Parametrii actuali: valori corespunzătoare parametrilor
formali, comunicate funcţiei în momentul apelului

 Ex: apel funcţia suma definită anterior


suma(50, 70);
27
Parametri actuali
(efectivi)
APELUL UNEI FUNCŢII
 Apelul unei funcţii poate să apară în expresii mai simple
sau mai complicate:
 dacă apare izolat, apelul se termină cu caracterul ’;’

 Dacă nu există parametri actuali, la apel se foloseşte


combinaţia nume_functie( )

 Parametrii actuali trebuie să corespundă ca număr,


poziţie şi tip cu parametrii formali

 Parametrii actuali sunt în general expresii:


 după evaluarea acestora se fac anumite conversii 28
admise de la un tip de date la altul
REVENIREA DINTR-O FUNCŢIE
 Revenirea dintr-o funcţie se face cu instrucţiunea return

 Prin această instrucţiune se termină execuţia funcţiei


curente şi se dă controlul funcţiei apelante

 Instrucţiunea return poate să apară oriunde în blocul unei


funcţii

 Forme: return;
return expresie;

29
REVENIREA DINTR-O FUNCŢIE

 Valoarea expresiei (cu unele conversii implicite) este


transmisă funcţiei apelante:
 expresia trebuie să aibă tipul rezultatului declarat în
prototipul funcţiei sau un tip ce poate fi convertit către
acel tip

 O funcţie care returnează un rezultat trebuie să conţină o


instrucţiune "return expresie"

 Funcţia apelantă poate neglija rezultatul returnat de o


funcţie

 Dacă funcţia nu returnează ceva, instrucţiunea return


poate lipsi, iar revenirea din funcţie se face după execuţia
ultimei instrucţiuni
30
FUNCŢIA MAIN()
 Este punctul de intrare in program, este apelată automat
la lansarea în execuţie a programului
 Programul se termină odată cu execuţia ultimei
instrucţiuni din main()
 Antetul funcţiei:
int main(void){}
int main(){}
int main(int argc, char *argv[]){}
int main(int argc, char ** argv){}

De aceste forme ale funcţiei


ne vom ocupa mai tarziu

Unele compilatoare acceptă şi tipul void pentru tipul returnat de 31


main()
Exemplu:
/*program care aduna 2 numere folosind o functie */

#include<stdio.h>
int suma(int, int); Prototipul functiei suma()
int main()
Functia principala (main)
{
int a=5, b=7;
int r=suma(a,b); Apelul functiei suma()
printf(”\nRezultatul adunarii=%d”, r);
return 0;
}
int suma(int x, int y)
{ Definirea functiei suma()
return x+y;
32
}
Cum ruleaza acest program?
Revenind la structura generală a unui program C/C++...

1. comentarii inițiale
2. directive preprocesor, include, define
3, prototipuri de functii ✓
4. declaraţii/definitii globale
5. functia main() ✓
6. definire funcţii ✓

33
5. DIRECTIVE PREPROCESOR

 Funcţiile din biblioteci sunt declarate împreună cu


constantele, tipurile şi variabilele asociate în fişiere antet
("header"), având extensia ".h"

 Utilizarea acestor funcţii necesită includerea fişierelor


antet corespunzătoare în program

 Acest lucru se realizează cu directiva preprocesor


#include

34
DIRECTIVE PREPROCESOR

 Forme:
#include <nume_fisier>
#include "nume_fisier" //cautare director curent

 Prima formă permite includerea unor fişiere a căror


amplasare este specificată în setările mediului de
programare

 A doua formă include fişiere antet din directorul curent


sau în calea precizată

 Exemple:
#include <stdio.h>
#include "my_def.h“ //director current
#include “D:/users/cpp/my_def.h” //cale orice SO
#include “D:\\users\\cpp\\my_def.h” //cale conventie Windows 35
DIRECTIVE PREPROCESOR
 Directiva "define":
#define identificator sir_simboluri
 Permite definirea unor constante simbolice și macro
funcții
 Identificatorul este înlocuit cu şirul de simboluri, din
poziţia curentă şi până la sfârşitul fişierului sau până la
întâlnirea unei directive #undef ce anulează definiţia
 Exemple:
#define PI 3.1415
#define EPS 1.0E-10
#define MAX 100
#define DIM MAX*5
#undef PI
//#define CIRCUM 2*PI*7 36
Structura generală a unui program C/C++:
1. comentarii inițiale
2. directive preprocesor, include, define ✓
3, prototipuri de functii ✓
4. declaraţii/definitii globale
5. functia main() ✓
6. definire funcţii ✓

37
6. COMENTARII
 Permit introducerea unor explicaţii în programul sursă
pentru creşterea lizibilităţii programului
 Nu sunt luate în considerare de către compilator

 Comentariile în limbajul C/C++ se pot introduce în două


moduri:
 /* Comentarii specifice limbajului C, dar pot fi folosite
şi în limbajul C ++*/
 caz în care tot ce este delimitat de caracterele /* şi */ este
considerat comentariu
 // Comentarii specifice limbajului C++
 tot ce urmează după caracterele // până la sfărşitul liniei
curente este considerat comentariu
38
COMENTARII

 La începutul fiecărui program se poate utiliza un bloc de


comentarii cu următorul conţinut:
 numele programului
 numele autorului programului, eventual adresa de e-
mail
 o scurtă descriere a programului
 data finalizării acelei versiuni a programului
 numele fişierului

 Utilizarea judicioasă a comentariilor în codul sursă fac ca


depanarea, revizuirea şi întreţinerea programelor să fie
mai uşoară

39
 Exemplul : tot primul program C/C++ - identificarea
structurii programului

/* afisare mesaj pe ecran*/


// directive preprocesor
#include<stdio.h>
#include<conio.h>
// functia main
int main(void)
{
printf("Hello world");
return 0;
}
40
Exemplu:
// directive preprocesor
#include <stdio.h>
//#include<conio.h>
int sqr(int); // prototip functie sqr

int main(void)
{
int numar, rezultat;
printf("Introduceti un numar intreg : ");
scanf("%d", &numar);
rezultat = sqr(numar); // apel functie sqr
printf("%d la patrat = %d \n", numar, rezultat);
// _getch();
return 0;
}

// definitie functie sqr


int sqr(int z)
{ 41
return(z*z);
}
Exemplu: program pentru citirea şi afişarea unui şir de
caractere folosind funcţii

// directive preprocesor
/* includerea unor fisiere antet ce contin prototipurile functiilor din
biblioteca standard folosite in program*/
#include <stdio.h>

// definirea unei constante simbolice


#define DIM 24

// declaratii globale
// tablou de caractere, revenim asupra lor …
char tab[DIM];

// prototipuri functii
void cit_sir(void);
void afis_sir(void); 42
int main(void)
{
cit_sir(); // apel functie de citire sir
afis_sir(); // apel functie de afisare sir
return 0;
}

// functie pentru citirea unui sir de caractere


void cit_sir(void)
{
// apel functie din biblioteca standard pentru afisarea unui mesaj
printf("\nIntroduceti sirul : ");
// apel functie din biblioteca standard pentru citirea unui sir de caractere
scanf("%s", tab);
}

// functie pentru afisarea unui sir de caractere, preluat din tabloul global
void afis_sir(void)
{
// apel functie din biblioteca standard pentru afisarea unui mesaj
// si a unui sir de caractere 43
printf("\nSirul introdus anterior este : %s\n", tab);
}
 Observaţii:
 Comentariile pot să apară oriunde poate să apară un
spaţiu alb

 Funcţiile printf() şi scanf() fac parte din grupul de


funcţii de intrare/ieşire pentru consolă din biblioteca C:
 aceste funcţii permit realizarea dialogului dintre operator
şi program
 de aceea este necesară cunoaşterea acestor funcţii din
documentaţii sau din help-ul mediului de programare

 Funcţia main() poate returna un rezultat şi poate avea


parametri

44
7. TIPURI DE DATE
 Data este o reprezentare a informaţiei prelucrate (număr,
mărime fizică, ...) caracterizată prin valorile pe care le
poate avea, prin operaţiile primitive de transformare şi
prin structură
 Tipul unei date determină valorile pe care aceasta le
poate lua, dimensiunea zonei de memorie ocupate şi
modul în care este reprezentată valoarea în memorie
 Tipul unei date se specifică prin cuvinte cheie sau prin
identificatori ai tipurilor de date utilizator

!!! C/C++(până la C++11) - limbaj de tip static-typed =


datele utilizate trebuie să aibă un tip specificat înainte de
45
utilizare
TIPURI DE DATE

 Clasificare:
 tipuri fundamentale (primitive) (aritmetice, caractere,
siruri de caractere, pointeri, referințe, void)
 tipuri derivate (agregate) (tablouri, tipuri definite de
utilizator, liste, etc.)

 Altă clasificare:
 tipuri predefinite (existente în limbaj)
 alte tipuri definite de utilizator

46
Tipuri de date
TIPURI FUNDAMENTALE
 Tipul void
 Indică absenţa oricărei valori, sau prezența oricărei
valori în unele cazuri
 Utilizare: declararea unei funcţii fără parametri sau fără
rezultat (până în această fază)

 Tipuri aritmetice
 Tipuri de bază: char, int, float, double
 bool(C++): true, false, introdus recent cu clase; în C,

pentru datele de tip boolean se utilizeaza tipul int: 0 -


false, 1 – true.
 wchar_t - tip fundamental in C++, in C in <cwchar> -
compiler specific (16 biti in compilatoare Microsoft)
47
 Modificatori de tip: signed, unsigned, short, long
Reprez
Tip Biţi Domeniu Obs.
entare
bool 8
[signed] char 8 -27 ...27 - 1 C2
unsigned char 8 0...28 - 1 C2
[signed] int 16/32 -215(31)...215(31) - 1 C2
short [int] 16 -215...215 - 1 C2
signed [short int] 16 -215...215 - 1 C2
unsigned [int] 16/32 0...216(32) - 1 C2
unsigned [short int] 16 0...216 - 1 C2
[signed] long [int] 32 -231...231 - 1 C2
unsigned long [int] 32 0...232 - 1 C2
long long int (C++11) 64 -263...263-1 C2
unsigned long long
64 0...264-1 C2
[int] (C++11)
38 38
float 48 32 +-(3.4*10- ...3.4*10+ ) VM 7 cifre
double 64 +-(1.7*10-308...1.7*10+308) VM 15 cifre
long double 80 +-(3.4*10-4932...3.4*10+4932 VM 19 cifre
Obs!!! In mediul Visual Studio, tipul int este reprezentat pe 32 biti
 !!! Obs. Reprezentarea tipului int depinde de compilator. In
Visual Studio tipul int este reprezentat pe 4 octeti (32 biti).
Dimensiunea tipului long depinde de arhitectură, sistem de
operare și compilator

 Tipurile de date sunt folosite pentru declarații de date

 Exemple declaraţii:
int a;
float b; Declarații de
double c; variabile
char ch;

Inițializarea variabilelor – cu expresii constante → mai târziu49


în acest curs…
8. CONSTANTE
 Constantele sunt valori fixe (numerice, caractere sau
şiruri de caractere), nealterabile prin program

 Tipul constantei este determinat de compilator:


 Implicit, pe baza valorii constantei
 Explicit, pe baza sintaxei utilizate

 Constante: întregi, reale, caracter, șir de caractere

50
Constante

 Constante întregi
 Tipuri: zecimale, octale, hexazecimale
 Tipul implicit:
int
long int
unsigned long int
 Tipul explicit se precizează prin adăugarea unui sufix
(U,u, L, l):
 U, u unsigned int
 L, l long int
 UL, Ul, ul, uL unsigned long int

51
Long long constants – C++11: sufix ll, LL
CONSTANTE
 Constante zecimale (baza 10): prima cifră nu este 0
 Constante octale (baza 8): prima cifră este 0, urmată de
cifre octale
 Constante hexazecimale (baza 16): prefix 0x sau 0X,
urmat de cifre hexazecimale
 Constante binare – C++14 (baza 2): prefix 0b

Exemplu: aceeasi constantă în diferite baze de numeraţie


int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;

int b = 0b101010; // C++14 52


 O constantă întreagă devine negativă dacă i se
aplică operatorul unar de negativare "-“

 Exemple:
 12, -15, 24u, 43l, 678ul

 076, 0777u, 01275ul

 0x1A, 0x34C12, 0X123456B

53
CONSTANTE

 Constante reale
 Tip implicit: double
 Tip explicit: prin sufixe F, f , L, l
 F, f float
 L, l long double

 Se compun din:
 o parte întreagă ca o constantă zecimală

 o parte fracţionară: punct zecimal (.) urmat de o


succesiune de cifre zecimale
 un exponent: e(E)[+,-]sir_cifre_zecimale

54
CONSTANTE

 Restricţii:
 Partea întreagă şi partea fracţionară nu pot lipsi
simultan
 Punctul zecimal pe de-o parte şi simbolul e(E) cu

exponentul pe de altă parte, nu pot lipsi deodată

 Exemple:
9.23E6 9.23x106
2e-4 2x10-4
-.45E16 -0.45x1016
.0, 0., 1., 1.0

55
CONSTANTE

 Constante caracter
 Sunt caractere încadrate între apostrofuri
 exemplu: 'a', '0', '+', '$‘
 Pentru reprezentarea internă se foloseşte codul ASCII
 In C tipul constantei caracter este int, cu octetul mai
semnificativ 0 sau cu extensie de semn şi poate să
apară oriunde poate să apară tipul int
 In C++ tipul constantei caracter este char (in mod
uzual un cod ASCII pe un octet);
 noile versiuni C++ (de la C++11) permit utilizarea
codurilor UNICODE (din 15 Septembrie 2021 – 14.0.0)
pe 8/16/32 biti, UTF-8, UTF-16, UTF-32) -> tipul
56
wchar_t ( wide char pe 2 sau 4 octeti)
CONSTANTE

 Caractere ASCII:
 neafişabile: 0...31, DEL (127)
 afişabile: spatiu (32), 33...126
 din setul extins: 128...255

 Exemplu: ‘a’ (ASCII: 97)


‘$’ (ASCII: 36)
‘3’ (ASCII: 51)

 Pentru a putea utiliza caractere neafişabile, se


folosesc "secvenţele de evitare" ("escape
sequences") care conțin caracterul ‘\’ ("backslash")
57
CONSTANTE
\b 0x08 BS
\f 0x0c FF
\n 0x0a LF
\r 0x0d CR
\t 0x09 HT
\v 0x0b VT
\\ 0x5c \
\' 0x27 '
\" 0x22 "
\ddd (octal) ; \xdd ; \Xdd (hexa)
 Exemple:
‘\10’ BS
‘\42‘ "
‘\x41‘ A 58

‘\x61’ a
CONSTANTE
 Constante şir de caractere
 Sunt succesiuni de caractere delimitate de ghilimele:
 Exemplu: "Sir de caractere "

 Caracterele din interiorul şirului pot fi secvenţe de


evitare:
 Exemplu: "\t Sir cu tabulare"

 Caracterul " (ghilimele) poate să apară într-un şir dacă


se utilizează o secvenţă de evitare:
 Exemplu: "Tipul \"int\""

 Un şir se continuă pe rândul următor folosind


caracterul ‘\’ (backslash), la sfârşitul rândului care se
continuă:
 Exemplu: "Text (linia 1)\
59
continuare (linia 2)"
CONSTANTE
 Caracterele unui şir se memorează unul după altul, pe
1 octet fiecare
 Sfârşitul de şir se marchează cu caracterul '\0' (NULL)
 Deci un şir de n caractere ocupă (n+1) octeţi în
memorie
 Există şi noţiunea de şir nul: ""
 Atenţie (pentru un mediu în care tipul int e pe 2 octeţi):
 Caracterul 'A' ocupă 1 octet în C++ şi 2 octeţi în C
 Şirul "A" ocupă 2 octeţi în C/C++
 Şirul nul "" ocupă 1 octet

60
9. VARIABILE SIMPLE
 Variabila permite reprezentarea în program a valorii unei
date, valoare ce poate fi modificată pe parcursul execuţiei
unui program

 Referirea la o variabilă se face prin numele acesteia:


 prin nume putem citi valoarea variabilei şi putem
modifica (scrie) această valoare
 O variabilă simplă (sau izolată) nu are legătură cu altă
variabilă simplă

 Unei variabile simple îi corespunde un tip de date ce nu


poate fi schimbat pe parcursul execuţiei programului

61
VARIABILE SIMPLE
 Tipul unei variabile se specifică prin cuvinte cheie

 Corespondenţa între numele unei variabile şi tipul


acesteia se defineşte printr-o declaraţie:
tip nume_var;
tip lista_de_nume;

 Exemple:
int suma;
int suma, produs, media;
char answer ;
Obligatoriu

62
VARIABILE SIMPLE
 Observaţii:
1. Declaraţia se termină obligatoriu cu delimitatorul ‘;’
2. Pentru variabile se folosesc, de obicei, litere mici
3. Variabilele declarate în interiorul unei funcţii (bloc) se
numesc variabile locale (automatice), iar cele declarate
în afara oricărei funcţii se numesc variabile globale
4. Fiecărei variabile îi corespunde o zonă din memoria
internă, care are asociate două valori:
 adresa zonei de memorie (referinţă, left-value sau
l-value) (poate sta în stânga unui operator de
atribuire)
 valoarea memorată (r-value sau right-value) (poate

sta numai în dreapta unui operator de atribuire !) 63


 Variabilele se pot iniţializa prin construcţii de forma:
tip nume = expresie_constanta;

Exemple: char ch='A', ans = 'N';


int k=-100, i=0;
float e=2.7172f;
 O altă metodă de iniţializare, introdusă în C++, este
numită iniţializare prin constructor (constructor
initialization), utilizând sintaxa:
tip nume(expresie_constanta);
Ex: int a(7); // echivalent cu int a=7;
 A treia metodă, numită iniţializare uniformă a fost
introdusă în C++11 si are sintaxa:
tip nume{expresie_constanta};
64
Ex: int a{7}; // echivalent cu int a=7;
VARIABILE SIMPLE

? Ce înţelegem prin: declarare, asignare, iniţializare ?

tip nume1, nume2; // declarare


tip nume= expresie_constanta; // initializare
nume1=nume2; // asignare

Exemplu: int a, b; // declarare


int a=4; // initializare
b=a; // asignare

65
 De la versiunea C++11 , cuvântul cheie auto poate fi
utilizat la iniţializarea unei variabile, pentru a specifica
faptul că tipul variabilei declarate va fi dedus automat din
expresia de iniţializare.

 Exemplu:
auto x = 4; // x → int
auto y = 3.37; // y → double
auto z = 'x'; // z → char

66
 Variabilele globale se alocă în memorie la compilare
şi se iniţializează cu valoarea expresiei
 implicit se iniţializează cu zero

 Variabilele locale (automatice) se alocă pe stivă, la


execuţie
 cele neiniţializate au valori nedefinite

 Dacă tipul expresiilor de iniţializare nu coincide cu tipul


variabilei pe care o iniţializează, atunci se fac conversii
de tip (cele permise)

67
10. TABLOURI
 Un tablou este o listă de elemente de acelaşi tip plasate
succesiv în memorie
 Orice tablou are un nume (care este un pointer constant
către primul element din tablou)
 Tipul elementelor tabloului reprezintă tipul tabloului
respectiv
 Tipuri:
 Unidimensionale (uneori numite vectori)
 Multidimensionale

68
Tablouri

TABLOURI UNIDIMENSIONALE
 Declaraţia tabloului:
tip nume_tablou[dimensiune];
 tip este un tip de dată (predefinit sau definit de
utilizator)
 nume_tablou este un identificator
 [ ] este delimitator
 dimensiune este o expresie constantă întreagă şi
pozitivă ce specifică numărul de elemente din tablou

69
Tablouri
 Pentru referirea unui element se foloseşte operatorul de
indexare [ ], precizând numele tabloului şi poziţia
elementului în tablou (numită şi index sau indice):
nume_tablou[index]

 Indexul este, în general, o expresie întreagă şi pozitivă


(nu neapărat constantă)

 Primul element are indexul 0, iar ultimul are indexul


(dimensiune-1)

70
Tablouri
 Pe baza numărului de elemente şi a tipului, compilatorul
determină dimensiunea zonei de memorie care se alocă
tabloului, după relaţia:
dimens_memorie = sizeof(tip) * dimensiune

 Exemplu:
int tab[100];

 primul element: tab[0]


 ultimul element: tab[99]
 un element oarecare: tab[i]
 dimensiunea memoriei alocate tabloului este:
sizeof(int)*100 = 2(4)00
71
Tablouri

 După alocarea memoriei necesare, la compilarea


restului programului sau la execuţie, nu se mai fac
verificări de domeniu la indici:
 de exemplu, o referire de genul tab[200] nu va fi
semnalată ca eroare, însă va genera surprize la
execuţie

 Acest lucru impune o mai mare atenţie din partea


programatorului

72
Tablouri

TABLOURI MULTIDIMENSIONALE
 Declaraţie:
tip nume_tablou[dim1][dim2]...[dimN];

 Referirea unui element se face astfel:


nume_tablou[index1][index2]...[indexN];

 Dacă n=2 tabloul se numeşte matrice


 Exemplu: float tab[10][5];

73
Tablouri

 Un tablou cu mai multe dimensiuni este de fapt un


tablou unidimensional având ca elemente alte tablouri

 Exemplu:
int tab[10][20];

este un tablou cu 10 elemente (linii), iar fiecare element


este un tablou de 20 de numere întregi (coloane)

Tablourile se pot inițializa în program cu instrucțiuni sau


cu valori trecute între acolade (dimensiunea este
optională) la declarare.
int note[ ] = {7, 10, 5, 8, 6, 9, 10}; 74
11. ŞIRURI DE CARACTERE

 In limbajul C nu există un tip de date special pentru


şiruri de caractere, dar se pot folosi tablourile
unidimensionale de caractere pentru a memora şiruri de
caractere
 In C++ avem acum un pseudo container string

 Declarare:
char nume_tablou[dimensiune];

 Pentru a marca sfârşitul şirului, după ultimul caracter se


adaugă un octet cu valoarea 0 (caracterul '\0'):
 In cazul unui şir vid nume_tablou[0] = '\0'
75
Şiruri de caractere
 Intr-un tablou se pot memora cel mult (dimensiune-1)
caractere

 Terminatorul '\0' permite testarea uşoară a sfârşitului


şirului de caractere

 Constantele şiruri de caractere pot fi folosite pentru


iniţializarea unui tablou de caractere
 Exemplu:
char tab[ ] = “Program de test”;

Noile compilatoare C++ permit utilizarea șirurilor de


caractere de tip wchar_t (wide char).
76
#include<iostream>
using namespace std;

int main() {
char str1[] = "This is character array";
cout << str1 << endl;
wchar_t str2[]= L"This is wide character
array";
wcout << str2 << endl;
cin.get();
}

77
CE ŞTIM DUPĂ ACEST CURS ?

 Cum arată un program C/C++


 Cum declarăm, definim şi apelăm o funcţie în C/C++

 Cum utilizăm directivele preprocesor şi comentariile

 Diferenta intre declaratia (prototipul) unei functii,


antetul unei functii, definirea (implementarea) unei
functii, apelul unei functii
 Diferenta intre parametri actuali si efectivi

 Antetul functiei main()?

 Cum reprezentăm constantele numerice, caracter, şir


de caractere

78
 Tipurile de date fundamentale
 Tablouri şi siruri de caractere – declarare, initializare

 Ce este o constanta, o variabila (globala, locala)

 Cum se pot initializa variabilele?

 Care este diferenta intre declaratia, initializarea si


asignarea variabilelor?
 Cand se rezerva spatiu pentru variabilele globale,
respectiv pentru cele locale?

79
80

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