Sunteți pe pagina 1din 15

Curs 3 Elementele limbajului C; Tipuri de date în C

LIMBAJUL C
- s-a dezvoltat între anii 1969-1973, o dată cu dezvoltarea
sistemului de operare Unix. (B.W.Kernighan, D.M.Ritchie); Totuşi,
anul 1972 este admis ca anul "naşterii" limbajului C. La sfârşitul
anului 1973 elementele esenţiale ale limbajului C au fost complete.
O altă perioadă de schimbări majore ale limbajului se produce între
1977 şi 1979. In anul 1978 a apărut prima descriere largă a
limbajului în cartea "The C programming language" scrisă de către
B.W.Kernighan, D.M.Ritchie.
În anul 1983 a fost începută standardizarea limbajului C de către
ANSI (American National Standards Institute), iar în 1989 a apărut
ANSI C.

Avantaje:
1. limbaj de programare de scop general
- permite dezvoltarea de aplicaţii diverse: soft ştiinţific, soft pentru gestiunea bazelor
de date, editoare de texte, jocuri, etc.
- nu este specializat pe un domeniu particular de aplicaţii
- oferă un control modern al funcţiilor şi al structurilor de date şi posedă un set bogat
de operatori
2. permite o foarte bună portabilitate a programelor
- programele scrise în C pot fi transferate uşor de la un calculator la altul.

3. permite programarea structurată (modulară)

4. permite scrierea softului de bază (programare de sistem)

5. oferă posibilitatea lucrului pe biţi şi a calculului adreselor

C++ -apărut in 1986 (B.Stroustrup)


- permite programarea orientată spre obiecte (Object Oriented Programming OOP )
OOP - tip de programare în care sunt definite nu numai tipurile de date ale unei structuri de date
ci şi operaţiile şi funcţiile care pot fi aplicate asupra structurii de date respective. Astfel, o structură
de date devine un obiect care include datele ca atare dar şi funcţiile cu care aceste date pot fi
prelucrate. In plus, diferite obiecte pot moşteni caracteristicile altor obiecte.

Visual C , Visual C++


- permit dezvoltarea de aplicaţii WINDOWS

1
Curs 3 Elementele limbajului C; Tipuri de date în C

Elementele limbajului C

Exemplu

// program de adunat numere //"celebrul" program Hello world!


# include <stdio.h> # include <stdio.h>
void main ( ) void main ( )
{ {
float x,s=0; printf("Hello world!");
int n=0; }
while (scanf("%f",&x)==1)
{
s+=x;
n++;
}
//adunarea se incheie la introducerea unei valori care nu
//poate fi convertita la tipul float
printf("\n S-au adunat %d numere. Suma lor este %g",n,s);
getch( );
}

Observaţii: 1. Programele scrise în C sunt compuse din una sau mai multe funcţii.
2. Funcţia principală = funcţia main ( )
3. Corpul oricărei funcţii (setul de instrucţiuni care se execută în funcţia respectivă)
este cuprins între acolade { }
Funcţiile conţin instrucţiuni prin care sunt specificate operaţiile de calcul care trebuie efectuate.

Categorii de elemente
Comentarii
- note explicative (adnotări) în program care sunt complet ignorate de către compilator
- şiruri de caractere (pot fi şi caractere speciale sau cuvinte cheie) cuprinse între
/* */ sau care se găsesc pe un singur rând după caracterele //

Exemple: /* Comentariu */

/* Acest program este


scris in scopul ......... */

// i este o variabila contor


// folosita in ciclul do-while

s+=x; //s reprezinta suma valorilor adunate : s=s+x

Cuvinte cheie (din Help > Contents > Key words)


Cuvintele cheie sunt cuvinte rezervate limbajului de programare, cu utilizare predefinită sau altfel
spus, nume cu destinaţii speciale. Toate cuvintele cheie în limbajul C se scriu cu litere mici.

2
Curs 3 Elementele limbajului C; Tipuri de date în C

Exemple:
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while

Astfel, o declaraţie de forma:

