Les exercices en C

Exercice 1

 Écrire  un programme en  C  qui permet  d’afficher le message Bonjour.   (Solution)                                        

Exercice 2 

Écrire  un programme en C permettant de saisir deux nombres et d'afficher leur produit.   (Solution)                                                                            

Exercice 3

Écrire  un programme en C  qui  permet d'échanger le contenu de deux entiers  A et B  saisis par l'utilisateur. et afficher ces entiers  après l’échange.  (Solution) 


Exercice 4                                                                                     

Écrire un un programme en C qui  permet d'afficher si un nombre  entier saisi au  clavier est pair ou impair.  (Solution) 

Exercice 5                                                                                      

Écrire un programme en C  qui permet d'afficher le plus grand de trois entiers saisis  au clavier.  (Solution)

Exercice 6                                                                                      

Écrire un programme en C  qui permet d'évaluer une note saisi au  clavier   (si la note est supérieur à 10 alors il affiche validé sinon non validé  (NB : la note comprise entre 0 et 20 ).    (Solution)

Exercice 7                                                                                      

Écrire un programme en C qui demande deux nombres m et n à l’utilisateur et l’informe ensuite si le produit de ces deux nombres est positif ou négatif. On inclut dans le programme le cas où le produit peut être nul.     (Solution)

Exercice 8                                                                                     

Écrire un programme en  C qui permet de calculer la valeur absolue d'un entier saisi  par l'utilisateur. (Solution)

Exercice 9

Écrire un programme en C qui permet de calculer la moyenne de trois entiers saisis par l'utilisateur.   (Solution)

Exercice 10

Une boutique propose à ces clients, une réduction de 15% pour les montants d’achat supérieurs à 200 dh. Écrire un programme en C permettant de saisir le prix total HT et de calculer le  montant TTC en prenant en compte la réduction et la TVA=20%.   (Solution)

Exercice 11

Le centre de photocopie facture 0,25 DH  pour les 10 premières photocopies, 0,20 DH les vingt suivantes et 0,10 DH  au-delà. Ecrire un programme en C qui demande à l’utilisateur de saisir le nombre de photocopies effectuées et qui affiche la facture correspondante.  (Solution)   

Exercice 12

Écrire un programme en C qui demande l'âge d'un enfant et permet d'informer de sa catégorie sachant que les catégories sont les suivantes: 
"poussin de 6 a 7 ans"   
"pupille de 8 a 9 ans "   
"minime de 10 a 11 ans "  
" cadet après 12 ans ".   (Solution)

Exercice 13

Écrire un programme en C permettant d’afficher le mois en lettre selon le numéro saisi au clavier.  (  Si l’utilisateur tape 1 le programme affiche janvier,  si 2  affiche  février, si 3 affiche mars...)  (Solution)

Exercice 14

Écrire un programme en C qui permet  d'afficher  le message   "Bonsoir"  10 fois. Utilisant la boucle while.   (Solution)

Exercice 15

Écrire un programme en C permettant de calculer la somme S= 1+2+3+...+ 10. Utilisant la boucle while.  (Solution)

Exercice 16

Écrire un programme en C permettant de  calculer la somme   S=1+2+3+...+ N,  où N saisi par l’utilisateur.  Utilisant la  boucle while.   (Solution)

Exercice 17

Écrire un programme en C qui permet d'afficher  le message "bonjour" 10 fois . Utilisant la  boucle for .  (Solution)

Exercice 18

Écrire un programme en C qui permet de  calculer  la somme  S=1+2+3+...+ 10. Utilisant la boucle for.  (Solution)

Exercice 19

Écrire un programme en C qui permet de calculer la somme   S=1+2+3+4+….+ N. où N saisi au clavier par l'utilisateur.Utilisant la boucle for .   (Solution)

Exercice 20

Écrire un programme en C qui permet d'afficher la table de multiplication de 5. Utilisant la boucle For.   (Solution)

