﻿'''
Fonction tri_bulles_par_notes_eleves_excel

principe du tri à bulles : 
on inverse 2 à 2 les valeurs pour mettre la plus grande en dessous.
On fait ça sur tout le tableau.
Après un premier passage : on a la plus grande valeur en bas.
On refait ça sur un tableau diminué de un : on les 2 plus grandes valeurs en bas, triées.
On recommence sur tout le tableau
'''

def tri_bulles_par_notes_eleves_excel(eleves_excel):
  for i in range(len(eleves_excel)):
    for j in range(len(eleves_excel)):
      if eleves_excel[j]["note"]>eleves_excel[j+1]["note"]:
        eleves_excel[j], eleves_excel[j+1]=eleves_excel[j+1], eleves_excel[j]

'''
Fonction create_eleves_excel

on crée une liste de dictionnaire à partir d'un dictionnaire {nom:note}. 
Chaque dicionnaire aura comme clé : id, nom et note.
Les id démarrent à 1 et sont incrémentés.
'''
def create_eleves_excel(eleves):
  eleves_excel=[]
  id=0
  for e in eleves:
    id+=1
    eleves_excel.append(
      {
        "id"  : id,
        "nom" : e,
        "note" : int(eleves[e])
      }
    )
  return eleves_excel

'''
Fonction print_table_eleves

On affiche le tableau de dictionnaires comme une table excel
On gère "en dur" id, nom et note
'''
def print_table_eleves(eleves):
  print(3*"-"+"-" +10*"-"+"-" +4*"-"+"-")
  print(f"{'id':<3s} {'nom':<10s} {'note':<4s}")
  print(3*"-"+"-" +10*"-"+"-" +4*"-"+"-")
  for e in eleves:
    id, nom, note = e.values() #destructuration
    print(f"{id:3d} {nom:<10s} {note:4d}")
  print(3*"-"+"-" +10*"-"+"-" +4*"-"+"-")

# Programme de test des 3 fonctions : 
eleves = {"Alice": 15, "Charlie": 12, "Bob": 16}
eleves_excel_dict = create_eleves_excel(eleves)
print_table_eleves(eleves_excel_dict)
tri_bulles_par_notes_eleves_excel(eleves_excel_dict)
print_table_eleves(eleves_excel_dict)

'''
Exercices : 
1) quand on teste le code, il y a une erreur :
--------------------
id  nom        note
--------------------
  1 Alice        15
  2 Charlie      12
  3 Bob          16
--------------------
Traceback (most recent call last):
  File "/Users/bertrandliaudet/Desktop/tp5/exo1.py", line 66, in <module>
    tri_bulles_par_notes_eleves_excel(eleves_excel_dict)
  File "/Users/bertrandliaudet/Desktop/tp5/exo1.py", line 23, in tri_bulles_par_notes_eleves_excel
    if eleves_excel[j]["note"]>eleves_excel[j+1]["note"]:
IndexError: list index out of range

1.1 : Analysez le message d'erreur et faites toutes les corrections nécessaires.
1.2 : Changer le code pour que ça trie de la plus petite note à la plus élevé.
1.3 : Changer le code pour que ça trie par nom
1.4 : Cuelle est la complexité de l'algorithme (complexité ça veut dire : combien de tours de boucle s'exécutent. On calcule la complexité en considérant qu'on a N éléments dans la liste, avec suffisament grand pour faire des approximations du genre : N+1 = N, N*N + N = N, etc.)
1.5 : Imaginons que le tableau soit déjà trié, ou que le tableau soit trié après le premier tour de boucle. Comment faire pour accélérer le traitement ? 

'''