Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Uniune

c



+ Font mai mare | - Font mai mic



Uniune

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 678
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved