TD 3 : pointeurs, tableaux
TD 3 : pointeurs, tableaux
TD 3 : pointeurs, tableaux
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>TD</strong> 3 : <strong>pointeurs</strong>, <strong>tableaux</strong><br />
Programmation en C (LC4)<br />
Semaine du 6 février 2006<br />
Exercice 1 — Retour sur le TP2 Écrire une fonction « void affichage_binaire(unsigned<br />
int m) » qui affiche la valeur de m en binaire (on suppose que les unsigned int sont codés sur<br />
32 bits). On affichera les bits de poids faible à droite, par exemple : « 459601 en binaire :<br />
00000000000001110000001101010001 »<br />
◮ Correction<br />
void affichage_binaire(int m){<br />
int i=0;<br />
unsigned int t=1;<br />
printf("%i␣en␣binaire␣:",m);<br />
for(i=31;i>=0;i−−){<br />
printf("%i", (m>>i)&t);<br />
}<br />
printf("\n");<br />
}<br />
Exercice 2 — On s’amuse avec les <strong>pointeurs</strong>... Compléter le tableau en indiquant les valeurs<br />
des différentes variables au terme de chaque instruction du programme suivant (on peut<br />
aussi indiquer sur quoi pointent les <strong>pointeurs</strong>) :<br />
programme a b c p1 *p1 p2 *p2<br />
int a, b, c, *p1, *p2 ; ? ? ? ? ? ? ?<br />
a = 1, b = 2, c = 3 ;<br />
p1 = &a, p2 = &c ;<br />
*p1 = (*p2)++ ;<br />
p1 = p2 ;<br />
p2 = &b ;<br />
*p1 -= *p2 ;<br />
++*p2 ;<br />
*p1 *= *p2 ;<br />
a = ++*p2 * *p1 ;<br />
p1 = &a ;<br />
*p2 = *p1 /= *p2 ;<br />
◮ Correction<br />
int main() {<br />
int a, b, c, ∗p1, ∗p2;<br />
a = 1, b = 2, c = 3;<br />
p1 = &a, p2 = &c;<br />
printf("0:␣a:%i,␣b:%i,␣c:%i,␣p1:%i,␣p2:%i␣\n",a,b,c,∗p1,∗p2);<br />
∗p1 = (∗p2)++;<br />
printf("1:␣a:%i,␣b:%i,␣c:%i,␣p1:%i,␣p2:%i␣\n",a,b,c,∗p1,∗p2);<br />
1
p1 = p2;<br />
printf("2:␣a:%i,␣b:%i,␣c:%i,␣p1:%i,␣p2:%i␣\n",a,b,c,∗p1,∗p2);<br />
p2 = &b;<br />
printf("3:␣a:%i,␣b:%i,␣c:%i,␣p1:%i,␣p2:%i␣\n",a,b,c,∗p1,∗p2);<br />
∗p1 −= ∗p2;<br />
printf("4:␣a:%i,␣b:%i,␣c:%i,␣p1:%i,␣p2:%i␣\n",a,b,c,∗p1,∗p2);<br />
++∗p2;<br />
printf("5:␣a:%i,␣b:%i,␣c:%i,␣p1:%i,␣p2:%i␣\n",a,b,c,∗p1,∗p2);<br />
∗p1 ∗= ∗p2;<br />
printf("6:␣a:%i,␣b:%i,␣c:%i,␣p1:%i,␣p2:%i␣\n",a,b,c,∗p1,∗p2);<br />
a = ++∗p2∗∗p1;<br />
printf("7:␣a:%i,␣b:%i,␣c:%i,␣p1:%i,␣p2:%i␣\n",a,b,c,∗p1,∗p2);<br />
p1 = &a;<br />
printf("8:␣a:%i,␣b:%i,␣c:%i,␣p1:%i,␣p2:%i␣\n",a,b,c,∗p1,∗p2);<br />
∗p2 = ∗p1 /= ∗p2;<br />
printf("9:␣a:%i,␣b:%i,␣c:%i,␣p1:%i,␣p2:%i␣\n",a,b,c,∗p1,∗p2);<br />
return 0;<br />
}<br />
> ./bla<br />
0: a:1, b:2, c:3, p1:1, p2:3<br />
1: a:3, b:2, c:4, p1:3, p2:4<br />
2: a:3, b:2, c:4, p1:4, p2:4<br />
3: a:3, b:2, c:4, p1:4, p2:2<br />
4: a:3, b:2, c:2, p1:2, p2:2<br />
5: a:3, b:3, c:2, p1:2, p2:3<br />
6: a:3, b:3, c:6, p1:6, p2:3<br />
7: a:24, b:4, c:6, p1:6, p2:4<br />
8: a:24, b:4, c:6, p1:24, p2:4<br />
9: a:6, b:6, c:6, p1:6, p2:6<br />
Exercice 3 — Échange de variables Écrivez une fonction « void echange(...) » qui permet<br />
d’échanger le contenu de deux variables de type int qui lui sont extérieures. Écrire l’appel<br />
de cette fonction dans un main.<br />
◮ Correction<br />
void echange(int ∗a, int ∗b){<br />
int tmp=∗a;<br />
∗a=∗b;<br />
∗b=tmp;<br />
}<br />
int main() {<br />
int ec1=4, ec2=2;<br />
printf("%i,␣%i␣\n",ec1, ec2);<br />
echange(&ec1, &ec2);<br />
printf("%i,␣%i␣\n",ec1, ec2);<br />
}<br />
Exercice 4 — Concaténation 1 Écrivez une fonction « int* concat_tab(int n1,int t1[],int<br />
n2, int t2[]) » qui prend en arguments deux <strong>tableaux</strong> et leurs tailles respectives, et qui<br />
renvoie leur concaténation. Il faudra allouer un nouveau tableau pour contenir cette concaténation.<br />
2
◮ Correction<br />
int∗ concat_tab(int n, int t[], int m, int r[]){<br />
int i=0;<br />
int j=0;<br />
int ∗ res = malloc((n+m)∗sizeof(int));<br />
for(;i
◮ Correction<br />
struct lvr ∗ init(int n){<br />
int i=0;<br />
struct lvr ∗ res= (struct lvr ∗)malloc(n ∗ sizeof(struct lvr));<br />
for(;i