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) 


<< Les Fonctions en C >>

Exercice 52

É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 53

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

Exercice 54

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

Exercice 55

É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 56

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

Exercice 57

É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 58

É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 59

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

Exercice 60

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

Exercice 61

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

Exercice 62

É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 63

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

(Solution)

Exercice 64

É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 65

É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 66

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

Exercice 67

É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 68
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 69
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 70

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 71

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 72

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