#include <stdio.
h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char matricule[10];
char nom[50];
char prenom[50];
char dateNaissance[11];
char nomsModules[5][50]; // Noms des modules
float notes[5][3]; // Notes (Cours, TD, TP)
float moyenneSemestre;
int aReussi; // 1 si la moyenne >= 10, 0 sinon
} Etudiant;
void trim(char *str) {
char *end;
// Supprimer les espaces à la fin
end = str + strlen(str) - 1;
while (end > str && (*end == ' ' || *end == '\n' || *end == '\r')) {
*end = '\0';
end--;
}
}
void saisirModules(Etudiant *etudiant, int moduleCount) {
for (int i = 0; i < moduleCount; i++) {
printf("Nom du module %d : ", i + 1);
scanf("%s", etudiant->nomsModules[i]);
printf("Module %d - Note cours: ", i + 1);
scanf("%f", &etudiant->notes[i][0]);
printf("Module %d - Note TD: ", i + 1);
scanf("%f", &etudiant->notes[i][1]);
printf("Module %d - Note TP (entrez -1 si pas de TP): ", i + 1);
scanf("%f", &etudiant->notes[i][2]);
}
}
void saisirEtudiant(Etudiant *etudiant, int moduleCount) {
printf("Matricule: ");
scanf("%s", etudiant->matricule);
getchar(); // Pour consommer le caractère '\n' restant
printf("Nom: ");
fgets(etudiant->nom, sizeof(etudiant->nom), stdin);
trim(etudiant->nom); // Supprimer les espaces ou '\n' à la fin
printf("Prenom: ");
fgets(etudiant->prenom, sizeof(etudiant->prenom), stdin);
trim(etudiant->prenom);
printf("Date de naissance (JJ/MM/AAAA): ");
fgets(etudiant->dateNaissance, sizeof(etudiant->dateNaissance), stdin);
trim(etudiant->dateNaissance);
saisirModules(etudiant, moduleCount);
}
float calculerMoyenneModule(float notes[], float coefficient) {
float moyenne;
if (notes[2] != -1) { // Si le TP est inclus
moyenne = 0.4 * notes[0] + 0.4 * notes[1] + 0.2 * notes[2];
} else {
moyenne = 0.5 * notes[0] + 0.5 * notes[1];
}
return moyenne * coefficient; // Moyenne pondérée par le coefficient
}
void calculerMoyenneSemestre(Etudiant *etudiant, float coefficients[], int
moduleCount) {
float sommePonderee = 0;
float sommeCoefficients = 0;
for (int i = 0; i < moduleCount; i++) {
float moyenneModule = calculerMoyenneModule(etudiant->notes[i],
coefficients[i]);
sommePonderee += moyenneModule;
sommeCoefficients += coefficients[i];
}
etudiant->moyenneSemestre = sommePonderee / sommeCoefficients;
etudiant->aReussi = (etudiant->moyenneSemestre >= 10);
}
void sauvegarderEtudiant(Etudiant etudiant, const char *nomFichier, int
moduleCount) {
FILE *fichier = fopen(nomFichier, "a");
if (fichier == NULL) {
printf("Erreur lors de l'ouverture du fichier.\n");
return;
}
fprintf(fichier, "%s;%s;%s;%s;%.2f;%s\n",
etudiant.matricule, etudiant.nom, etudiant.prenom,
etudiant.dateNaissance, etudiant.moyenneSemestre,
etudiant.aReussi ? "Reussi" : "Echoue");
for (int i = 0; i < moduleCount; i++) {
fprintf(fichier, "%s;Cours: %.2f;TD: %.2f;TP: %.2f\n",
etudiant.nomsModules[i],
etudiant.notes[i][0],
etudiant.notes[i][1],
etudiant.notes[i][2]);
}
fprintf(fichier, "----------------------------------\n");
fclose(fichier);
}
void rechercherEtudiant(const char *nomFichier, const char *matriculeRecherche) {
FILE *fichier = fopen(nomFichier, "r");
if (fichier == NULL) {
printf("Erreur lors de l'ouverture du fichier.\n");
return;
}
char ligne[256];
int trouve = 0;
while (fgets(ligne, sizeof(ligne), fichier)) {
char matricule[10], nom[50], prenom[50], dateNaissance[11], resultat[10];
float moyenne;
if (sscanf(ligne, "%[^;];%[^;];%[^;];%[^;];%f;%[^;]",
matricule, nom, prenom, dateNaissance, &moyenne, resultat) == 6)
{
trim(resultat);
if (strcmp(matricule, matriculeRecherche) == 0) {
printf("\nEtudiant trouve :\n");
printf("Matricule : %s\n", matricule);
printf("Nom : %s\n", nom);
printf("Prenom : %s\n", prenom);
printf("Date de naissance : %s\n", dateNaissance);
printf("Moyenne semestrielle : %.2f\n", moyenne);
printf("Resultat : %s\n\n", strcmp(resultat, "Reussi") == 0 ?
"Reussi" : "Echoue");
printf("Modules et notes :\n");
while (fgets(ligne, sizeof(ligne), fichier)) {
if (strstr(ligne, "----------------------------------")) {
break;
}
char module[50];
float cours, td, tp;
sscanf(ligne, "%[^;];Cours: %f;TD: %f;TP: %f", module, &cours,
&td, &tp);
printf("- %s : Cours = %.2f, TD = %.2f, TP = %.2f\n",
module, cours, td, tp);
}
trouve = 1;
break;
}
}
}
if (!trouve) {
printf("Etudiant non trouve.\n");
}
fclose(fichier);
}
void compterEtudiantsReussis(const char *nomFichier) {
FILE *fichier = fopen(nomFichier, "r");
if (fichier == NULL) {
printf("Erreur lors de l'ouverture du fichier.\n");
return;
}
char ligne[256];
int compteur = 0;
float moyenne = 0.0;
while (fgets(ligne, sizeof(ligne), fichier)) {
if (sscanf(ligne, "%*[^;];%*[^;];%*[^;];%*[^;];%f;%*[^;]", &moyenne) == 1)
{
if (moyenne >= 10.0) {
compteur++;
}
}
}
printf("\nNombre d'etudiants ayant une moyenne >= 10 : %d\n", compteur);
fclose(fichier);
}
// Fonction pour trier les étudiants par moyenne décroissante
int comparerMoyennes(const void *a, const void *b) {
Etudiant *etudiantA = (Etudiant *)a;
Etudiant *etudiantB = (Etudiant *)b;
return (etudiantB->moyenneSemestre - etudiantA->moyenneSemestre) > 0 ? 1 : -1;
}
// Fonction pour afficher les étudiants triés par moyenne décroissante
void classerEtudiantsParMoyenne(const char *nomFichier, int moduleCount) {
FILE *fichier = fopen(nomFichier, "r");
if (fichier == NULL) {
printf("Erreur lors de l'ouverture du fichier.\n");
return;
}
Etudiant etudiants[100]; // Limiter à 100 étudiants (peut être ajusté)
int count = 0;
char ligne[256];
// Lire le fichier ligne par ligne
while (fgets(ligne, sizeof(ligne), fichier)) {
// Lire les informations générales de l'étudiant
char matricule[10], nom[50], prenom[50], dateNaissance[11], resultat[10];
float moyenne;
// Si la ligne contient les informations de l'étudiant (6 éléments)
if (sscanf(ligne, "%[^;];%[^;];%[^;];%[^;];%f;%[^;]", matricule, nom,
prenom, dateNaissance, &moyenne, resultat) == 6) {
// Stocker l'étudiant dans le tableau
strcpy(etudiants[count].matricule, matricule);
strcpy(etudiants[count].nom, nom);
strcpy(etudiants[count].prenom, prenom);
strcpy(etudiants[count].dateNaissance, dateNaissance);
etudiants[count].moyenneSemestre = moyenne;
trim(resultat);
etudiants[count].aReussi = (strcmp(resultat, "Reussi") == 0) ? 1 : 0;
count++;
}
// Ignorer les lignes de séparation
if (strstr(ligne, "----------------------------------")) {
continue;
}
}
fclose(fichier);
// Trier les étudiants par moyenne décroissante
qsort(etudiants, count, sizeof(Etudiant), comparerMoyennes);
// Afficher les étudiants triés
printf("\nClassement des etudiants par moyenne décroissante:\n");
for (int i = 0; i < count; i++) {
printf("%d. Matricule: %s, Nom: %s, Prenom: %s, Moyenne: %.2f, Resultat:
%s\n",
i + 1, etudiants[i].matricule, etudiants[i].nom,
etudiants[i].prenom,
etudiants[i].moyenneSemestre, etudiants[i].aReussi ? "Reussi" :
"Echoue");
}
printf("\nFin du classement. Retour au menu principal.\n");
}
int main() {
const char *nomFichier = "etudiants.txt";
Etudiant etudiant;
int moduleCount = 0; // Initialisation à 0 pour vérifier si le nombre de
modules a déjà été défini
float *coefficients = NULL; // Utilisation d'un pointeur pour pouvoir allouer
dynamiquement la mémoire
// Demander le nombre de modules et les coefficients si ce n'est pas encore
fait
if (moduleCount == 0) {
printf("Entrez le nombre de modules : ");
scanf("%d", &moduleCount);
// Allocation dynamique pour les coefficients
coefficients = (float *)malloc(moduleCount * sizeof(float));
for (int i = 0; i < moduleCount; i++) {
printf("Entrez le coefficient pour le module %d : ", i + 1);
scanf("%f", &coefficients[i]);
}
}
int choix;
do {
printf("\n===== Gestion des Etudiants =====\n");
printf("1. Saisir un etudiant\n");
printf("2. Calculer la moyenne d'un etudiant\n");
printf("3. Sauvegarder un etudiant dans le fichier\n");
printf("4. Rechercher un etudiant par matricule\n");
printf("5. Compter les etudiants ayant la moyenne >= 10\n");
printf("6. Classer les etudiants par moyenne décroissante\n");
printf("7. Quitter\n");
printf("Votre choix : ");
scanf("%d", &choix);
switch (choix) {
case 1:
printf("\n--- Saisie d'un etudiant ---\n");
saisirEtudiant(&etudiant, moduleCount);
break;
case 2:
printf("\n--- Calcul de la moyenne de l'etudiant ---\n");
calculerMoyenneSemestre(&etudiant, coefficients, moduleCount);
printf("Moyenne semestrielle : %.2f\n", etudiant.moyenneSemestre);
printf("Resultat : %s\n", etudiant.aReussi ? "Reussi" : "Echoue");
break;
case 3:
printf("\n--- Sauvegarde de l'etudiant dans le fichier ---\n");
sauvegarderEtudiant(etudiant, nomFichier, moduleCount);
printf("Etudiant sauvegarde avec succes.\n");
break;
case 4:
printf("\n--- Recherche d'un etudiant par matricule ---\n");
char matriculeRecherche[10];
printf("Entrez le matricule a rechercher : ");
scanf("%s", matriculeRecherche);
rechercherEtudiant(nomFichier, matriculeRecherche);
break;
case 5:
printf("\n--- Nombre d'etudiants ayant la moyenne >= 10 ---\n");
compterEtudiantsReussis(nomFichier);
break;
case 6:
printf("\n--- Classement des etudiants par moyenne décroissante
---\n");
classerEtudiantsParMoyenne(nomFichier, moduleCount);
break;
case 7:
printf("\nAu revoir !\n");
break;
default:
printf("\nChoix invalide. Veuillez reessayer.\n");
}
} while (choix != 7); // Remarquez que la boucle se termine lorsque
l'utilisateur choisit "Quitter"
// Libération de la mémoire allouée
free(coefficients);
return 0;
}