### **Correction des Exercices**
---
## **Exercice 1 : Gestion d’un catalogue de produits**
### **Partie 1 : Déclaration et initialisation**
```c
#include <stdio.h>
#include <string.h>
#define MAX_PRODUITS 10
typedef struct {
int id;
char nom[50];
float prix;
int stock;
} Produit;
Produit catalogue[MAX_PRODUITS] = {
{1, "Laptop", 999.99, 5},
{2, "Smartphone", 599.99, 10},
{3, "Tablette", 299.99, 8},
{4, "Casque", 99.99, 15},
{5, "Souris", 19.99, 20},
// Ajoutez d'autres produits si nécessaire
};
```
### **Partie 2 : Fonctions de manipulation**
```c
void afficherProduit(Produit p) {
printf("ID: %d\nNom: %s\nPrix: %.2f\nStock: %d\n\n", p.id, p.nom, p.prix, p.stock);
}
void afficherCatalogue() {
printf("\n--- CATALOGUE ---\n");
for (int i = 0; i < MAX_PRODUITS; i++) {
if (catalogue[i].id != 0) { // Ignore les emplacements vides
afficherProduit(catalogue[i]);
}
}
}
void rechercherProduit() {
int id;
printf("Entrez l'ID du produit : ");
scanf("%d", &id);
for (int i = 0; i < MAX_PRODUITS; i++) {
if (catalogue[i].id == id) {
afficherProduit(catalogue[i]);
return;
}
}
printf("Produit non trouvé.\n");
}
```
### **Partie 3 : Modification interactive**
```c
void modifierPrix() {
int id;
float nouveauPrix;
printf("Entrez l'ID du produit : ");
scanf("%d", &id);
for (int i = 0; i < MAX_PRODUITS; i++) {
if (catalogue[i].id == id) {
printf("Nouveau prix : ");
scanf("%f", &nouveauPrix);
catalogue[i].prix = nouveauPrix;
printf("Prix mis à jour.\n");
return;
}
}
printf("Produit non trouvé.\n");
}
void ajouterStock() {
int id, quantite;
printf("Entrez l'ID du produit : ");
scanf("%d", &id);
for (int i = 0; i < MAX_PRODUITS; i++) {
if (catalogue[i].id == id) {
printf("Quantité à ajouter : ");
scanf("%d", &quantite);
catalogue[i].stock += quantite;
printf("Stock mis à jour.\n");
return;
}
}
printf("Produit non trouvé.\n");
}
```
### **Partie 4 : Menu principal**
```c
int main() {
int choix;
do {
printf("\n--- MENU ---\n");
printf("1. Afficher le catalogue\n");
printf("2. Rechercher un produit\n");
printf("3. Modifier le prix d'un produit\n");
printf("4. Ajouter du stock\n");
printf("5. Quitter\n");
printf("Choix : ");
scanf("%d", &choix);
switch (choix) {
case 1: afficherCatalogue(); break;
case 2: rechercherProduit(); break;
case 3: modifierPrix(); break;
case 4: ajouterStock(); break;
case 5: printf("Au revoir !\n"); break;
default: printf("Choix invalide.\n");
}
} while (choix != 5);
return 0;
}
```
---
## **Exercice 2 : Gestion d’étudiants avec calculs statistiques**
### **Partie 1 : Déclaration et saisie**
```c
#include <stdio.h>
#include <string.h>
#define NB_ETUDIANTS 5
#define NB_NOTES 5
typedef struct {
char nom[30];
float notes[NB_NOTES];
float moyenne;
} Etudiant;
void saisirEtudiants(Etudiant etudiants[]) {
for (int i = 0; i < NB_ETUDIANTS; i++) {
printf("\nÉtudiant %d\n", i + 1);
printf("Nom : ");
scanf("%s", etudiants[i].nom);
printf("Notes (5 matières) : ");
for (int j = 0; j < NB_NOTES; j++) {
scanf("%f", &etudiants[i].notes[j]);
}
}
}
```
### **Partie 2 : Calculs et affichage**
```c
void calculerMoyenne(Etudiant *e) {
float somme = 0;
for (int i = 0; i < NB_NOTES; i++) {
somme += e->notes[i];
}
e->moyenne = somme / NB_NOTES;
}
void afficherEtudiants(Etudiant etudiants[]) {
printf("\n--- LISTE DES ÉTUDIANTS ---\n");
for (int i = 0; i < NB_ETUDIANTS; i++) {
calculerMoyenne(&etudiants[i]);
printf("%s : Moyenne = %.2f\n", etudiants[i].nom, etudiants[i].moyenne);
}
}
Etudiant meilleurEtudiant(Etudiant etudiants[]) {
Etudiant meilleur = etudiants[0];
for (int i = 1; i < NB_ETUDIANTS; i++) {
if (etudiants[i].moyenne > meilleur.moyenne) {
meilleur = etudiants[i];
}
}
return meilleur;
}
```
### **Partie 3 : Statistiques avancées**
```c
float moyenneClasse(Etudiant etudiants[]) {
float somme = 0;
for (int i = 0; i < NB_ETUDIANTS; i++) {
somme += etudiants[i].moyenne;
}
return somme / NB_ETUDIANTS;
}
void rechercherEtudiant(Etudiant etudiants[]) {
char nomRecherche[30];
printf("Nom de l'étudiant : ");
scanf("%s", nomRecherche);
for (int i = 0; i < NB_ETUDIANTS; i++) {
if (strcmp(etudiants[i].nom, nomRecherche) == 0) {
printf("Notes : ");
for (int j = 0; j < NB_NOTES; j++) {
printf("%.1f ", etudiants[i].notes[j]);
}
printf("\nMoyenne : %.2f\n", etudiants[i].moyenne);
return;
}
}
printf("Étudiant non trouvé.\n");
}
```
### **Partie 4 : Menu interactif**
```c
int main() {
Etudiant etudiants[NB_ETUDIANTS];
saisirEtudiants(etudiants);
int choix;
do {
printf("\n--- MENU ---\n");
printf("1. Afficher tous les étudiants\n");
printf("2. Afficher le meilleur étudiant\n");
printf("3. Afficher la moyenne de la classe\n");
printf("4. Rechercher un étudiant\n");
printf("5. Quitter\n");
printf("Choix : ");
scanf("%d", &choix);
switch (choix) {
case 1: afficherEtudiants(etudiants); break;
case 2: {
Etudiant meilleur = meilleurEtudiant(etudiants);
printf("Meilleur étudiant : %s (Moyenne = %.2f)\n", meilleur.nom, meilleur.moyenne);
break;
}
case 3: printf("Moyenne de la classe : %.2f\n", moyenneClasse(etudiants)); break;
case 4: rechercherEtudiant(etudiants); break;
case 5: printf("Au revoir !\n"); break;
default: printf("Choix invalide.\n");
}
} while (choix != 5);
return 0;
}
```
---
## **Exercice 3 : Système de gestion d’employés avec dates**
### **Partie 1 : Structures imbriquées**
```c
#include <stdio.h>
#include <string.h>
#include <time.h>
#define NB_EMPLOYES 5
typedef struct {
int jour, mois, annee;
} Date;
typedef struct {
char nom[30];
float salaire;
Date dateEmbauche;
} Employe;
Employe equipe[NB_EMPLOYES] = {
{"Dupont", 2500.0, {15, 10, 2010}},
{"Martin", 1800.0, {20, 5, 2015}},
{"Durand", 3000.0, {10, 3, 2008}},
{"Leroy", 2200.0, {5, 12, 2019}},
{"Moreau", 1900.0, {30, 7, 2017}}
};
```
### **Partie 2 : Affichage et recherche**
```c
void afficherEmploye(Employe e) {
printf("Nom: %s\nSalaire: %.2f\nDate d'embauche: %02d/%02d/%04d\n\n",
e.nom, e.salaire, e.dateEmbauche.jour, e.dateEmbauche.mois, e.dateEmbauche.annee);
}
void afficherEquipe() {
printf("\n--- ÉQUIPE ---\n");
for (int i = 0; i < NB_EMPLOYES; i++) {
afficherEmploye(equipe[i]);
}
}
void rechercherEmploye() {
char nomRecherche[30];
printf("Nom de l'employé : ");
scanf("%s", nomRecherche);
for (int i = 0; i < NB_EMPLOYES; i++) {
if (strcmp(equipe[i].nom, nomRecherche) == 0) {
afficherEmploye(equipe[i]);
return;
}
}
printf("Employé non trouvé.\n");
}
```
### **Partie 3 : Ancienneté et augmentation**
```c
int anciennete(Employe e) {
time_t now = time(NULL);
struct tm *tm_now = localtime(&now);
int anneeActuelle = tm_now->tm_year + 1900;
return anneeActuelle - e.dateEmbauche.annee;
}
void augmenterSalaire() {
printf("\n--- AUGMENTATION POUR ANCIENNETÉ > 5 ANS ---\n");
for (int i = 0; i < NB_EMPLOYES; i++) {
if (anciennete(equipe[i]) > 5) {
equipe[i].salaire *= 1.05; // +5%
printf("%s : Nouveau salaire = %.2f\n", equipe[i].nom, equipe[i].salaire);
}
}
}
```
### **Partie 4 : Menu principal**
```c
int main() {
int choix;
do {
printf("\n--- MENU ---\n");
printf("1. Afficher tous les employés\n");
printf("2. Rechercher un employé\n");
printf("3. Calculer l'ancienneté d'un employé\n");
printf("4. Appliquer une augmentation\n");
printf("5. Quitter\n");
printf("Choix : ");
scanf("%d", &choix);
switch (choix) {
case 1: afficherEquipe(); break;
case 2: rechercherEmploye(); break;
case 3: {
char nom[30];
printf("Nom de l'employé : ");
scanf("%s", nom);
for (int i = 0; i < NB_EMPLOYES; i++) {
if (strcmp(equipe[i].nom, nom) == 0) {
printf("Ancienneté : %d ans\n", anciennete(equipe[i]));
break;
}
}
break;
}
case 4: augmenterSalaire(); break;
case 5: printf("Au revoir !\n"); break;
default: printf("Choix invalide.\n");
}
} while (choix != 5);
return 0;
}
```
---