Sunteți pe pagina 1din 40

Scopul cursului

Structuri și uniuni, câmpuri pe biți


 Definirea și inițializarea unei structuri

 Accesarea membrilor unei structuri

 Structuri incluse

 Uniuni

 Câmpuri pe biți

 Tipul enumerare

 Definirea unui tip de dată de către utilizator

Programarea calculatoarelor I - Gyorodi


Cornelia 1
Definirea unei structuri
 O structură este un conglomerat de tipuri de date.
 Fiecare element al unei structuri poate avea propriul său tip care poate
diferi oricărui alt element.
 Structurile sunt definite în C folosind forma generală:
struct tag_name
{
type element 1;
type element 2;
...
type element N;
} lista_variabile;
Programarea calculatoarelor I - Gyorodi
Cornelia 2
Definirea unei structuri
unde:
 cuvântul cheie struct instruieşte compilatorul că se defineşte o
structură
 type - este orice tip de dată admis de C. type nu trebuie să fie
acelaşi pentru toate elementele
 tag_name - este numele structurii

 lista_variabile - este o listă de variabile de tip tag_name

Observaţie: tag_name şi lista_variabile sunt opţionale, dar una dintre ele


trebuie să fie prezentă.
 Elementele unei structuri sunt denumite câmpuri sau membri

Programarea calculatoarelor I - Gyorodi


Cornelia 3
Definirea unei structuri
Exemplu de definire de structură:
struct persoana
{
char nume [40];/* numele persoanei */
char prenume [40]; /* prenumele persoanei */
long date; /* data nasterii */
}pers;

 pers este numele unei variabile


 persoana este tipul structurii

Programarea calculatoarelor I - Gyorodi


Cornelia 4
Definirea unei structuri
 struct
 O structură nu poate conține o instanță a ei

 Poate conține un membru care este un pointer la același tip de structură

 Definirea unei structuri nu face alocare de spațiu în memorie

Programarea calculatoarelor I - Gyorodi


Cornelia 5
Definirea unei structuri
 Declarații
 Declararea unor variable de tipul structurii:
persoana pers, t[ 52 ], *p;

 Putem declara variabile și la definirea structurii:


struct persoana
{
char nume [40]; /* numele persoanei */
char prenume [40]; /* prenumele persoanei */
long date; /* data nasterii */
}pers, t[ 52 ], *p;

Programarea calculatoarelor I - Gyorodi


Cornelia 6
Accesarea membrilor unei structuri
 De exemplu pentru a accesa câmpul nume din structura persoana folosim
următoarea instrucţiune:
pers.nume = "ion";

 Pentru a afişa numele persoanei, se poate folosi instrucţiunea următoare:


printf ("Numele persoanei este %s", pers. nume);

 Pentru a citi numele persoanei, se foloseşte instrucţiunea următoare:


gets (pers.nume);

Programarea calculatoarelor I - Gyorodi


Cornelia 7
Accesarea membrilor unei structuri
 Pentru a citi data naşterii folosim următoarea instrucţiune :
scanf ("%d", &pers.date);
 Odată ce a fost definit un tip de structură, se pot crea mai multe variabile
de acest tip, folosind forma generală:
struct tag_name var_list;

 Presupunând de exemplu structura persoana, declaraţia următoare


defineşte trei variabile de tip persoana.
struct persoana var1, var2, var3;

Programarea calculatoarelor I - Gyorodi


Cornelia 8
Accesarea membrilor unei structuri

 Pentru a accesa un câmp al unei anumite structuri din tablou, indexul


trebuie urmat de punct şi de numele câmpului dorit.

 Pentru a iniţializa câmpul prenume al structurii 10 vom folosi


instrucţiunea următoare:
t[9].prenume = "adrian";

OBS: Această modalitate se pretează doar la inițializarea câmpurilor de


tip șir. În cazul atribuirii unei valori trebuie folosite funcțiile pe șiruri
de caractere (strcpy, strcat …).

Programarea calculatoarelor I - Gyorodi


