Documente Academic
Documente Profesional
Documente Cultură
George Mois
October 12, 2021
Abstract
Lucrul cu tipurile de date ı̂n C s, i utilizarea variabilelor.
1 Introducere
Tipurile de date sunt folosite pentru a declara tipurile variabilelor.
Variabilele sunt numele pe care le dăm locat, iilor din memoria calculatoru-
lui, care sunt folosite pentru a stoca valori ı̂n cadrul unui program. În cazul
limbajului de programare C, toate variabilele trebuie declarate ı̂nainte de a fi
folosite (de obicei la ı̂nceputul funct, iei, ı̂nainte de instruct, iunile executabile). O
declarat, ie anunt, ă proprietăt, ile unei variabile, s, i anume numele tipului de date
s, i numele acesteia. Este posibilă declararea ı̂mpreună a mai multor variabile de
acelas, i tip (ı̂n cadrul aceleias, i instruct, iuni). Tipurile de date determină tipul
(interpretarea secvent, ei de bit, i) s, i mărimea datelor asociate fiecărei variabile.
Table 1: C keywords
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
1
2 Tipuri de date pentru reprezentarea valorilor
ı̂ntregi
Reprezentarea datelor din lumea reală se poate face prin numere (ı̂ntregi sau
reale), caractere sau s, iruri de caractere (strings).
Programatorul trebuie să decidă tipul unei variabile ı̂nainte de a stoca orice
valoare pentru aceasta.
În C avem două tipuri principale de date: integer data types s, i float data
types.
Pentru reprezentarea unui număr ı̂ntreg se utilizează tipurile de date ı̂ntregi.
Acestea pot fi cu semn (signed) sau fără semn (unsigned). Mai ı̂ncolo vom vedea
că umerele reale sunt reprezentate adoptând tipuri de date floating point (ex. o
val. de temperatură – 14.2 grade C ).
Tipurile de date cu semn (ex. temperatura, care poate fi pozitivă sau nega-
tivă) sunt:
Tipurile de date fără semn pot fi create adăugând cuvântul cheie unsigned
ı̂nainte de cele cu semn (de exemplu unsigned char sau unsigned short int).
Fiecare tip de date specifică o dimensiune precisă pentru datele stocate ı̂n mem-
orie s, i un interval precis de reprezentare.
Dimensiunea spat, iului de memorie pentru fiecare tip de date depinde de com-
pilatorul utilizat, iar dimensiunile nu sunt fixate ı̂n acelas, i mod pentru fiecare
compilator. În cazul compilatorul gcc avem dimensiunile s, i limitele specificate
ı̂n Tabelul 3. Aceste date sunt prezentate ı̂n manualul compilatorului.
2
Table 3: Tipuri de date pentru ı̂ntregi cu semn, compilatorul gcc
Pentru long int avem următoarea observat, ie: ”Depending on your system,
this data type might be 64-bit, ı̂n which case its range is identical to that of the
long long int data type.” Aceeas, i observat, ie se aplică s, i ı̂n cazul unsigned long
int.
Standardul C nu fixează dimensiunile de stocare ale diferitelor tipuri de date.
Specifică doar valorile minime s, i maxime reprezentabile.
Următoarele tipuri de date sunt fixe independent de compilator:
3
Ca s, i un al doilea exemplu, să ne gândim la temperatura soarelui, care la
suprafat, a lui este de 5505 grade C. De asemenea, s, tim că nu va fi o valoare
negativă, cel put, in pentru următoarele câteva miliarde de ani.
Pentru alegerea tipului de date trebuie să t, inem cont că 5505 este mai mare
decât 255, as, a că nu putem folosi tipul de date unsigned char. Următorul tip de
date este short int, sau short. Nu vom avea nevoie de valori negative, as, a că ne
putem ı̂ndrepta atent, ia către unsigned short, care poate memora variabile intre
0 s, i 32767.
3 Variabile
Definit, ie: ”tip de date” urmat de ”numele variabilei”.
1. poate cont, ine doar litere (uppercase sau lowercase), cifre s, i underscore;
2. pe prima pozit, ie a numelui putem avea o literă sau underscore;
3. nu este nicio regulă specificată ı̂n standard legată de lungimea numelui,
dar ar putea apărea probleme ı̂n cazul unor compilatoare dacă se folosesc
mai mult de 31 de caractere;
4. nu poate fi un cuvânt cheie al C.
4
Table 4: Format string
3.3 Exercit, iu
Scriet, i două programe care afis, ează valorile din exemplele date la finalul Sect, iunii
2.
5
3.4 Exercit, iu
Scriet, i un program care calculează s, i afis, ează distant, a dintre două oras, e, A s, i
C, s, tiind că distant, a dintre A s, i un oras, B este 160 km s, i distant, a dintre B s, i C
este 40 km (creat, i variabilele pentru cele trei distant, e – AB, BC s, i AC, calculat, i
suma, stocat, i rezultatul s, i afis, at, i-l).
3.6 Exemplu
Pentru valoarea -25 avem.
25 ı̂n baza 10 = 0001 1001
25 complementat = 1110 0110
25 complementat + 1 = 11100111 = E7 ı̂n hexazecimal = 0xE7.
3.7 Exercit, ii
1. Afis, at, i valoarea de mai sus ı̂n hexazecimal ı̂ntr-un program.
2. În baza informat, iilor de mai sus, calculat, i valorile minime s, i maxime care
se pot afis, a pe 8 bit, i cu semn (char ).
3. Calculat, i valorile afis, abile folosind tipurile de date short int (short) s, i
unsigned short int (unsigned short).
4. Scriet, i un program pentru a afis, a numerele ı̂ntregi de la 0 la 15 ı̂n zecimal,
octal s, i hexazecimal. Afis, at, i rezultatele ı̂ntr-un format tabelar.
5. Scriet, i un program care să afis, eze numerele următoare:
1 1
12 12
123 123
1234 1234
12345 12345
6
3.8 Comanda sizeof
Operatorul sizeof oferă cantitatea de stocare, ı̂n octet, i, necesară pentru a stoca
un obiect de tipul operandului. Acest operator permite evitarea specificării
dimensiunilor de date dependente de mas, ină ı̂n program.
Mai multe despre acest operator la adresa https://docs.microsoft.com/
en-us/cpp/c-language/sizeof-operator-c?view=vs-2019.
3.9 Exercit, iu
Scriet, i un program care să afis, eze mărimea tipurilor de date pe calculatorul
dumneavoastră (STM32CubeIDE host program).
4 Coduri ASCII
În C, o variabilă char det, ine valoarea ASCII (un număr ı̂ntreg ı̂ntre 0 s, i 127),
mai degrabă decât acel caracter ı̂n sine. Această valoare ı̂ntreagă este codul
ASCII al caracterului. De exemplu, valoarea ASCII a caracterului ”A” este 65.
Dacă ı̂n program vrem să folosim caracterul corespunzător unei valori, acesta
trebuie să apară intre două caractere apostrof.
4.1 Exemplu
Rulat, i următorul program:
#include <stdio.h>
int main()
{
char a1 = 65;// char a1 = ’A’;
char a2 = 112;// ’p’
char a3 = 112;// ’p’
char a4 = 108;// ’l’
char a5 = 101;// ’e’
char a6 = 58; // ’:’
char a7 = 41; // ’)’
printf("%c%c%c%c%c%c%c\n",a1,a2,a3,a4,a5,a6,a7);
return 0;
}
7
4.2 Exercit, iu
1. Afis, at, i caracterul ”A” folosind codul lui ASCII.
2. Afis, at, i codul ASCII corespunzător caracterului ”B”.
3. Scriet, i un program care afis, ează caracterele pentru codurile ASCII ı̂ntre
32 s, i 126.
8
void function_1()
{
int a, b; // you can use a and b within braces only
}
void function_2()
{
printf("%d\n", a); // ERROR, function_2() doesn’t know any variable a
}
6.2 Exemplu
#include <stdio.h>
int main()
{
int myScore;
myScore = 900;
printf("Value of my score = %d\n", myScore);
//apelare functie myFun1
myFun1();
return 0;
}
Eroare din cauza variabilei myScore, vizibilă doar ı̂n funct, ia main.
#include<stdio.h>
int main()
{
int a = 100;
{
/*
variable a declared ^
ın this block is
completely different from variable
9
declared outside.
*/
int a = 10;
printf("Inner a = %d\n", a);
}
#include <stdio.h>
//variabila globala
int myScore;
int main()
{
myScore = 900;
printf("Value of my score = %d\n", myScore);
//apelare functie myFun1
myFun1();
return 0;
}
10
6.4 Exemplu
Rulat, i programele:
#include <stdio.h>
//var globala
int valA = 4;
int main()
{
// var locala
int valA = 50;
return 0;
}
#include <stdio.h>
//var globala
int valA = 4;
int main()
{
{
// var locala
int valA = 50;
}
return 0;
}
11
2. Locat, ia ı̂n care va fi stocată variabila
3. Valoarea init, ializată a unei variabile
4. Durata de viat, ă a unei variabile
5. Vizibilitatea unei variabile
6. Cine poate accesa o variabilă?
Durata de viat, ă a unei variabile sau a unei funct, ii este durata de timp
care ı̂ncepe atunci când memoria este alocată pentru a o stoca s, i se termină
atunci când memoria este eliberată. De asemenea, durata de viat, ă se referă la
extinderea unei variabile.
Domeniul de aplicare s, i durata de viat, ă a unei variabile sunt aspecte centrale
de proiectare care definesc interact, iunea dintre date s, i funct, ii.
Există patru tipuri de clase de stocare standard ı̂n C:
1. auto – implicită,
2. extern – variabilă globală,
3. static – variabilă locală care este capabilă să returneze o valoare chiar s, i
atunci când controlul este transferat la apelul funct, ional,
4. register – variabilă stocată ı̂ntr-un registru.
7.2 Exemplu
#include <stdio.h>
int main( )
{
auto int j = 1;
{
auto int j= 2;
{
auto int j = 3;
printf ( " %d ", j);
}
printf ( "\t %d ",j);
}
printf( "%d\n", j);
12
return 0;
}
7.3 Extern
Clasa de stocare externă este utilizată atunci când avem funct, ii sau variabile
globale care sunt partajate ı̂ntre două sau mai multe fis, iere.
Cuvântul cheie extern este folosit la declararea unei variabile globale sau a
unei funct, ii dintr-un alt fis, ier pentru a furniza referint, a variabilei sau funct, iei
care a fost deja definită ı̂n fis, ierul original.
Variabilele definite printr-un cuvânt cheie extern sunt numite variabile glob-
ale. Aceste variabile sunt accesibile pe tot parcursul programului. O variabilă
declarată externă nu poate fi init, ializată, de vreme ce ea a fost deja definită ı̂n
fis, ierul original.
7.4 Exemplu
main.c
#include <stdio.h>
extern i;
main() {
printf("value of the external integer is = %d\n", i);
return 0;}
original.c
#include <stdio.h>
i=48;
7.5 Exemplu
Rulat, i următorul proiect:
main.c
#include <stdio.h>
void file1_func1(void);
int mainPrivat;
int main()
{
mainPrivat = 100;
printf("mainPrivat = %d\n",mainPrivat);
file1_func1();
printf("mainPrivat = %d\n",mainPrivat);
13
return 0;
}
file1.c
extern int mainPrivat;
void file1_func1(void)
{
mainPrivat = 900;
}
7.6 Static
Variabilele statice sunt utilizate ı̂n funct, ie/fis, ier ca variabile statice locale. Ele
pot fi folosite s, i ca variabile globale. În acest fel se pot folosi valori globale
accesibile doar ı̂n unele funct, ii.
• Variabila locală statică este o variabilă locală care ı̂s, i păstrează s, i stochează
valoarea ı̂ntre apeluri de funct, ii sau bloc s, i rămâne vizibilă numai funct, iei
sau blocului ı̂n care este definită.
• Variabilele globale statice sunt variabile globale vizibile numai ı̂n fis, ierul
ı̂n care sunt declarate.
Este de ret, inut faptul că variabila statică are o valoare init, ială implicită zero
s, i este init, ializată o singură dată ı̂n timpul viet, ii sale.
Variabilele globale sunt accesibile ı̂n tot fis, ierul, ı̂n timp ce variabilele statice
sunt accesibile numai părt, i particulare de cod.
Durata de viat, ă a unei variabile statice este identică cu cea a programu-
lui. O variabilă declarată sau init, ializată utilizând cuvânt cheie static cont, ine
ı̂ntotdeauna zero ca valoare implicită.
7.7 Exemplu
#include <stdio.h>
int main()
{
//apelare repetata functie
functie();
functie();
functie();
functie();
14
return 0;
}
//definitie functie
void functie(void)
{
static int count = 0;
count = count + 1;
printf("Aceasta functie s-a apelat de %d ori.\n", count);
}
Scope pentru variabila count este global, dar vizibilitatea este doar ı̂n funct, ia
functie.
void file1_func1(void);
int main()
{
mainPrivat = 100;
printf("mainPrivat = %d\n",mainPrivat);
file1_func1();
printf("mainPrivat = %d\n",mainPrivat);
return 0;
}
file1.c
extern int mainPrivat;
void file1_func1(void)
{
mainPrivat = 900;
}
Proiectul nu poate fi compilat, mainPrivat este vizibil doar ı̂n fisierul main.c.
Acelas, i mecanism se poate aplica s, i ı̂n cazul funct, iilor.
7.9 Register
Se utilizează ı̂n cadrul funct, iilor sau a blocurilor de cod pentru stocarea de vari-
abile locale ı̂n registre CPU ı̂n loc de RAM pentru acces rapid. Ca s, i exemplu,
15
contoarele sunt un bun candidat pentru a fi stocate ı̂n regis, tri.
Exemplu:
16