struct_td1

2

Click here to load reader

description

td srut

Transcript of struct_td1

Page 1: struct_td1

DUT Informatique Conception de structures de donnees Annee 2012/2013

TD 1 - Pointeurs -

Exercice 1. Pointeurs

1. Quelle difference y a-t-il entre les deux programmes suivants ?

main(){

int i = 3, j = 4;

int *p1, *p2;

p1 = &i; p2 = &j;

*p1 = *p2;

}

main(){

int i = 3, j = 4;

int *p1, *p2;

p1 = &i; p2 = &j;

p1 = p2;

}

2. Etant donnees ces declarations/initialisations, que valent les expressions dans le tableau ?

typedef struct toto{ int a; int b;} Toto;

int i1=1, i2=i1;

int *p1=&i1, *p2=&i2, *p3=&i2;

*p2=2;

Toto t1 = {1,2}, t2 = {1,2};

Toto *pt1=&t1, *pt2=&t2, *pt3=pt2;

(i1==i2)

(p1==p2)

(p2==p3)

(*p2==*p3)

(t1==t2)

(t1.a==t2.a)

(pt1==pt2)

(pt2==pt3)

(*pt1==*pt2)

3. Decrire et expliquer le resultat de l’execution du programme suivant :

1 void f0(int *tab, int lg){

2 int *q=tab;

3 do printf("%d:%d ", q-tab, *q-*tab);

4 while (++q-tab < lg);

5 printf("\n");

6 }

78 void f1(int *c, int *s){ c=s; }

910 void f2(int **c, int *s){ *c=s; }

1112 void main (){

13 int lg = 5;

14 int foo[] = {1,9,4,10,17};

15 int *bar = calloc(lg, sizeof(int));

1617 printf("foo : "); f0(foo, lg);

18 f1(bar, foo); printf("bar : "); f0(bar, lg);

19 f2(&bar, foo); printf("bar : "); f0(bar, lg);

20 }

1

Page 2: struct_td1

Exercice 2. Allocation de matricesOn suppose que l’on dispose d’un type Pixel : typedef struct ... Pixel;

Ecrire la fonction qui alloue de l’espace pour un tableau de nb de Pixels et renvoie un pointeursur cet espace. Ecrire les 2 fonctions qui allouent et liberent de l’espace pour une matrice r × cde Pixels.

a. Pixel *allocArrayPixels(int nb);

b. Pixel **allocMatrixPixels(int r, int c);

c. void freeMatrixPixels(Pixel **t, int r);

Exercice 3. Allocation de matrices (bis)Refaire l’exercice precedent de telle facon que les matrices a allouer soient passees en parametres(du coup, le type de retour des fonctions est void).

Exercice 4. Fichier et tableauOn considere le format de fichiers d’entiers suivant : Le premier nombre est le nombre d’entiers.Les nombres suivants representent les entiers separes par des espaces ou des passages a la ligne :N n1 n2 ... nN

Ecrire l’en-tete d’une fonction qui :

1. ouvre un fichier dont le nom est passe en parametre ;

2. qui alloue dynamiquement un tableau d’entiers de la bonne taille ;

3. qui lit les entiers dans le fichier et les met dans le tableau ;

4. qui retourne le tableau ;

5. qui place le nombre d’elements du tableau dans une variable passee en parametre.

Exercice 5. DebbugageDans le TP precedent, se trouve la question : ”Ecrire une fonction max qui renvoie le maximumd’un tableau passe en parametre ainsi que son indice.”

Voici l’une des reponses proposees. Qu’en pensez-vous ?

1 int dichotomie( int tab[], int n, int nb_a_chercher ){ ... }

23 int max(int *t, int taille){

4 int i;

5 int maxi;

6 for(i=0;i<taille;i++)

7 if(t[i]>t[i+1])

8 maxi=t[i];

9 int a=dichotomie(t, taille, maxi);

10 int *p=&a;

11 return maxi;

12 }

1314 int main(int argc, char *argv[]){

15 int *p;

16 int tab[5]={45,2,6,489,1};

17 printf("Le maximum du tableau est %d a l’indice n=%d", max(tab,5), *p);

18 return 0;

19 }

2