Cornelia 9
Accesarea membrilor unei structuri
struct persoana
{
char nume [40];
char prenume [40];
int i;
}s, *p;

p=&s; /* asignam lui p adresa lui s*/


p->i = 6; /* asignam campului i valoarea 6 */

Programarea calculatoarelor I - Gyorodi


Cornelia 10
Accesarea membrilor unei structuri
 Accesarea unui element al structurii printr-un pointer vom
folosi operatorul –>
 Accesarea membrilor unei structuri
 operatorul (.) utilizat cu variabile de tipul structurii
persoana pers;
printf( "%s", pers.nume );
 operatorul (->) utilizat cu variabile de tipul pointeri la structură
persoana *p = &pers;
printf( "%s", p->nume );
 p->nume este echivalent cu: ( *p ).nume

Programarea calculatoarelor I -
Gyorodi Cornelia 11
Accesarea membrilor unei structuri

 Important de reținut:
 Când accesăm un element al unei structuri printr-o variabilă de
structură folosim operatorul punct (.)

 Când accesăm un element al unei structuri printr-un pointer


folosim operatorul (->)

Programarea calculatoarelor I - Gyorodi


Cornelia 12
Următorul program ilustrează folosirea pointerilor către structuri.

# include <stdio.h>
# include <string.h>

struct s_type
{
int i;
char str [80];
}s, *p;

void main (void )


{
p = &s;
s.i = 10; /* aceasta, functional este la fel */
p->i = 10; /* cu aceasta */
strcpy (p -> str, "OK");
printf ("%d %d %s", s.i, p->i, p->str);
}

Programarea calculatoarelor I - Gyorodi


Cornelia 13
Utilizarea structurilor cu funcții

 Structurile pot fi transferate ca parametri funcţiilor.

 O funcţie poate să returneze o structură.

 Conţinutul unei variabile de structură poate fi asignat unei alte


variabile de structură de acelaşi tip.

Programarea calculatoarelor I - Gyorodi


Cornelia 14
Utilizarea structurilor cu funcții
De exemplu considerăm următorul fragment de program, în care conţinutul unei variabile de
structură poate fi asignat unei alte variabile de structură de acelaşi tip :

struct
{
int a;
float f;
}var1, var2;

var1.a = 10;
var1.f = 100.25;
var2 = var1; /* var1 si var2 vor conţine aceleaşi date */

Programarea calculatoarelor I - Gyorodi


Cornelia 15
O funcţie poate să returneze o structură
#include <stdio.h>
struct exemplu {
int i;
double d;
} var1;
struct exemplu f1(void);

void main(void)
{
var1 = f1();
printf("%d %lf ", var1.i, var1.d);
}

struct exemplu f1(void)


{
struct exemplu tmp;

tmp.i = 100;
tmp.d = 123.23;
return tmp;
}
Programarea calculatoarelor I - Gyorodi
Cornelia 16
Exemplu – Funcția care are argument pointer la structură
#include <stdio.h>
#include <string.h>
struct Books {
char title[50]; void printBook( struct Books *book )
char author[50]; {
char subject[100]; printf( "Book title : %s\n", book->title);
int book_id; }; printf( "Book author : %s\n", book->author);
/* function declaration */ printf( "Book subject : %s\n", book->subject);
void printBook( struct Books *book ); printf( "Book book_id : %d\n", book->book_id);
int main( ) }
{
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */
/* book 1 specification */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* book 2 specification */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* print Book1 info by passing address of Book1 */
printBook( &Book1 );
/* print Book2 info by passing address of Book2 */
printBook( &Book2 );
return 0;
} 17
Dimensiunea unei structuri
 Pentru a afla dimensiunea unei structuri, va trebui să folosiţi operatorul
sizeof.

 De exemplu, pentru structura persoana putem afla dimensiunea folosind


următoarea secvenţă de instrucţiuni:

int i;
i = sizeof (struct persoana);
printf ("persoana are lungimea de %d bytes", i);

Programarea calculatoarelor I - Gyorodi