Exercice 21

Écrire un programme en C qui permet d'afficher la table de multiplication d’un entier saisie par l’utilisateur,  Utilisant la boucle For.  (Solution)

Exercice 22

Écrire un programme en C  qui permet d'afficher "Bonjour" 10 fois. utilisant la boucle Do While.   (Solution)

Exercice 23

Écrire un programme en C qui calcule la somme  S= 1+2+3+…+ 10. Utilisant la boucle  Do While.   (Solution)

Exercice 24

Écrire un programme en C qui affiche la table de multiplication de 8. Utilisant la boucle  Do While.   (Solution)

Exercice 25

Écrire un programme en C permettant de saisir 10 entiers et de les stocker dans un tableau nommé Tableau, puis les afficher.   (Solution)

Exercice 26

Écrire un programme en C  permettant de saisir 10 notes et qui affiche la moyenne de ces notes.   (Solution)

Exercice 27

Écrire un programme en C permettant de saisir 10 entiers et qui affiche le maximum de ces entiers.   (Solution)

Exercice 28

Écrire un programme en C  permettant de saisir 10 entiers dans un tableau, et de calculer le nombre d'occurrences d'un élément N  dans ce tableau. Où N saisi par l’utilisateur.    (Solution)

Exercice 29

Écrire un programme en C  permettant de saisir 10  entiers dans un tableau et de  trier ce tableau par ordre croissante. puis affiche ce tableau après le tri.   (Solution)

Exercice 30

Écrire un programme en C permettant de calculer le factoriel d'un entier saisi par l'utilisateur. par exemple N = 7  le factoriel de 7 égal à  1*2*3*4*5*6*7 =5040.    (Solution)


Exercice 31

Écrire un programme en C permettant d'afficher les nombres paires compris entre 0 et N, où N saisi par l'utilisateur.  (Solution)

Exercice 32

Écrire  un programme en C qui permet de calculer la somme d'entiers  impaires de 1 jusqu'à un entier N saisi par l'utilisateur.   Exemple N=8   Somme = 1 +3+5+7= 16   (Solution)

Exercice 33

Écrire un programme en C qui permet de calculer le plus grand diviseur commun entre deux entiers saisis par l'utilisateur.  Par exemple:  M= 15  et N=10   PGCD (15 , 10) =  5      (Solution)

Exercice 34

Ecrire un programme en C qui permet d'afficher  un  triangle  d'entiers, selon un entier saisi par l'utilisateur. Exemple   N=4

1

22

333

4444  

  (Solution)


Exercice 35

Écrire un programme en C qui permet de calculer le nombre de chiffres d'un entier N saisi  par l'utilisateur.  Exemple  N = 10843

le nombre de chiffres est : 5               (Solution)

Exercice 36

Écrire un programme en C  qui permet d'inverser les chiffres d'un entier N saisi par l'utilisateur.   par exemple  N=35672  le résultat affiché doit être   27653     (Solution)

Exercice 37

Écrire un programme en C  qui permet de saisir un entier N et d'afficher le triangle d'étoiles. par exemple  N = 4

              *

            ***

          *****

         *******     

(Solution)


Exercice 38

Écrire un programme en C  qui  permet de saisir 10 entiers dans un tableau. puis compter combien y a-t-il  d'éléments pairs et  impairs.  (Solution)

Exercice 39

Écrire un programme en C qui affiche si un nombre  entier N  saisi au clavier est Premier ou non.   (Solution)

Exercice 40

Ecrire  un programme en C qui demande la saisie d'un tableau T de 10 entiers, et de mettre les éléments pairs dans  un tableau T1 et les éléments impaires dans un tableau T2. Puis afficher T1  et  T2      (Solution)

Exercice 41

Ecrire un programme en C qui permet à l'utilisateur de saisir une suite d'entiers se terminant par 0, et qui affiche à la fin le nombre d'occurrences de 5     (Solution)

