Documente Academic
Documente Profesional
Documente Cultură
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
};
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.
ISBN: 978-973-755-897-8
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
ISBN: 978-973-755-897-8
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
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
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
int dead;
}
};
8.8.
Pointeri i structuri
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