Le pique-nique

un pique-nique

Photo by Spencer Davis on Unsplash

Toute notre histoire va commencer par un pique-nique. Imaginez que vous organisez entre élèves de la même classe un repas en fin d'année. Vous faîtes ce repas sous forme d'un pique-nique, en mutualisant les dépenses. Un certain nombre de personnes vont aller faire les courses pour tout le monde. Et ensuite, on fera les comptes, et chacun payera sa part. On remboursera ceux qui ont avancé l'argent en faisant les courses.

Comme vous êtes passionnés d'informatique, vous vous dites qu'un programme serait parfait pour gérer ces dépenses.

Types de base

Nous avons vu plusieurs types de base en python :

  • les entiers (int)
  • les nombres à virgules flottantes (float)
  • les chaînes de caractère (string)

Lorsque des données sont amenées à évoluer au cours d'un programme, nous avons appris à les stocker dans des variables.

Type construit

Lorsque les données ont besoin d'être considérée en grand nombre, nous avons vu un nouveau type de données : les tableaux. Un tableau est un ensemble de variables, souvent en quantité importante, et généralement (même si ce n'est pas obligatoire) du même type. Les tableaux correspondent à un besoin : celui de manipuler des données en grand nombre, ce nombre n'étant de plus pas toujours connu à l'avance. On peut penser par exemple à la liste des notes des élèves d'une classe, stockée dans un tableau qui permet de calculer la moyenne et l'écart type de ces notes.

Il est important aussi de noter que le langage Python porte à confusion sur le sujet, les tableaux en Python recouvrent à la fois les notions informatiques de tableaux et de listes, qui sont séparées dans un certains nombre de langages informatiques.

On dit que les tableaux constituent un type construit par ce qu'ils s'appuyent sur d'autre type pour leur fabrication. Un tableau est une collection de variable. C'est une variable qui va contenir d'autres variables.

Les dictionnaires que nous allons étudier sont un autre type construit et correspondent à un autre besoin.

Le programme

Vous souhaitez faire un programme pour la gestion des dépenses. Dans une première version du programme, vous utilisez une liste que l'on remplit au fur et à mesure. Voilà votre première version du programme. On crée une liste avec toutes les dépenses, ensuite, on calcule la moyenne pour savoir ce que chaque participant doit payer en théorie, puis on fait la différence avec ce qu'il a payé réellement, pour enfin afficher ce qu'il doit recevoir ou payer.

entree=""
depenses = []
numero = 1
while entree != "F":
    question = f"Entrez F pour arréter ou la somme payée par la personne n°{numero} : "
    entree=input(question)
    if entree != "F":
        depenses.append(float(entree))
        numero += 1

# Fin des entrées 
# On calcule tout l'argent dépensé et on fait la moyenne par personne
total = 0
for somme in depenses:
    total += somme
moyenne = total / len(depenses)

# On va maintenant dire combien doit chacun.
# Si c'est positif, on le rembourse.
# Si c'est négatif, il doit mettre dans le pot commun
for i in range(len(depenses)):
    difference = depenses[i] - moyenne
    if  difference >= 0:
        print(f"La personne n°{i+1}  doit recevoir : {difference:.2f}")
    else:
        print(f"La personne n°{i+1}  doit payer : {-difference:.2f}")

Ce programme a le mérite de fonctionner, mais il présente un inconvénient majeur : les personnes sont juste des numéros dans ce programme. Si la liste est rentrée au fur et à mesure de la soirée, il faut que chacun se souvienne de son numéro

Bien sur, vous pourriez remédier à ce problème en créant une seconde liste. Cette liste contiendrait les noms des personnes. Il faudrait modifier les entrées en conséquence (on doit donner à la fois le nom de la personne et la somme dépensée) et ensuite modifier les sorties pour avoir l'affichage non pas du numéro de la personne mais le nom de la personne.

D'ailleurs, ça ne vous semble pas impossible à faire.

À faire vous même

Vous allez reprendre le programme précédent et le modifier de la façon suivante :

  • Ajouter une liste nom
  • Demander le nom en plus de la somme dans la partie entrée des dépenses.
  • Afficher le nom au lieu du numéro dans le résultat final.

Ajouter une seconde liste a bien fonctionné, mais nous allons voir que cette stratégie n'est pas nécessairement tenable sur le plus long terme. Les problèmes vont commencer dès la fin de la soirée...