<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">\input TDexo
\magnification\magstep1
\nopagenumbers
\line{Université de Paris X Nanterre\hss vendredi 3 février 2006}
\line{Licence MMIA deuxième année\hss}
\line{enseignant : L. PIERRE\hss}
\centerline{contrôle d'informatique}
\def\titre#1{\medbreak\centerline{\bf#1}\smallbreak}
Qu'écrit le programme suivant quand on l'exécute ?
{\verbatimc
#include&lt;stdio.h&gt;
void pr(int a,int b)
{ if(b&gt;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=&amp;i,*q=&amp;j,*r;
  printf("%4d %4d %4d %4d\n",a&amp;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&lt;&lt;3,a&gt;&gt;1);
  printf("%4d %4d %4d %4d\n",++i*j--,k+=l--,a&lt;&lt;3,a&gt;&gt;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;
}
\endgroup }
Compléter les trois procédures{\verbatimc
int sommepairs(liste a);
void echminmax(liste a);
liste otemin(liste a);
\endgroup }
sommepairs(a) rend la somme des éléments pairs de la liste a.

echminmax(a) échange 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.
\vfill\eject
\titre{barême sur 21.25 points}
Les 7 {\tt printf} du programme principal affichent chacun 4 nombres.
Cela fait en tout 28 nombres qui comptent chacun 0.25 point.  28/4=7 points

{\tt pr(a,3)} affiche 17 nombres qui comptent chacun 0.25 point.  17/4=4.25 points

{\tt pr2(a,3)} affiche 8 nombres qui comptent chacun 0.25 point.  8/4=2 points

{\tt sommepairs()} 2 points\qquad
{\tt echminmax()} 3 points\qquad
{\tt otemin()} 3 points
\verbatimc
                                           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-&gt;suite)    // 0.33
  for(;a;                       // 0.33       if(a-&gt;val%2==0)      // 0.33
         a=a-&gt;suite)            // 0.33        s+=a-&gt;val;          // 0.33
   if(a-&gt;val&lt;p-&gt;val) p=a; else  // 0.33      return s;             // 0.33
   if(a-&gt;val&gt;g-&gt;val) g=a;       // 0.33    }
  if(p!=g)                      // 0.33  ou if(!a) return; au début
    x=p-&gt;val,                   // 0.33
    p-&gt;val=g-&gt;val,              // 0.33
    g-&gt;val=x;                   // 0.33
}
int valmin(liste a)  // 0 point car c'est une partie de echminmax()        
{ int m=a-&gt;val;
  for(;a;a=a-&gt;suite) if(a-&gt;val&lt;m) m=a-&gt;val;
  return m;
}
liste oteval(liste a,int x) // 6*0.33=2 points
{ if(a-&gt;val==x)                 // 0.33
  { liste b=a-&gt;suite;           // 0.33 ou b=a, a=a-&gt;suite
    free(a);                    // 0.33
    return b;                   // 0.33
  }
  a-&gt;suite=oteval(a-&gt;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érative
{ liste *m=&amp;a, *p, b;
  for(p=&amp;a;*p;p=&amp;(*p)-&gt;suite) if((*p)-&gt;val&lt;(*m)-&gt;val) m=p;
  if(a) b=*m, *m=b-&gt;suite, free(b);
  return a;
}
\endgroup
\bye
</pre></body></html>