Université de Paris X Nanterre vendredi 3 février 2006 Licence MMIA deuxième année enseignant : L. PIERRE

contrôle d’informatique

Qu’écrit le programme suivant quand on l’exécute ?

#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éter les trois procédures

int sommepairs(liste a);
void echminmax(liste a);
liste otemin(liste a);

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.

barême 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ébut
    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érative
{ 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;
}