int while;

va fi semnalată ca eroare de către compilator deoarece se încearcă declararea unei variable cu


numele while, care este cuvânt cheie rezevat.
Se recomandă să nu se folosească cuvinte cheie din C++ ca şi nume de variabile în programe
scrise în C deoarece este posibil că vreodată codul scris în C să fie transcris în C++.

Identificatori (nume)
Identificatorii sunt folosiţi pentru a denumi variabile, constante, funcţii, structuri de date,
etc. şi reprezintă succesiuni de caractere alfanumerice, primul caracter trebuind să fie literar.
Menţionăm că limbajul C face distincţie între literele mari şi literele mici şi că un identificator poate
conţine oricâte caractere dar sunt luate în considerare doar primele 32 caractere. Identificatorii nu
pot conţine caractere speciale :
+ - / ^ < > ( ) [ ] { } . , : ; ' # $ @ - spatiu
Recomandăm ca identificatorii folosiţi într-un program să fie sugestivi, adică să sugereze scopul
alegerii lor.

Exemple:
a, suma, SUMA, m2, nr_stud_an1f, NrStudAn1F
incorect: 2x, a*b, if
pentru valoarea x2 se pot folosi variabilele: xp, xx, xla2,etc.

Există identificatori care încep cu caracterul _ (underscore) sau care conţin caracterele _ _
(dublu underscore). Aceste stiluri de identificatori care încep cu _ sau conţin _ _ sunt folosite
pentru implementare şi pentru librăriile standard în C şi C++.

Variabile
Variabilele sunt nume simbolice asociate unor locaţii de memorie, ale căror valori pot fi
modificate prin instrucţiuni ale programului. Declararea (definirea) variabilelor constă în precizarea
tipului şi numelui lor.

Exemplu:
int n; (n = variabila de tip întreg, stocată într-o locaţie de 2 octeţi = 16 biţi)
float s; (s = variabilă de tip real, stocată într-o locaţie de 4 octeţi = 32 biţi)

3
Curs 3 Elementele limbajului C; Tipuri de date în C

Declararea variabilelor de acelaşi tip se poate face într-o singură linie.


Exemplu:
char a , nume [20], prenume [20];
float medie, xcm, ycm, zcm, note [100] ;

Observaţii:
Aceeaşi variabilă nu poate fi declarată cu două tipuri. De asemenea, variabilele pot fi iniţializate
în momentul declarării. In multe cazuri, variabilele trebuie să fie iniţializate şi acest lucru este în
mod special important pentru pointeri.

Exemplu:
float s=0;
int i, j, k, n=1;

Variabilele declarate în afara funcţiei main se numesc variabile globale şi sunt iniţializate automat
cu valoarea zero.

Exemplu:
# include <stdio.h>

float s=0; //s era oricum iniţializată cu 0


//fiind variabilă globală

void main ( )
{ ......
s=s+x;
......
}

Program exemplu: transformarea temperaturii din grade Fahrenheit în grade Celsius

/*program tF -> tC
tC=5*(tF-32)/9;
*/
#include <stdio.h>

void main()
{
int tF, tC, min, max, pas;
min=0; max=200; pas=10;
tF=min;
while(tF<=max)
{
tC=5*(tF-32)/9;
printf("\noF: %d\toC: %d",tF,tC);
tF=tF+pas;
}
}

4
Curs 3 Elementele limbajului C; Tipuri de date în C

Constante
Constantele sunt valori care nu pot fi modificate în decursul programului. În limbajul C, constantele
sunt de două feluri şi anume constante simbolice şi constante obiect.

a) Constante simbolice
- se definesc cu directiva define
Directiva define - stabileşte (defineşte) un nume simbolic pentru o anumită valoare
- se compune din cuvântul cheie #define, o denumire simbolică şi o
valoare
Exemplu:
#define h 6.625e-34
#define c 3e8

Observaţie: Directiva define nu se termină cu ;


Exemplu:
#define MAX 50
float sir [MAX];
int memorie_necesara;

