Top Banner
Structures de données IFT-10541 Abder Alikacem Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009 ! +
34

Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Apr 04, 2015

Download

Documents

Clairene Roger
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Structures de donnéesIFT-10541

Abder AlikacemAbder Alikacem

Semaine 2Tests sur les pointeurs

Département d’informatique et de génie logiciel

Édition Janvier 2009

! +

Page 2: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test#1

a- Il y aura erreur de compilationb- Il y aura un accès à une zone mémoire indéterminée ou

invalidec- Le code s'exécutera sans erreur 

int a, *b, **c; Réponse (a, b ou c) : ___ 

c = (int *)&a;**c = 5;

Page 3: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #2

Qu’affiche le programme suivant? Comment réagit votre compilateur à la compilation? A-t-il raison (est ce logique) s’il vous affiche une valeur? int * mallocIntMaison(int valeur); int main(){

int *i;i = mallocIntMaison(10);cout << *i;return 0;

} int* mallocIntMaison(int valeur){

int i = valeur;return &i;

}

Page 4: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test#3

a- Il y aura erreur de compilationb- Il y aura un accès à une zone mémoire indéterminée ou

invalidec- Le code s'exécutera sans erreur  

int x[5]; Réponse (a, b ou c) : ___int y[6];int *z[2];

 z[0] = x;z[1] = y;

Page 5: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

int main()

{

int x[5];

int y[6];

int *z[2];

z[0] = x;

z[1] = y;

(*z)[2]=4;

(*(z+1))[3]=8;

return 0;

}

Test #4

Page 6: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test#5

int x[10]; Réponse (a, b ou c) : ___

*(x + 5*sizeof(int)) = 33;

a- Il y aura erreur de compilationb- Il y aura un accès à une zone mémoire indéterminée ou

invalidec- Le code s'exécutera sans erreur

Page 7: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

int main(){int R,x,*y,**z,***w;

x = 5;y = &x;z = &y;w = &z;R = ***w;

cout << R;

return 0;}

Test#6

Page 8: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

int main(){int a, **c;

c = (int **)&a;**c = 5;

cout << **c;

return 0;}

Retour sur le test#1

Page 9: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

int main(){int a, **c;

c = (int **)&a;(int)*c = 5;

cout << (int) *c; // cout << static_cast<int>(*c)

return 0;}

Test#8

Page 10: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

int main(){int R,x,*y,**z,***w;

x = 5;y = &x;z = (int **)y; // z = static_cast<int**>(y)w = &z;R = (int) **w; // R = static_cast<int>(**w)

cout << R;

return 0;}

Test#9

Page 11: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

int main(){

int R,x[5],i;

for(i=0;i<5;i++) {

x[i]=i;}

R = *((&(x[3]))+1);

cout << R;

return 0;}

Test #10

Page 12: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

int main(){

int R,x[5],i,*y[5];for(i=0;i<5;i++){

x[i]=i;}for(i=0;i<5;i++){

y[i] = &(x[i]);}R = ((&y[0])[1])[2];cout << R;

return 0;}

Test #11

Page 13: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #12

Réponse (a, b ou c) : ___

long double * ld; Réponse (a, b ou c) : ___

ld = new (long double *);*ld= 593280.112358;

a- Il y aura erreur de compilationb- Il y aura un accès à une zone mémoire indéterminée ou

invalidec- Le code s'exécutera sans erreur

Page 14: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #13

Qu'est-ce que le programme suivant affiche ? Sinon, expliquez pourquoi que ça plante.

 int main(){

int *tableau, taille = 20, i;

for(i=0;i<taille;i++) tableau[i] = i;cout << tableau[12];return 0;

}

Page 15: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #14

Donnez la valeur affectée à R suite aux instructions suivantes:

int R,z[5],*x,i;

x = z;for(i=0;i<5;i++) x[i]=i;x = x+x[1];x = x- x[2];x = x+ x[6];R = *((&(x[-1]))-1);

Page 16: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #15

void toto(char ***);

