Universit´e de Paris X Nanterre vendredi 3 f´evrier 2006 Licence MMIA deuxi`eme ann´ee
enseignant : L. PIERRE
contrˆole d’informatique Qu’´ecrit le programme suivant quand on l’ex´ecute ?
#include<stdio.h>
void pr(int a,int b)
{ if(b>0) pr(a+4,b-1),pr(a+3,b-2),pr(a+2,b-1);
else printf("%4d",a);
}
void pr2(int a,int b) { printf("%4d",a);
while(b) a+=b,pr2(a,--b);
}
#define a
#define b int main()
{ int i,j,k,l,*p=&i,*q=&j,*r;
printf("%4d %4d %4d %4d\n",a&b,a|b,a^b,(a,b));
printf("%4d %4d %4d %4d\n",-a,~a,!a,!!a);
printf("%4d %4d %4d %4d\n",i=a,j=b,k=a+b,l=a-b);
printf("%4d %4d %4d %4d\n",++i*j--,k+=l--,a<<3,a>>1);
printf("%4d %4d %4d %4d\n",++i*j--,k+=l--,a<<3,a>>1);
r=p,p=q,q=r;
i=a,j=b;
printf("%4d %4d %4d %4d\n",i,j,*p,*q);
j+=i+=*q, j+=i+=*q;
printf("%4d %4d %4d %4d\n",i,j,*p,*q);
pr (a,3); printf("\n");
pr2(a,3); printf("\n");
return 0;
}
Compl´eter les trois proc´edures int sommepairs(liste a);
void echminmax(liste a);
liste otemin(liste a);
sommepairs(a) rend la somme des ´el´ements pairs de la liste a.
echminmax(a) ´echange la plus petite valeur et la plus grande valeur dans la liste a.
otemin(a) est la liste obtenue en enlevant le chaˆınon contenant la plus petite valeur de la liste a.
barˆeme sur 21.25 points
Les 7 printf du programme principal affichent chacun 4 nombres. Cela fait en tout 28 nombres qui comptent chacun 0.25 point. 28/4=7 points
pr(a,3) affiche 17 nombres qui comptent chacun 0.25 point. 17/4=4.25 points pr2(a,3) affiche 8 nombres qui comptent chacun 0.25 point. 8/4=2 points sommepairs() 2 points echminmax() 3 points otemin() 3 points
int sommepairs(liste a) // 2 pt void echminmax(liste a) // 3 points { int s=0; // 0.33
{ int x; for(;a; // 0.33
liste p=a, g=a; // 0.33 a=a->suite) // 0.33
for(;a; // 0.33 if(a->val%2==0) // 0.33
a=a->suite) // 0.33 s+=a->val; // 0.33
if(a->val<p->val) p=a; else // 0.33 return s; // 0.33 if(a->val>g->val) g=a; // 0.33 }
if(p!=g) // 0.33 ou if(!a) return; au d´ebut
x=p->val, // 0.33
p->val=g->val, // 0.33
g->val=x; // 0.33
}
int valmin(liste a) // 0 point car c’est une partie de echminmax() { int m=a->val;
for(;a;a=a->suite) if(a->val<m) m=a->val;
return m;
}
liste oteval(liste a,int x) // 6*0.33=2 points
{ if(a->val==x) // 0.33
{ liste b=a->suite; // 0.33 ou b=a, a=a->suite
free(a); // 0.33
return b; // 0.33
}
a->suite=oteval(a->suite,x); // 0.33
return a; // 0.33
}
liste otemin(liste a) // 3*0.33=1 point
{ return a ? // 0.33 if(a)
oteval(a,valmin(a)) // 0.33 a=oteval(a,valmin(a));
: 0; // 0.33 return a;
}
liste otemin2(liste a) // version it´erative { liste *m=&a, *p, b;
for(p=&a;*p;p=&(*p)->suite) if((*p)->val<(*m)->val) m=p;
if(a) b=*m, *m=b->suite, free(b);
return a;
}