Sunteți pe pagina 1din 16

Echipamente programabile – Laborator 3 & 4

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.

1.1 Cuvinte cheie ı̂n C


Lista de mai jos cont, ine cuvintele rezervate ı̂n C. Acestea nu pot fi folosite ca
s, i constante, variabile, sau alte nume.

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:

Table 2: Tipuri de date pentru ı̂ntregi cu semn


char
short int
int
long int
long long int

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

Tip de date Dimensiune Valori


date memorie ı̂n
octet, i
char 1 -128...127 (−28−1 to 28−1 − 1)
unsigned char 1 0...255 (0 to 28 − 1)
short int 2 -32768...32767 (−216−1 to 216−1 − 1)
unsigned short int 2 0...65535 (0 to 216 − 1)
int 4 -2147483648...2147483647
(−232−1 to 232−1 − 1)
unsigned int 4 0...4294967295
(0 to 232 − 1)
long int 4 sau 8 cel putin -2147483648...2147483647
unsigned long int 4 sau 8 cel putin 0...4294967295
long long int 8 -9223372036854775808...9223372036854775807
unsigned long long int 8 0...18446744073709551615

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:

char, unsigned char 1 octet


short, unsigned short 2 octet, i
long long, unsigned long long 8 octet, i

Ca s, i exemplu, explicăm cum procedăm dacă dorim sa afis, ăm valoarea de


temperatură de la o anumită locat, ie ı̂ntr-un program. Temperatura actuală este
21 grade Celsius. Ceea ce s, tim este că temperatura nu scade niciodată sub -10
grade s, i nu urcă niciodată peste 40 ı̂n locat, ia considerată.
Asta ı̂nseamna că temperatura este mai mare decât -128 s, i mai mică decât
127.
As, adar, putem alege ca s, i tip de date pentru variabila pe care o putem numi
temp, tipul de date char.
Declarat, ia variabilei este:

char temp; //Vom folosi o var. denumita temp


temp=21; //Valoarea acesteia este 21

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.

unsigned short tempSoare; //Vom folosi o var. denumita temp


tempSoare=5505; //Valoarea acesteia este 21

3 Variabile
Definit, ie: ”tip de date” urmat de ”numele variabilei”.

unsigned char variabila_mea; //Definitie


variabila_mea=12; //Initializare

Variabilele sunt identificatoare pentru date. Datele sunt de obicei sto-


cate ı̂n memoria computerului, iar o variabilă este o etichetă pentru locat, ia
de memorie ı̂n care sunt stocate datele. Numele variabilelor nu sunt stocate
ı̂n memoria computerului, iar compilatorul le ı̂nlocuies, te cu adresele propriu-
zise de memorie. As, adar, numele variabilelor sunt folosite doar pentru a us, ura
munca programatorului.

3.1 Numele unei variabile


Numele unei variabile este o reprezentare simbolică a locat, iei de memorie aso-
ciată variabilei. Există un set de reguli pentru numele unei variabile ı̂n C:

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.

3.2 Afis, area valorilor variabilelor


În C avem nevoie de specificatori de format pentru a lucra cu diferite tipuri
de date. Specificatorii de format definesc tipul de date care trebuie tipărite pe
ies, irea standard, atunci când se foloses, te funct, ia printf. Vom vedea mai ı̂ncolo
că s, i pentru a prelua intrarea formatată avem nevoie de specificatori de format.
Specificatorii de format sunt numit, i s, i ”format string”.

4
Table 4: Format string

Specificator Descriere Tip de date


de format suportat
%c Character char, unsigned char
%d Signed Integer short, unsigned short, int, long
%e sau Scientific notation float, double
%E of float values
%f Floating point float
%g sau Similar cu float, double
%G %e sau %E
%hi Signed Integer short
(Short)
%hu Unsigned Integer unsigned short
(Short)
%i Signed Integer short, unsigned short, int, long
%l sau Signed Integer long
%ld sau
%li
%lf Floating point double
%Lf Floating point long double
%lu Unsigned integer unsigned int, unsigned long
%lli, Signed integer long long
%lld
%llu Unsigned integer unsigned long long
%o Octal representation short, unsigned short, int,
%o of integer unsigned int, long
%p Address of pointer void *
to void void *
%s String char *
%u Unsigned Integer unsigned int, unsigned long
%x sau Hexadecimal representation short, unsigned short, int,
%X of Unsigned Integer unsigned int, long
%n Prints nothing
%% Prints % character

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.5 Calcularea domeniului pentru tipul de date char


Se folosesc 8 bit, i pentru reprezentare. Valorile negative sunt stocate pe 7 bit, i,
primul, most significant bit, fiind 0, pentru semn. Pentru numere negative
se foloses, te complementul fat, ă de 2. Complementul fat, ă de 2 al unui număr
binar se calculează prin complementarea tuturor bit, ilor s, i adăugarea valorii 1
la rezultat.

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. Scriet, i un program care să afis, eze următoarea figură.

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.

unsigned char variabila_mea=’B’;

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;
}

Înlocuit, i valorile pentru variabile cu caracterele aflate ı̂ntre caractere apos-


trof.
Înlocuit, i specificatorul de format pentru a afis, a codurile ASCII pentru fiecare
caracter.

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.

5 Definit, ia vs. declararea undei variabile


Declarat, ia unei variabile reprezintă informarea compilatorului despre: numele
variabilei, tipul valorii pe care le det, ine s, i valoarea init, ială, dacă este necesară.
Cu alte cuvinte, declarat, ia oferă detalii despre proprietăt, ile unei variabile.
Definit, ia unei variabile specifică s, i locul unde este stocată variabila. Cu
alte cuvinte memoria pentru variabilă este alocată ı̂n timpul definirii variabilei.