Exercice 42

Ecrire un programme en C permettant de saisir 10 entiers et dit si ces entiers sont consécutifs ou non.     (Solution)

Exercice 43

Ecrire un programme en C qui permet de saisir 10 entiers et qui permet de calculer la différence entre la somme des éléments paires et la somme des éléments impaires

par exemple : 1 6 7 4 5 3 1 8 2 5

==> (6+4+8+2) - (1+7+5+3+5+1) = -2      (Solution)

Exercice 44

Ecrire un programme en C permettant, à partir d'un réel x et d'une valeur entière positive n, de calculer x puissance n   (Solution)    

Exercice 45

Ecrire un programme en C qui permet de tester l'égalité entre deux tableaux d'entiers (tailles 10). Le programme affiche VRAI si les composants des deux tableaux sont correspondent position par position, sinon il affiche FAUX.     (Solution)

Exercice 46

Écrire un programme en C qui compte le nombre d'éléments en double ( deux éléments ou plus ) dans un tableau d'entiers saisie par l'utilisateur.      (Solution)

Exercice 47

Le centre de photocopie de votre établissement facture 0,25 DH pour les dix premières photocopies, 0,20 DH les vingt suivantes et 0,10 DH au-delà. Ecrire un programme en C qui de mande à l'utilisateur le nombre de photocopies effectuées et qui affiche la facture correspondant.   (Solution)    

Exercice 48

Écrire un programme en C qui permet de lire un caractère et dit s'il s'agit d'une lettre ou non, en cas d'une lettre il dit s'il s'agit d'une lettre minuscule ou majuscule.   (Solution)

Exercice 49

Écrire un programme en C permettant de décaler les valeurs nulles vers la fin du tableau, en gardant l'ordre des éléments.
Exemple     1  2  0   6    9    0   0  8    0    3
Résultat      1   2  6  9   8   3   0    0    0    0    (Solution)    

Exercice 50

Écrire un programme en C permettant d'échanger ( permuter ) et afficher les valeurs des trois entiers ( A, B et C ) saisis par l'utilisateur, selon l'ordre croissant c'est-à-dire (A < B < C ).    (Solution)

Exercice 51