void main ( )
{
......
memorie_ necesara = 4*MAX;
......
}

Peste tot în program, compilatorul va înlocui automat MAX cu valoarea 50.


În practica limbajului C, toate constantele simbolice se notează folosind majuscule.

Exemplu:
#define X 200
#define Y X+10
..........
z=3*Y;
..........

z va avea valoarea: 3*200+10=610


Dacă dorim ca z să fie 3*(x+10) atunci va trebui să modifică directivele define astfel:

#define X 200
#define Y (X+10)

.........
z =3*Y;
.........

In acest caz z are valoarea: z= 3*(200+10)=630

O directivă define autorizează substituţia pe care o defineşte din punctul în care este scrisă până la
sfârşitul fişierului sau până la întâlnirea unei directive undef.

5
Curs 3 Elementele limbajului C; Tipuri de date în C

Exemplu:

#define DIM 25
.........
float medii_fm[DIM]; //echivalent cu: medii_fm[25];
.........
#undef DIM
........
#define DIM 100
........
double alfa;
........
alfa=DIM/2; //echivalent cu: alfa=50

Al doilea tip de constante în C sunt:

b) Constantele obiect
Acestea se numesc şi constante cu tip, iar declararea lor constă din cuvântul cheie const
urmat de tipul constantei şi de un identificator iniţializat. Declararea acestor constante se termină
cu caracterul ;.

Exemplu:
int const DIM = 50; // sau const int DIM=50;
char const cc='x';

O constantă de tip char (caracter) este un întreg, scris ca un singur caracter între două simboluri '.
Valoarea constantei caracter este valoarea caracterului respectiv în setul de caractere ASCII
(American Standard Code for Information Interchange).
Astfel, '0' are valoarea 48, 'A' are valoarea 65, iar 'a' are valoarea 97. (vezi Anexa 1).

Program exemplu: caracterele corespunzătoare codurilor ASCII

// Program ASCII: caracterele corespunzatoare codurilor ASCII


#include <stdio.h>

void main()
{
int i,m,M;
printf("Coduri ASCII -> caractere\n");
printf("Introduceti limita min si max: ");
scanf("%d %d",&m,&M);
printf("Cod ASCII\tCaracter");
for(i=m;i<=M;i++)
printf("\nCod: %d\tCaracter: %c",i,i);
}

Constantele caracter pot fi operanzi în orice operaţii aritmetice, ca orice întreg.

6
Curs 3 Elementele limbajului C; Tipuri de date în C

Instrucţiuni
Instrucţiunile sunt părţi (linii) de program care prin compilare produc acţiuni (coduri)
executabile.
Fiecare instrucţiune se termină cu caracterul ; numit terminator de instrucţiune. Altfel spus, pentru
ca o expresie să devină instrucţiune ea trebuie încheiată cu caracterul ;.
Compilatorul semnalează lipsa caracterului ; la începutul liniei următoare prin mesajul:

Statement missing ; in function ...

Exemple:
float x, s=0;
s+=x;
while (.......)
{
..........
}

int i=0, max=100;

while(i<=max)
{
i=i+5;
printf("\n%d",i);
}

Observaţii
► In urma execuţiei programului se tipăresc valorile de la 5 la 105.
► Dacă nu se pun acolade la while se va tipări doar valoarea 105

Expresii
Expresiile sunt construcţii formate din operanzi şi operatori. Ele au valori şi tipuri, atât
valorile cât şi tipurile expresiilor fiind determinate de către valorile şi tipurilor operanzilor şi de
către operatorii care compun expresia.

Exemplu:
b*b-4*a*c aceasta este o expresie
a , b , c sunt operanzii expresiei
* , - sunt operatorii expresiei
delta = b*b - 4*a*c ; aceasta este o instrucţiune prin care se atribuie variabilei
delta rezultatul evaluarii expresiei b2 - 4ac

Operanzii pot fi :
- constante
- identificatori (nume) de variabile
- nume de tipuri de date
- apeluri de funcţii
- expresii cuprinse între paranteze rotunde