Cornelia 18
Structuri incluse
 Printre elementele unei structuri se pot găsi şi alte structuri. Acestea se numesc structuri incluse.
struct data
{
unsigned char zi;
unsigned char luna;
int an;
};
struct pers
{
char nume [30]; /* numele persoanei */
char prenume [30]; /* prenumele persoanei */
struct data data_nastere; /* data nasterii, camp de tip structura*/
}p[10];

Programarea calculatoarelor I - Gyorodi


Cornelia 19
Exemplu - structuri incluse
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define MAXNAME 30
#define MAXPERSONS 2

struct date {
unsigned char day;
unsigned char month;
int year;
};

struct person {
char firstName[MAXNAME];
char lastName[MAXNAME];
struct date dateOfBirth;
};

Programarea calculatoarelor I - Gyorodi


Cornelia 20
Exemplu – citirea datelor
int main()
{
struct person p[ MAXPERSONS ];
int i;

clrscr();
/* Read in the person's data */
for(i = 0; i < MAXPERSONS; i++) {
printf("Please enter the details of person %d.\n", i+1);
printf("\tLast name: "); gets(p[i].lastName);
printf("\tFirst name: "); gets(p[i].firstName);
printf("\tDay of birth: "); scanf("%uc", &p[i].dateOfBirth.day);
printf("\tMonth of birth: "); scanf("%uc", &p[i].dateOfBirth.month);
printf("\tYear of birth: "); scanf("%d", &p[i].dateOfBirth.year);
getchar(); /* ultimul scanf nu citeste \n, asa ca noi trebuie sa il citim
explicit ! */
}

Programarea calculatoarelor I - Gyorodi


Cornelia 21
Exemplu – tipărirea datelor
printf("\n\n Lista de persoane:\n");
for(i = 0; i < MAXPERSONS; i++) {
printf("%s %s, born on %02u/%02u/%04d\n",
p[i].firstName, p[i].lastName,
p[i].dateOfBirth.day,
p[i].dateOfBirth.month,
p[i].dateOfBirth.year);
}
return EXIT_SUCCESS;

Mai multe detalii în Bibl 1 - Exemplu 7.1

Programarea calculatoarelor I - Gyorodi


Cornelia 22
Uniuni

 Declaraţia unei uniuni se face la fel ca declaraţia unei structuri,


înlocuind cuvântul cheie struct cu union.

 Deosebirea dintre ele constă în aceea că, în timp ce, în cazul


unei structuri, fiecărui câmp i se alocă spaţiu de memorie, în
cazul uniunilor nu se alocă decât pentru memorarea câmpului
de dimensiune maximă.

Programarea calculatoarelor I - Gyorodi


Cornelia 23
Uniuni
 Fie următoarele declaraţii:
struct s union n
{ {
int i; int i;
char c; char c;
float f; float f;
} }
 sizeof(struct s) = 7 octeţi
 sizeof (union n) =sizeof(f)

Programarea calculatoarelor I - Gyorodi


Cornelia 24
Uniuni

 Accesul la un câmp al unei uniuni se face cu aceeaşi operatori


de selecţie • si -> ca şi în cazul structurilor.
 Iniţializarea uniunilor se face cu o singură valoare (expresie
constant) închisă în acolade, care iniţializează primul cîmp
declarat:
union
{
int i;
char c;
float f;
} = {15};

Programarea calculatoarelor I - Gyorodi


Cornelia 25
Exemplu
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

union number {
int x;
double y;
};

int main() {
union number value;

clrscr();
value.x = 100;
printf( "%s\n%s\n%s%d\n%s%f\n\n","Atribuie campului de tip int o valoare",
"si afiseaza ambele campuri.","int: ", value.x, "double:\n", value.y );

 Programarea calculatoarelor I - Gyorodi


Cornelia 26
Exemplu (continuare)
value.y = 100.0;
printf( "%s\n%s\n%s%d\n%s%f\n", "Atribuie campului de tip double o valoare ",
"si afiseaza ambele campuri.", "int: ", value.x, "double:\n", value.y );

return EXIT_SUCCESS;
}
Mai multe detalii în Bibl 1 - Exemplu 7.2

Programarea calculatoarelor I - Gyorodi


Cornelia 27
Câmpuri pe biți
 Un câmp de biţi este un element al unei structuri, care cuprinde unul sau
mai mulţi biţi.
 Folosind câmpurile de biţi, se pot accesa prin nume unul sau mai mulţi biţi
dintr-un octet sau cuvînt.
 Pentru a defini un câmp de biţi trebuie folosită forma generală:
type name: size;
unde:
type - poate fi int sau unsigned
name - numele câmpului de biţi
size - dimensiunea câmpului de biţi

Programarea calculatoarelor I - Gyorodi


Cornelia 28
Câmpuri pe biți
Exemplu:

struct b_type {
unsigned department:3; /*până la 7 departamente */
unsigned instoc:1; /*1 dacă există stoc, 0 dacă nu */
unsigned time:3; /* perioada în luni */
unsigned comandat:1; /* 1 comandat, 0 nu */
}tab[max];

Programarea calculatoarelor I - Gyorodi


Cornelia 29
Câmpuri pe biți

 În acest caz, într-un singur octet se pot stoca informaţii pentru fiecare
articol care în mod normal (dacă nu am folosi cîmpul de biţi), ar ocupa 4
octeţi.

 Un câmp de biţi trebuie referit ca orice alt element al unei structuri.

De exemplu:
tab [3].departament = 4; /* asignează valoarea 4 câmpului
departament al articolului 4 */

Programarea calculatoarelor I - Gyorodi


Cornelia 30
Câmpuri pe biți - Avantaje

 optimizarea modului de folosire a spațiilor de memorare a informațiilor binare prin utilizarea


lungimilor minime ale acestora

 transmiterea și prelucrarea informațiilor binare la nivel de biți transmise de anumite


dispozitive periferice
 accesarea anumitor biți dintr-un octet de către anumite subrutine (funcții) de codificare a
informațiilor binare

 Cu toate că aceste operații pot fi efectuate cu ajutorul operatorilor pe biți structurile cu


câmpuri de biți aduc un plus de eficiență și organizare programelor în care acestea apar.

Programarea calculatoarelor I - Gyorodi


Cornelia 31
Exemplu: Program care afişează codul binar al unui caracter introdus de la tastatură.

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

struct exemplu
{
unsigned a :1;
unsigned b :1;
unsigned c :1;
unsigned d :1;
unsigned e :1;
unsigned f :1;
unsigned g :1;
unsigned h :1;
};

Programarea calculatoarelor I - Gyorodi


Cornelia 32
union key
{
char ch;
struct exemplu biti;
} k;

void main (void )


{
printf ("Apasati o tasta:");
k.ch = getch ( );
printf ("\r Codul binar este:");
if (k.biti.h) printf ("1");
else printf ("0");
if (k.biti.g) printf ("1");
else printf ("0");
if (k.biti.f) printf ("1");
else printf ("0");
if (k.biti.e) printf ("1");
else printf ("0");
if (k.biti.d) printf ("1");
else printf ("0");
if (k.biti.c) printf ("1");
else printf ("0");
if (k.biti.b) printf ("1");
else printf ("0");
if (k.biti.a) printf ("1");
else printf ("0");
}
Mai multe detalii în Bibl 1 - Exemplu 8.1
33
Tipul enumerare
 Definirea unui tip enumerare se realizează folosind următoarea formă
generală :
enum tip_nume { lista_enumerare } lista_variabile;

 De exemplu :
enum culori { rosu, galben, verde } col;

 Declararea unei variabile de tipul culori se face astfel :


enum culori mycul;

 Implicit, compilatorul asignează valori întregi constantelor începând de la


0 şi pornind din stânga spre dreapta.

Programarea calculatoarelor I - Gyorodi


Cornelia 34
Tipul enumerare - Exemplu
Exemplu 7.3. Un exemplu de program care afișează elementele unui tip de dată enumerare:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

enum months { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };

int main()
{
enum months month;
const char *monthName[] = { "", "January", "February", "March", "April",
"May","June", "July", "August", "September", "October", "November", "December"};
for ( month = JAN; month <= DEC; month=month+1 )
printf( "%2d%11s\n", month, monthName[ month ] );
return EXIT_SUCCESS;
}

Programarea calculatoarelor I - Gyorodi


Cornelia 35
Typedef - Definirea unui tip de dată
 În limbajul C se poate atribui un nume unui tip, indiferent de faptul că
acesta este un tip predefinit sau definit de utilizator, prin intermediul lui
typedef.
typedef int INTEGER; typedef struct data {
int zi;
char luna [11];
int an;
} DC;
Declararea variabilelor:
INTEGER x, y;
DC data_nasterii;

Programarea calculatoarelor I - Gyorodi


Cornelia 36
Typedef - Definirea unui tip de dată
 Putem folosi typedef pentru a da un nume și tipurilor de date definite de utilizator.
 De exemplu, puteți utiliza typedef cu o structură pentru a defini un nou tip de date și apoi
utilizați acel tip de date pentru a defini direct variabilele de tip structură.
#include <stdio.h>
#include <string.h>
typedef struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
int main( )
{
Book book;
strcpy( book.title, "C Programming");
strcpy( book.author, "Alex ");
strcpy( book.subject, "C Programming ");
book.book_id = 7;
printf( "Book title : %s\n", book.title);
printf( "Book author : %s\n", book.author);
printf( "Book subject : %s\n", book.subject);
printf( "Book book_id : %d\n", book.book_id);
return 0;
}

37
Exemplu – definire de tipuri de date
#include <stdio.h>

#define MAXMODEL 32
#define MAXREGNO 10
#define MAXCARS 20

struct car {
char model[MAXMODEL];
char regno[MAXREGNO];
int year;
int capacity;
};

Programarea calculatoarelor I - Gyorodi


Cornelia 38
Exemplu – definire de tipuri de date (continuare)
typedef struct car Car;

void readCar(Car* car);


void printCar(Car car);
struct cars {
Car cars[MAXCARS];
int no;
};
typedef struct cars Cars;

Programarea calculatoarelor I - Gyorodi


Cornelia 39
Mulțumesc pentru atenție!

Programarea calculatoarelor I - Gyorodi


Cornelia 40

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

  • Proiect Arhitectura Sistemelor de Calcul (DOCA, PATER, KOVACS 1631)
    Proiect Arhitectura Sistemelor de Calcul (DOCA, PATER, KOVACS 1631)
    Document20 pagini
    Proiect Arhitectura Sistemelor de Calcul (DOCA, PATER, KOVACS 1631)
    Bogdan Sopota
    Încă nu există evaluări
  • Problema UBD
    Problema UBD
    Document20 pagini
    Problema UBD
    Bogdan Sopota
    Încă nu există evaluări
  • Curs PCLP
    Curs PCLP
    Document39 pagini
    Curs PCLP
    Bogdan Sopota
    Încă nu există evaluări
  • Curs PCLP
    Curs PCLP
    Document44 pagini
    Curs PCLP
    Bogdan Sopota
    Încă nu există evaluări
  • Curs PCLP
    Curs PCLP
    Document35 pagini
    Curs PCLP
    Bogdan Sopota
    Încă nu există evaluări
  • Curs PCLP
    Curs PCLP
    Document40 pagini
    Curs PCLP
    Bogdan Sopota
    Încă nu există evaluări
  • Curs PCLP
    Curs PCLP
    Document44 pagini
    Curs PCLP
    Bogdan Sopota
    Încă nu există evaluări
  • Curs PCLP
    Curs PCLP
    Document38 pagini
    Curs PCLP
    Bogdan Sopota
    Încă nu există evaluări
  • Curs PCLP
    Curs PCLP
    Document35 pagini
    Curs PCLP
    Bogdan Sopota
    Încă nu există evaluări
  • Curs PCLP
    Curs PCLP
    Document37 pagini
    Curs PCLP
    Bogdan Sopota
    Încă nu există evaluări