Sunteți pe pagina 1din 13

Universitatea Tehnică “Gheorghe Asachi” din Iași

Facultatea de Automatică și Calculatoare

PROGRAMARE 1

Curs nr. 11

Capitolul 3. Pointeri 3.
Pointer și structuri. Pointer la pointer

Pointeri la structuri
struct S {
//Declararea membrilor structurii
double b;
int a;
};

struct S s1 = {3.14159, 10};


struct S *ps = 0, *ps1 = 0, *ps2 = 0; //Inițializare cu 0
…..........................
s1.b = s1.b +s1.a;
…..........................
P1 Curs nr. 11 - 2019 2

Pointeri la structuri
ps = &s1; // Inițializare cu adresa unei variabile

Operator de selecție a unui membru dintr-o structură


->

ps->a = 5;
ps ->b = ps->a / 7;

scanf(“%lf”, &ps->b);

printf(“%d\n”, ps->a);

P1 Curs nr. 11 - 2019 3

1
Pointeri la structuri
ps1 = ps; //Inițializare cu valoarea unui alt pointer

// Inițializare prin alocare dinamică

ps2 = (struct S*)malloc(sizeof(struct S));


if(ps2 == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}

P1 Curs nr. 11 - 2019 4

Pointeri la structuri

ps2->b = 17.5;

scanf(“%d”, &ps2->a);
printf(“%d\n”, ps2->a);
…...................
free(ps2);
ps2 = 0;
.
.

P1 Curs nr. 11 - 2019 5

Pointeri la structuri
struct DATA {
int zi, an;
char *luna;
};

struct DATA *ps, astazi;

ps = (struct DATA *)malloc(sizeof(struct DATA));


if(ps == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}
P1 Curs nr. 11 - 2019 6

2
Pointeri la structuri
ps -> an = 2018;
astazi.an = 2018;
ps -> zi = 25;
astazi.zi = 5;
printf("Anul este %d si ziua %d.\n", ps->an, ps->zi);

astazi.luna = (char *)malloc(15*sizeof(char));


if(astazi.luna == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}

P1 Curs nr. 11 - 2019 7

Pointeri la structuri
ps->luna = (char *)malloc(15*sizeof(char));
if(ps->luna == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}
…...................................
Dealocare

free(astazi.luna);
astazi.luna = 0;

P1 Curs nr. 11 - 2019 8

Pointeri la structuri

free(ps->luna);
ps->luna = 0;

free(ps);
ps = 0;

P1 Curs nr. 11 - 2019 9

3
Pointeri la structuri
q Vom considera aceeași structură DATA

struct DATA *pd = 0;


int n = 5;
// n poate fi și citit de la tastatură sau dintr-un fișier

pd = (struct DATA *)malloc(n * sizeof(struct DATA);


if(pd == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}
P1 Curs nr. 11 - 2019 10

Pointeri la structuri
pd[2].luna = (char*)malloc(strlen(“mai”)+1)*sizeof(char));
if(pd[2].luna == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}

free(pd[2].luna);
pd[2].luna = 0;

free(pd);
pd = 0;

P1 Curs nr. 11 - 2019 11

Pointeri la structuri
struct DATA zile[15];

zile[3].zi = 20;

printf(“%d”, (zile+3)->zi);

*(zile+3)->zi

P1 Curs nr. 11 - 2019 12

4
Pointer la pointer
T *tab[100]

tab
tab[0] i1 i2 i3 i4
tab[1]
. j1 j2 j3 j4 j5 j6
.
.
tab[99] k1 k2

P1 Curs nr. 11 - 2019 13

Pointer la pointer

tab

tab[0] i1 i2 i3 i4
tab[1]
tab[2] j1 j2 j3 j4 j5 j6

k1 k2

P1 Curs nr. 11 - 2019 14

Pointer la pointer

tab tab[0] + 3

tab[0] i1 i2 i3 i4 i5
tab[1] j1 j2 j3 j4 j5
tab[2] k1 k2 k3 k4 k5

T** tab;

tab[i][j] <-> *(tab[i] + j) <-> *(*(tab+i)+j)

P1 Curs nr. 11 - 2019 15

5
Matrice alocate dinamic

T **aloca2d(int nrLinii, int nrColoane)


{
T **a = 0;
int i;
a = (T **)malloc(nrLinii * sizeof(T *));
if(a == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}

P1 Curs nr. 11 - 2019 16

Matrice alocate dinamic


for(i=0; i<nrLinii; i++)
{
a[i] = (T *)malloc(nrColoane * sizeof(T));
if(a[i] == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}
}
return a;
}

P1 Curs nr. 11 - 2019 17

Matrice alocate dinamic


void dealoca2d(T **a, int nrLinii)
{
int i;
for(i=0; i<nrLinii; ++i)
{
free(a[i]);
a[i] = 0;
}
free (a);
}

P1 Curs nr. 11 - 2019 18

6
Matrice alocate dinamic

T **aloca2dc(int nrLinii, int nrColoane)


{
T **a = 0;
int i;
a = (T **)malloc(nrLinii * sizeof(T *));
if(a == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}

P1 Curs nr. 11 - 2019 19

Matrice alocate dinamic


a[0] = (T *)malloc(nrLinii * nrColoane * sizeof(T));
if(a[0] == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}
for(i=1; i<nrLinii; ++i)
{
a[i] = a[0] + i * nrColoane;
/* a[i] = a[i-1] + nrColoane; */
}
return a;
}
P1 Curs nr. 11 - 2019 20

Matrice alocate dinamic


