#include <stdio.
h> // Pour les fonctions d'entrée/sortie : printf, scanf,
fopen, etc.
#include <stdlib.h> // Pour les fonctions utilitaires (non utilisées ici)
#include <string.h> // Pour manipuler les chaînes de caractères : strcmp,
fgets, etc.
#define MAX_NAME 100 // Taille maximale pour le nom d’un étudiant
#define MAX_STUDENTS 100 // Nombre maximum d’étudiants gérés
// Définition de la structure d’un étudiant
typedef struct {
int id; // Identifiant unique
char name[MAX_NAME]; // Nom de l'étudiant
float grade; // Note de l'étudiant
} Student;
// Déclaration du tableau des étudiants et du compteur global
Student students[MAX_STUDENTS];
int student_count = 0; // Nombre d’étudiants actuellement enregistrés
// ➕ Ajouter un étudiant
void add_student() {
if (student_count >= MAX_STUDENTS) { // Vérifie si le tableau est plein
printf("Nombre maximum d'étudiants atteint.\n");
return;
}
Student s;
printf("ID de l'étudiant : ");
scanf("%d", &[Link]); // Lecture de l'ID
getchar(); // Consomme le caractère \n restant dans le buffer
printf("Nom de l'étudiant : ");
fgets([Link], MAX_NAME, stdin); // Lecture du nom
[Link][strcspn([Link], "\n")] = 0; // Suppression du \n à la fin
printf("Note de l'étudiant : ");
scanf("%f", &[Link]); // Lecture de la note
students[student_count++] = s; // Ajout de l’étudiant au tableau
printf("✅ Étudiant ajouté avec succès.\n");
}
// 📋 Afficher tous les étudiants
void display_students() {
if (student_count == 0) {
printf("Aucun étudiant enregistré.\n");
return;
}
printf("\n📋 Liste des étudiants :\n");
for (int i = 0; i < student_count; i++) {
printf("ID: %d | Nom: %s | Note: %.2f\n", students[i].id, students[i].name,
students[i].grade);
}
}
// 💾 Sauvegarde les étudiants dans un fichier texte
void save_to_file(const char *filename) {
FILE *file = fopen(filename, "w"); // Ouvre le fichier en écriture
if (!file) {
printf("❌ Erreur d'ouverture du fichier.\n");
return;
}
for (int i = 0; i < student_count; i++) {
fprintf(file, "%d,%s,%.2f\n", students[i].id, students[i].name,
students[i].grade);
}
fclose(file); // Ferme le fichier
printf("💾 Données sauvegardées dans '%s'.\n", filename);
}
// 📂 Charge les étudiants depuis un fichier texte
void load_from_file(const char *filename) {
FILE *file = fopen(filename, "r"); // Ouvre le fichier en lecture
if (!file) {
printf("⚠️ Fichier non trouvé. Aucun étudiant chargé.\n");
return;
}
student_count = 0;
// Lit chaque ligne du fichier et l'ajoute au tableau
while (fscanf(file, "%d,%99[^,],%f\n",
&students[student_count].id,
students[student_count].name,
&students[student_count].grade) == 3) {
student_count++;
}
fclose(file);
printf("📂 %d étudiants chargés depuis '%s'.\n", student_count, filename);
}
// 🔠 Trie les étudiants par nom (ordre alphabétique)
void sort_students_by_name() {
for (int i = 0; i < student_count - 1; i++) {
for (int j = i + 1; j < student_count; j++) {
if (strcmp(students[i].name, students[j].name) > 0) {
// Échange si le nom est "plus grand"
Student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
printf("🔠 Étudiants triés par nom.\n");
}
// 🧭 Menu principal
void menu() {
int choice;
const char *filename = "[Link]"; // Nom du fichier de sauvegarde
do {
// Affiche le menu
printf("\n=== Student Manager ===\n");
printf("1. Ajouter un étudiant\n");
printf("2. Afficher les étudiants\n");
printf("3. Trier les étudiants par nom\n");
printf("4. Sauvegarder dans un fichier\n");
printf("5. Charger depuis un fichier\n");
printf("0. Quitter\n");
printf("Votre choix : ");
scanf("%d", &choice);
getchar(); // Nettoie le buffer clavier
// Traite le choix de l'utilisateur
switch (choice) {
case 1: add_student(); break;
case 2: display_students(); break;
case 3: sort_students_by_name(); break;
case 4: save_to_file(filename); break;
case 5: load_from_file(filename); break;
case 0: printf("👋 Au revoir !\n"); break;
default: printf("❌ Choix invalide.\n");
}
} while (choice != 0); // Continue tant que l’utilisateur ne choisit pas 0
}
// 🔓 Point d’entrée du programme
int main() {
menu();
return 0;
}