Favicon

NSI Vaugelas - Terminale

Connexion

Sommaire

Correction : modularité

Modulariser un code

Problèmes identifiés et solutions

Problème Solution
Aucune fonction ! Diviser le code en fonctions : 1 fonction = 1 seule tache "élémentaire"
Redondance du code : le même code se retrouve à l'identique à plusieurs endroits du programme ( affichage du menu, calcul de la moyenne). Factoriser le code, de façon à ce qu'il soit plus lisible, et surtout plus facilement maintenable
Utilisation de variables globales ( les tableaux eleves et notes, modifiées en n'importe quel point du programme. Préférer le passage d'argument(s) en paramètre(s) des fonctions, et le renvoi de résultat(s) lors de l'appel de celles-ci.

Liste des fonctions/programme principal

Fonctions Programme principal
  • calcul moyenne
  • recherche meilleur moyenne
  • moyenne élève
  • moyenne classe
  • ajouter un élève
  • ajouter une note
  • afficher le menu
  1. afficher le menu
  2. choix utilisateur ?
  3. appeler la fonction correspondant au choix (ou quitter)
  4. afficher le résultat renvoyé par cette fonction

Pas de print ( sauf exception, comme ici dans l'affichage du menu ) ni de input dans les fonctions, ce n'est pas leur rôle d'afficher ou de demander des données à l'utilisateur ( cela se fait dans le programme principal ).

Penser à la documentation du code (docstring, annotations de type, etc...), mais c'est un autre problème.

Proposition de code corrigé



def afficher_menu():
    """Affiche le menu principal.
    Entrées : aucune
    Sorties : aucune
    """
    print("\n=== Gestion des élèves et des notes ===")
    print("1. Ajouter un élève")
    print("2. Ajouter une note à un élève")
    print("3. Calculer la moyenne d'un élève")
    print("4. Afficher la moyenne de la classe")
    print("5. Afficher l'élève avec la meilleure moyenne")
    print("6. Quitter")

def ajouter_eleve(nom, eleves, notes):
    """Ajoute un élève au tableau des élèves, et crée un tableau vide pour ses notes.
    Entrées : nom (str) = le nom de l'élève à ajouter
              eleves (list) = le tableau des élèves
              notes (list) = le tableau des notes
    Sorties : les tableaux 'eleves' et 'notes' modifiés
    """
    eleves.append(nom)
    notes.append([])
    return eleves, notes

def ajouter_note(nom, eleves, notes, nouvelle_note):
    """Ajoute une note à un élève.
    Entrées : nom (str) = le nom de l'élève
              eleves (list) = le tableau des élèves
              notes (list) = le tableau des notes
              nouvelle_note (float) = la nouvelle note à ajouter
    Sorties : le tableau 'notes' modifié (list)
    """
    indice = eleves.index(nom)
    notes[indice].append(note)
    return notes

def calculer_moyenne(notes):
    """Calcule la moyenne d'une liste de notes.
    Entrées : notes (list) = un tableau de notes
    Sortie : la moyenne des notes (float)
    """
    if len(notes) == 0: # si aucune note dans la liste
        return None
    return sum(notes) / len(notes)

def moyenne_eleve(nom, eleves, notes):
    """Calcule et affiche la moyenne des notes d'un élève.
    Entrées : nom (str) = le nom de l'élève
              eleves (list) = le tableau des élèves
              notes (list) = le tableau des notes
    Sortie : la moyenne des notes (float)
    """
    indice = eleves.index(nom)
    moyenne = calculer_moyenne(notes[indice])
    return moyenne

def moyenne_classe(notes):
    """Calcule et affiche la moyenne de la classe.
    Entrées : notes (list) = le tableau de notes
    Sortie : la moyenne des notes (float)
    """
    toutes_les_notes = [note for liste_notes in notes for note in liste_notes]
    moyenne = calculer_moyenne(toutes_les_notes)
    return moyenne

def meilleur_eleve(eleves, notes):
    """Trouve et affiche l'élève avec la meilleure moyenne.
    Entrées : eleves (list) = le tableau des élèves
              notes (list) = le tableau des notes
    Sortie : le nom du meilleur élève (str) et sa moyenne (float)
    """
    meilleur_eleve = ""
    meilleure_moyenne = -1

    for i in range(len(eleves)):
        moyenne = calculer_moyenne(notes[i])
        if moyenne is not None:
            if moyenne > meilleure_moyenne:
                meilleure_moyenne = moyenne
                meilleur_eleve = eleves[i]
    return meilleur_eleve, meilleure_moyenne

# Programme principal
eleves = ["Alice", "Bob", "Charlie"]
notes = [[12, 15, 10], [14, 13, 16], [11, 12, 9]]

while True:
    afficher_menu()
    choix = input("Entrez votre choix (1-6) : ")

    if choix == "1":
        nom = input("Nom du nouvel élève ?")
        eleves, notes = ajouter_eleve(nom, eleves, notes)
        print("Nouveau tableau des élèves : ", eleves)
    elif choix == "2":
        nom = input("Nom de l'élève ?")
        note = float(input("Note à ajouter ?"))
        notes = ajouter_note(nom, eleves, notes, note)
        print("Nouveau tableau des notes : ", notes)
    elif choix == "3":
        nom = input("Nom de l'élève ?")
        moyenne = moyenne_eleve(nom, eleves, notes)
        print("La moyenne de l'élève", nom, "est", moyenne)
    elif choix == "4":
        moyenne = moyenne_classe(notes)
        print("La moyenne de la classe est", moyenne)
    elif choix == "5":
        eleve = meilleur_eleve(eleves, notes)
        print("Le meilleur élève est :", eleve[0], "avec une moyenne de", eleve[1])
    elif choix == "6":
        print("Au revoir !")
        break
    else:
        print("Choix invalide. Veuillez entrer un nombre entre 1 et 6.")