Écrire un programme en C qui permet d'échanger les valeurs de deux entiers A et B saisis par l'utilisateur, mais à condition d’utiliser seulement deux variables A et B. ( sans d'utiliser la troisième variable auxiliaire )   (Solution) 

<< La Fonction malloc >>


Exercice 52

Écrire un programme en C permettant de saisir N entiers et de les stocker dans un tableau nommé Tab, puis les afficher. Où N saisi par l’utilisateur. 

(Solution)

Exercice 53

Écrire un programme en C  permettant de saisir N notes et qui affiche la moyenne de ces notes. Où N saisi par l’utilisateur.  (Solution)

Exercice 54

Écrire un programme en C permettant de saisir N entiers et qui affiche le maximum de ces entiers. Où N saisi par l’utilisateur.  (Solution)

Exercice 55

Écrire un programme en C  permettant de saisir N entiers dans un tableau, et de calculer le nombre d'occurrences d'un élément N  dans ce tableau. Où N saisi par l’utilisateur. Où N saisi par l’utilisateur.  (Solution)

Exercice 56

Écrire un programme en C  permettant de saisir N entiers dans un tableau et de  trier ce tableau par ordre croissante. puis affiche ce tableau après le tri. Où N saisi par l’utilisateur. 

(Solution)


<< Les Fonctions en C >>

Exercice 57

Écrire une fonction qui permet de calculer le prix TTC , cette fonction va recevoir un paramètre de type Réel dont le nom est "prixHT" et un second paramètre de type Réel dont le nom est "tva".  (Solution)

Exercice 58

Écrire une fonction qui permet d'afficher si un nombre entier passé en paramètre est pair ou impair.(Solution)

Exercice 59

Écrire une fonction qui remplace les voyelles (minuscules et majuscules) par des espaces dans une chaîne passée en paramètre.(Solution) 

Exercice 60

Écrire une fonction qui permet de retourner le nombre de caractères d’une chaîne de caractères passée en paramètre. (Solution)

Exercice 61

Écrire une fonction qui permet   d'inverser une chaîne de caractères passée en paramètre.  (Solution)

Exercice 62

Écrire une fonction qui cherche combien de fois un caractère est présent dans une chaîne de caractères. Le caractère à chercher et la chaîne seront passés en paramètres. (Solution)

Exercice 63

Écrire une fonction qui cherche si une valeur est présente dans un tableau (entiers). Elle renverra 0 si la valeur n'est pas trouvée, sinon retourne 1.Il faut passer en paramètre la valeur cherchée, le tableau et le nombre d'éléments dans le tableau. (Solution)  

Exercice 64

Écrire une fonction qui tri par ordre croissant les éléments d'un tableau de nombres entiers. (Solution)

Exercice 65

Écrire une fonction récursive qui permet de calculer le factorielle d'un entier saisi par l'utilisateur. (Solution)

Exercice 66

Écrire une fonction récursive qui permet de calculer la somme 1+2+3+...+ N. où N saisi par l'utilisateur.(Solution)

Exercice 67

Écrire une fonction récursive permettant, à partir d'un réel x et d'une valeur entière positive n, de calculer x puissance n .(Solution)

Exercice 68

Écrire une fonction récursive qui permet d'afficher  les entiers de 0 à 10 .utilisant un seul paramètre.

(Solution)

Exercice 69

Écrire une fonction récursive qui permet d'afficher  les entiers de A à  B . Où A et B sont  des paramètres de cette fonction.(Solution)

Exercice 70

Écrire une fonction récursive qui permet de calculer le PGCD de deux entiers passés en paramètres,( utiliser l'algorithme d'Euclide).(Solution)

Exercice 71

Écrire une fonction récursive qui permet d'afficher les éléments d'une matrice passée en paramètre. (Solution)

Exercice 72

Écrire une fonction récursive qui permet de calculer l'image d'un entier (passé en paramètre) par une suite de Fibonacci. Suite de Fibonacci est une suite d'entiers dans laquelle chaque terme est la somme des deux termes qui le précèdent.   F(0)=F(1)=1.(Solution)


Les structures de données                  

Exercice 73
Pour avoir une immunité collective contre le virus COVID19, le Maroc a lancé un  programme pour la vaccination d’un grand nombre de citoyens, ce qui nécessite une gestion efficace pour l’opération de vaccination et le suivi de citoyens vaccinés. Les types  des vaccins adoptés sont : Astrazeneca et Sinopharm. L’immunité d’un citoyen contre le  virus COVID19  nécessite deux doses pour le vaccin utilisé, la deuxième dose doit être  programmée après une période précise par rapport à la première dose, sachant que la  période varie entre deux à quatre semaines. 

La gestion des citoyens concernés par la vaccination est réalisée via un tableau de structures, où chaque structure représente un citoyen. Les informations qui concernent  un citoyen sont : le numéro de la carte d’identité nationale (cin) , le nom (nom), le  prénom(prenom), le type du vaccin (type), la date de la première dose (date_prem)  et le  nombre de jours entre la première et la deuxième dose (nbj).
On considère les structures  suivantes :

typedef struct 
int jour ; 
int mois ; 
int annee ; 
Date ;

typedef struct   
char type[30] ; 
Date date_prem  ; 
int  nbj ;
Vaccin ;

typedef struct 
char cin[30]  ; 
char nom [30] ;  
char prenom[30];  
Vaccin vac ; 
Citoyen  ;

#define max 100


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

1) void  lecture (Citoyen C[max] , int N)  qui  permet de saisir les informations des citoyens concernés par la vaccination. N représente le nombre total de citoyens.  
 
