retour au sujet

correction DPIE1 Juin 2002

remarques : je fais simple, on pouvait si on le désirait rajouter diverses vérifications

Question 0 voir cours

Un identificateur est le nom qui désigne un objet du C (variable, fonction,...) Il est composé de lettres majuscules ou minuscules (sans accents), de chiffres, et du souligné (_). Il ne doit pas commencer par un chiffre. Les majuscules et minuscules ne sont pas équivalentes. Il est séparé du texte qui le précède et qui le suit par un ou plusieurs séparateurs (espace, tabulation, retour,...) qui n'est obligatoire que pour le séparer d'un autre identificateur, optionnel en cas de caractères non alphanumérique (signe opératoire, parenthèse, point virgule,...).

Question 1

#define L 15
#define H 8

Question 2

int calcul_indice(int magasin, int etage, int appart)
{
 int pos;
 pos=(etage-1)*L + (appart-1);
 if(magasin==2) pos=pos+(L*H);
 return(pos);
}

int demande_position(void)
{
 int m,e,c,i;
 printf("quel magasin (1=gauche, 2=droite) ? ");
 scanf("%d",&m);
 printf("quel étage ? ");
 scanf("%d",&e);
 printf("quelle case dans l'étage %d ? ",e);
 scanf("%d",&c);
 i=calcul_indice(m,e,c);
 return(i);
}

Question 3

void affiche_position(int indice)
{
 int e,c;
 e=indice/L + 1; //division entière
 c=indice%L + 1; //reste de la division
 printf("%dième case du %d ième étage du magasin de ",c,e);
 if(indice<L*H) printf("gauche\n");
 else printf("droite\n");
}

Question 4

#define MAX (L*H*2)
typedef int tabint[MAX];
tabint DUREE;

void lendemain(void)
{
 int i;
 for(i=0;i<MAX;i++)
  if(DUREE[i]>=0) DUREE[i]=DUREE[i]+1;  //ou ++
}

Question 5

void plus_recente(void)
{
 int i,indice_recente=-1;
 for(i=0;i<MAX;i++)
  if(DUREE[i]>=0)
   if(indice_recente<0) // si c'est la première non vide trouvée
     indice_recente=i;
   else if(DUREE[i]<DUREE[indice_recente])
     indice_recente=i;
 if(indice_recente<0) printf("le stock est totalement vide\n");
 else printf("la plus récente est dans la case d'indice %d\n",indice_recente);
}

Question 6

tabint REF;
void cherche(void)
{
 int i,ind,ref,age=-1;
 printf("quelle référence désirez vous ? ");
 scanf("%d",&ref);
 for(i=0;i<MAX;i++)
  if(REF[i]==ref)
   {
    if(DUREE[i]>age)
     {
      ind=i;
      age=DUREE[i];
     }
   } 
 if(age<0)printf("aucune pièce de ce type disponible en stock !\n");
 else
  {
   printf("allez la chercher dans la ");
   affiche_position(ind);
  }
}

Question 7

int compter(int ref)
{
 int nb=0,i;
 for(i=0;i<MAX;i++)
  if(REF[i]==ref)nb++;
 return(nb); 
} 

Question 8

#include <math.h>
float distance(int indice)
//dit à quelle distance se trouve une case, inspiré de la question 3
{
 int e,c;
 e=indice/L + 1; 
 c=indice%L + 1; 
 return(sqrt(e*e + c*c));
}

void cherche_mieux(void)
{
 int i,ind,ref,age=-1;
 float dist; //la racine carrée n'est que rarement un entier
 printf("quelle référence désirez vous ? ");
 scanf("%d",&ref);
 for(i=0;i<MAX;i++)
  if(REF[i]==ref)
   {
    if(DUREE[i]>age || (DUREE[i]==age && distance(i)<dist))
     {
      ind=i;
      age=DUREE[i];
      dist=distance(i);
     }
   } 
 if(age<0)printf("aucune pièce de ce type disponible en stock !\n");
 else
  {
   printf("allez la chercher dans la ");
   affiche_position(ind);
  }
}

prgramme principal

Ce qui suit permet de tester le programme, ne repond à aucune question

#define M 30 /*je n'affiche que les premiers au lieu des 240 */
void aff(tabint t)
{int i;for(i=0;i<M;i++)printf("%d ",t[i]);printf("\n");}
void main(void)
{int i;
 affiche_position(i=demande_position());
 printf("indice : %d\n",i);
 for(i=0;i<MAX;i++)DUREE[i]=(i>20)?-1:i%3;
 aff(DUREE);
 lendemain();
 aff(DUREE);
 plus_recente();
 for(i=0;i<MAX;i++)REF[i]=(i>20)?-1:(i%2)+1;
 aff(REF);
 for(i=0;i<MAX;i++)if(REF[i]==5)printf("%d ",REF[i]);printf("\n");
 printf("%d cases de ref 2 \n",compter(1));
 printf("essayez de chercher la ref 2\n");
 cherche();
 printf("essayez de chercher la ref 2, pour comparer\n");
 cherche_mieux();
}


pour retourner au sommaire des sujets d'examen, cliquez ici. Pour retourner au sujet de cet examen, cliquez .


retour sommaire des sujets Patrick TRAU, ULP - IPST juillet 02