void dealoca2dc(T **a)
{
free((a[0]);
a[0] = 0;
free (a);
}

P1 Curs nr. 11 - 2019 21

7
Matrice alocate dinamic - exemplu
Să se scrie un program care folosind matrice alocate dinamic,
ordonează liniile unei matrice de numere întregi în ordinea
crescătoare a elementului maxim de pe fiecare linie.

Exemplu:
-1 0 1 0 -1 -2
2 3 1 à -1 0 1
0 -1 -2 2 3 1

P1 Curs nr. 11 - 2019 22

Matrice alocate dinamic - exemplu


Proiect:
1. modul de alocare:
alocare.h
alocare.c
2. modul de lucru cu matrice
matrice.h
matrice.c

P1 Curs nr. 11 - 2019 23

Matrice alocate dinamic – exemplu – alocare.h


#ifndef ALOCARE_H_
#define ALOCARE_H_

int **aloca2d(int n, int m);


void dealoca2d(int **a, int n);

#endif

P1 Curs nr. 11 - 2019 24

8
Matrice alocate dinamic – exemplu - alocare.c
#include <stdlib.h>
#include “alocare.h”

int **aloca2d(int nrLinii, int nrColoane)


{
int **a = 0;
int i;
a = (int **)malloc(nrLinii * sizeof(int *));
if(a == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}
P1 Curs nr. 11 - 2019 25

Matrice alocate dinamic – exemplu - alocare.c


for(i=0; i<nrLinii; i++)
{
a[i] = (int *)malloc(nrColoane * sizeof(int));
if(a[i] == 0)
{
fprintf(stderr, “Alocare esuată\n”);
exit(EXIT_FAILURE);
}
}
return a;
}

P1 Curs nr. 11 - 2019 26

Matrice alocate dinamic – exemplu - alocare.c


void dealoca2d(int **a, int nrLinii)
{
int i;
for(i=0; i<nrLinii; ++i)
{
free(a[i]);
a[i] = 0;
}
free (a);
}

P1 Curs nr. 11 - 2019 27

9
Matrice alocate dinamic – exemplu – matrice.h
#ifndef MATRICE_H_
#define MATRICE_H_

int **citireMatrice(int n, int m, char *den);


void afisareMatrice(int **a, int n, int m, char *den);
void sortareMatrice(int **a, int n, int m);
void swapLI(int **l1, int **l2);
int maxim(int *a, int m);

#endif

P1 Curs nr. 11 - 2019 28

Matrice alocate dinamic - exemplu – matrice.c


#include <stdio.h>
#include “alocare.h”
#include “matrice.h”

int **citireMatrice(int n, int m, char *den)


{
int **a = 0;
int i, j;
a = aloca2d(n,m);

P1 Curs nr. 11 - 2019 29

Matrice alocate dinamic - exemplu – matrice.c


for(i=0; i<n; ++i)
{
for(j=0; j<m; ++j)
{
printf("%s(%d,%d) = ", den, i, j);
scanf("%d", *(a+i)+j);
}
}
return a;
}

P1 Curs nr. 11 - 2019 30

10
Matrice alocate dinamic - exemplu – matrice.c
void afisareMatrice(int **a, int n, int m, char *den)
{
int i, j;
printf("Matricea %s este\n", den);
for(i=0; i<n; ++i)
{
for(j=0; j<m; ++j)
{
printf("%4d ", *(*(a+i)+j));
}
printf("\n");
}
}P1 Curs nr. 11 - 2019 31

Matrice alocate dinamic - exemplu – matrice.c


void swapLI(int **l1, int **l2)
{
int *aux = 0;
aux = *l1;
*l1 = *l2;
*l2 = aux;
}

P1 Curs nr. 11 - 2019 32

Matrice alocate dinamic - exemplu – matrice.c


void sortareMatrice(int **a, int n, int m)
{
int i;
int ok; // ok = 0 daca exista interschimbare
int k = n-1;
do {
ok = 1;
for(i=0; i<k; ++i)
{

P1 Curs nr. 11 - 2019 33

11
Matrice alocate dinamic - exemplu – matrice.c

if(maxim(a[i],m) > maxim(a[i+1], m))


{
swapLI(&a[i], &a[i+1]);
ok = 0;
}
}
--k;
} while((ok == 0) && (k>0));
}

P1 Curs nr. 11 - 2019 34

Matrice alocate dinamic - exemplu – matrice.c


int maxim(int *a, int m)
{
int max;
int i;
max = *a;
for(i=1; i<m; ++i)
{
if(*(a+i) > max)
{
max = *(a+i);
}
}
return max;
}

P1 Curs nr. 11 - 2019 35

Matrice alocate dinamic - exemplu – p11.c


#include <stdio.h>
#include "alocare.h"
#include "matrice.h"

int main(void)
{
int **a = 0;
int n, m;

P1 Curs nr. 11 - 2019 36

12
Matrice alocate dinamic - exemplu – p11.c
do {
printf("Nunarul de linii din matrice: ");
scanf("%d", &n);
printf("Numarul de coloane din matrice: ");
scanf("%d", &m);
} while(n<=0 || m<=0);
a = citireMatrice(n, m, "A");
afisareMatrice(a, n, m, "A");
sortareMatrice(a, n, m);

P1 Curs nr. 11 - 2019 37

Matrice alocate dinamic - exemplu – p11.c


puts("\nDupa sortare");
afisareMatrice(a, n, m, "A");

dealoca2d(a,n);
a=0;

return 0;
}

P1 Curs nr. 11 - 2019 38

13

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