2) void affichage (Citoyen C[max] , int N)  qui  permet d’afficher les informations des 
citoyens concernés par la vaccination. N représente le nombre total de citoyens.   

3) void  totalVaccin (Citoyen C[max] , int N)  qui  permet de calculer et afficher le nombre de citoyens qui vont prendre un type du vaccin, sachant que C un tableau contenant les  citoyens concernés par la vaccination. N représente le nombre total de citoyens.  
   
4) void   CitoyenVac (Citoyen C[max] , int N, char type[30],Citoyen tab[max], int * k)  qui  permet de remplir un tableau des citoyens ( tab)  contenant les citoyens qui vont  prendre le vaccin spécifié par le type (type). C  représente un tableau de citoyens et N représente le nombre total de citoyens et  k  sert à mémoriser la taille du tableau (tab). 

5) Date  *  deuxDose (Citoyen C[max] , int N, char type[30])  qui  permet de retourne un  tableau de type Date ( un pointeur sur Date) contenant les dates de la deuxième dose  pour les citoyens concernés par un type de vaccin spécifié par le troisième argument de la  fonction. C  représente un tableau de citoyens et N  représente le nombre total de  citoyens. 

6) void AfficheDate(Citoyen C[max] , int N, char cin[20] )  qui  permet d’afficher les dates  des deux doses programmées pour un citoyen identifié par le CIN.  C  représente un  tableau de citoyens et  N représente le nombre total de  citoyens.

                                               Correction
       
                                                
1)

void Lecture(Citoyen C[max],int N){
 int i;
  for ( i=0; i<N ; i++)
   { printf("Entrer Le CIN :"); scanf("%s",C[i].cin);
     printf("Entrer Le nom :"); scanf("%s",C[i].nom);
     printf("Entrer Le prenom :"); scanf("%s",C[i].prenom);
     printf("Entrer le type de vaccin :");  scanf("%s",C[i].vac.type);
     printf("Entrer la date de vaccin \n");
     printf("  Entrer le jour :"); scanf("%d",&C[i].vac.date_prem.jour);
     printf("  Entrer le mois :"); scanf("%d",&C[i].vac.date_prem.mois);
     printf("  Entrer l'annee :"); scanf("%d",&C[i].vac.date_prem.annee);
     printf("Entrer Le nombre de jours entre les deux doses :"); 
     scanf("%d",&C[i].vac.nbj);
      printf("******************************\n");
   }
}
2)

void Affichage(Citoyen C[max],int N){
 int i ;
 
 for ( i=0; i<N ; i++)
   { printf("Le CIN : %s\n",C[i].cin);
     printf("Le nom : %s\n",C[i].nom); 
     printf("Le prenom :%s\n",C[i].prenom); 
     printf("Le type de vaccin : %s\n",C[i].vac.type); 
     printf("La date de vaccin: %d/%d/%d\n ", C[i].vac.date_prem.jour , C[i].vac.date_prem.mois, C[i].vac.date_prem.annee);
     printf("Le nombre de jours entre les deux doses : %d\n",C[i].vac.nbj); 
     printf("******************************\n");
    }                                  
}

3)

void  totalVaccin (Citoyen  C[max] , int N) 
 { int i,Nb_Astra=0,Nb_Sino=0 ;
   for ( i=0; i<N ; i++)
    {  if(strcmp(C[i].vac.type,"Astrazeneca")==0)
           Nb_Astra++;
       else  Nb_Sino++;
     } 
     printf("Le nombre de citoyens qui vont Astrazenica %d\n",Nb_Astra);
     printf("Le nombre de citoyens qui vont Sinopharme %d\n",Nb_Sino);
 }


4)

void  CitoyenVac (Citoyen C[max],int N,char type[30],Citoyen tab[max],int * k)
{ Citoyen tab[max];
  int i;
 *k =0;
  for ( i=0; i<N ; i++)
    { if(strcmp(C[i].vac.type,type)==0)
       {   tab[*k] = C[i];
             (*k)++;
       }
    } 
  
}


