Vous êtes sur la page 1sur 15

Rapport du TP 5

• Travail demandé:
Lors de cette séance de travaux pratiques, nous avons été demandés de
traiter un exercice qui permet de gérer les indemnités allouées aux
employés d’un groupe industriel appelé MotoProd.

1. Déclaration des variables et des pointeurs :

À l'intérieur de la fonction main(), nous déclarons plusieurs variables, y


compris nbWorkshops pour stocker le nombre d'ateliers de fabrication,
nomAF et nomSuperviseur pour stocker les noms des ateliers et de leurs
superviseurs, respectivement. Nous utilisons des pointeurs pour stocker
les noms des employés (nomE) et les indices des pièces fabriquées
(indiceP). Nous utilisons également des pointeurs pour stocker le nombre
de pièces fabriquées par chaque employé (npf) et le nombre total
d'employés dans chaque atelier (nbEmployes). Enfin, nous déclarons une
variable indemnite de type float pour stocker l'indemnité totale accordée
aux employés.

int main() {
int nbWorkshops;
char **nomAF, **nomSuperviseur, ***nomE, *indiceP;
int **npf, *nbEmployes;
float indemnite;

2. Allocation dynamique de mémoire pour les tableaux :


Ici, nous allouons dynamiquement de la mémoire pour stocker les
informations sur les ateliers de fabrication et leurs employés. Nous
utilisons la fonction ‘malloc()’ pour réserver de l'espace mémoire
nécessaire pour chaque tableau en fonction du nombre d'ateliers
(nbWorkshops).
// Allocation dynamique de mémoire pour les tableaux
nomAF = (char **)malloc(nbWorkshops * sizeof(char *));
nomSuperviseur = (char **)malloc(nbWorkshops * sizeof(char *));
nomE = (char ***)malloc(nbWorkshops * sizeof(char **));
indiceP = (char *)malloc(nbWorkshops * sizeof(char));
npf = (int **)malloc(nbWorkshops * sizeof(int *));
nbEmployes = (int *)malloc(nbWorkshops * sizeof(int));

3. Parcours des ateliers de fabrication :


Dans cette partie du code, nous parcourons les ateliers de
fabrication à l'aide d'une boucle for. Pour chaque atelier, nous
allouons dynamiquement de la mémoire pour stocker le nom de
l'atelier nomAF[i] et le nom du superviseur nomSuperviseur[i]
à l'aide de la fonction malloc.

// Parcours des ateliers de fabrication


for (int i = 0; i < nbWorkshops; i++) {
nomAF[i] = (char *)malloc(50 * sizeof(char));
nomSuperviseur[i] = (char *)malloc(50 * sizeof(char));

printf("\nNom de l'atelier : ");


scanf("%s", nomAF[i]);

printf("Nom du superviseur de l'atelier %s : ", nomAF[i]);


scanf("%s", nomSuperviseur[i]);

printf("Nombre d'employés de fabrication dans %s : ", nomAF[i]);


scanf("%d", &nbEmployes[i]);

4. Allocation dynamique de mémoire pour les employés :


Nous effectuons une allocation dynamique de mémoire pour chaque atelier de fabrication.
Pour chaque atelier, nous allouons de l'espace mémoire pour deux tableaux :

• nomE[i] : Un tableau de pointeurs vers des chaînes de caractères. Chaque pointeur


représente le nom d'un employé de fabrication dans cet atelier.
• npf[i] : Un tableau d'entiers. Chaque entier représente le nombre de pièces
fabriquées par l'employé correspondant dans cet atelier.

// Allocation dynamique de mémoire pour les employés


nomE[i] = (char **)malloc(nbEmployes[i] * sizeof(char *));
npf[i] = (int *)malloc(nbEmployes[i] * sizeof(int));
5. Parcours des employés de chaque atelier :
nous parcourons les employés de chaque atelier de fabrication à l'aide d'une boucle for.
Pour chaque employé, nous allouons dynamiquement de la mémoire pour stocker son
nom nomE[i][j] à l'aide de la fonction malloc().Nous répétons ce processus pour
chaque employé dans chaque atelier de fabrication. Une fois que nous avons récupéré
les informations sur chaque employé, nous calculons l'indemnité qui lui est accordée en
fonction de l'indice attribué à ses pièces fabriquées. Enfin, nous affichons le nom de
l'employé et l'indemnité qui lui est accordée.

// Parcours des employés de chaque atelier


for (int j = 0; j < nbEmployes[i]; j++) {
nomE[i][j] = (char *)malloc(50 * sizeof(char));

printf("\nNom de l'employé : ");


scanf("%s", nomE[i][j]);

printf("Nombre de pièces fabriquées par %s : ", nomE[i][j]);


scanf("%d", &npf[i][j]);

printf("Indice accordé (A, B ou C) : ");


scanf(" %c", &indiceP[i]);

// Calcul de l'indemnité
switch(indiceP[i]) {
case 'A':
indemnite = npf[i][j] * TAUX_A;
break;
case 'B':
indemnite = npf[i][j] * TAUX_B;
break;
case 'C':
indemnite = npf[i][j] * TAUX_C;
break;
default:
printf("Indice invalide.\n");
continue;
}

printf("L'indemnité accordée à %s est de %.2f DH\n",


nomE[i][j], indemnite);
}
}
6. Affichage des informations stockées :
Ici, nous affichons les informations stockées pour chaque atelier de fabrication et ses
employés. Nous utilisons une boucle for pour parcourir chaque atelier.

// Affichage des informations stockées


printf("\n--- Informations stockées ---\n");
for (int i = 0; i < nbWorkshops; i++) {
printf("\nAtelier : %s\n", nomAF[i]);
printf("Superviseur : %s\n", nomSuperviseur[i]);
for (int j = 0; j < nbEmployes[i]; j++) {
printf("Nom de l'employé : %s\n", nomE[i][j]);
printf("Nombre de pièces fabriquées : %d\n",
npf[i][j]);
printf("Indice accordé : %c\n", indiceP[i]);
switch(indiceP[i]) {
case 'A':
indemnite = npf[i][j] * TAUX_A;
break;
case 'B':
indemnite = npf[i][j] * TAUX_B;
break;
case 'C':
indemnite = npf[i][j] * TAUX_C;
break;
default:
printf("Indice invalide.\n");
continue;
}
printf("L'indemnité accordée à %s est de %.2f DH\n",
nomE[i][j], indemnite);
}}
7. Libération de la mémoire allouée :

// Libération de la mémoire allouée


for (int i = 0; i < nbWorkshops; i++) {
free(nomAF[i]);
free(nomSuperviseur[i]);
for (int j = 0; j < nbEmployes[i]; j++) {
free(nomE[i][j]);
}
free(nomE[i]);
free(npf[i]);
}
free(nomAF);free(nomSuperviseur);free(nomE);
free(npf);free(indiceP);free(nbEmployes);
8. Code complet :

#include <stdio.h>
#include <stdlib.h>

#define TAUX_A 20
#define TAUX_B 10
#define TAUX_C 5

int main() {
int nbWorkshops;
char **nomAF, **nomSuperviseur, ***nomE, *indiceP;
int **npf, *nbEmployes;
float indemnite;

printf("Entrez le nombre d'ateliers de fabrication : ");


scanf("%d", &nbWorkshops);

// Allocation dynamique de mémoire pour les tableaux


nomAF = (char **)malloc(nbWorkshops * sizeof(char *));
nomSuperviseur = (char **)malloc(nbWorkshops * sizeof(char
*));
nomE = (char ***)malloc(nbWorkshops * sizeof(char **));
indiceP = (char *)malloc(nbWorkshops * sizeof(char));
npf = (int **)malloc(nbWorkshops * sizeof(int *));
nbEmployes = (int *)malloc(nbWorkshops * sizeof(int));

// Parcours des ateliers de fabrication


for (int i = 0; i < nbWorkshops; i++) {
nomAF[i] = (char *)malloc(50 * sizeof(char));
nomSuperviseur[i] = (char *)malloc(50 * sizeof(char));

printf("\nNom de l'atelier : ");


scanf("%s", nomAF[i]);

printf("Nom du superviseur de l'atelier %s : ",


nomAF[i]);
scanf("%s", nomSuperviseur[i]);

printf("Nombre d'employés de fabrication dans %s : ",


nomAF[i]);
scanf("%d", &nbEmployes[i]);

// Allocation dynamique de mémoire pour les employés


nomE[i] = (char **)malloc(nbEmployes[i] * sizeof(char
*));
npf[i] = (int *)malloc(nbEmployes[i] * sizeof(int));

// Parcours des employés de chaque atelier


for (int j = 0; j < nbEmployes[i]; j++) {
nomE[i][j] = (char *)malloc(50 * sizeof(char));

printf("\nNom de l'employé : ");


scanf("%s", nomE[i][j]);

printf("Nombre de pièces fabriquées par %s : ",


nomE[i][j]);
scanf("%d", &npf[i][j]);

printf("Indice accordé (A, B ou C) : ");


scanf(" %c", &indiceP[i]);

// Calcul de l'indemnité
switch(indiceP[i]) {
case 'A':
indemnite = npf[i][j] * TAUX_A;
break;
case 'B':
indemnite = npf[i][j] * TAUX_B;
break;
case 'C':
indemnite = npf[i][j] * TAUX_C;
break;
default:
printf("Indice invalide.\n");
continue;
}

printf("L'indemnité accordée à %s est de %.2f DH\n",


nomE[i][j], indemnite);
}
}

// Affichage des informations stockées


printf("\n--- Informations stockées ---\n");
for (int i = 0; i < nbWorkshops; i++) {
printf("\nAtelier : %s\n", nomAF[i]);
printf("Superviseur : %s\n", nomSuperviseur[i]);
for (int j = 0; j < nbEmployes[i]; j++) {
printf("Nom de l'employé : %s\n", nomE[i][j]);
printf("Nombre de pièces fabriquées : %d\n",
npf[i][j]);
printf("Indice accordé : %c\n", indiceP[i]);
switch(indiceP[i]) {
case 'A':
indemnite = npf[i][j] * TAUX_A;
break;
case 'B':
indemnite = npf[i][j] * TAUX_B;
break;
case 'C':
indemnite = npf[i][j] * TAUX_C;
break;
default:
printf("Indice invalide.\n");
continue;
}
printf("L'indemnité accordée à %s est de %.2f DH\n",
nomE[i][j], indemnite);
}
}

// Libération de la mémoire allouée


for (int i = 0; i < nbWorkshops; i++) {
free(nomAF[i]);
free(nomSuperviseur[i]);
for (int j = 0; j < nbEmployes[i]; j++) {
free(nomE[i][j]);
}
free(nomE[i]);
free(npf[i]);
}
free(nomAF);
free(nomSuperviseur);
free(nomE);
free(npf);
free(indiceP);
free(nbEmployes);

return 0;}
9. Compilation du code :
Rapport du TP 6
• Travail demandé:
Ecrire un programme en langage C pour gérer une liste dynamique d'entiers
représentant des prix. Utilisateur devra saisir le montant fixe à ne pas dépasser
.Ensuite, l'utilisateur pourra saisir les prix un par un. Toute allocation de mémoire
pour la liste des prix sera dynamique. Une fois tous les prix saisis, le programme
devra calculer le total des prix et déterminer si ce total dépasse le montant fixé
par l'utilisateur.

1. Fonction pour ajouter un prix à la liste :

La fonction ajouterPrix est chargée d'ajouter un prix à une liste dynamique.


Elle prend trois paramètres en entrée : listePrix, un pointeur vers un
pointeur d'entiers représentant la liste des prix, taille, un pointeur vers un
entier contenant la taille actuelle de la liste, et prix, un entier représentant
le prix à ajouter. La fonction utilise realloc pour réallouer de la mémoire et
agrandir la liste, en ajoutant un nouvel élément pour le prix.

// Fonction pour ajouter un prix à la liste


void ajouterPrix(int** listePrix, int* taille, int prix) {
// Réallouer de la mémoire pour agrandir la liste
*listePrix = realloc(*listePrix, (*taille + 1)* sizeof(int));
if (*listePrix == NULL) {
printf("Erreur d'allocation de mémoire.\n");
exit(EXIT_FAILURE);
}
// Ajouter le prix à la liste et augmenter la taille
(*listePrix)[*taille] = prix;
(*taille)++;
}
2. Fonction pour calculer le total des prix :

La fonction calculerTotal parcourt la liste des prix pour calculer la somme


totale de tous les prix saisis par l'utilisateur. Elle prend deux paramètres en
entrée : listePrix, un pointeur vers un tableau d'entiers représentant les
prix, et taille, un entier indiquant le nombre d'éléments dans le tableau. La
fonction itère à travers chaque prix dans le tableau en ajoutant son
montant au total. Une fois la somme totale calculée, elle la retourne.

// Fonction pour calculer le total des prix


int calculerTotal(int* listePrix, int taille) {
int i,total = 0;
for (i = 0; i < taille; i++) {
total += listePrix[i];
}
return total;
}

3. Fonction pour déterminer si le total des prix dépasse le


montant fixé :

// Fonction pour déterminer si le total des prix dépasse le montant


fixé
int depasseMontant(int* listePrix, int taille, int montantFixe) {
int total = calculerTotal(listePrix, taille);
return total > montantFixe;
}
4. Initialisation de la liste des prix + Saisie du montantfixe +
Saisie des prix :

int main() {
// Initialisation de la liste des prix
int* listePrix = NULL;
int taille = 0;

// Saisie du montant fixe


int montantFixe;
printf("Veuillez saisir le montant fixe : ");
scanf("%d", &montantFixe);

// Saisie des prix


int prix;
do {
printf("Veuillez saisir un prix (saisir 0 pour terminer):
");
scanf("%d", &prix);
if (prix != 0) {
ajouterPrix(&listePrix, &taille, prix);
}
} while (prix != 0);

5. Calcul du total des prix et Libération de la mémoire allouée


pour la liste des prix :

// Calcul du total des prix


int total = calculerTotal(listePrix, taille);

// Vérification si le total dépasse le montant fixé


if (depasseMontant(listePrix, taille, montantFixe)) {
printf("Le total des prix est : %d\n", total);
printf("Le total des prix dépasse le montant fixé de %d\n",
montantFixe);
} else {
printf("Le total des prix est : %d\n", total);
printf("Le total des prix ne dépasse pas le montant fixé de
%d\n", montantFixe);
}

// Libération de la mémoire allouée pour la liste des prix


free(listePrix);
6. Code complet :

#include <stdio.h>
#include <stdlib.h>

// Fonction pour ajouter un prix à la liste


void ajouterPrix(int** listePrix, int* taille, int prix) {
// Réallouer de la mémoire pour agrandir la liste
*listePrix = realloc(*listePrix, (*taille + 1) *
sizeof(int));
if (*listePrix == NULL) {
printf("Erreur d'allocation de mémoire.\n");
exit(EXIT_FAILURE);
}

// Ajouter le prix à la liste et augmenter la taille


(*listePrix)[*taille] = prix;
(*taille)++;
}

// Fonction pour calculer le total des prix


int calculerTotal(int* listePrix, int taille) {
int i,total = 0;
for (i = 0; i < taille; i++) {
total += listePrix[i];
}
return total;
}

// Fonction pour déterminer si le total des prix dépasse le


montant fixé
int depasseMontant(int* listePrix, int taille, int montantFixe) {
int total = calculerTotal(listePrix, taille);
return total > montantFixe;
}

int main() {
// Initialisation de la liste des prix
int* listePrix = NULL;
int taille = 0;

// Saisie du montant fixe


int montantFixe;
printf("Veuillez saisir le montant fixe : ");
scanf("%d", &montantFixe);

// Saisie des prix


int prix;
do {
printf("Veuillez saisir un prix (saisir 0 pour terminer)
scanf("%d", &prix);
if (prix != 0) {
ajouterPrix(&listePrix, &taille, prix);
}
} while (prix != 0);

// Calcul du total des prix


int total = calculerTotal(listePrix, taille);

// Vérification si le total dépasse le montant fixé


if (depasseMontant(listePrix, taille, montantFixe)) {
printf("Le total des prix est : %d\n", total);
printf("Le total des prix dépasse le montant fixé de %d\n",
montantFixe);
} else {
printf("Le total des prix est : %d\n", total);
printf("Le total des prix ne dépasse pas le montant fixé de
%d\n", montantFixe);
}

// Libération de la mémoire allouée pour la liste des prix


free(listePrix);

return 0;
}

7. Compilation du code :

Vous aimerez peut-être aussi