Sunteți pe pagina 1din 8

Elemente de baz ale programrii n C - Aplicaii de Laborator

Laborator nr. 8
Tipuri de date compozite
Tipurile de date compozite pot fi construite cu ajutorul tipurilor de baza (primitive) sau
cu alte tipuri compozite.

8.1.

Structuri

O structur reprezint o colecie de una sau mai multe variabile, de acelai tip sau de
tipuri diferite, grupate sub un singur nume pentru a putea fi tratate mpreun.
Declaraia unei structuri include o list de cmpuri i tipul de date corespunztor
fiecruia, cu ajutorul cuvntului cheie struct.
Structurile sunt un tip compozit care include un set definit de cmpuri (membri).
Declaraia unei structuri include lista de cmpuri i tipul de date corespunztor fiecruia, cu
ajutorul cuvntului cheie struct. De exemplu, o structura de date care poate modela un vector
tridimensional poate fi descrisa astfel:
struct Vector {
float x;
float y;
float z;
};
n acest moment este definit structura, dar nici o variabila de acest tip nu exist nc. O
variabila viteza de tipul Vector poate fi creata prin declaraia:
Vector velocity;
Similar se poate defini structura Color:
struct Color {
unsigned int red;
unsigned int green;
unsigned int blue;
};
n grafica tridimensional se definete poziia i culoarea fiecrei muchii a unui obiect n
spaiu. Un mod de rezolva problema poate fi o structura Vertex care conine aceste informaii:
struct Vertex {
Vector position;
Color color;
60
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

};
La fel ca mai sus, instantierea unei variabile cu aceasta structura se poate face prin:
Vertex v;
Iar accesul la membrii structurii e posibil cu operatorul punct:
v.position.x = 0.0;
v.position.y = 1.5;
v.position.z = 0.0;
v.color.red = 128;
v.color.green = 0;
v.color.blue = 255;
Structurile sunt folosite n principal pentru a crea baze de date, precum:
struct Account {
int account_number;
char *first_name;
char *last_name;
float balance;
};

8.2.

Exemple de structuri

Problema 8.1.

// Structura de date care poate modela un vector tridimensional


struct Vector
{
float x;
float y;
float z;
};
Problema 8.2.

// Structura de date care permit datarea calendaristic


struct date
{
int day;
int month;
int year;
61
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

int yearday;
char mon_name[4];
};
8.3.

Funcii i structurii

Singurele operaii care se pot aplica unei structuri sunt accesul la un membru
al structurii i considerarea adresei ei cu ajutorul operatorului &.
Avnd n vedere ca structurile sunt tipuri de date particulare, funciile pot
returna structuri sau le pot primi ca argumente.
S definim urmtoarea structur:
struct object {
char id[20];
int xpos;
int ypos;
};
Pe care o putem iniializa cu valorile:
struct object player1 = {player1, 0, 0};
Pentru a returna o structura object se declara funcia de tipul structurii
respective, de exemplu:
struct object createobj(char name[], int xpos, int ypos)
{
struct object newobj;
strcpy(newobj.id, name);
newobj.xpos = xpos;
newobj.ypos = ypos;
return newobj;
}
Structurile se transmit funciilor prin valoare. De exemplu, o funcie care
afieaz valorile membrilor structurii pe care o primete ca argument poate fi:
void printobj(struct object obj)
{
62
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

printf(name: %s, , obj.id);


printf(x position: %d, , obj.xpos);
printf(y position: %d, obj.ypos);
printf(\n);
}
Iat cum pot fi asamblate exemplele anterioare ntr-o aplicaie unitar,
http://www.exforsys.com/tutorials/c-language/c-structures-and-unions.html:
#include <stdio.h>
#include <stdlib.h>
struct object {
char id[20];
int xpos;
int ypos;
};
struct object createobj(char id[], int xpos, int ypos);
void printobj(struct object obj);
void main()
{
struct object player1 = createobj("player1", 0, 0);
struct object enemy1 = createobj("enemy1", 2, 3);
printobj(player1);
printobj(enemy1);
}
struct object createobj(char id[], int xpos, int ypos)
{
struct object newobj;
strcpy(newobj.id, id);
newobj.xpos = xpos;
newobj.ypos = ypos;
return newobj;
}
void printobj(struct object obj)
{
63
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

printf("name: %s, ", obj.id);


printf("x position: %d, ", obj.xpos);
printf("y position: %d", obj.ypos);
printf("\n");
}
Textul afisat de program va fi:
name: player1, x position: 0, y position: 0
name: enemy1, x position: 2, y position: 3

8.4.

Exemplu de problem