5)

Date * deuxDose(Citoyen C[max],int N ,char type[30])
{ int i,j=0;
  Date dates[max];
  for ( i=0; i<N ; i++)
    { if(strcmp(C[i].vac.type,type)==0)
       { dates[i].jour = ( C[i].vac.date_prem.jour + C[i].vac.nbj )%30; 
         dates[i].mois = ( C[i].vac.date_prem.mois +(C[i].vac.date_prem.jour + C[i].vac.nbj)/30)%12; 
         dates[i].annee = C[i].vac.date_prem.annee +(C[i].vac.date_prem.mois +(C[i].vac.date_prem.jour + C[i].vac.nbj)/30)/12;
       }
     }
     return dates;
}

6)

void AfficheDate(Citoyen C[max],int N,char cin[20])
{ int i,j=0;
  Date d;
  for ( i=0; i<N ; i++)
    { if( strcmp(C[i].cin,cin)==0)
      {
       d.jour =(C[i].vac.date_prem.jour + C[i].vac.nbj )%30; 
       d.mois = ( C[i].vac.date_prem.mois +(C[i].vac.date_prem.jour + C[i].vac.nbj)/30)%12; 
       d.annee = C[i].vac.date_prem.annee +(C[i].vac.date_prem.mois +(C[i].vac.date_prem.jour + C[i].vac.nbj)/30)/12;
       printf(" %s  %s  %s \n",C[i].nom,C[i].prenom,cin);
       printf("La date de la premiere dose: %d/%d/%d\n",C[i].vac.date_prem.jour,C[i].vac.date_prem.mois,C[i].vac.date_prem.annee);
       printf("La date de la deuxieme dose: %d/%d/%d",d.jour,d.mois,d.annee);
      }    
    }
}


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

Exercice 75

Un club d’athlétisme organise chaque année une compétition de course (400 mètres  et 3000 mètres) afin de sélectionner les athlètes contribuant aux compétitions nationales. Un athlète participant à la compétition est une personne identifiée  par les informations suivantes : un code identifiant (code), le nom (nom), le prénom (prénom), et la date de naissance (date) et le score (score).

On considère les structures  suivantes :

typedef struct  {  
int  temps ;      /* temps en seconde effectué pour terminer la course  */
char distance[10] ;  /*  Distance de la course ( "400 m" ou  "3000 m" )  */
char  termine[4] ;     /*  Athlète a terminé la course ( "oui" ou  "non" )   */
} Score ;

typedef struct   {  
int code  ;    /* code identifiant l’athlète */
char nom_prenom [10]  ;   /*  Nom et prénom de l’athlète  */
Score competition  ;     /*  Résultat de l’athlète  */ 
}  Athlete  ;

#define max 100

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

1)  void   Lecture (Athlete   A[max], int N )  permet de saisir les informations  de N athlètes.

2) void Affichage (Athlete  A[max], int N )   qui  permet  d’afficher  les informations  de  N athlètes. 

3) void Calcul  (Athlete  A[max], int N)  qui  permet de calculer et  afficher  le nombre des  athlètes participant à chaque type de course  ( NB_400 , NB_3000 )

4) void  supprimer (Athlete  A[max] ,  int N )  qui  permet de supprimer les athlètes qui  n’ont  pas terminé la course.  
   
5) void   chercher_400  (Athlete  A[max] ,  int N , Athlete   T[max] , int * k )  qui permet de remplir le tableau  T  avec  des  athlètes qui ont terminé la course de 400 mètres.  A  représente un tableau contenant  N  Athlètes, et le quatrième argument sert à mémoriser  la taille du tableau T.

6) void   affiche_ordre_400 (Athlete  T[max]  ,  int  n )  qui  permet  de  trier et afficher les informations  des athlètes qui ont terminé la  course 400 mètres par ordre de  mérite ( Ordre croissant ). n  représente le nombre total des athlètes  qui ont terminé la course de 400 mètres.

                                                 Correction
                                                       
