Exercice

Modifier le programme précédent :

  1. en écrivant une procédure d'impression d'une struct commande passée en paramètre.

  2. en écrivant une fonction de recherche de commande maximum (celle pour laquelle le produit nombre $ \times $ prix est maximum). Cette fonction admettra en paramètre un pointeur vers la struct commande qui est tête de la liste complète, et rendra un pointeur vers la structure recherchée.

  3. le main sera modifié de manière à faire appel à la fonction de recherche de la commande maximum et à imprimer cette commande.
#include <stdlib.h>
#include <stdio.h>

/*   les types communs a toutes les procedures   */
/*   -----------------------------------------   */
struct commande
   {
   char nom[80];
   char article[80];
   int nombre,prix;
   struct commande *suiv;
   };

/*********************************************************************/
/*                                                                   */
/*                              print_com                            */
/*                                                                   */
/*   But:                                                            */
/*      Imprime une structure commande                               */
/*                                                                   */
/*********************************************************************/
void print_com(struct commande com)
{
printf("%s %s %d %d\n",
       com.nom, com.article, com.nombre, com.prix);
}
/*********************************************************************/
/*                                                                   */
/*                            max_com                                */
/*                                                                   */
/* But:                                                              */
/*    Recherche la commande pour laquelle le produit nombre * prix   */
/*    est le maximum                                                 */
/*                                                                   */
/* Interface:                                                        */
/*    l_com : la liste dans laquelle doit se faire la recherche      */
/*    valeur rendue : pointeur vers la structure commande recherchée */
/*                    ou NULL si l_com est vide                      */
/*                                                                   */
/*********************************************************************/
struct commande *max_com(struct commande * l_com)
{
struct commande *pmax;   /*   pointeur vers le max courant   */
struct commande *pcour;  /*   pointeur vers l'element courant   */
int vmax,vcour;

if (l_com == NULL)
   return(NULL);
else
   {
   pmax = l_com; vmax = (pmax -> nombre) * (pmax -> prix);

   for (pcour = l_com -> suiv; pcour != NULL; pcour = pcour ->suiv)
      {
      vcour = (pcour -> nombre * pcour -> prix);
      if (vcour > vmax)
         {
         vmax = vcour;
         pmax = pcour;
         }
      }
   
   return(pmax);
   }
}
/*********************************************************************/
/*                             main                                  */
/*********************************************************************/
int main(void)
{
FILE * fi;
struct commande *l_com = NULL; /* liste des commandes */
struct commande *prec,*cour;   /* pour la commande précédente
                                  et courante */
int val_ret;                   /* valeur de retour de fscanf */

if ((fi = fopen("exer7.data","r")) == NULL)
   printf("Impossible d'ouvrir le fichier exer7.data\n");
else
   {
   /*   lecture du fichier avec création de la liste de commandes   */
   /*   ---------------------------------------------------------   */
   do
      {
      cour = malloc(sizeof(struct commande));
      val_ret = fscanf(fi,"%s %s %d %d", cour -> nom, cour -> article,
                             &(cour -> nombre), &(cour -> prix)); 
      if (val_ret == EOF)
         {
         free(cour); 
         if(l_com != NULL) prec -> suiv = NULL;
         }
      else
         {
         if (l_com == NULL) l_com = cour; else prec -> suiv = cour;
         prec = cour;
         }
      }
   while (val_ret != EOF);

   /*   parcours de la liste avec impression   */
   /*   ------------------------------------   */
   if (l_com == NULL)
      printf("La liste de commandes est vide\n");
   else
      {
      for (cour = l_com; cour != NULL; cour = cour -> suiv)
         print_com(*cour);
      
      /*   recherche et impression de la commande maximum   */
      /*   ----------------------------------------------   */
      printf("La commande maximum est :\n");
      print_com(*max_com(l_com));
      }
   
   fclose(fi); /*   fermeture du fichier   */
   }
return 0;
}



Matthieu Moy 2017-02-08