int main(){

char * ptr1;char ** ptr2;ptr1 = (char *)malloc(128);strcpy(ptr1, "Le C est facile!!!");ptr2=&ptr1;toto(&ptr2);cout << ptr1;return(0);

}

void toto (char ***x){

**x = **x + 3;*(**x+1) = '\'';

}

Qu’affiche ce programme?

Page 17: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #16Considérer le code suivant :  int tab[100]; int i=0; int *a; int *b;  for(i=0; i<50 ; i++) tab[i] = 10*i;  b = new int[100]; a = b; /* ligne 1*/ b = tab; /* ligne 2*/ a) que devient a si on fait free (b) à la place du commentaire /*ligne 1*/ ?b) qu’arrivera –t-il si on fait free (b) à la place du commentaire /*ligne 2*/ ?

Page 18: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #17

Écrire une fonction qui initialise une chaîne de char..void toto1(…);

Écrire un main() pour simuler l’appel de toto1()

Page 19: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #18

Même question: un tableau de 3 chaînes de char..void toto2(…);

Écrire un main() pour simuler l’appel de toto2()

Page 20: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

#include <iostream>#include <cstring>

using namespace std;

void toto1 (char **x){

*x = new char[40];strcpy(*x, "salut");

}

int main(){

char * ptr1;char ** ptr2;

toto1(&ptr1);cout << ptr1;

toto2(&ptr2);cout << ptr2[0] << ptr2[1] << ptr2[2]) << endl;

return 0;}

void toto2 (char ***x){ *x = new char *[3]; **x = new char[40]; *(*x+1) = new char[40]; *(*x+2) = new char[40];

strcpy((*x)[0], "allo"); strcpy((*x)[1], "patate"); strcpy((*x)[2], "toto");}

Page 21: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

void mallocIntMaison(int **ptr, int valeur);

int main(){

int *i;

mallocIntMaison(&i,10);cout << *i;return 0;

}

void mallocIntMaison(int **ptr, int valeur){

int i = valeur;*ptr = &i;

}

Test #19

Page 22: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #20 int main(){

int bonjour[50];int *allo;int i;for(i=0;i<50;i++) bonjour[i] = i;allo = bonjour;allo++;cout << allo[45] <<endl; /*Premier affichage*/allo[4] = 777;allo[5] = 888;allo[6] = 999;cout << (bonjour+1)[5] <<endl; /*Deuxième

affichage*/allo= allo+10 ;cout <<*(int**) (bonjour - 1) << endl; /*Troisième

affichage*/ cout << allo <<endl; /*Quatrième

affichage*/ cout << *(int*)(*(bonjour - 1))<< endl; /*Cinquième

affichage*/ return 0;

}

Expliquez tous les affichagesaprès l’exécution de ce code.

Page 23: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #21Qu’affiche le bout de programme suivant :

int main(){ int **x;

int i, j; 

x=new int*[6]; 

x[0][0]=0;x[0][1]=1;x[0][2]=2;x[1][0]=3;x[1][1]=4;x[1][2]=5;

 for (i=0; i<2; i++)for (j=0; j<3; j++) cout << x[i][j];return 0;

}

Page 24: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #22Qu’affiche le bout de programme suivant : int main(){ int **x;

int i, j; 

x= new int*[6];  for (i=0; i<6; i++) x[i]= new int;

x[0][0]=0;x[0][1]=1;x[0][2]=2;x[1][0]=3;x[1][1]=4;x[1][2]=5;

 for (i=0; i<2; i++)for (j=0; j<3; j++) cout << x[i][j];return 0;

}

Page 25: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #23Est ce que le programme suivant s’exécute? int main(){ int **x;

int i, j; 

x= new int*[6];  for (i=0; i<6; i++) x[i]= new int;

x[0][0]=0;x[0][1]=1;x[0][2]=2;x[1][0]=3;x[1][1]=4;x[1][2]=5;for (i=0; i<2; i++)for (j=0; j<3; j++) cout x[i][j];delete[] x;return 0;

}

Page 26: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #24Est ce que le programme suivant s’exécute? int main(){ int **x;

int i, j; 

x= new int*[2];  for (i=0; i<2; i++) x[i]= new int[3];