1)

void Lecture (Athlete A[max],int N ){
 int i;
  for ( i=0; i<N ; i++)
   { printf("Entrer le code:"); scanf("%d",&A[i].code);
     printf("Entrer le nom et prenom: "); scanf("%s",A[i].nom_prenom);
     printf("Le temps effectue en seconde: "); scanf("%d",&A[i].competition.temps);
     printf("La distance de la course:");  scanf("%s",A[i].competition.distance);
     printf("Termine la course (oui ou non)?:"); scanf("%s",A[i].competition.termine);
     printf("*************************\n");
   }
 }
2)

void  Affichage (Athlete A[max],int N){
 int i;
  for ( i=0; i<N ; i++)
   { printf("le code: %d\n",A[i].code);
     printf("Le nom et prenom: %s\n",A[i].nom_prenom);
     printf("Le temps effectue en seconde:%d\n",A[i].competition.temps);
     printf("La distance de la course: %s\n",A[i].competition.distance);
     printf("Terminition: %s\n",A[i].competition.termine);
     printf("**************************\n");
   }
 }

3)

void Calcul(Athlete A[max],int N) 
 { int NB_400=0 , NB_3000 = 0 ,i;
   for ( i=0; i<N ; i++)
    {  if(strcmp(A[i].competition.distance,"400m")==0)
           NB_400++;
       if(strcmp(A[i].competition.distance,"3000m")==0)
           NB_3000++;
     } 
    printf("Le nombre de participant de 400m : %d\n",NB_400);
    printf("Le nombre de participant de 3000m : %d\n",NB_3000);
 }


4)

void  Supprimer(Athlete A[max],int *N)
{ int i,j;
   for ( i=0; i<*N ; i++)
     {if(strcmp(A[i].competition.termine,"non")==0)
        {    
           for (j=i;j<*N ;j++)   A[j] = A[j+1];
              (*N)--;   i--; 
        }
    }
 }

5)

void chercher_400(Athlete A[max],int N,Athlete T[max],int * k)
 {  
   int i ;
       *k = 0;
  for ( i=0; i<N ; i++)
    { if(strcmp(A[i].competition.distance,"400m")==0 &&
           strcmp(A[i].competition.termine,"oui")==0)
      {    T[*k] = A[i];
           (*k)++ ;
      }
    } 
  }



6)

void affiche_ordre_400(Athlete T[max],int N)  
{  Athlete aide;
   int i,j;
  for( i=0; i <N-1; i++)
   {  for( j=i+1; j<N; j++)
       {
        if ( T[i].competition.temps > T[j].competition.temps )
          {  aide = T[i]; T[i] = T[j] ;  
             T[j]= aide ;
          }
      } 
    }
       Affichage (T,N);
}



Exercice 76

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



Exercice 77

Un centre d’immatriculation au Maroc souhaite automatiser l’enregistrement des véhicules  (Neuf et occasion) via un système informatique. Ce système doit assurer les taches suivantes : l’enregistrement des véhicules, l’élaboration des cartes grises, ….etc. On vous propose de réaliser cette gestion en utilisant un tableau de structures. Chaque véhicule est identifié par les informations suivantes : Nom, prénom et CIN du propriétaire, Marque, Model, Carburant (gasoil ou essence), état (neuf ou occasion), puissance fiscale et Immatriculation. Ces informations représentent les champs des  structures  suivantes.

typedef  struct  {  
int  mois  ;  
int   annee ;  
} Model ;

typedef  struct  {   
char nom_prenom[30] ;  
char  CIN[20]  ;  
char marque[20]  ; 
 Model mod ; 
char carburant[15] ; 
char etat[15] ;  
int fiscale ;  
char Matricule[40]  ;  
} Vehicule ; 

#define max 100

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

