Documente Academic
Documente Profesional
Documente Cultură
L13 Structuri
L13 Structuri
Def: O structura este o colectie de una sau mai multe variabile grupate sub un acelasi nume.
Variabilele intr-o structura, spre deosebire de cele dintr-un array, pot fi de diferite tipuri. O structura poate
contine orice tip de date, inclusiv alte structuri sau array-uri, mai puin declaraii ce implica recursivitate.
Fiecare variabila dintr-o structura se numeste membru al structurii.
Ex de structura numita coord, care are ca si membrii coordonatele unui punct :
struct coord {
int x;
int y;
};
Obs. Caracterul ; este obligatoriu dp declararea unei structuri.
Cuvantul cheie struct indica inceputul definirii unei structuri. Acesta trebuie urmat de numele structurii.
Intre acolade se declara membrii structurii. Fiecare membru tebuie sa aiba specificat tipul. Exemplul de mai
sus defineste un tip structura care contine doua variabile de tip intreg x,y, dar nu creeaza nici un fel de
instantiere. Sunt doua posibilitati de a declara o structura (de a rezerva spatiu de memorie pentru membrii
structurii) :
1.
struct coord {
int x;
int y;
} first, second;
first si second declara 2 structuri de tip coord. Asta inseamna ca first contine doi membrii de tip intreg ,
adica pe x si pe y si la fel si second.
2.
struct coord {
int x;
int y;
};
/* optional poate fi scris cod, declararea fiind posibila pe parcursul
programului */
struct coord first, second;
typedef struct{
int x;
int y;
}coord;
coord first, second;
Accesarea membrilor unei structuri:
Membrii unei structuri sunt accesati prin operatorul . (operatorul de selecie). Acesta se pune intre numele
structurii si numele membrului. De exemplu, daca vrem sa atribuim lui x valoarea 50 si lui y valoarea 100,
apartinand structurii first vom scrie :
first.x = 50;
first.y = 100;
Pentru a ne convinge ca atribuirea s-a efectuat, putem sa afisam coordonatele in felul urmator:
(echivalent cu)
first.x = second.x;
first.y = second.y;
Un alt avantaj pe care structurile il ofera este acela de a putea accesa un grup de diferite tipuri de variabile.
De exemplu, daca dorim sa avem o baza de date la care fiecare intrare sa fie o structura care sa aiba ca
membri mai multe informatii (nume, adresa, telefon), acestea constituind membrii structurii.
Ex de structura cu instantiere :
struct date {
char month[2];
char day[2];
char year[4];
} current_date;
Ex de declarare si initializare a unei structuri :
struct time {
int hours;
int minutes;
int seconds;
} time_of_birth = { 8, 45, 0 };
Structuri care contin alte structuri
Sa presupunem ca dorim sa fixam cooronatele unui dreptunghi. Pentru aceasta avem nevoie de doua puncte
care vor reprezenta colturile de pe diagonala dreptunghiului. Fiecare colt este definit prin doua coordonate
x si y. Pentru a ne referi la x si y (coordonatele unui punct), facem apel la structura de mai sus coord.
In continuare definim o alta structura care are ca si membrii doua structuri de tip coord,fiecare
reprezentand cate un punct al diagonalei dreptunghiului :
struct rectangle {
struct coord topleft;
struct coord bottomrt;
};
Pentru a declara aceasta structura, exemplificam inca o data cele doua metode expuse mai sus :
1.
struct rectangle {
struct coord topleft;
struct coord bottomrt;
} mybox;
2.
struct rectangle mybox;
Accesarea punctelor x si y se face in felul urmator :
mybox.topleft.x = 0;
mybox.topleft.y = 10;
mybox.bottomrt.x = 100;
mybox.bottomrt.y = 200;
Structuri care contin tablouri (array-uri)
Ex de definire de structura care are ca si membrii 2 tablouri de tipuri diferite
struct data{
int x[4];
char y[10];
};
Ex de declarare a acestei structuri :
struct data record;
Ex de accesare a membrilor ei :
record.x[2] = 100;
record.y[1] = `x';
Tablouri de structuri
Sa presupunem ca dorim sa retinem numele si numarul de telefon al unor persoane. Pentru aceasta definim
o structura :
struct entry{
char fname[10];
char lname[12];
char phone[8];
};
Apoi declaram un tablou numit lista care contine 1000 de elemente. Fiecare din aceste elemente va fi o
structura de tip entry :
struct entry list[1000];
Rezultatul obtinut este un tablou de structuri. Se pot face diferite operatii intre membrii structurilor. Spre
exemplu putem atribui un element al tabloului altui element :
list[1] = list[5];
Prin exemplul de mai sus am atribuit fiecarui membru al structurii list[1] valorile care sunt la list[5]. De
asemenea se pot copia date intre membrii structurilor :
strcpy(list[1].phone, list[5].phone);
Obs: Variabila phone a fost declarata de tip char, de aceea trebuie folosita functia strcpy().
Structuri si pointeri
Pointerii pot fi folositi pe de o parte ca si membri ai unei structuri, dar si pentru a accesa o structura
(pointeri la structuri)
se
face
avand
ca
si
argument
numele
dat
instantei
return 0;
}
void print_rec(struct data x)
{
printf("\nDonor %s %s gave $%.2f.\n", x.fname, x.lname,
x.amount);
}
void print_rec_2(struct data *x)
{
printf("\nDonor %s %s gave $%.2f.\n", x->fname, x->lname,
x->amount);
}
Ex de program care acceseaza elemente succesive ale unui array prin incrementarea unui pointer :
#include <stdio.h>
#define MAX 4
/*Definirea unei structuri, apoi declararea si initializarea unui
tablou cu 4 structuri*/
struct part {
int number;
char name[10];
} data[MAX] = {{1, "Smith"},
2, "Jones",
3, "Adams",
4, "Wilson"
};
return 0;
Probleme propse :
1.
Propuneti o structura care sa contina toate campurile necesare unei inregistrari din cartea de telefon.
Motivati utilizarea si definirea campurilor respective.
2.
Se cere proiectarea unei baze de date care sa contina poligoane neregulate inchise in plan. Se vor initializa
Un numar de 7 poligoane cu numarul de laturi intre 3 si 10, iar in final pentru fiecare poligon se va afisa
perimetrul.
3.
Sa se argumenteze crearea unei baze de date folosind structuri, necesare unui campionat de fotbal in care
sa fie incluse jucatorii, echipele si meciurile.
4.
Se considera mai multe orase, fiecare oras putand dispune sau nu de unul din urmatoarele atribute :
- patinoar (7-35)
- opera (15-70)
- muzeu (15-60)
- stadion (10-40)
- monumente (30-70)
- mall (3-30)
- strand (10-20)
- cinema (14-30)
- parc (40-70)
- discoteca (15-25)
Numerele din paranteza reprezinta intervalul de varsta pentru care proprietatea respectiva prezinta interes.
Orasele se introduc de la taspatura, pentru fiecare oras dandu-se 2 linii : pe prima linie, numele orasului iar
pe a 2-a un sir format din 0 si 1 fara pauze, de 10 caractere, 0 reprezentand absenta proprietatii, iar 1
prezenta ei in oras. Lista de orase se incheie la prima linie vida. Dupa ce s-au introdus orasele, se vor
introduce pe rand numere reprezentand varste. Pentru fiecare varsta introdusa, sa se afiseze primele 3 orase
cele mai atractive pentru acea varsta si gradul lor de atractivitate. Gradul de atractivitate este dat de
numarul proprietatilor prezente in oras, care reprezinta atractie pentru varsta data.
5.
Scrieti o functie care atribuie o structura alteia, structura fiind definita in felul urmator: struct
o_structura{int x; char h; char *f}; si cunoscandu-se ca f arata spre un sir de caractere neconstant!