Problema 8.3.
//
#include <stdio.h>
#include <stdlib.h>
struct object
{
char id[20];
int xpos;
int ypos;
};
struct object createobj(char id[], int xpos, int ypos);
void printobj(struct object obj);
void main()
{
struct object player1 = createobj("player1", 0, 0);
struct object enemy1 = createobj("enemy1", 2, 3);
printobj(player1);
printobj(enemy1);
}
struct object createobj(char id[], int xpos, int ypos)
{
struct object newobj;
strcpy(newobj.id, id);
newobj.xpos = xpos;
newobj.ypos = ypos;
}
void printobj(struct object obj)
{
printf("name: %s, ", obj.id);
64
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

printf("x position: %d, ", obj.xpos);


printf("y position: %d", obj.ypos);
printf("\n");
}

8.5.

Tablouri de structuri

Deoarece structurile sunt potrivite pentru descrierea coleciilor de date, ele pot constitui
tablouri de structuri. Iat cum poate fi modificat exemplul anterior pentru a utiliza tablouri i nu
doar structuri singulare

8.6.

Exemplu de problem

Problema 8.4.
#include <stdio.h>
#include <stdlib.h>
struct object
{
char id[20];
int xpos;
int ypos;
};
struct object createobj(char id[], int xpos, int ypos);
void printobj(struct object obj);
void main()
{
int i;
struct object gameobjs[2];
gameobjs[0] = createobj("player1", 0, 0);
gameobjs[1] = createobj("enemy1", 2, 3);
for (i = 0; i < 2; i++)
printobj(gameobjs[i]);
/* update enemy1 position */
gameobjs[1].xpos = 1;
gameobjs[1].ypos = 2;
for (i = 0; i < 2; i++)
printobj(gameobjs[i]);
}
struct object createobj(char id[], int xpos, int ypos)
{
struct object newobj;
strcpy(newobj.id, id);
newobj.xpos = xpos;
newobj.ypos = ypos;
65
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

return newobj;
}
void printobj(struct object obj)
{
printf("name: %s, ", obj.id);
printf("x position: %d, ", obj.xpos);
printf("y position: %d", obj.ypos);
printf("\n");
}
Funcia createobj iniializeaz elementele tabloului de structuri gamobjs. Difereneleintre
cele doua programa sunt minore; funcia de actualizare a poziiei arata cum se acceseaz membrii
structurii cnd elementele alctuiesc un tablou.
Textul afiat de aceasta data este:
name: player1, x position: 0, y position: 0
name: enemy1, x position: 2, y position: 3
name: player1, x position: 0, y position: 0
name: enemy1, x position: 1, y position: 2
O alta modificare a aplicaiei anterioare se poate face definind o structura cu numele
coordinates care conine coordonatele x si y. n acest caz, structura object va fi redefinit astfel:
struct object {
char id[20];
struct coordinates loc;
};
Iar iniializarea se poate face prin atribuirea:
struct object player1 = {player1, {0, 0}};

8.7.

Uniuni

Uniunile sunt similare structurilor; diferena esenial ns, este ca o uniune poate avea o
singura valoare la un moment dat. Avantajul lor este ca folosesc un volum de memorie redus;
membrii uniunii folosesc un spaiu de memorie comun. De exemplu, n structura object poate fi
introdusa o uniune deadoralive care va indica dead sau alive:
struct object {
char id[20];
struct coordinates loc;
union deadoralive {
int alive;
66
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

int dead;
}
};

8.8.

Pointeri i structuri

Pointerii i structurile sunt suportul unor aplicaii de programare complexe: liste


nlnuite, stive, cozi i arbori pot fi dezvoltate pe baza sistemului constituit de pointeri i
structuri; de asemenea apelurile ctre funcii pot fi realizate cu ajutorul pointerilor structura,
aceasta au avantajul de a mari viteza funciei i de a scdea ncrcarea memoriei. n plus, dac e
cazul, funcia apelat poate modifica structura folosit ca argument.
Declararea se face tot cu ajutorul simbolului asterisc, iar accesarea membrilor cu ajutorul
operatorului sageata -> (minus, mai mare). Iat un exemplu de utilizare:

8.9.

Exemplu de problem

Problema 8.5.
#include <stdio.h>
struct details
{
int num;
};
int main()
{
struct details MainDetails;
struct details *structptr;
structptr=&MainDetails;
structptr->num=20;
printf("n%d",MainDetails.num);
return 0;
}

8.10.
8.2.1.
8.2.2.
8.2.3.
8.2.4.

Probleme

Ce sunt structurile?
Care sunt operaiile aplicate structurilor?
Ce permit pointeri i structurile n programare?
Scriei un program care s foloseasc structuri i pointeri.

67
MatrixRom 2013

ISBN: 978-973-755-897-8

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