7
Curs 3 Elementele limbajului C; Tipuri de date în C

Funcţii
Funcţiile sunt grupuri de instrucţiuni recunoscute sub un anumit nume. Funcţiile realizează
acţiuni şi întorc (returnează) valori programului principal (funcţiei principale) sau altei funcţii
apelante. Ele se apelează prin nume şi lista lor de parametri.
Funcţia principală returnează valori sistemului de operare, acesta fiind programul apelant al ei.
Anumite funcţii standard sunt gata scrise şi prototipurile lor se găsesc în bibliotecile limbajului
(header files).

Exemple:
<stdio.h> - conţine funcţii standard de intrare ieşire (I/O)
(printf, scanf, getch, ...)
<stdlib.h> - conţine funcţii standard precum
(abort, exit, rand, atoi, itoa,...)
<string.h> - conţine funcţii pentru prelucrarea şirurilor de caractere
(strcpy, strlen, strcmp, strcat,...)
<math.h> - conţine funcţii matematice
(cos, sin, pow, fabs, abs, ...)
<graphics.h> - conţine funcţii pentru gestiunea ecranului în mod grafic
(initgraph, putpixel, line, outtext, outtextxy , cleardevice, ...)
<conio.h> - conţine funcţii standard de intrare ieşire de la consolă
(clrscr, getch, getche, gotoxy, putch, wherex, wherey,...)
<time.h> - conţine funcţii pentru gestiunea orei şi a datei sistemului de calcul
(gettime, settime, ctime,...)
<dos.h> - conţine funcţii pentru interacţiunea cu sistemul de operare DOS
(setdrive, inport, outport)
… etc.

Exemplu: funcţia atoi


char str1[] = "124z3yu87";
char str2[] = "-3.4";
char *str3 = "e24";
printf("str1: %d\n", atoi(str1));
printf("str2: %d\n", atoi(str2));
printf("str3: %d\n", atoi(str3));

Output-ul rezultat este:


str1: 124
str2: -3
str3: 0

Exemplu: funcţia itoa (nu este suportată de toate compilatoarele)

#include <stdio.h>
#include <stdlib.h>

int main()
{
char str[10]; // trebuie sa fie destul de mare pentru a putea stoca
//toate caracterele numarului rezultat prin conversie

8
Curs 3 Elementele limbajului C; Tipuri de date în C

//itoa are ca parametri:valoarea care se converteste, sirul care va


//contine caracterele rezutate prin conversie si sistemul de numeratie
//in care se face conversia
printf("15 in binar este %s\n", itoa(15, str, 2));
printf("15 in octal este %s\n", itoa(15, str, 8));
printf("15 in zecimal este %s\n", itoa(15, str, 10));
printf("15 in hexazecimal este %s\n", itoa(15, str, 16));
return 0;
}

Outputul acestui program este:

15 in binar este 1111


15 in octal este 17
15 in zecimal este 15
15 in hexazecimal este f

Orice funcţie se compune dintr-un antet şi un corp de instrucţiuni.

Exemplu:

Antetul este format din tipul valorii pe care o returnează funcţia, din numele funcţiei şi lista
parametrilor funcţiei, adică tipul şi numele variabilelor funcţiei.
Corpul unei funcţii este grupul de instrucţiuni care se execută la apelul funcţiei respective.
Apelul unei funcţii se face prin numele său şi lista de parametri.

Exemplu:
cnk = fact(n)/fact(k)/fact(n-k);

Funcţia main
Funcţia main este partea principală a unui program C. Aceasta este apelată şi lansată în
execuţie de către sistemul de operare.

Exemplu:
void main ( ) int main ( )
{ {
......... ...........
} return 0;
}

9
Curs 3 Elementele limbajului C; Tipuri de date în C

În cel de-al doilea exemplu, tipul int al funcţiei main comunică compilatorului că funcţia returnează
la ieşire o valoare întreagă, apelatorul fiind sistemul de operare. Dacă valoarea returnată este zero
înseamnă ca nu au fost erori la execuţia programului.

Funcţii recursive
O funcţie este recursivă dacă se autoapelează. Astfel de funcţii se folosesc la definirea
proceselor recursive. Un proces este recursiv dacă are o parte care se defineşte prin el însuşi.
La apelurile recursive ale unei funcţii aceasta este reapelată înainte de a se reveni din ea.

Exemplu
1) Funcţia factorial
dacă n==0 fact(n)=1 <- aceasta este partea apelului recursiv care nu se defineşte prin el
însuşi (partea definită direct)
altfel
fact(n)=n*fact(n-1) <- se defineşte funcţia fact prin ea însăşi

Funcţia fact recursivă:


double fact(int n)
{
if((n==0) return 1.0;
else
return n*fact(n-1);
}

2) Cel mai mare divizor comun


dacă a%b==0 cmmdc(a,b)=b
altfel
cmmdc(a,b)=cmmdc(b,a%b)

Funcţia cmmdc recursivă:


int cmmdc(int a, int b)
{
if(!(a%b)) return b;
else
return cmmdc(b,a%b);
}

La fiecare reapel al unei funcţii recursive, parametrii şi variabilele automatice ale ei se alocă într-o
zonă specială de memorie, numită stivă. Acestea au valori diferite la fiecare reapelare.
Recursivitatea nu conduce la coduri mai rapide şi nici la necesităţi de memorie mai mici.
Totuşi, codurile recursive sunt mai compacte şi uneori mai uşor de înţeles. Recursivitatea este în
special convenabilă pentru structuri de date definite recursiv (arbori).

Tablouri
Tablourile sunt colecţii de valori de acelaşi tip.

Exemplu:
Să presupunem că trebuie să declarăm 5 elemente de tip întreg. Acest lucru poate fi făcut sub
forma:

10
Curs 3 Elementele limbajului C; Tipuri de date în C

Elementele unui tablou pot fi accesate folosind un index. Aceste elemente sunt indexate de la 0 la
n-1 unde n reprezintă dimensiunea tabloului.
Un tablou unidimensional se numeşte vector, iar unul bidimensional se numeşte matrice.

Exemplu
Este declarat un tablou unidimensional de 5 elemente şi elementele tabloului sunt apoi iniţializate
cu valoarea 0.

int a[5];
int i;
for(i=0;i<5;i++)
a[i]=0;

Exemplu

float medii[10];
Dacă se va face atribuirea:

medii[10]=9.85;

se obţine o eroare deoarece elementul medii[10] nu există.

Pentru a indexa elementele unui tablou de la 1 la n atunci respectivul tablou trebuie declarat de
dimensiune cel puţin n + 1

Exemplu:
float x[6];
x[1] = 12; x[2]=34; … x[5] = 14; //x[0] = nedefinit !!

Dar din declaraţia:

float x[6] = {12, 34, 1, 9, 14}


//rezultă: x[0] = 12; ... x[4] = 14; şi x[5] = nedefinit !!

Şiruri de caractere
Şirurile de caractere sunt tablouri cu elemente de tip char (caractere).

11
Curs 3 Elementele limbajului C; Tipuri de date în C

Exemplu:
char nume[20], prenume[20];
char nume[20] = "Popescu";

Şirurile de caractere trebuie cuprinse între " ".

Exemplu
Dacă avem declaraţia:
char nume[20] = "Popescu"
Atunci o reiniţializare de forma:
nume = "Ionescu"
va produce o eroare.

O iniţializare a unui şir se poate face fie la declararea lui, fie folosind funcţia strcpy (string copy).

Exemplu
# include <stdio.h>
.................
char nume[20] = "Popescu";
.................
strcpy (nume, "Ionescu");
.................

Citirea şi tipărirea şirurilor se face cu funcţiile gets( ) şi puts( ).

Exemplu
#include <string.h>
.....................
char nume[20];
.....................
gets(nume);
....................
puts(nume);
....................

Orice şir se încheie cu caracterul NULL (marcatorul sfârşitului şirului respectiv) şi va trebui să se
ţină seama de acest lucru la declararea şirurilor, când se specifică dimensiunea lor.
Un şir de caractere este stocat în elementele succesive ale unui tablou cu elemente de tip char,
tabloul fiind terminat cu caracterul NULL (caracterul '\0'). Astfel şirul "Programare" este stocat de
exemplu în tabloul de caractere sircar[] după cum urmează:

char sircar[DIM]
sircar[0]='P'; sircar[1]='r'; sircar[2]='o'; sircar[3]='g'
sircar[4]='r' sircar[5]='a'; sircar[6]='m'; sircar[7]='a';
sircar[8]='r' sircar[9]='e'; sircar[10]='\0';
Caracterul NULL este scris folosind secvenţa escape '\0', fiind definit în <stdio.h>, iar valoarea
sa ASCII este 0.

Secvenţe escape

12
Curs 3 Elementele limbajului C; Tipuri de date în C

Secvenţele escape sunt coduri de control (spaţii albe), folosite pentru specificarea
formatelor de scriere a datelor şi constau din combinaţii dintre un caracter backslash \ urmat de o
literă sau de o combinaţie de cifre .
Setul de secvenţe escape în C este:

Cod Descriere
escape
\n Rând nou
\t Tabulator orizontal
\r Intoarcere la începutul rândului
\a Alarmă (sunet)
\b Backspace
\f Pagină nouă la imprimantă
\” Ghilimele
\’ Apostrof
\\ Backslash
\0OO Valoare în octal
\xHH Valoare în hexazecimal
O secvenţă escape este văzută ca un singur caracter şi reprezintă un caracter constant.
Unele secvenţe escape sunt specifice perifericelor folosite. Astfel, secvenţele \v (tabulator vertical)
şi \f (pagină nouă la imprimantă) nu afectează formatul de ieşire al datelor pe monitor ci numai la
imprimantă.

Exemplu:
In urma instrucţiunii:
printf("\nSuma celor %d numere este %g\t\a"n,s);
se obţine:
Suma celor 5 numere este 43.75 ♫_ (cursor)

Exemplu
În urma execuţiei instrucţiunilor:
printf("\n\tSem I\t\tSem II");
for(i=1; i<=nrstud; i++)
printf("\n%d:\t%5.2f\t\t%5.2f",i,medsem1[i],medsem2[i]);
se obţine:
Sem I Sem II
1: 8.75 5.25
2: 10.00 10.00
3: 5.30 6.67
...................................................

Exemplu:

#define fis_intrare "d:\\fiz1r\\centru.dat"

adică pentru a despărţi directoarele într-o cale de directoare scrisă într-un program C trebuie
folosite două caractere backslash (\\).

13
Curs 3 Elementele limbajului C; Tipuri de date în C

Codul ASCII
Codul ASCII (American Standard Code for Information Interchange) este un cod standard
de reprezentare a caracterelor ca valori întregi pe 7 biţi. Acest cod a fost introdus pentru a se
obţine o compatibilitate între diferitele tipuri de echipamente folosite la procesarea datelor.
Codul ASCII standard constă din 128 de numere întregi (reprezentate pe 7 biţi, cu valori între 0
şi 127) atribuite unor caractere (cele englezeşti), numere, semne de punctuaţie, celor mai uzuale
caractere speciale şi unor coduri de control (comenzi) netipăribile (primele 32 de caractere).
Codul ASCII extins constă de asemenea din 128 numere întregi, cu valori între 128 şi 255
(pentru reprezentarea lor folosindu-se toţi cei 8 biţi ai unui octet), care reprezintă caractere
suplimentare din alte limbi, simboluri matematice, grafice, caractere speciale sau sau simboluri ale
unor monede străine.
Folosirea acestor coduri face posibilă şi prelucrarea caracterelor, nu numai a numerelor.
În figurile următoare sunt date codurile ASCII (standard şi extins) şi caracterele
corespunzătoare.

14
Curs 3 Elementele limbajului C; Tipuri de date în C

15

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