L’objectif est de créer un programme  permettant la gestion d’une bibliothèque, cette bibliothèque contient un grand nombre de livres de différentes spécialités. Chaque livre comporte un ensemble d’informations (code, titre,  spécialité,  auteur et  édition).
On considère les structures  suivantes :

typedef struct  {  
int  jour ;       
int  mois ;     
int  annee ;        
} Edition ;

typedef struct   {  
int code  ;       
char titre [30]  ;        
char specialite[30]  ;           
char auteur[30]  ;   
Edition edit  ;         
}  Livre  ;

#define max 100

==> Les fonctions à rédiger sont les  suivantes :

1)  void   lecture (Livre   L[max], int N )   qui permet de saisir les informations  de  N  livres.

2)  void afficher (Livre  L[max], int N )   cette fonction  permet  d’afficher les informations de N livres. 

3) int  comparer  (Edition  x , Edition y )  qui  permet de comparer deux dates d’éditions, et  retourne ( -1  si x avant  y,  0  si x et y sont identiques , 1  si x après y ).

4) void   ordre_edition  (Livre  L[max] ,  int N )   permet de classer les livres du tableau  L  par ordre,  selon la date d’édition. 
    
5) Livre *  livres_auteur  (Livre  L[max] ,  int N , char nom[30] , int * k )   cette fonction permet de retourner un tableau  contenant  les livres d’un auteur passé en paramètre   (nom).  L  représente un tableau contenant N Livres  et k  sert à mémoriser la taille du tableau retourné.

6) void   supprimer ( Livre  L[max]  , int  * N , char  nom[30] )  cette fonction  permet  de supprimer les livres d’un auteur passé en paramètre.  N  passé par adresse pour modifier la taille du tableau après la suppression.

                                            Correction
                                                       
1)

void   lecture (Livre L[max],int N ){
 int i;
  for ( i=0; i<N ; i++)
   { printf("Entrer le code:");   scanf("%d",&L[i].code);
     printf("Entrer le titre: "); scanf("%s",L[i].titre);
     printf(" specialite: ");  scanf("%s",L[i].specialite);
     printf(" L'auteur :");    scanf("%s",L[i].auteur);
     printf("Date d'edition \n"); 
     printf(" Jour:");  scanf("%d",&L[i].edit.jour);
     printf(" Mois:");  scanf("%d",&L[i].edit.mois);
     printf(" annee:"); scanf("%d",&L[i].edit.annee);
     printf("***************************\n");
   }
 }

2)
void  afficher (Livre L[max],int N){
 int i;
  for ( i=0; i<N ; i++)
   { printf("le code: %d\n",L[i].code);
     printf("Le titre : %s\n",L[i].titre); 
     printf(" specialite :%s\n",L[i].specialite);
     printf(" l'auteur : %s\n",L[i].auteur);
     printf("Date d'edition: %d/%d/%d \n",
     L[i].edit.jour,L[i].edit.mois,L[i].edit.annee);
     
     printf("****************************\n");
   }
 }

3)

int  comparer(Edition x ,Edition y) 
 {  if(x.annee < y.annee ) return -1;
    if(x.annee > y.annee ) return  1 ;
    if(x.annee == y.annee && x.mois < y.mois ) return -1 ;
    if(x.annee == y.annee && x.mois > y.mois ) return  1 ;
    if(x.annee == y.annee && x.mois == y.mois && x.jour < y.jour) return -1 ;
    if(x.annee == y.annee && x.mois == y.mois && x.jour > y.jour) return  1 ;
    if(x.annee == y.annee && x.mois == y.mois && x.jour == y.jour) return 0 ;   
 }

4)

void ordre_edition(Livre L[max],int N)
 { Livre aide;   int i,j;

   for( i=0; i <N-1; i++)
   {  for( j=i+1; j <N; j++)
       {
          if(L[i].edit.annee > L[j].edit.annee) 
           { aide = L[i]; L[i] = L[j] ;  L[j]= aide ;}
          if(L[i].edit.annee == L[j].edit.annee &&
           L[i].edit.mois > L[j].edit.mois) 
           { aide = L[i]; L[i] = L[j] ;  L[j]= aide ; }
          
          if(L[i].edit.annee == L[j].edit.annee &&
             L[i].edit.mois  == L[j].edit.mois  &&
             L[i].edit.jour > L[j].edit.jour) 
            { aide = L[i]; L[i] = L[j] ;  L[j]= aide ; }
       } 
    } 
}

5)

Livre * livres_auteur(Livre L[max],int N ,char nom[30],int *k)
{   Livre tab[max];
   int i;
     *k = 0 ;
  for ( i=0; i<N ; i++)
    { if(strcmp(L[i].auteur,nom)==0)
      {  tab[*k] = L[i];
         (*k)++ ; 
      }
    } 
  return tab;
}




6)

void   supprimer (Livre L[max],int *N,char nom[30])  
{ int i,j;
   for ( i=0; i<*N ; i++)
     {if(strcmp(L[i].auteur,nom)==0)
        {    
           for (j=i;j<*N ;j++)   L[j] = L[j+1];
              (*N)--;   i--; 
        }
    }
 }