Sunteți pe pagina 1din 15

Introducere în limbajul de programare C

- C este un limbaj de programare ale cărui caracteristici sunt economia de expresie,


structuri moderne de control al fluxului şi de date, precum şi un set bogat de operatori.
C nu este un limbaj de nivel "înalt" şi nu este specializat vreunei arii particulare de
aplicaţii.
- C a fost la început proiectat şi implementat pe sistemul de operare UNIX pe DEC
PDP11 de către Dennis Ritchie. Ulterior Brian Kernigham, în cautarea celui mai
potrivit limbaj pentru scrierea sistemului de operare a conceput împreună cu Dennis
Ritchie, la începutul anilor 1970 un limbaj nou: C. Sistemul de operare, compilatorul
C şi în mod esenţial, toate programele de aplicaţii din UNIX sunt scrise în C.

- Limbajul C are construcţiile fundamentale pentru controlul fluxului necesare pentru


programele structurate: grupare de instrucţiuni; luare de decizii ("if"); repetare cu
test de terminare la început ("while", "for") sau la sfârşit ("do"), selectare a unui caz
dintr-o mulţime de cazuri posibile ("switch").

- Limbajul C foloseşte pointeri şi are abilitatea de a face aritmetica cu adrese.


Argumentele funcţiilor sunt pasate copiind valoarea argumentului şi este imposibil
pentru funcţia apelată să modifice argumentul real din apelant. Când se doreşte să se
obţină un "apel prin referinţă", se trimite explicit un pointer, iar funcţia poate modifica
obiectul la care face referire pointerul. Numele de tablouri sunt trimise ca locaţie a
originii tabloului, deci argumentele tablourilor sunt efectiv apeluri prin referinţă.

Reprezentarea unui algoritm într-un limbaj de programare poartă numele de


program.
Un program C conţine una sau mai multe funcţii, dintre acestea una este funcţia
principală. Fiecare funcţie are un nume. Funcţia principală se numeşte main; celelalte
funcţii au nume date de utilizator.

1
Un program C este alcătuit din următoarele elemente constitutive:
- directive de preprocesare (precompilare)
- declaraţii:
- de variabile
- de funcţii
- definiţii de funcţii
- comentarii

Fişierul care conţine un program scris în C se numeşte fişier sursă şi are extensia .c.
Prin compilarea unui fişier sursă rezultă un fişier obiect, acesta are extensia .obj.
Fişier Sursă Fişier obiect

Compilator

Urmează etapa de editare de legături (link-editare), în urma căreia rezultă un fişier


executabil, acesta are extensia .exe. În urma execuţiei unui program sunt obţinute
rezultatele (datele finale) programului.

Fişier sursă 1
Fişier sursă 2
... Editor
legături
Fişier sursă n Rutine Fişier executabil

2
Elementele de bază ale limbajului C
Ca şi alte limbaje de programare, C are un alfabet şi reguli pentru scrierea
programelor corecte folosind semne de punctuaţie. Aceste reguli formează sintaxa
limbajului C.
Compilatorul împarte programul sursă în atomi lexicali, care reprezintă vocabularul
de bază al limbajului. În ANSI C (American National Standards Institute) sunt şase
tipuri de atomi lexicali (care se mai numesc şi elemente lexicale sau unităţi lexicale):
1. cuvinte rezervate (sau cheie);
2. identificatori;
3. constante;
4. siruri constante;
5. operatori;
6. semne de punctuatie.
Setul de caractere utilizat în C este cel reprezentat de codul ASCII. (American
Standard Code for Information Interchange). Caracterele sunt codificate prin întregi
în intervalul [0,127]. Un astfel de întreg poate fi păstrat în binar pe 8 biţi (un
octet). Mulţimea caracterelor este împărţită în 3 grupe: caractere negrafice (exceptând
caracterul DEL care are codul 127, au codurile ASCII mai mici decât 32, deci aparţin
intervalului [1,31]), spaţiu (are codul 32) şi caractere grafice (au codurile ASCII mai
mari decât 32, deci sunt din intervalul [33,126]; astfel sunt literele mari – au codurile
cuprinse în intervalul [65,90], literele mici – au codurile cuprinse în intervalul
[97,122] şi caracterele speciale, cifrele au codurile cuprinse în intervalul [48,57]).
Caracterul cu codul 0, numit şi caracter nul, nu poate fi generat de la tastatură şi nu
poate fi tipărit, notat cu '\0' – reprezintă finalul unui şir de caractere în memorie