1)  void  saisir (Vehicule  V[max] , int N )  permet de saisir les informations  de N véhicules.  
 
2) void   afficher  (Vehicule  V[max] , int N )   permet d’afficher la liste de N véhicules qui sont enregistrés dans le tableau V. 

3)  int rechercher  (Vehicule   V[max] , int N , char Matricule [40] )   cette fonction 
permet  de rechercher un véhicule identifié par la matricule  m  dans  le tableau V contenant N véhicules et retourne l’indice 1 dans le cas de réussite et  0  dans le cas inverse.

4) void  ajouter_vehicule  (Vehicule   V[max] , int  * N  , Vehicule vc  )   permet  d’ajouter un véhicule vc  au tableau V  de N  véhicules. Dans le cas où le véhicule existe déjà dans le tableau, il faut faire une mise à jour concernant  le nouveau propriétaire (nom_prénom et CIN).  
            
5) Dans le cadre de la protection de l’environnement contre la pollution et la réduction du nombre des  accidents, une décision est prise pour arrêter les véhicules qui ont dépassés  25  ans de circulation par rapport à la date  précisée. 

void   supprimer (Vehicule   V[max] ,  int  * N ,  int  annee )  cette fonction  permet  de supprimer les véhicules qui ont dépassés 25  ans de circulation.

                                            Correction
                                                       
1)

void saisir (Vehicule V[max],int N){
 int i;
  for ( i=0; i<N ; i++)
   {
     printf("Entrer Nom et prenom:");   scanf("%s",V[i].nom_prenom);
     printf("Entrer CIN: "); scanf("%s",V[i].CIN);
     printf("Entrer marque: "); scanf("%s",V[i].marque);
     printf("Entrer model \n");  
     printf(" mois: ");     scanf("%d",&V[i].mod.mois);
     printf(" annee: ");    scanf("%d",&V[i].mod.annee);
     printf("Carburant: "); scanf("%s",V[i].carburant);
     printf("Etat : ");     scanf("%s",V[i].etat);
     printf("Nb cv: ");     scanf("%d",&V[i].fiscale);
     printf("Matricule :"); scanf("%s",V[i].Matricule);
   }
 }

2)

void  afficher (Vehicule V[max],int N){
 int i;
  for ( i=0; i<N ; i++)
   { printf("Nom et prenom: %s\n",V[i].nom_prenom);
     printf("CIN: %s\n",V[i].CIN);
     printf("Model: %d/%d \n",V[i].mod.mois,V[i].mod.annee);  
     printf("Carburant: %s \n",V[i].carburant);
     printf("Etat : %s \n",V[i].etat);
     printf("Nb cv: %d \n",V[i].fiscale);
     printf("Matricle:%s \n",V[i].Matricule);
     printf("**************************\n");
   }
 }

3)

int rechercher (Vehicule V[max], int N,char  m[40])  
 {  int i,existe=0;
    for ( i=0; i<N ; i++) {
    if( strcmp(V[i].Matricule,m)==0) 
        existe=1; 
     }
    return existe;  
 }


4)

void  ajouter_vehicule(Vehicule V[max],int *N,Vehicule vc)
 {   int i;
     if(rechercher(V,*N,vc.Matricule)== 1) 
      { for( i=0; i < *N; i++)
         { if( strcmp(V[i].Matricule,vc.Matricule)==0) 
            { strcpy(V[i].nom_prenom,vc.nom_prenom) ; 
              strcpy(V[i].CIN,vc.CIN);
            }  
          } 
     }else
        { V[*N] = vc ;   (*N)++; }  
 }

5)

void   supprimer (Vehicule V[max],int *N,int annee)  
{ int i,j;
   for ( i=0; i<*N ; i++)
     {if(annee-V[i].mod.annee>=25)
        {    
           for (j=i;j<*N ;j++)   V[j] = V[j+1];
              (*N)--;   i--; 
        }
    }
 }