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);
}