Cuvinte cheie
Cuvintele cheie(rezervate) sunt cuvinte care au înţeles special pentru compilatorul C:
acestea sunt instrucţiuni, tipuri fundamentale sau intră în sintaxa de definire a funcţiilor

3
şi a tipurilor de date.

auto break case char const continue default


do double else enum extern float for
goto if int long register return short
signed sizeof static struct switch typedef union
unsigned void volatile while

Identificatori
Un identificator este un atom lexical format dintr-o succesiune de
litere şi cifre, primul caracter fiind literă. Se pot utiliza litere mici şi litere mari ale
alfabetului englez, precum şi caracterul underscore (semnul de subliniere: _ ).
Limbajul C este un limbaj case sensitive, adică literele mici sunt diferite de cele
mari.
Exemple: x, i, a1, A1, b_1, Maxim, MAXIM, maxim.
Identificatorii care încep cu underscore pot fi confundaţi cu numele variabilelor
sistem. De exemplu, identificatorul _ctype declarat în biblioteca <ctype.h>, este folosit
pentru numele unui vector de atribute. Dacă un programator foloseste un
identificator cu acelasi nume, dar pentru alte scopuri, atunci ori se va semnala o eroare
aparent necunoscută, ori compilatorul se va comporta ciudat. Se recomandă a nu se
folosi identificatori care încep cu underscore.

Tipuri de date
Prin tip de dată se înţelege o mulţime pentru care se definesc:
• dimensiunea zonei de memorie asociate unui element;
• tipul de viaţă asociat datei;
• mulţimea operaţiilor prin care valorile tipului pot fi modificate sau prelucrate şi
semnificaţia acestor operaţii;
4
• operatorii utilizaţi şi semnificaţia acestora.
Se pot face mai multe clasificări pentru datele folosite într-un program C, astfel:
- date ca operanzi, acestea sunt:
• constante (literale şi simbolice)
• variabile
- date ca mod de reprezentare, acestea sunt:
• întregi cu semn (reprezentate intern în format complement faţă de 2)
şi fără semn (reprezentate intern în baza 2)
• reale (reprezentate intern în format virgulă mobilă)
- date ca mod de interpretare, acestea sunt:
• numerice
• caractere
• adrese
- date sub aspectul multiplicităţii, acestea sunt:
• scalare
• agregate- tablouri, structuri, uniuni, bit-fields (câmpuri de biţi)

Tipurile de date pot fi: predefinite (numite şi tipuri de bază) şi definite de


utilizator (numite şi derivate).

Următorul tabel prezintă tipurile de bază folosite în limbajul C (ANSI).

5
Tipul Descriere Dimensiune Interval de valori
int Întreg binar reprezentat 16 biţi [-32768, 32767]
prin complement faţă de 0

unsigned Întregbinar reprezentat prin 16 biţi [0, 65535]


int complement faţă de 0

short Întreg binar reprezentat 16 biţi [-32768, 32767]


prin complement faţă de 0

unsigned Întreg binar reprezentat 16 biţi [0, 65535]


short prin complement faţă de 0

long Întreg binar reprezentat 32 biţi [-2^31, 2^31 – 1]


prin complement faţă de 0

unsigned Întregbinar reprezentat prin 32 biţi [0, 2^32 – 1]


long complement faţă de 0-

unsigned codul ASCII caracter 8 biţi [0, 255]


char
signed char codul ASCII caracter 8 biţi [-128, 127]
float Număr 32 biţi Valoarea absolută a
reprezentat în virgulă unei date diferită de 0
flotantă simplă [3.4*10^(-38);
precizie 3.4*10^(38)]
double Număr 64 biţi Valoarea absolută a
reprezentat în virgulă unei date diferită de 0
flotantă în dublă precizie [1.7*10^(-308);
1.7*10^(308)]

long double Număr 80 biţi Valoarea absolută a


reprezentat în virgulă (10 octeţi) unei date diferită de 0
flotantă în dublă precizie [3.4*10^(- 4932);
3.4*10^(4932)]

