Escolar Documentos
Profissional Documentos
Cultura Documentos
DATE
Declarare/definire
Aplicarea operatorului „typedef”
Accesul la membrii structurii
Operatorul „sizeof” aplicat structurilor
Pointeri la structuri
Câmpuri de biţi
Tablouri de structuri
Atribuiri de structuri de acelasi tip
Structurile ca tip de argumente sau tip întors de funcţii
Funcţii ce preiau structuri
Funcţii ce întorc structuri
Bibliografie
2
Declarare/definire
Structura este un grup de variabile reunite sub acelaşi nume, ce pune la
dispoziţia utilizatorului un mod convenabil de păstrare a informaţiilor legate
între ele.
Structurile se deosebesc de tablouri prin următoarele aspecte:
elementele unei structuri pot avea tipuri diferite
structurile pot fi atribuite
funcţiile pot returna structuri
elementele unui structuri nu sunt variabile anonime ci au câte un nume.
referirea unui element al unei structuri se realizează cu operatorul de selecţie
( . ) şi nu cu operatorul de indexare ( [ ] ).
Declararea unei structuri creează un nou tip de date ce poate fi folosit
pentru a crea variabile de acel tip sau pentru a crea direct variabile de acel tip.
Variabilele care fac parte din structură se numesc membri, elemente sau câmpuri
ale structurii. între membrii structurii de obicei există o legătură logică.
Forma generala a declarării unei structuri este:
struct nume_generic {
tip nume_membrul_l; tip nume_membrul_2;
……………………..
tip nume_membrul_n;
} lista_variabile;
unde:
struct - este cuvânt rezervat, numele tipului de date;
tip - este orice tip de dată admis de C; nu trebuie să fie acelaşi pentru
toate câmpurile;
nume_generic - numele dat noului tip de date, opţional;
listă_variabile - este o listă de variabile de tip numegeneric daca apare
sau anonim daca nu apare, este opţională;
nume_membru_i - este numele câmpului (membralui) i al structurii.
Nume_generic şi listă_variabile sunt opţionale, dar cel puţin una trebuie
sa apara. Dacă nume_generic apare înseamnă că s-a creat un nou tip de date.
3
Dacă
apare numai lista_variabile înseamnă ca s-au declarat variabile de tip structură,
fară ca structura să aibă tip (tipul structurii create este anonim).
Exemplu:
struct carte {
char nume_carte [30];
char nume_autor [40];
char editura [20];
long data_ap;
unsigned char ed; //editia} cartel, carte2;
unde : carte este tipul structurii, variabilele de tip structură sunt carte1 şi
carte2.
Odată definit un tip de structură, se pot crea mai multe variabile de acel tip,
folosind forma generală: struct nume_generic lista_variabile;
4
apar, dar se permite existenţa unui pointer către o structură de acelaşi tip cu cea în
care apare pointerul. Situaţia aceasta este întâlnită în cadrul tehnicilor de
programare, unde implementarea tipurilor de date abstracte - lista, stiva, coada,
arbore ş.a - fac apel la liste de structuri, în care fiecare structură a acelei liste
poate puncta către structura vecină din dreapta - listă simplu înlănţuită, sau şi
către cea din dreapta şi către cea din stânga - listă dublu înlănţuită.
Sintaxa la declarare/definire este aceeaşi cu a variabilelor obişnuite, doar că nu
pot fi iniţializate.
Exemplu:
1. typedef struct persoana{
5
char prenume[15] ;
char nume[15] ;
int varsta ;
} PERSOANA ;
2. typedef struct{
char prenume[15] ;
char nume[15] ;
int varsta ;
} PERSOANA ;
Pentru a accesa direct un cămp al unei structuri, trebuie specificate atât numerele
variabilelor de tip structură cât şi numele câmpului, separate printr-un punct.
Forma generala de acces la un membru:
nume_variabil.nume_membru
unde nume_variabila este numele variabilei de tip structura, iar
nume_membru este numele campului ce se doreste a fi accesat.
Pentru structura şi variabilele declarate mai sus putem realiza următoarele operaţii:
- atribuirii de forma:
cartel.data_ap = 1999;
carte2.editura = "Teora";
cartel.nume_carte = "Programare în C";
cartel.preţ = 12345.50;
6
ch= cartel.nume_autor [5]);
- conţinutul unei variabile de tip structură poate fi asignat unei alte variabile
de tip structură, dar de acelasi tip:
carte2 = cartel;
atribuire echivalentă cu atribuirile:
carte2.nume_autor = cartel.nume_autor; carte2.nume_carte = cartel . nume_carte;
carte2.editura = cartel.editura;
…………………………….
carte2.preţ = cartel.pret;
7
pot fi "aşezate" diferit în memorie. De aceea, pentru a şti exact spaţiul alocat
trebuie folosit operatorul sizeof().
Sintaxă:
sizeof (struct tip) ; /* fără typedef.*/
sau
sizeof (tipStructura) ; /* cu typedef.*/
Observaţie:
Pentru a asigura portabilitatea unui program ce conţine structuri este
obligatorie folosirea operatorului sizeof(). Se asigură astfel că dimensiunea în
memorie este mereu folosită aşa cum trebuie.
Pointeri la structuri
Accesarea unei structuri printr-un pointer este o tehnică uzual folosită în
C.
• Declararea unui pointer la o structură
Un pointer la o structură se declară prin plasarea operatorului * în faţa
numelui variabilei de tip structură.
De exemplu declaraţia:
struct alfa {
char x;
int y;
char s [ 10];
} beta, *gama;
8
} beta; struct alfa *gama;
unde gama este pointer către structura alfa.
9
include <stdio . h>
define DELAY 128000
struct ceas {
int ora;
int minute;
int secunde; } ;
void afiseaza(struct ceas *p);
void calc(struct ceas *p);
void intirziere(void);
void main(void){
struct ceas curenta;
curenta.ora=0;
curenta.minute=0;
curenta.secunde=0;
for ( ; ; ) { calc(&curenta);
afişeaza(&curenta); }
}
void întarziere(void) {
long int p;
for (p=l; p<DELAY; p++;) }
10
Câmpuri de biţi
Limbajul C, prin tipul de date câmpuri de biţi, permite accesul la unul sau
un grup de biţi, dintr-un octet sau cuvânt (doi octeţi).
Pentru a avea acces la biţi, limbajul C foloseşte o metodă bazată pe tipul
structura, în fapt, un câmp de biţi este efectiv chiar un tip special de membru al
unei structuri căruia i se specifică tipul si numărul efectiv de biţi. Forma generală
de definire a unui câmp de biţi este:
struct nume_generic { tip nume1:lungime;
tip nume2 : lungime;
………………
tip numen: lungime
} lista_variabile;
unde:
nume_generic - este numele tipului de dată creat;
tip - este tipul câmpului nume de biţi şi care trebuie să fie de tip int, unsigned
sau signed. Câmpul de lungime unu trebuie să fie declarat ca fiind unsigned
deoarece un singur bit nu poate avea semn.
lungime - reprezintă numărul de biţi ai câmpului nume.
Dacă un câmp de biţi este specificat ca int sau signed, bitul cel mai
semnificativ va fi bitul de semn. Numele câmpului de biţi nume i şi lungimea sa
sunt separate prin două puncte (:).
Câmpurile de biţi sunt utile în următoarele situaţii:
- dorim să înmagazinăm mai multe informaţii, de obicei de tip
boolean (adevărat/fals) într-un spaţiu cât mai mic;
- pentru a transmite informaţii codificate unor echipamente;
- pentru a cripta informaţii într-un octet sau cuvânt. De exemplu:
struct camin {
unsigned camere:4 ; //pana la 15 camere
unsigned stare:l ; // ocupate 1, libere 0
unsigned plata:l ; // 1 plătit, 0 restanţă
unsigned perioada: 2; //perioada in luni închiriată }
agronomie[3],lapuş;
Toate aceste informaţii sunt stocate într-un singur octet (4 + 1 + 1 + 2 = 8
biţi). în mod normal dacă nu se folosea câmpul de biţi, ar fi fost necesar minim 4
octeţi. Un membru al unui câmp de biţi poate fi accesat ca orice element al unei
structuri.
De exemplu instrucţiunea „agronomie[ 2 ] .camere=14;” asignează
valoarea 14 câmpului camere a articolului 3 din tabloul de structuri
agronomie[3].
Sau instrucţiunea:
if (lapus.stare) printf("camera este ocupată");
else printf ("camera este liberă");
11
Nu este necesar ca biţii dintr-un octet sau cuvânt să fie toţi ocupaţi.
struct alfa {
int x: 10;
int y: 2; };
Compilatorul stochează structura definită câmp de biţi pe cea mai mică
unitate de memorie octet sau cuvant în o aceeaşi structură pot coexista atât
câmpuri de biţi cât şi variabile normale, membri ai structurii.
struct blocuri {
char bloc[10]; //nume bloc
float plata; // cheltuieli lunare
unsigned achitat: 1; //1 - da, 0 - nu
unsigned intarziere : 3; //număr de luni
} cartier[4];
struct alfa{
unsigned x: 3;
unsigned y: 2; }beta, *p;
p=β
p->x=5; / * atribuie valoarea 5 câmpului x a variabilei structură beta
*/
Tablouri de structuri
Structurile pot fi aranjate în tablouri la fel ca celelalte tipuri de date. De
exemplu următoarea declaraţie creează un tablou unidimensional CARTE[20] de
structuri de tip carte, ce conţine 20 de elemente:
struct carte CARTE[20];
12
Pentru a accesa un câmp al unei anumite structuri din tablou, indexul
trebuie urmat de punct şi de numele câmpului dorit. De exemplu:
gets (CARTE[3].nume_autor)
CARTE[3].data_ap=1998
printf (preţul cărţii este : %f”, CARTE[3] .preţ);
printf („Al 3-lea caracter al celei de-a 3-a carte este %c,
CARTE[2].nume_carte)
etc.
La toate tablourile si la tablourile de structuri indicii încep de la 0.
13
void f (struct alfa beta);
void main(void){
struct alfa gama;
gama.x=123;
gama.y=456;
f(gama);
printf („valoarea campului lui x dupa apelul functiei %d”, gama.x);
}
void f(struct alfa beta){
beta.x=beta.x+beta.y;
printf („valoarea campului x dupa asignare=%d”, beta.x);
Dacă declaraţi parametrii de tip structură, trebuie să declaraţi structuri de
tip global, astfel ca toate funcţiile programului să le poată folosi.
Funcţiile pot returna o structură.
#include<stdio.h>
struct alfa { int x; float y; } beta;
struct alfa f(void);
void main(void){
beta = f();
printf ("%d %f", beta . x, beta . y);
}
struct alfa f(void){ stuct alfa temp;
temp.x = 123;
temp.y = -65.345;
return temp;
}
Sintaxă:
tipStruct var1, var2 ;
var1 = var2 ;
14
Bineînţeles că se presupune că tipStructură este anterior definit - cu sau
fără typedef.
Exemplu:
struct Oarecare{
char vector[30] ;
} var1, var2 = {"Un sir de caractere"} ;
var1 = var2 ; /*atribuirea propriu-zisă.*/
printf("\n Prima structura are campul egal cu: %s", var1.vector) ;
printf("\n A doua structura are campul egal cu: %s", var2.vector) ;
Exemplu:
typedef struct{
char adresa[100] ;
int sector ;
} ADRESA ;
void fct(ADRESA) ;
...
ADRESA mea = {"Str. Strazilor, nr. 2", 3} ;
fct(mea) ;
15
Se defineşte mai întâi tipul structurii, după care în prototipul funcţiei se
specifică tipul argumentului ce va fi preluat Undeva în funcţia main() se declară o
variabilă de tipul structurii, iniţializată, iar această variabilă este preluată de
funcţie, în apelul său. Pe post de argument de apel este bineînţeles copia structurii
declarate, ce are rolul de a iniţializa argumentul funcţiei, pentru lucrul în interiorul
acesteia. Apelul este prin valoare.
Exemplu:
struct adresa{
BYTE casaSauBloc ;
char nume[100] ;
int sector ;
};
struct adresa calcule(struct adresa *) ;
...
struct adresa adr1 = { True, "Str. 5", 2}, adr2 ;
adr2 = calcule(&adresa) ;
printf("\n Câmpurile structurii preluate sunt acum: %i, %s, %d.",\n
adr2.casaSauBloc, adr2.nume, adr2.sector) ;
16
Bibliografie
http://www.math.uaic.ro
http://www.cs.ucv.ro
http://www.ereferat.md
17
18