34
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 ! +

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

Embed Size (px)

Citation preview

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;}