1.
ncludes et définitions globales
#include <stdio.h>
o Inclusion de la bibliothèque standard d’entrées/sorties pour printf,
scanf, etc.
#include <string.h>
o Inclusion pour les fonctions de manipulation de chaînes (strcmp, strlen,
etc.).
#include <time.h>
o Inutile dans le code tel qu’on le voit (pas utilisé ici). Peut être laissé par
habitude.
#define Nb_Matieres 6
o Déclare une constante symbolique Nb_Matieres égale à 6. Sert pour
dimensionner les tableaux de notes et les matières.
#define MAX_Etudiants 2
o Déclare une constante MAX_Etudiants égale à 2. Limite le nombre
d’étudiants que le programme peut gérer.
2. Déclarations globales des matières et crédits
char Matieres[Nb_Matieres][20] =
{ "[Link]","[Link]","[Link]","[Link]","[Link]","
[Link]" };
o Déclare un tableau de chaînes (noms des matières). Chaque nom peut
faire jusqu’à 19 caractères + terminateur nul.
o Contient 6 matières avec un préfixe numérique et le nom de la matière.
int credits[Nb_Matieres] = {8,10,8,15,7,12};
o Déclare un tableau d’entiers représentant les crédits associées à
chaque matière. C’est prêt à être utilisé pour des calculs, mais dans le
code fourni il n’est pas utilisé.
3. Définition de la structure Etudiant
typedef struct {
char Matricule[5];
char Nom[25];
char Prenom[20];
char Sexe;
int Jour_naiss, mois_naiss, annee_naiss;
char Lieu_naissance[31];
float Notes[Nb_Matieres];
} Etudiant;
o Déclare une structure pour représenter un étudiant avec les champs
suivants:
Matricule: chaîne de 5 caractères (attention: requiert espace
pour le '\0' et 4 caractères utiles).
Nom: chaîne de 25 caractères.
Prenom: chaîne de 20 caractères.
Sexe: caractère (probablement 'M' ou 'F').
Jour_naiss, mois_naiss, annee_naiss: date de naissance.
Lieu_naissance: chaîne de 31 caractères.
Notes: tableau de notes float pour Nb_Matieres matières.
4. Déclarations et initialisations globales
Etudiant liste[MAX_Etudiants];
o Déclare un tableau global de Etudiant de taille MAX_Etudiants (ici 2).
int nb_Etudiants = 0;
o Compteur du nombre actuel d’étudiants dans liste, initialisé à 0.
5. Fonctions auxiliaires
void pause() {
printf("\nAppuyer sur Enter...");
getchar();
getchar();
}
o Fonction qui demande à l’utilisateur d’appuyer sur Enter pour
continuer. Elle lit deux fois pour vider le buffer (avec certaines
configurations, une seule getchar() peut suffire).
void trierParNom() {
Etudiant temp;
for(int i=0;i<nb_Etudiants-1;i++)
for(int j=i+1;j<nb_Etudiants;j++)
if(strcmp(liste[i].Nom,liste[j].Nom)>0){
temp=liste[i];
liste[i]=liste[j];
liste[j]=temp;
}
}
o Trie les étudiants présents dans liste par ordre alphabétique du nom
(ordre croissant) en utilisant un tri à bulles (bubble sort).
o Utilise la variable globale nb_Etudiants pour déterminer la taille du tri.
o Le swap se fait avec une variable temporaire temp.
void trierParAge() { // âge croissant = plus vieux d'abord
Etudiant temp;
for(int i=0;i<nb_Etudiants-1;i++)
for(int j=i+1;j<nb_Etudiants;j++)
if(liste[i].annee_naiss > liste[j].annee_naiss){
temp=liste[i];
liste[i]=liste[j];
liste[j]=temp;
}
}
o Trie les étudiants par année de naissance.
o Le commentaire dit “âge croissant = plus vieux d'abord”, mais la
condition actuelle (annee_naiss > annee_naiss_j) déplace les étudiants
plus jeunes vers le début; en pratique, plus l’année est grande, plus
l’étudiant est jeune. Donc le commentaire ne correspond pas
exactement à l’effet réel. Pour un tri “plus vieux d’abord” on
mettrait < ou inverser l’ordre.
6. Partie principale: int main()
int main() {
o Point d’entrée du programme.
int choix;
o Déclare une variable choix pour stocker l’option du menu.
do { ... } while (choix != 9);
o Boucle principale qui affiche le menu, lit le choix et exécute l’action
correspondante. La condition de sortie est probablement lorsque
l’utilisateur choisit 9 (Sortir), bien que la fin du fichier ne montre pas le
cas 9; on suppose qu’il y a un cas 9 plus bas ou que le reste du code
complète le menu.
Dans le corps de la boucle:
o Affichage du titre et du menu avec printf.
o scanf("%d",&choix);
Lit le choix de l’utilisateur.
o switch(choix) { ... }
Exécute le bloc correspondant au choix saisi.
7. Cas 1: afficher par ordre alphabétique
ケース 1
case 1:
if(nb_Etudiants==0)
printf("Aucun etudiant\n");
o Si aucun étudiant n’est enregistré, affiche ce message.
else {
trierParNom();
for(int i=0;i<nb_Etudiants;i++)
printf("%s %s ne le %02d/%02d/%04d a %s - %c - %s\n",
liste[i].Nom,liste[i].Prenom,
liste[i].Jour_naiss,liste[i].mois_naiss,
liste[i].annee_naiss,liste[i].Lieu_naissance,
liste[i].Sexe,liste[i].Matricule);
}
o Trie les étudiants par nom avec trierParNom().
o Puis boucle sur nb_Etudiants et affiche pour chaque étudiant: Nom,
Prenom, date de naissance formatée, Lieu_naissance, Sexe, Matricule.
o Le message utilise une phrase en français: “Nom Prenom ne le
Jour/mois/année a Lieu - Sexe - Matricule” (grammaire un peu
étranglée; on peut ajuster la mise en forme).
pause();
break;
8. Cas 2: Saisie étudiants
case 2:
if(nb_Etudiants>=2)
printf("Limite de 2 etudiants atteinte\n");
o Vérifie si on a atteint MAX_Etudiants (2). Si oui, affiche le message.
else { ... }
o Sinon, entre dans une série de saisies pour ajouter un nouvel étudiant à
liste[nb_Etudiants].
Saisie et validations successives:
o Matricule: lit avec scanf("%s", liste[nb_Etudiants].Matricule); vérifie que
strlen ≤ 5; répète sinon.
o Nom: lit et vérifie longueur ≤ 25.
o Prenom: lit et vérifie longueur ≤ 20.
o Sexe: lit un caractère avec scanf(" %c", &liste[nb_Etudiants].Sexe);
accepte seulement 'M' ou 'F'; rejoue sinon.
o Jour_naiss: lit int et vérifie 1..31.
o Mois_naiss: lit int et vérifie 1..12.
o Annee_naiss: lit int et vérifie 1900..2100.
o Lieu_naissance: lit une chaîne et vérifie longueur ≤ 30.
o Pour i de 0 à Nb_Matieres-1, initialise liste[nb_Etudiants].Notes[i] à 0.
o nb_Etudiants++;
o printf("Ajoute avec succes\n");
pause();
break;
9. Cas 3: Saisie des notes (partiellement montré)
case 3:
if(nb_Etudiants==0)
printf("Aucun Etudiant\n");
o Si aucun étudiant, avertit.
else {
for(int i=0;i<nb_Etudiants;i++)
printf("%d. %s %s\n",i+1,liste[i].Nom,liste[i].Prenom);
int num;
printf("Choisir: "); scanf("%d",&num);
if(num>=1 && num<=nb_Etudiants)
for(int i=0;i<Nb_Matieres;i++){
do{
printf("%s (0-20): ",Matieres[i]);
scanf("%f",&liste[num-1].Notes[i]);
}while(liste[num-1].Notes[i]<0 || liste[num-1].Notes[i]>20);
}
}
Affiche la liste des étudiants avec leur numéro, demande à l’utilisateur d’en
choisir un.
Si le choix est valide, pour chaque matière, demande la note entre 0 et 20 et
stocke dans Notes[i] du bon étudiant (num-1).
Chaque saisie est répétée tant que la note n’est pas dans [0, 20].
pause();
break;