Obs. Datele specificate numai prin char au o interpretare implicită: numere fără semn
cuprinse în intervalul [0,255].

6
Comentarii
Comentariile sunt explicaţii pentru programatori şi nu au nici un efect asupra
compilatorului fiind omise la compilare.
- comentarii peo line //
- comentarii pe mai multe linii : comentariu începe cu secvenţa de caractere /* şi se
termină cu */
Exemple:
1.// comentariu pe o linie
2./* un comentariu */
3. /*
Al treilea
comentariu
*/

Constante
Constantele sunt valori fixe reprezentând caractere, şiruri de caractere, numere
întregi sau raţionale.
O constantă are un tip şi o valoare; valoarea sa nu poate fi schimbată în timpul execuţiei
programului în care a fost utilizată.
Constantele pot fi: constante întregi, constante flotante şi constante caracter.
Constantele întregi pot fi scrise în sistemul de numeraţie cu baza 8, 10 sau 16.
O constantă zecimală întreagă este un şir de cifre zecimale care are prima cifră
diferită de zero. Constantele zecimale se reprezintă prin complement faţă de doi pe
16 biţi sau pe 32 de biţi. Constantele întregi reprezentate pe 16 biţi sunt de tip int, iar
cele reprezentate pe 32 biţi sunt de tip long.
O constantă zecimală ce se reprezintă în mod implicit pe 16 biţi, se poate reprezenta
şi pe 32 de biţi, punând l sau L la sfârşitul ei. Exemplu: 12345l sau 12345L.
O constantă zecimală are tipul unsigned dacă se termină cu litera u sau U. O astfel

