Dans le département d’informatique de la faculté des sciences, il existe un laboratoire, 
appelé «  Traitement de l’information et Aide à la Décision », qui regroupe  un ensemble de  professeurs, chercheurs et doctorants. Ce laboratoire produit chaque année un ensemble  de productions scientifiques.   L’objectif de ce sujet est la gestion automatique de cette  production  en utilisant un tableau de structures, où chaque production est une structure. Une production est caractérisée par les informations suivantes : un code de référence (ref), le titre de la production (titre), l’auteur principal (aut1), le directeur de la thèse (aut2), l’encadrant (aut3), le type de production (type : thèse, publication ou communication), et la date de production (date).

On considère les structures  suivantes :

typedef struct  
int  jours ;
int  mois ;  
int  annee ; 
} Date;

typedef struct  
int ref  ;   
char titre [100]  ;     
char   aut1[40] ;  
char aut2[40];  
char aut3[40] ;   
char type[40]   ;    
Date   date  ;
Production;

#define max 100 

Les fonctions à rédiger sont les  suivantes:

1) void   lecteure ( Production  P[max], int N)  qui  permet de saisir les informations de  N  productions. 
      
2) void Affichage (Production  P[max] , int N)  qui  permet d’afficher les informations de N  productions.  
 
3) void  NombreProductions (Production  P[max] , int N)  qui  permet de calculer et 
afficher  le nombre de production pour chaque type ( thèse, publication et communication) sachant que P un tableau  contenant les productions et N représente le nombre total de productions.   
    
4) Production *  RechType (Production  P[max] , int N , char type[30] , int * k)  qui  permet  de rechercher et retourne un tableau des productions  ( un pointeur sur Production)  contenant les Productions  d’un type donné ( type). P  représente un tableau de productions  et N représente le nombre total de productions,  et le troisième argument  k  sert à mémoriser le nombre de productions enregistrés dans le tableau  retourné. 

5) void  SuppProd (Production  P[max] , int * N, char auteur[30])  qui  permet de 
supprimer les productions  d’un auteur ( qui peut être un auteur principal, un directeur de  thèse ou bien un encadrant). Et après  la suppression, afficher les productions  supprimées. 

6) void AffichOrdre ( Production   P[max] , int N )  qui  permet d’afficher les productions  par ordre croissant selon la date de  production. P  représente un tableau de productions et  N représente le nombre total de productions. 

                                               Correction
                                                       
1)

void Lecture(Production P[max],int N){
 int i;
  for ( i=0; i<N ; i++)
   { printf("Entrer la reference :"); scanf("%d",&P[i].ref);
    printf("Entrer Le titre : "); scanf("%s",P[i].titre);
    printf("Entrer Le nom de l'auteur  : "); scanf("%s",P[i].aut1);
    printf("Entrer Le nom du directeur :");  scanf("%s",P[i].aut2);
    printf("Entrer le nom de l'encadrant  :"); scanf("%s",P[i].aut3);
    printf("Entrer le type de la production  :"); scanf("%s",P[i].type);
     printf("Entrer la date de la prodction: \n");
     printf("  Entrer le jour :"); scanf("%d",&P[i].date.jour);
     printf("  Entrer le mois :"); scanf("%d",&P[i].date.mois);
     printf("  Entrer l'annee :"); scanf("%d",&P[i].date.annee);
     printf("*********************************\n");
   }
 }
2)

void Affichage(Production P[max],int N){
 int i ;
 
 for ( i=0; i<N ; i++)
   {printf(" La reference : %d\n",P[i].ref); 
    printf(" Le titre: %s\n",P[i].titre); 
    printf(" Le nom de l'auteur: %s\n",P[i].aut1); 
    printf(" Le nom du directeur: %s\n",P[i].aut2);  
    printf(" Le nom de l'encadrant: %s\n",P[i].aut3); 
    printf(" Le type de la production: %s\n",P[i].type); 
    printf(" La date de la prodction: %d/%d/%d\n",P[i].date.jour,
    P[i].date.mois,P[i].date.annee);
    printf("*******************************\n");
    }                                  
}

3)

void  NombreProductions(Production P[max],int N) 
 { int Nb_pro_these=0,Nb_pro_pub=0,Nb_pro_commu=0 ,i;
   for ( i=0; i<N ; i++)
    {  if(strcmp(P[i].type,"These")==0)
           Nb_pro_these++;
       if(strcmp(P[i].type,"Publication")==0)
           Nb_pro_pub++;
       if(strcmp(P[i].type,"Communication")==0)
           Nb_pro_commu++;
     } 
    printf("Le nombre de production Thèse : %d\n",Nb_pro_these);
    printf("Le nombre de production publication : %d\n",Nb_pro_pub);
    printf("Le nombre de production communication : %d\n",Nb_pro_commu);
 }

4)

Production * RechType(Production P[max],int N,char type[30],int *k)
{  Production tab[max];
   int i;
     *k = 0 ;
  for ( i=0; i<N ; i++)
    { if(strcmp(P[i].type,type)==0)
      {  tab[*k] = P[i];
         (*k)++ ; 
      }
    } 
  return tab;
}

5)

void SuppProd (Production P[max],int *N,char auteur[30])
{  Production supp[max];
int i,j,k=0;
  for ( i=0; i<*N ; i++)
    { if(strcmp(P[i].aut1,auteur)==0 ||
         strcmp(P[i].aut2,auteur)==0 ||
         strcmp(P[i].aut3,auteur)==0)
        {    supp[i]=P[i];
           for ( j=i ; j<*N ; j++)   P[j] = P[j+1];
         
            (*N)--; i--;  k++;
        }
    }
    printf("la liste de productions supprimées :");
    Affichage(supp,k);
 }


6)

void AffichOrdre(Production P[max],int N)
{  Production aide;
    int i,j;

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