Var. declaration Var. definition


Declaration tells the compiler Def. allocates mem.
about data type and size of the var. for the var.
Var. can be declared many It can happen only one time
times ı̂n a program. for a variable ı̂n a program.
The assignment of properties Assignments of storage
and identification to a var. space to a var.

În C, definit, ia s, i declarat, ia pentru o variabilă au loc ı̂n acelas, i timp.


Mai multe la:
https://www.geeksforgeeks.org/difference-between-definition-and-declaration/
Variabilele trebuie declarate ı̂n program ı̂nainte de utilizare. Spat, iul de mem-
orie nu este alocat ı̂n cadrul declarat, iei unei variabile. Acest lucru se ı̂ntâmplă
numai la definit, ia variabilei.
Init, ializarea variabilei ı̂nseamnă atribuirea unei valori variabilei.
Este recomandat ca variabilele să fie init, ializare ı̂nainte de folosire. Vezi
https://riptutorial.com/c/example/1472/use-of-an-uninitialized-variable.

6 Variabile locale s, i globale


Există trei tipuri de variabile ı̂n C:
• locale
• globale
• environment variable – ı̂n afara scopului acestui laborator

6.1 Variabile locale


Domeniul (scope) variabilelor locale este numai ı̂n cadrul funct, iei. Aceste vari-
abile sunt declarate ı̂n cadrul funct, iei s, i nu pot fi accesate ı̂n afara ei.

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>

//prototipul functiei myFun1


void myFun1(void);

int main()
{
int myScore;
myScore = 900;
printf("Value of my score = %d\n", myScore);
//apelare functie myFun1
myFun1();
return 0;
}

//Definitie functie myFun1


void myFun1(void)
{
myScore = 800;
printf("Value of my score = %d\n", myScore);
}

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);
}

printf("Outer a = %d\n", a);

// signal to operating system everything works fine


return 0;
}

6.3 Variabile globale


Domeniul (scope) variabilelor globale va fi pe tot parcursul programului. Aceste
variabile pot fi accesate de oriunde din program.
Această variabilă este definită ı̂n afara funct, iei principale. Astfel, această
variabilă este vizibilă ı̂n funct, ia principală s, i ı̂n cadrul tuturor celorlalte funct, ii
secundare.

#include <stdio.h>

//prototipul functiei myFun1


void myFun1(void);

//variabila globala
int myScore;

int main()
{
myScore = 900;
printf("Value of my score = %d\n", myScore);
//apelare functie myFun1
myFun1();
return 0;
}

//Definitie functie myFun1


void myFun1(void)
{
myScore = 800;
printf("Value of my score = %d\n", myScore);
}

10
6.4 Exemplu
Rulat, i programele:

#include <stdio.h>

//var globala
int valA = 4;

int main()
{
// var locala
int valA = 50;

printf("Val A este: %d", valA);

return 0;
}

#include <stdio.h>

//var globala
int valA = 4;

int main()
{
{
// var locala
int valA = 50;
}

printf("Val A este: %d", valA);

return 0;
}

7 Clasa de alocare a memoriei ı̂n C (Storage


Class ı̂n C)
Scope-ul sau domeniul de aplicare/def. a unei variabile este partea programului
ı̂n cadrul căreia ea poate fi utilizată. Deci, scope-ul reprezintă vizibilitatea
s, i locat, ia unei variabile ı̂n cadrul programului. Acesta spune din ce parte a
codului putem accesa o variabilă. O clasă de stocare sau de alocare a memoriei
este utilizată pentru a descrie următoarele lucruri:

1. Scope-ul (domeniul de definit, ie) unei variabile

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.1 Auto – Automatic storage class


Variabilele definite ı̂n acest fel sunt variabile locale. O variabilă se află ı̂n mod
implicit ı̂n clasa de stocare automată dacă nu este specificată ı̂n mod explicit.
Scope-ul unei variabile automate este limitat doar la blocul ı̂n care aceasta
este definită. Odată ce controlul iese din bloc, accesul la variabilă dispare. Asta
ı̂nseamnă că numai blocul ı̂n care este declarată variabila automată o poate
accesa.
Cuvântul cheie auto este utilizat pentru a defini o clasă de stocare automată.
În mod implicit, o variabilă automată cont, ine o valoare aleatoare.

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>

//declarare prototip functie


void functie(void);

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.

7.8 Exemplu de variabile accesibile ı̂ntr-un fis, ier


main.c
#include <stdio.h>

void file1_func1(void);

int static mainPrivat;

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:

register int age;

Pentru declararea unei variabile, se utilizează cuvântul cheie register. Ele au


o durată de viat, ă identică cu ı̂ntreg parcursul programului.
Este similară cu clasa de stocare automată. Variabila este limitată la blocul
ı̂n care e definită. Singura diferent, ă este faptul că sunt stocate ı̂n registrele CPU
ı̂n loc de o memorie. Accesul la regis, tri este mai rapid decât cel al memoriei
principale.
Variabilele declarate folosind clasa de stocare register nu au valoare implicită.
Aceste variabile sunt adesea declarate la ı̂nceputul unui program.

Table 5: Storage classes – caracteristici principale

Storage class Declaration Storage Default value Scope Lifetime


auto Inside a Memory Unpredictable Within the Within the
function/block function/block function/block
register Inside a CPU Garbage Within the Within the
function/block Registers function/block function/block
extern Outside all Memory Zero Entire file Program
and others runtime
(where declared
as extern)
Static Inside a Memory Zero Within the Program
(local) function/block function/block runtime
Static Outside all Memory Zero Global Program
(global) functions runtime

16

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