Sunteți pe pagina 1din 6

Programare C/C++

LABORATOR

8 Structuri de
date

Structuri de date
Uniuni
Aplicaţii
Probleme propuse

Structuri
Structura reprezintă o mulţime organizată de date (câmpuri) toate sub un acelaşi
nume.
O structură se declară sub următoarea formă:
struct nume_structura
{
tip1 numevar1;
tip2 numevar2;
………………
tipn numevarn;
} lista_variabile_la_structura;
sau se poate opta pentru definirea unui tip structură astfel:
typedef struct
{
tip1 numevar1;
tip2 numevar2;
………………

65
Programare C/C++

tipn numevarn;

}nume_tip_structura;
Declararea de variabile la structură se face:
- în primul caz:
struct nume_structura lista_variabile;
- în al doilea caz:
nume_tip_structura;
Refererirea la câmpurile unei structuri se face prin următoarele declaraţii:
variabila_structura.câmp_structura;
sau
(*variabila_structura).câmp_structura;
respectiv
variabila_structura -> câmp_structura;
dacă, aşa cum este prezentat în ultimele două cazuri variabila_structura este de fapt o
variabila pointer la acea structură.
Obs.:
1. O structură poate să fie rezultat al unei funcţii. Astfel, dacă se doreşte realizarea
unei funcţii care să întoarcă un masiv (vector) se trece acesta într-o structură.
2. Operatorul „ . ” se numeşte operator de referire sau selecţie, iar „ -> “ se numeşte
operator de selecţie la câmpurile unei structuri prin intermediul pointerilor.

Uniuni
Uniunile se mai numesc şi înregistrări cu structură variabilă sau alternativă.
Crearea şi declararea este identică cu cea a structurilor, diferenţa făcând-o faptul că în loc
de cuvântul cheie struct se foloseşte union.
Diferenţă există şi anume faptul că dacă în cazul structurilor memoria ocupată de
acesta este egală cu suma memoriei tuturor câmpurilor sale, în cazul uniunii memoria
ocupată este cea egală cu memoria celui mai mare câmp în octeţi. Aceasta nu înseamnă

66
Programare C/C++

însă vreo facilitate în cazul uniunilor, ci dimpotrivă, nu se poate utiliza decât unu la un
moment dat.

Aplicaţii
Ex.1: Să se realizeze o aplicaţie care realizează prelucrări cu numere complexe, adică
citire, afişare, sumă, modul , produs.
#include<stdio.h>
#include<math.h>
#include<conio.h> //ptr. getche()
#include<stdlib.h>

typedef struct{
double re;
double im;
}complex;

void citeste(complex *z,char* nume)


{
double a,b;
printf("Dati %s.re: ",nume); scanf("%lf",&a);
printf("Dati %s.im: ",nume); scanf("%lf",&b);

/* doua modalitati diferitede a referi campurile pintr-o variabila


pointer la structura */
(*z).re=a;
z->im=b;
}

void scrie(complex z,char* nume)


{
printf("Numarul complex %s este: ",nume);
if (z.im>=0)
printf("%6.2lf +%6.2lf*i\n",z.re,z.im);
else
printf("%6.2lf %6.2lf*i\n",z.re,z.im);
}

double modul(complex z)
{
return sqrt(pow(z.re,2)+pow(z.im,2));
}

complex suma1(complex z1, complex z2)


{
complex z;
z.re=z1.re+z2.re;
z.im=z1.im+z2.im;

67
Programare C/C++

return z;
}

//in acest caz vom declara o functie avand ca parametri pointeri la


structuri
complex suma2(complex *z1, complex *z2)
{
complex z;
z.re=z1->re+z2->re;
z.im=z1->im+z2->im;
return z;
}

//in acest caz vom declara o functie avand ca parametri pointeri la


structuri si ca rezultat tot un pointer la structura
complex* suma3(complex *z1, complex *z2)
{
complex* z;
z=(complex*)malloc(sizeof(complex));
z->re=z1->re+z2->re;
z->im=z1->im+z2->im;
return z;
}

complex produs(complex z1,complex z2)


{
complex z;
z.re=z1.re*z2.re-z1.im*z2.im;
z.im=z1.re*z2.im+z1.im*z2.re;
return z;
}

void main()
{
complex a,b,c,*p;

citeste(&a,"a");
citeste(&b,"b");
scrie(a,"a");
scrie(b,"b");
printf("Modulul nr. complex a este : %.2lf\n",modul(a));
printf("Modulul nr. complex b este : %.2lf\n",modul(b));

puts("\nSuma este:");
c=suma1(a,b);
scrie(c,"a+b");
c=suma2(&a,&b);
scrie(c,"a+b");
p=suma3(&a,&b);
scrie(*p,"a+b");

puts("\nProdusul este:");
c=produs(a,b);

68
Programare C/C++

scrie(c,"aXb");
}

Probleme propuse
1. Sa se scrie un program care sa administreze un parc de automobile. Informatiile
relative la un automobil sunt: nr. de locuri, puterea
(in cai putere), marca, culoarea, anul fabricatiei
a) cititi informatiile relative la cele n automobile din parc. Afisati automobilele care au
5 locuri
b) ordonati crescator dupa putere automobilele; afisati datele ordonate
c) scrieti o functie care afiseaza toate automobilele fabricate intr-un an dat ca parametru

#include<stdio.h>
#include<conio.h>

typedef struct{
char marca[20]; //marca autoturismului
char cul[20]; //culoarea masinii
int an; //anul fabricatiei
struct {
char nl; //nr. de locuri
int put; //puterea in cai putere
}date;
}automobil;

typedef automobil masina[20];

void citire(masina a, int *n)


{
int i;
printf("Dati nr. de automobile: ");
scanf("%d",n);

for(i=0; i<*n; i++)


{
printf("\nDati marca: "); scanf("%s",a[i].marca);
printf("Dati culoarea: "); scanf("%s",a[i].cul);
printf("Dati anul: "); scanf("%d",&a[i].an);
printf("Dati nr. de locuri: "); scanf("%d",&a[i].date.nl);
printf("Dati puterea in cai putere: "); scanf("%d",&a[i].date.put);
}
}

void afisare(masina a,int n)


{
clrscr();

69
Programare C/C++

int i;
for (i=0;i<n;i++)
{
printf("Automobil [%d]:\n",i+1);
printf("\tmarca: %s\n",a[i].marca);
printf("\tculoarea: %s\n",a[i].cul);
printf("\tan fabr.: %d\n",a[i].an);
printf("\tnr locuri: %d\n",a[i].date.nl);
printf("\tputerea: %d\n\n",a[i].date.put);
}
}

void main()
{
masina a;
int n;
citire(a,&n);
afisare(a,n);
}
Să se continue această aplicaţie.

2. Să se realizeze un program care inventariază cărţile unei biblioteci date după autor,
nume carte, profil carte, editură, anul apariţiei astfel: se cere citirea cărţilor, afişarea lor,
ordonarea după titlul cărţii, afişarea cărţilor unei anumite edituri dintr-un anumit an,
afişarea tuturor cărţilor care încep cu o anumită literă.

70

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