x[0][0]=0;x[0][1]=1;x[0][2]=2;x[1][0]=3;x[1][1]=4;x[1][2]=5;for (i=0; i<2; i++)for (j=0; j<3; j++) cout << x[i][j];delete [] x; /*Est ce qu’on a rien oublié?*/return 0;

}

Page 27: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #25Qu’affiche le bout de programme suivant :

int main(){int ***ptr;int i,j;ptr = new int **[2];for(i = 0; i < 2; i++){ *(ptr + i) = new int*[3]; for(j = 0; j < 3; j++) { *( *(ptr + i) + j) = new int[4]; *( *( *(ptr + i) + j)) = 48; *( *( *(ptr + i) + j) + 1) = 34; *( *( *(ptr + i) + j) + 2) = 7; *( *( *(ptr + i) + j) + 3) = 125; }}cout << ptr[0][1][2];return 0;}

Page 28: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #26

Que fait la fonction sss ci-dessous ? (Test à faire après l’étude deLa semaine 3) struct element{

TypeEl el;element *suivant;element *precedent;

} ;/*noeud typique d’une liste doublement chaînée circulaire */  

bool sss(elem *a){

elem *x;if (a == 0) return true;x = a;do{

if (a->suivant->precedent != a) return false;

a = a->suivant;} while (a != x);return true;

}

Page 29: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #27

Que fait la fonction sss ci-dessous ? (Test à faire après l’étude de la semaine 3) 

struct element{

TypeEl el;element *suivant;element *precedent;

}; /* noeud typique d’une liste doublement chaînée circulaire */ bool sss(elem *a){

elem *x; if (a == 0) return true;

x = a;do{

if (a->suivant->precedent != a->suivant ) return false;a = a->suivant;} while (a != x);return true;

}

Page 30: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Test #28Soit les déclarations suivantes : int tableau[] = {15,12,14,17,25,89,74,14,1,35,26,85};int * ptr;int * * ptrPtr; ptrPtr = &ptr;ptr = tableau; Donnez 6 façons différentes (2 qui utilisent ptr et 4 qui utilisent ptrPtr) pour avoir accès à la valeur 89. 

Page 31: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

int main()

{ int tableau[] = {15,12,14,17,25,89,74,14,1,35,26,85};

int * ptr;

int * * ptrPtr;

ptrPtr = &ptr;

ptr = tableau;

cout << *(ptr+5) << ptr[5] << endl;

cout << *(*ptrPtr+5) << ptrPtr[0][5] << (*ptrPtr)[5] << *(ptrPtr[0]+5) << endl;;

return 0;

}

Page 32: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

#include <cstring>

void toto(char ***);

int main(){

char * ptr1;char ** ptr2;

ptr2=&ptr1;

toto(&ptr2);cout << ptr1;

return 0;}

void toto (char ***x){

**x="Bonjour";*(**x+3)='\0';

}

void toto (char ***x){

**x= new char[128];strcpy(**x, "Bonjour");*(**x+3)='\0';

}

Qu’affiche ce programme? Expliquez.

Test #29

Page 33: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Qu’affiche ce programme? Expliquez.

Test #30#include <stdio.h>#define N 9int main(){

int *p;char *n;char **s;int tab[N] = {-8,-6,-4,-2,0,2,4,6,8};s = &n;*s = "pointeurs";p = tab+N-1;

while (**s != '\0'){

cout << *(n+*p);++(*s); p--;

}

return 0;}

Page 34: Structures de données IFT-10541 Abder Alikacem Semaine 2 Tests sur les pointeurs Département d’informatique et de génie logiciel Édition Janvier 2009.

Qu’affiche ce programme? Expliquez.

Test #31int initcmp(char *c1,char *c2) { return c1==NULL || c2==NULL || *c1!=*c2;}

void resultat(int (*f)(char*,char*),char *ch1,char *ch2) { if ((*f)(ch1,ch2)==0 ) cout << "pareil\n" else cout << "pas pareil\n");}

int main() { resultat(initcmp,"Anne","Arbre"); resultat(strcmp,"Anne","Arbre");

return 0;}