#**********************Correction TD*********************************
#********************************************************************
############Partie 1
#Question 1
class Etudiant :
Code = " "#chaîne vide
CIN = " "#chaîne vide
Nom = " "#chaîne vide
Prenom = " "#chaîne vide
Note=0.0#réel
#Question 2
def saisir_Etudiant(e):
e.Code = input("entrer le code de l'étudiant ")
e.CIN =input("entrer le CIN de l'étudiant ")
e.Nom=input("entrer le Nom de l'étudiant")
e.Prenom=input("entrer le prenom de l'étudiant ")
e.Note=float(input("entrer la note de l'étudiant "))
#Question 3
def afficher_Etudiant(e):
print("l'Etudiant : ")
print("*** Code = ", e.Code)
print("*** CIN = ", e.CIN)
print("*** Nom = ", e.Nom)
print("*** Prenom = ", e.Prenom)
print("*** Note = ", e.Note)
#Question 4
def liste_Etudiants(effectif):
T=[]
print("saisie de ", effectif, "étudiants ")
for i in range(effectif):
print("----Etudiant num ", i+1)
e=Etudiant()#créer un objet de type Etudiant
#Les champs de e ont les valeurs initiales
saisir_Etudiant(e)#appel de la procedure saisir_Etudiant()
T.append(e)#ajout de l'etudiant couant à la liste
#En sortant de la boucle for:
# T est rempli d'un nombre=effectif d'objets de type Etudiant,
#les champs chaque Etudiant ont été saisi au clavier,
#La saisi est effectuée grâce à la procedure saisir_Etudiant()
return T #la liste des étudiants est retourné par la fonction
#Question 5
def moyenne_section(liste):
n=len(liste)
if n==0:
print("liste vide!!")
return None
m=0.0
#On parcourt la liste des étudiants
for e in liste:
#On calcule la somme des notes des étudiants
m=m+e.Note
#En sortant de la boucle m contient la somme des notes
#on divise m sur le nombre des étudiants pour avoir la moy
return m/n #on retourne la moyenne
#Question 6
def taux_validation(liste):
n=len(liste)
if n==0:
print("liste vide!!")
return None
t=0.0
#On parcourt la liste des étudiants
for e in liste:
#On calcule le nombre des étuadiants ayant une note>10
if e.Note>=10:
t=t+1
#nb des étudiants ayant une note>=10 sur nb total des étudiants
#on multiplie par 100 pour retourner un pourcentage de validation
return 100*t/n
#Question 7
def supprimer_Etudiant(CIN,liste):
#On parcourt la liste des étudiants
for e in liste:
#on cherche l'étudiant ayant le CIN en paramètre
if e.CIN==CIN:
#si on trouve le CIN, on supprime l'étudiant
liste.remove(e)
return None
#return est optionnel
#pour sortir de la procedure une fois l'étudiant trouvé
##############Partie 2
#Question 1
#version 1: en utilisant la méthode write()
def fichier_notes(liste,fich):
#ouvrir le fich en mode Ecriture 'w'
objfich=open(fich, 'w')
#parcourir la liste des etudiants
for e in liste:
#pour chaque Etudiant e:
#créer une chaîne=ligne contenant:
#le code suivi de 4 tabs suivis de la note
#la note est un réel, on fait la conversion avec str
#on ajoute un retour à la ligne à la fin
ligne=e.Code +"\t\t\t\t"+ str(e.Note)+"\n"
objfich.write(ligne)#on écrit la ligne avec write()
#la méthode write prend en paramètre une chaîne de caractère
#En sortant de la boucle, toutes les lignes sont écrites
#on ferme le fichier
objfich.close()
#version 2: en utilisant la méthode writelines()
def fichier_notes2(liste,fich):
#ouvrir le fich en mode Ecriture 'w'
objfich=open(fich, 'w')
#créer une liste des lignes
lignes=[]
#parcourir la liste des etudiants
for e in liste:
#pour chaque Etudiant e:
#créer une chaîne=ligne contenant:
#le code suivi de 4 tabs suivis de la note
#la note est un réel, on fait la conversion avec str
#on ajoute un retour à la ligne à la fin
une_ligne=e.Code +"\t\t\t\t"+ str(e.Note)+"\n"
#ajouter la ligne courante à la liste
lignes.append(une_ligne)
#En sortant de la boucle, toutes les lignes sont stockées dans la liste
objfich.writelines(lignes)#on écrit les lignes avec writelines()
#la méthode writelines prend en paramètre une liste de chaînes
#on ferme le fichier
objfich.close()
#Question 2
#version 1: En utilisant readline()
def chercher_note(code, fich):
#ouverture du fichier en mode lecture 'r'
objfich=open(fich, 'r')
#lire la première ligne avec readline()
ligne=objfich.readline()
#On utilise une boucle while pour lire ligne par ligne
#on arrive à la fin du fich quand la ligne lue est vide
while ligne!="":
#split permet de diviser une chaîne selon
#le séparateur passé en paramètre et retourne
#la liste des mots constituants la chaîne
contenu_ligne=ligne.split("\t\t\t\t")#liste des mots
if contenu_ligne[0]==code:#1ère chaine contient le code
objfich.close()#code trouvé? je ferme le fichier
note=contenu_ligne[1]#2ème chaine contient note suivi de \n
note=float(note[:-2])#enlever \n et convertir en float
return note
#ici le code n'est pas trouvé je lis la ligne suivante
ligne=objfich.readline()
#En sortant de la boucle while, tout le fich est lue
#la dernière ligne lue par readline() est vide
objfich.close()#on ferme le fichier
#ici j'ai lu tout le fichier et je n'ai pas trouvé le code
#sinon, la note a été retournée et je n'arriverai jamais ici
return None
#version 2: En utilisant readlinelines()
def chercher_note2(code, fich):
#ouverture du fichier en mode lecture 'r'
objfich=open(fich, 'r')
#lire toute les lignes avec readlines()
lignes=objfich.readlines()
#tout le contenu est stocké dans lignes,
objfich.close()#on ferme le fichier
#On utilise une boucle for pour parcourir les lignes
#readlines() retourne une liste des chaînes
#chaque chaîne dans la liste est une ligne du fichier
for e in lignes:
#split permet de diviser une chaîne selon
#le séparateur passé en paramètre et retourne
#la liste des mots constituants la chaîne
contenu_ligne=e.split("\t\t\t\t")#liste des mots
if contenu_ligne[0]==code:#1ère chaine contient le code
note=contenu_ligne[1]#2ème chaine contient la note suivi de \n
note=float(note[:-2])#enlever \n et convertir en float
return note
#En sortant de la boucle for,
#ici j'ai parcouru toutes les lignes et je n'ai pas trouvé le code
#sinon, la note a été retournée et je n'arriverai jamais ici
return None
#version 3: En utilisant read()
def chercher_note3(code, fich):
#ouverture du fichier en mode lecture 'r'
objfich=open(fich, 'r')
#lire tout le contenu avec read()
contenu=objfich.read()
#tout le contenu est stocké dans une seule chaîne: contenu,
#on ferme le fichier
objfich.close()
#on divise la chaîne contenu avec split et le séparateur="\n"
#pour obtenir une liste des lignes
lignes=contenu.split("\n")
#On utilise une boucle for pour parcourir les lignes
#chaque chaîne dans la liste est une ligne du fichier sans "\n"
for e in lignes:
#split permet de diviser une chaîne selon
#le séparateur passé en paramètre et retourne
#la liste des mots constituants la chaîne
contenu_ligne=e.split("\t\t\t\t")#liste des mots
if contenu_ligne[0]==code:#1ère chaine contient le code
note=contenu_ligne[1]#2ème chaine contient note (pas de \n)
note=float(note)#convertir en float
return note
#En sortant de la boucle for,
#ici j'ai parcouru toutes les lignes et je n'ai pas trouvé le code
#sinon, la note a été retournée et je n'arriverai jamais ici
return None
#Question 3
#En utilisant readline()
#On peut lire le fichier avec readlines() ou read() comme Question 9
def nombre_mentions(fich):
n=0#pour compter le nombre de mentions
objfich=open(fich, 'r')
ligne=objfich.readline()
while ligne!="":
#split permet de diviser une chaîne selon
#le séparateur passé en paramètre et retourne
#la liste des mots constituants la chaîne
contenu_ligne=ligne.split("\t\t\t\t")#liste des mots
note=contenu_ligne[1]#deuxième chaine contient la note suivi de \n
note=float(note[:-2])#enlever \n et convertir en float
if note>=12:
n=n+1#on incremente le nombre des notes>=12
ligne=objfich.readline()
objfich.close()
return n
#Partie3: Test
#Création liste Etudiants
effectif=int(input("entrer le nb d'étudiants"))
T=liste_Etudiants(effectif)
#Affichage de la liste des Etudiants
print("la liste des Etudiants est: ")
for e in T:
afficher_Etudiant(e)
#Affichage de la moy des notes
print("la moyenne des notes= ", moyenne_section(T))
#Affichage du taux de validation
print("le taux de validation= ", taux_validation(T),"%")
#Supprimer un Etudiant
c=input("entrer le CIN de l'étudiant à supprimer")
supprimer_Etudiant(c,T)
#Affichage de la liste après suppression
print("la liste des Etudiants est: ")
for e in T:
afficher_Etudiant(e)
#Création du fichier "notes.txt"
fichier_notes(T,"notes.txt")
#Affichage la note d’un étudiant donné par son code
code=input("entrer un code à chercher")
note=chercher_note2(code, "notes.txt")
print("la note de l'étudiant ayant le code = ",code, "est ",note )
#Affichage du nombre des mentions obtenues
nb_mentions=nombre_mentions("notes.txt")
print("le nombre des mentions obtenues= ",nb_mentions )