7
de constantă se reprezintă pe 16 biţi dacă nu este mai mare decât 65535 şi pe 32 de
biţi în caz contrar. Dacă se doreşte ca o constantă întreagă fără semn mai mică decât
65535 să se reprezinte pe 32 de biţi, constanta respectivă se va termina prin una din
următoarele succesiuni de litere: ul, lu, LU, UL.
O constantă octală întreagă este o succesiune de cifre octale (0-7) precedată de un
zero nesemnificativ. Ea se păstrează pe 16 biţi sau pe 32 biţi. Dacă aceasta se termină
cu l sau L, atunci ea se reprezintă pe 32 de biţi chiar dacă sunt suficienţi 16 biţi
pentru eprezentarea ei. Constantele octale sunt de tip unsigned dacă se reprezintă pe
16 biţi şi unsigned dacă se reprezintă pe 32 biţi.
O constantă hexazecimală întreagă este o succesiune de cifre hexazecimale precedată
de 0x sau 0X. În rest are aceleaşi proprietăţi ca şi o constantă octală.
O constantă flotantă reprezintă un număr raţional. Ea se compune dintr-o parte
întreagă, care poate fi şi vidă, dintr-o parte fracţionară, care poate fi şi vidă şi un
exponent, care poate fi şi vid. Partea întreagă este o constantă zecimală. Partea
fracţionară se compune din caracterul punct după care urmează o succesiune de
cifre zecimale. Succesiunea poate fi vidă doar dacă partea întreagă este prezentă.
Exponentul începe cu litera e sau E, după care poate fi prezent un semn opţional
(plus sau minus) şi un şir de cifre zecimale. Exponentul defineşte un factor care
exprimă o putere a lui 10.
Constantele flotante se reprezintă în dublă precizie (pe 64 biţi). Pentru a reprezenta o
constantă flotantă în simplă precizie trebuie ca aceasta să fie urmată de litera f sau F.
O constantă caracter are ca valoare codul ASCII al caracterului pe care-l reprezintă.
Ea are tipul int. O constantă caracter este inclusă între caractere apostrof. Exemplu:
'a', 'D', '7', '*'. Excepţie de la această regulă o fac caracterele apostrof ('), backslash (\)
şi ghilimele ("). Acestea se reprezintă astfel:
- caracterul apostrof '\' '
- caracterul backslash '\\'
- caracterul ghilimele '\"'
Caracterul backslash se poate utiliza pentru a defini constante caracter şi pentru
8
caractere negrafice. Se spune că backslash introduce o secvenţă escape. De exemplu:
‘\n’ - rând nou
‘\t’ - tabulator orizontal

Şir de caractere
O succesiune de zero sau mai multe caractere incluse între ghilimele
formează o constantă şir sau un şir de caractere. La scrierea caracterelor din
compunerea unui şir de caractere se pot utiliza secvenţe escape.
Exemple:
"Acesta este un sir de caractere"
"Prin aceasta secventa escape \\ se reprezinta backslash"

Caracterele unui şir de caractere se păstrează în memorie într-o zonă contiguă,


reprezentate fiind de codurile lor ASCII. După ultimul caracter al şirului se păstrează
caracterul NUL, adică valoarea zero (‘\0’). Acesta joacă rolul de marcaj de sfârşit
al oricărui şir de caractere. Datorită acestui marcaj se face distincţie între o constantă
caracter care corespunde unui caracter şi şirul de caractere care este format din
acelaşi caracter.
Exemplu:
Constanta caracter 'A' se păstrează în memorie într-un octet prin valoarea 65, pe
când şirul de caractere "A" ocupă o zonă de doi octeţi: în primul octet se păstrează
valoarea 65, iar în al doilea caracterul NUL.

Variabile
Prin variabilă înţelegem o dată a cărei valoare se poate schimba pe parcursul
execuţiei programului. Unei variabile i se atribuie patru entităţi: nume (cu ajutorul
căruia se va putea referi pe parcursul execuţiei programului), valoare (la un moment

9
dat), tip (valorile pe care le poate avea variabila la momente diferite trebuie să aparţină
aceluiaşi tip) şi adresa în memorie. Corespondenţa dintre numele şi tipul unei
variabile se realizează cu ajutorul unei declaraţii.

Declaraţia unei variabile simple


tip lista_de_identificatori;

unde tipul este un cuvânt cheie pentru tipurile predefinite, iar lista_de_identificatori
este o succesiune de nume de variabile separate prin virgulă.
Exemple:
int a,b,c;
char opt;
float x,z;
double y;
long double w;

Datele de acelaşi tip pot fi grupate astfel încât să formeze o mulţime ordonată de
elemente la care să ne putem referi folosind indici. În acest caz definim tablouri.
Un tablou reprezintă un tip structurat care ocupă o zonă de memorie continuă şi conţine
elemente de acelaşi tip. Tablourile pot fi unidimensionale, caz în care se utilizează un
singur indice pentru a referi elementele tabloului şi multidimensionale, caz în care
se folosesc mai mulţi indici.
Exemple de tablouri unidimensionale sunt vectorii, iar de tablouri bidimensionale
sunt matricele. Ca orice variabilă, un tablou trebuie declarat înainte de a fi utilizat.

Declaraţia unui tablou

tip nume_tablou[dim_1][dim_2]…[dim_n];

10
unde tip este un cuvânt cheie pentru tipurile predefinite, nume_tablou este numele
variabilei tablou, iar dim_i este dimensiunea superioară a indicelui i, adică el poate lua
valorile 0,1,2,...,dim_i-1.
Dimensiunile dim_i sunt expresii constante.
În limbajul C, numele unui tablou este un simbol care are ca valoare adresa primului
său element. La compilare, se alocă o zonă de memorie necesră pentru a reţine
elementele sale.
Exemple:
int a[100];
- un tablou cu 100 elemente de tip întreg. Elementele sale pot fi referite prin
a[0],a[1],…,a[99]. a[0] are ca valoare valoarea primului element din tablou, iar
variabila a are ca valoare adresa acestui element.
char m[10];
float x[10], y[10][20];
La elementele matricii y ne referim prin:
y[0][0] y[0][1]…y[0][19]
y[1][0] y[1][1]…y[1][19]
y[2][0] y[2][1]…y[2][19]

y[10][0] y[10][1]…y[10][19]
y are ca valoare adresa elementului y[0][0].

Preprocesare
Un program sursă C sau C++ poate fi prelucrat înainte de a fi supus compilării.
O astfel de prelucrare se numeşte preprocesare. Ea este realizată automat înaintea
compilării. Preprocesarea asigură:
- includeri de fişiere cu texte sursă;

11
- definiţii şi apeluri de macrouri;
- compilare condiţionată.

Preprocesarea se realizează prin prelucrarea unor informaţii specifice care au ca prim


caracter, caracterul diez (#).
În paragraful de faţă vom aborda construcţia #include şi parţial construcţia #define
utilizată la substituiri de succesiuni de caractere. Ulterior se vor descrie şi alte facilităţi
oferite de preprocesare.

Includeri de fişiere cu texte sursă


Un fişier cu text sursă poate fi inclus cu ajutorul construcţiei #include. Aceasta
construcţie are unul din următoarele formate:
#include "specificator_de_fisier" sau
#include <specificator_de_fisier>

unde: specificator_de_fişier defineşte un fişier cu text sursă păstrat pe disc. În faza


de preprocesare, textul fişierului respectiv se substituie construcţiei #include. În
felul acesta textul fişierului respectiv ia parte la compilare împreună cu textul în care
a fost inclus.
Formatul în parantezele unghiulare <...> se utilizează la includerea fişierelor
standard, cum sunt cele care conţin prototipuri pentru funcţiile de bibliotecă. În cazul
în care se utilizează caracterele ghilimele, fişierul se caută în directorul curent sau
conform “căii” dacă aceasta este prezentă.
Exemple:
1. #include <stdio.h>
Fişierul stdio.h conţine prototipurile pentru o serie de funcţii ce realizează operaţii de
intrare/ieşire.
2. #include "fis1.cpp"
Se include textul fişierului fis1.cpp aflat în directorul curent.
12
3. #include "c:\\temp\\user\\fis2 .c"
În acest exemplu este prezentă calea fişierului fis2.c.

Substituiri de caractere la preprocesare


Construcţia #define se poate folosi la substituţii de succesiuni de caractere.
#define nume succesiune_de_caractere
unde:
nume - este precedat şi urmat de cel puţin un spaţiu.

Folosind această construcţie, preprocesarea substituie nume cu


succesiune_de_caractere peste tot în textul sursă care urmează construcţiei #define
respective, exceptând cazul în care nume apare într-un şir de caractere sau într-un
comentariu.
Numele definit printr-o construcţie #define substituindu-se prin secvenţa de caractere
corespunzătoare nu mai este prezent la compilare.
De obicei, un astfel de nume se scrie cu litere mari pentru a scoate în evidenţă faptul
că el este definit printr-o construcţie #define.
Succesiune_de_caractere începe cu primul caracter care nu este alb. Ea poate fi
continuată pe mai multe linii terminând rândul care dorim să se continue cu backslash.
#define este folosită frecvent pentru a defini constante; de aceea numele astfel
definit se spune că este o constantă simbolică.
O construcţie #define începe substituţia pe care o defineşte din punctul în care
ea este scrisă şi până la sfârşitul fişierului în care ea este scrisă sau până la întâlnirea
unei construcţii #undef care o anulează. Aceasta are formatul:
#undef nume
La întâlnirea ei, se dezactivează substituirea lui nume cu succesiunea de caractere care
i-a fost ataşată în prealabil printr-o construcţie
#define.
13
Exemple:
1. …
#define A 10
/* A se substituie prin 10 începând din acest punct al fişierului sursă */

#define MAX 20
#define DIMMAX (A*MAX)

char tab[A];

double mat [MAX] [DIMMAX];

După preprocesare se obţin declaraţiile:

char tab[10];

double mat[20][10*20];

DIMMAX s-a substituit prin (10*20) şi nu prin valoarea 200 a produsului deoarece
preprocesorul nu face calcule, ci numai substituţii. Din această cauză se recomandă
ca expresiile utilizate în construcţiile #define să fie incluse în paranteze rotunde.

2. #define A 123
#detine B A+10

x=2*B; // se substituie prin x=2*123+10;

3. #define A 123
14
#define B (A+12)

x=2*B; // se substituie prin x=2*(123+10);

4. …
#define A 100

int x [A+1] ; // declaraţia devine int x[100+1];

#undef A
#define A 1.5

double y;

y=A; // y=1.5;

Constantele simbolice se utilizează frecvent în locul constantelor obişnuite deoarece
ele prezintă următoarele avantaje:
• permit să se atribuie nume sugestive unor constante.
• permit realizarea de prescurtări.
• permit înlocuirea simplă a unei constante printr-o alta.

Bibliografie:
V. Iordan- Algoritmi si programare in C, Ed.Eurostampa, 2007

15

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