Documente Academic
Documente Profesional
Documente Cultură
1. SETUL DE CARACTERE
Entităţile sintactice specifice limbajului C se construiesc din simbolurile care constituie alfabetul
limbajului C. Simbolurile se codifica conform codului ASCII ( American Standard Code for Information
Interchange ), prin cate o configuratie de 8 biti ( un octet); rezulta faptul ca sunt 256 ( 0 - 255 ) de
caractere in codul ASCII.
Simboluri grafice
Cod ASCII
Categorie Membri in zecimal in hexazecimal in
octal
A B C ..... Z A -- 65 41 101
Z -- 90 5A 132
Litere a -- 97 61 141
a b c ...... z z -- 122 7A 172
0 -- 48 30 060
Cifre 0 1 2 ...... 9
9 -- 57 39 070
Liniuta de _ 95 5F 137
subliniere
! " # % & ' ( ) * + , - .
Operatori si /
semne : ; < = > ? [ ] \ ^ { } |
de punctuatie ~
Cod
Secventa
Simbol Semnificatie ASCII
escape
in zecimal
SP avans cursor cu o pozitie - space 32
BEL semnal acustic - bell \a 7
BS revenire cursor cu o pozitie - back space \b 8
FF salt la pagina noua - form feed \f 12
NL avans cursor cu o linie - new line \n 10
revenire cursor la inceputul liniei curente-carriage
CR \r 13
return
salt la urm pozitie de tabulare orizontala -horizontal
HT \t 9
tab
VT salt la urm pozitie de tabulare verticala -vertical tab \v 11
NULL caracter cu cod 0 ( terminator de sir ) \0 0
1
Astfel, mulţimea caracterelor se împarte în trei grupe:
caractere negrafice: cod Ascii < 32 şi DEL(cod 127 - excepţie)
- au diferite funcţii speciale, spre exemplu: \n, \t, \b, etc
spaţiu cod Ascii = 32
caractere grafice (imprimabile) 32<cod Ascii <127
- literele mari ale alfabetului englez (A cod 65)
- literele mici ale alfabetului englez (a cod 97)
- cifre 0..9 (0 cod 48)
- caractere speciale: !, ", *. + etc.
-
OBS. Limbajul C este case-sensitive, în el se face distincţie între literele mari şi literele mici!
2 ENTITĂŢILE SINTACTICE
2.1. Cuvintele cheie şi cuvintele rezervate sunt cuvinte utilizate în principal pentru declaraţii de
tipuri de date şi instrucţiuni. Toate aceste cuvinte sunt scrise cu litere mici.
EXEMPLU: Tabela cuvintelor cheie - 32 cuvinte cheie, dintre care 27 provin din standardul initial
Kernighan - Ritchie, iar 5 au fost adaugate de comitetul ANSI ( enum, const, signed, void, volatile );
limbajele de nivel inalt au de obicei mult mai multe cuvinte cheie - BASIC peste 100
Tabela cuvintelor rezervate - proprii compilatorului Turbo C: nume de registri, moduri de compilare
2
far _es _BP _DL
huge _ss _BX _DX
interrupt _AH _CH _FLAGS
near _AL _CL _SI
pascal _AX _CX _SP
2.2. Identificatori
Un identificator este o succesiune de litere (mari sau mici ale alfabetului englez), cifre sau
caracterul special ‘_’; primul caracter este obligatoriu noncifră.
Exemplui:
nume de variabile, constante simbolice, functii, tipuri, structuri, uniuni ( care sunt nume
utilizator ):.
cuvinte cheie şi rezervate ale limbajului C - pot fi folosite doar cu intelesul cu care au fost
definite
Exemple:
- constante simbolice
#define PI 3.1415
#define DIMENSIUNE 20
#define Salut "Hello!"
întregi –
o zecimale - în baza 10;
o octale - în baza 8; sunt precedate de 0 exemplu: 0237 ( în octal );
o hexazecimale - în baza 16; sunt precedate de 0x sau 0X; exemple: 0xffab
reale – reprezintă valori raţionale în scriere zecimală sau exponenţială. De exemplu o
constantă în patru scrieri echivalente:
3
b) Constantele caracter se precizează între apostrofuri: ‘a’, ‘1’.Caracterul poate fi:
un simbol grafic sau codul său ASCII scris în zecimal, sau hexazecimal, respectiv octal, prin
utilizarea simbolului \; exemple: 'A' '\x41' '\101' ( sunt echivalente );
o caracterele \ ' " se reprezintă ca şi constante: '\\' '\'' '"'
un simbol fără echivalent grafic, dat ca secvenţă escape: '\n' '\xa' '\12' ( sunt
echivalente ).
caractere cu coduri în [128, 255] se pot afişa prin intermediul secvenţelor escape ‘\xdd’
unde dd reprezintă scrierea în baza 16 a codului
#include <iostream>
using namespace std;
int main()
{
unsigned char a='\xc9', b='\xcd',
c='\xbb', d='\xc8', e='\xbc',
f='\xba', g='\x01';
cout<<a<<b<<b<<b<<c<<endl;
cout<<f<<' '<<g<<' '<<f<<endl;
cout<<d<<b<<b<<b<<e;
return 0;
}
exemplu>
c) Constantele şir de caractere se precizează între ghilimele. Fiecare caracter din şir poate fi un
simbol grafic, o secvenţă escape sau un cod ASCII ( în octal sau hexazecimal ). Spaţiul ocupat este
un număr de octeţi cu unu mai mare decât al caracterelor din sir, ultimul octet fiind rezervat
pentru terminatorul de sir: caracterul cu codul ASCII 0, adică '\0'. Dacă se doreşte ca şi caracterul
" să facă parte din şir, el trebuie precedat de \.
Exemple: "CURS" "\x43URS" ( scrieri echivalente ale unui şir ce ocupă 5 octeţi );
"1a24\t" "\x31\x61\x32\x34\11" ( scrieri echivalente ale unui şir ce ocupă 6 octeţi )
"'\"" ( şirul ’” ce conţine caracterele ' " şi terminatorul, deci ocupă 3 octeţi ).
4
Tabelul ASCII
5
Tabelul ASCII-extins
6
2.4. Operatori sunt simboluri utilizate pentru a specifica operaţiile de efectuat. O combinaţie validă
de valori (variabile sau constante) şi operatori formează o expresie.
3 TIPURI DE DATE
CLASIFICARE:
1. tipuri predefinite de date (standard sau fundamentale)
aritmetice (întregi şi reale)
void (niciun tip)
2. tipuri derivate
tipuri structurate
- tablouri (şiruri de caractere)
- înregistrare
- fişier text
pointer
referinţă, sinonim
definite de utilizator (enumerare)
7
Tipurile simple de date (predefinite sau standard) uzuale pt. Codeblocks şi MinGW.
8
4. Variabile
identificatori (nume) cărora li se asociază la un moment dat o adresă şi o valoare, şi care sunt
supuse prelucrării în programul care le conţine
reprezintă un ansamblu de 4 elemente: nume / tip / adresă de memorie / valoare
se declară prin intermediul instrucţiunilor de declarare:
<tip> nume [=val];
Exemplu: float a,b;
char a[20], x;
int a=5;
char s[]=”ora” ;
nu există tipuri de variabile predefinite
înainte de a fi utilizate, variabilele trebuie declarate pentru a specifica tipul şi numele lor şi pentru
a li se rezerva spaţiul de memorie
variabilele pot fi de:
o tip întreg (char, int, long long)
o tip real (float, double, long double),
o tipuri structurate (vectori, matrice, şiruri de caractere, înregistrare)
o pointeri
pentru a avea acces la zona de memorie alocată unei variabile, folosim operatorul de adresă &
exemplu. int v=10; cout<<&p;
iniţializarea unei variabile se face prin citire sau atribuire simplă:
Exemplu: int x=3, y,z;
cin>>y; z=x+y+z;
5. Operatori
1. Operatorul sizeof
2. Operatorul de determinare a adresei &
3. Operatorii aritmetici
a. operatorii unari de păstrare/schimbare a semnului: + -
b. operatorii binari multiplicativi - de înmulţire, împărţire, modulo: * / %
c. operatorii binari aditivi - de adunare şi scădere: + -
4. Operatorii de atribuire =
5. Operatorii pe biti
~ complementare & si
>> deplasare la dreapta ^ sau exclusiv
<< deplasare la stanga | sau
6. Operatorii de atribuire aritmetică (compusă)
9
1. Operatorul sizeof
Rezultatul aplicării acestui operator unar este un număr natural reprezenând numărul de octeti
necesari pentru stocarea unei valori de tipul operandului acestui operator.
#include <iostream>
using namespace std;
int main()
{
cout<<sizeof('a')<<endl ;
cout<<sizeof(int)<<endl;
cout<<sizeof(2.5 + 3)<<endl;
cout<<sizeof(float)<<endl;
cout<<sizeof(double)<<endl;
cout<<sizeof(long double);
return 0;
}
Este un operator unar, operandul fiind o variabilă (obligatoriu!!). Se poate afla adresa zonei de
memorie repartizate unei variabile folosind acest operator.
Exemplu:
int v=2011;
cout<<"valoare: "<<v<<endl<<"adresa de memorie: "<<&v;
3. Operatorii aritmetici
a. operatorii unari: + -
b. operatorii binari multiplicativi - de înmulţire, împărţire, modulo: * / %
c. operatorii binari aditivi: + -
10
Obs:
– Rezultatul evaluării expresiei aritmetice 10/3 este 3, adică câtul împărţirii întregi
ale celor doi operanzi întregi.
– 10./ 3 = 3.33333
– Operatorul % se aplică doar datelor de tip întreg.
4. Operatorii de atribuire =
variabilă=expresie;
int a,b,c;
a=b=7=c=2;
- & 0 1
0 0 0
1 0 1
- Este folosit pentru a verifica dacă un bit este setat (are valoarea) 1 sau 0. În acest scop, efectuăm o
operaţie între variabila al cărui conţinut vrem să-l testăm şi o constantă hexazecimală care are un
singur bit 1, în poziţia ce urmează a fi testată.
11
Exemplu: testez bitul 4 din variabila a de tip char cu conţinutul 0101 1011= 0x5B, adică 91 în baza
10. Folosesc variabila b=0001 0000=0x10
#include <iostream>
using namespace std;
int main()
{ char a=0x5B, b=0x10, c=0x04;
cout<<"a= "<<a<<" caracter cu codul: "<<(int)a<<endl;
cout<<"b= "<<b<<" caracter cu codul: "<<(int)b<<endl;
cout<<"a&b="<<(a&b)<<endl;
if(a&b!=0) cout<<"bit 4 setat pe 1";
else cout<<"bit 4 setat pe 0";
if(a&c) cout<<"\nbit 2 setat pe 1";
else cout<<"\nbit 2 setat pe 0";
return 0;
}
| 0 1
0 0 1
1 1 1
12
Exemplu: Fie variabila a de tip unsigned char cu conţinutul 0101 1011= 0x5B, adică 91 în baza 10.
Fie variabila x=1101 0001=0xD1 = 209 de tip unsigned char.
- Este folosit pentru a schimba setarea unui bit. (0=>1 , respectiv 1=>0)
^ 0 1
0 0 1
1 1 0
Exemplu: Schimb setarea bitului 4 din variabila a de tip char cu conţinutul 0101 1011= 0x5B, adică
91 în baza 10. Folosesc variabila b=0001 0000=0x10
În cazul operatorilor de deplasare, care sunt binari, primul operand este cel ai cărui biţi sunt
deplasaţi, iar al doilea indică numărul de biţi cu care se face deplasarea - deci numai primul operand
este prelucrat la nivel de bit:
a<<n // deplasare la stânga a reprezentării binare cu n poziţi
a>>n // deplasare la dreapta a reprezentării binare cu n poziţi
La deplasarea la stânga cu o poziţie, bitul cel mai semnificativ se pierde, iar în dreapta se
completează cu bitul 0.
La deplasarea la dreapta cu o poziţie, bitul cel mai puţin semnificativ se pierde, iar în stânga se
completează cu un bit identic cu cel de semn (primul bit).
Obs. Cu excepţia cazurilor când se produce depăşire, deplasarea la stânga cu n biţi echivalează cu
înmulţirea cu 2 la puterea n.
Analog, deplasarea la dreapta cu n biţi echivalează cu împărţirea cu 2 la puterea n.
13
Exemple:
Cele doua secvente din tabela conduc la aceleasi rezultate pentru variabila i de tip int:
i=i*8; i=i<<3;
i=i/4; i=i>>2;
i=i*10; i=i<<3 + i<<1;
În tabela următoare apar valorile obţinute (în binar şi zecimal) prin aplicarea operatorilor de
deplasare pentru variabila a de tip char:
Exemplul 1: Afişarea reprezentării binale a unui număr natural x care poate fi reprezentat pe 4
octeţi. ( bitul cel mai puţin semnificativ se consideră ca fiind de poziţie 0, biţii sunt numerotaţi
de la 0 la 31, bitul 31 este bitul de semn setat pe 1 în acest caz).
#include <iostream>
using namespace std;
int main()
{
int x, bit=1, i;
cout<<" x>=0: "; cin>>x;
bit=bit<<30; // bitul 1 este pe pozitia 30
for(i=1;i<=31;i++)
{ if((x & bit)!=0)cout<<1;
else cout <<0;
bit= bit>>1;
}
return 0;
}
14
Exemplul 2. Să se genereze toate submulţimile mulţimii {1,2,3,…,n} unde 1<=n<=63, n
număr natural.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long x, bit, max=0;
int i,n;
cout<<"n<60 n= "; cin>>n;
//formez in max cel mai mare numar natural care poate fi reprezentat
//pe n pozitii binare, 0<=n<63
max =pow(2.0,n)-1;
//cout<<max<<endl;
bit=1; // bitul 1 este pe pozitia 30
for(x=0;x<=max;x++)
{ bit=1; cout<<"{";
for(i=0;i<=n;i++)
{ if((x & bit)!=0)cout<<i+1<<' ';
bit= bit<<1;
}
cout<<"}\n";
}
cout<<"numar total de submultimi(2^n)= "<<max+1;
return 0;
}
15
5. Operatorii de atribuire aritmetică (compusă)
dacă este prefixat (adică este pus în faţa numelui variabilei) atunci mai întâi se modifică
valoarea variabilei şi apoi se foloseşte noua valoare.
// se va afişa valoarea 9
dacă este postfixat (adică este pus după numele variabilei) atunci mai se foloseşte
valoarea curentă a variabilei şi apoi se modifică valoarea variabilei.
// se va afişa valoarea 10 11
Operatorii relaţionali sunt binari şi apar în expresii logice (condiţii logice), valorile acestora fiind
logice: 0 ( interpretat ca valoarea logică fals)- sau 1 ( interpretat ca valoarea logica adevărat ). În
C orice valoare diferită de 0 este interpretată ca adevărat.
8. Operatori de egalitate == !=
Expresiile în care intervin aceşti operatorii returnează 0 sau 1, dacă se realizează egalitatea
sau nu.
! negatie logica
&& si logic
|| sau logic
Operanzii sunt întregi, interpretaţi ca valori logice. Operatorii tratează operanzii ca valori logice,
deci orice valoarea diferită de 0 este interpretată ca adevărat, iar 0 ca fals.
x y !x x&&y x||y
0 0 1 0 0
0 valoare≠0 1 0 1
valoare≠0 0 0 0 1
valoare≠0 valoare≠0 0 1 1
dacă primul operand al expresiei în care apare operatorul && este 0, sigur rezultatul final este 0,
indiferent de valoarea celui de-al doilea
dacă primul operand al expresiei în care apare operatorul || este ≠0, sigur rezultatul final este 1,
indiferent de valoarea celui de-al doilea.
Expresiile logice în C se calculează în „scurt circuit”, adică dacă primul operand are valorile de mai
sus, corespunzator operandului && sau ||, cel de-al doilea operand nu se mai evaluează. Aceasta
implică necesitatea codificării cu atentie a expresiilor logice, trebuind să se tina cont şi de efectele
laterale.
17
Exemplu:
#include <iostream>
using namespace std;
int main()
{
int a=4,b=6;
cout<<"a= "<<a<<" b= "<<b<<endl;
cout<<"!a "<<!a;
cout<<endl<<"!!a "<<!!a;
cout<<endl<<"a&&b-6 "<< (a&&b-6); // se executa mai intai b-6, apoi a&&0
cout<<endl<<"a||(b+=8) "<< (a||(b+=8)); //a e diferit de 0=> expresia
//este adevarata. b nu se modifica
cout<<endl<<"a= "<<a<<" b= "<<b;
return 0;
}
18
Exemplu int char x='a', y=1;
cout<<x+y; //98
cout<<(char)(x+y); //b
Operatorul de conversie explicita ( cast ) se utilizeaz[ cand se doreşte ca tipul unui operand
(expresie) să fie altul decât cel implicit. Operatorul este unar, are prioritate ridicată şi are sintaxa:
( tip ) expresie
Exemplu: float r;
r=5/2; // impartirea se face în int, deci r va fi 2.0
r=(float)5/2; // r va fi 2.5
Operatorul conditional este singurul operator ternar. El se foloseste în situaţiile în care există două
variante de obţinere a unui rezultat, dintre care se alege una singură, funcţie de îndeplinirea sau
neîndeplinirea unei condiţii. Cei trei operanzi sunt expresii, prima reprezentand condiţia testată.
expr_logică ? expr1 : expr2
Dacă valoarea expr_logică este adevarată ( !=0 ), se evalueaza expr1, altfel expr2, rezultatul
expresiei evaluate fiind rezultatul final al expresiei condiţionale.
Exemple:
Se utilizează atunci când prelucrarea unei expresii formată din mai multe expresii separate prin
virgule. Evaluarea expresiei presupune evaluarea a două sau mai multor expresii; acestea se
evaluează de la stânga la dreapta, iar rezultatul (valoarea) întregii expresii este cel al ultimei expresii
( exprn ):
expr1,expr2,...,exprn
Exemplul 1: Expresia de mai jos memorează în max valoarea maximă dintre a şi b, realizând şi
ordonarea descrescătoare a acestora (deci le interschimba dacă a<b prin utilizarea unei variabile
auxiliare ):
int a,b,aux,max;
max=a>=b?a:(aux=b,b=a,a=aux);
19
Operatorul virgulă este necesar pentru a avea o singura expresie după :.
Folosind instructiunea if, prelucrarea de mai sus se poate scrie:
if(a<b)aux=b,b=a,a=aux;
max=a;
sau:
if(a<b){aux=b;b=a;a=aux;}
max=a;
Exemplul 2:
20
21