CATEGORII DOCUMENTE |
DOCUMENTE SIMILARE |
|
TERMENI importanti pentru acest document |
|
Limbajul C ofera utilizatorului posibilitatea de a folosi aceeasi zona de memorie pentru a pastra date de tipuri diferite in momente diferite ale executiei programului. Astfel, de exemplu, putem utiliza o zona de memorie pentru a pastra la un moment dat o data flotanta, iar ulterior sa reutilizam aceeasi zona pentru o data intreaga sau de tip pointer. Reutilizarile zonelor de memorie conduc la utilizarea mai eficienta a acesteia, uneori putandu-se obtine o economie substantiala a spatiului de memorie alocat programului.
O uniune se declara printr-o constructie asemanatoare declaratiei de structura. Deosebirea consta in inlocuirea cuvantului struct prin union
union nume
;
Exemplu:
union u
Prin aceasta declaratie s-a definit tipul de date u. In continuare, putem declara date de tipul u printr-o declaratie de forma:
union u u1;
unde u1 este o data de tip u careia i se aloca o zona de memorie care poate fi utilizata pentru a pastra date de tipurile int, float sau double. Deoarece tipul double necesita memoria cea mai mare se aloca 8 octeti. Astfel zona u1 poate pastra pe oricare din celelalte componente ale uniunii dar in momente diferite ale executiei programului.
Accesul la componentele unei uniuni se face la fel ca si in cazul structurilor. Astfel, pentru a ne referi la componenta i a uniunii u1 definita in exemplul anterior folosim constructia:
u1 i
sau daca p este pointer spre tipul u declarat prin
union u *p;
atunci constructia
p -> i
permite accesul la componenta i a uniunii spre care pointeaza p.
Pentru a evita erorile legate de evidenta in fiecare moment a datei care se prelucreaza se ataseaza unei uniuni o data menita sa indice componenta curenta. Aceasta data este specificata pentru fiecare uniune. De exemplu pentru uniunea u1 definita anterior este important sa se stie daca zona de memorie contine un intreg, un flotant in simpla precizie sau un flotant in dubla precizie. Se definesc trei constante simbolice:
#define INTREG 1
#define F_SIMPLU 2
#define F_DUBLU 3
Modificam tipul u atasand data tip_curent de tip int astfel:
struct u
uu;
Declaram structura us astfel:
struct u us;
In acest caz, in momentul in care se pastreaza o data in zona rezervata uniunii, se atribuie componentei tip_curent una din constantele definite anterior:
INTREG, daca se pastreaza un intreg;
F_SIMPLU daca se pastreaza un flotant in simpla precizie;
F_DUBLU daca se pastreaza un flotant in dubla precizie.
Astfel cand se foloseste componenta de tip int se va asocia atribuirea:
us tip_curent=INTREG;
Analog se vor folosi ti atribuirile urmatoare cand se vor folosi componentele de tip float sau de tip double:
us tip_curent=F_SIMPLU;
respectiv:
us tip_curent=F_DUBLU;
In felul acesta, se poate testa, in fiecare moment, tipul de data prezent in zona rezervata. Aceasta se poate face printr-o secventa de instructiuni if sau prin intermediul instructiunii switch
if (us tip_curent = = INTREG) // se foloseste us uu i
else if (us tip_curent = = FSIMPLU) // se foloseste us uu f
else if (us tip_curent = = FDUBLU) // se foloseste us uu d
else eroare
sau folosind switch avem o constructie mai clara de forma:
switch (us tip_curent)
Programul urmator calculeaza ariile pentru urmatoarele figuri geometrice:
cerc;
dreptunghi;
patrat;
triunghi.
Programul citeste datele pentru o figura geometrica, calculeaza aria figurii respective si scrie rezultatul:
La intrare se folosesc urmatoarele formate:
- pentru cerc C raza;
- pentru dreptunghi D lungime latime;
- pentru patrat P latura;
- pentru triunghi T latura latura latura;
- sfarsit fisier EOF.
In cazul triunghiului, se utilizeaza formula lui HERON pentru calculul ariei:
aria = sqrt (p*(p-a)(p-b)(p-b))
unde p este semiperimetrul, iar a, b, c sunt cele 3 laturi.
#include <stdio.h>
#include <math.h>
#define PI 3.14159265
#define EROARE -1
#define CERC 1
#define PATRAT 2
#define DREPT 3
#define TRIUNGHI 4
typedef struct
fig;
}FIG;
void main (void) // calculeaza arii
zfig.tip = EROARE;
switch(car[0])
zfig.tip = CERC; // se pastreaza tipul figurii
break;
case 'P': // patrat
printf('se cere latura patratului in flotantan');
i = scanf('%lf',&zfig.fig.lp);
if( i !=1)
zfig.tip = PATRAT;
break;
case 'D': // dreptunghi
printf('se cer laturile dreptunghiului in flotantan');
i = scanf('%lf %lf',&zfig.fig.ld[0],&zfig.fig.ld[1]);
if(i != 2)
zfig.tip = DREPT;
break;
case 'T': // triunghi
printf('se cer laturile triunghiului in flotantan');
i = scanf('%lf %lf %lf', &zfig.fig.lt[0], &zfig.fig.lt[1],&zfig.fig.lt[2]);
if(i != 3)
zfig.tip =TRI;
break;
printf('laturile nu formeaza un triunghin');
break;
default:
printf('se cere una din literele urmatoaren');
printf('C pentru cercn');
printf('P pentru patratn');
printf('D pentru dreptunghin');
printf('T pentru triunghin');
} // sfarsit switch
switch (zfig.tip)
else
default : // avans pana la newline sau EOF
while ((i = getchar()) != 'n' && i != EOF);
} // sfarsit switch
if (i = = EOF) break;
} // sfarsit for
// sfarsit main
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 743
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved