TP1-PROG-08 - Tableaux#

Objectifs#

  • Manipuler les listes en Python

  • Créer, modifier, supprimer des listes 1D et 2D

  • Appliquer sur la gestion d’un horaire automatique d’une gare CFF

Tableau 1D : les listes#

En Python, on décrit une liste avec les éléments qui le composent. Ces éléments sont des variables qui peuvent être de n’importe quel type.

Une liste est caractérisée par :

  • est délimitée par des crochets [], et

  • ses éléments sont séparés par une virgule ,

Création d’une liste vide#

# Création d'une liste vide
uneListe = []

Accéder aux éléments d’une liste#

On accède aux éléments de la liste avec l’index de l’élément. Le premier index est toujours 0. Par exemple:

# Création d'une liste avec une chaîne de caractères, un entier et un float
uneListe = ['une chaîne de caractères',4,3.14]

# On accède au premier élément avec :
uneListe[0]

# On imprime le premier élément :
print(uneListe[0])
une chaîne de caractères
# On imprime le second élément :
print(uneListe[1])
4
# On imprime le troisième élément :
print(uneListe[2])
3.14

Longueur d’une liste#

La fonction len(list) retourne la longueur de la liste list

len(uneListe)
3

Ajout d’un élément à la liste#

Pour ajouter un nouvel élément à la liste, il existe deux façon :

  1. pour ajouter un élément à la fin de la liste on utilise la méthode (c’est comme une fonction) uneListe.append()

  2. pour ajouter un élément element à la position i, on utilise la fonction uneListe.insert(i, element)

# Ajouter la chaîne de caractères 'salut' à la fin de la liste
uneListe.append('salut')
# Afficher la liste
print(uneListe)
# Ajouter le valeur `0.618' à la position 2 (soit entre 4 et 3.14)
uneListe.insert(2,0.618)
# Afficher la liste une seconde fois
print(uneListe)
['une chaîne de caractères', 4, 3.14, 'salut']
['une chaîne de caractères', 4, 0.618, 3.14, 'salut']

Modification d’un élément de la liste#

On peut modifier un élément en y accédant à l’aide de l’indice i

## Modification de 3.14 en 6.28
uneListe[3] = 6.18
# Affichage de la liste
print(uneListe)
['une chaîne de caractères', 4, 0.618, 6.18, 'salut']

Enlever des éléments d’une liste#

On peut enlever des éléments avec les méthodes suivantes :

  • list.remove(x) si l’élément x existe

  • list.pop() le dernier élément

  • list.clear() tous les éléments

# Suppression de 0.618
uneListe.remove(0.618)
# Affichage de la liste
print(uneListe)
['une chaîne de caractères', 4, 6.18, 'salut']
# Suppression du dernier élément
uneListe.pop()
# Affichage de la liste
print(uneListe)
['une chaîne de caractères', 4, 6.18]
# Effacement de tous les éléments de la liste
uneListe.clear()
# Affichage de la liste vide
print(uneListe)
[]

Affichage de l’horaire des trains en gare#

Un horaire CFF est un tableau en 2 dimensions. Chaque ligne de ce tableau représente un train. Chaque train a les caractéristiques suivantes :

  • un type (un RER, un Interregio, un Intercity, etc..)

  • une heure de départ

  • la gare de destination

  • une voie d’arrivée

Un train est donc une liste 1D

L’horaire affiché est donc une liste de listes 1D, à savoir un tableau en deux dimensions.

En informatique, on parle d’un tableau 2D ou tableau à deux dimensions. Chaque colonne représente les caractéristiques d’un train (type, heure de départ, destination, etc..) et chaque ligne représente un train.

Création de l’horaire#

L’horaire est constitué d’une liste de listes 1D.

Chaque train est une liste 1D qui possède autant d’éléments qu’il y a de caractéristiques dans l’horaire, séparées par une virgule , :

  • type (str)

  • heure de départ (str)

  • destination (str)

  • la voie sur laquelle il va arriver (int)

train1 = ['S22', '8h47', 'Vufflens-la-Ville', 1]
train2 = ['S2', '8h51', 'Aigle', 4]
train3 =  ['S4', '8h55', 'Palézieux', 3]

Exercice 1 : Ajout d’un train#

Définissez la liste train4 selon l’horaire affiché par l’image : c’est un S1 à destination de Lausanne qui arrive sur la voie 4 à 8h57

Exercice 2 : Création de l’horaire#

L’horaire est un tableau en 2 dimensions donc une liste de listes.

# Création de l'horaire avec les trois trains
horaire = [train1, train2, train3]
horaire
[['S22', '8h47', 'Vufflens-la-Ville', 1],
 ['S2', '8h51', 'Aigle', 4],
 ['S4', '8h55', 'Palézieux', 3]]

Exercice 3 : ajout d’un train à l’horaire#

Créez l’horaire avec les 4 trains train1, train2, train3, train4

Accèder aux éléments de l’horaire (les trains)#

Avec une liste de liste, il faut donner deux indices. Le premier correspond à un élément de l’horaire.

# Affichage du train2 (S2 de 8h51 en direction d'Aigle sur voie 4)
print(horaire[1])
['S2', '8h51', 'Aigle', 4]

Le second indice correspond à un élément à l’intérieur de la liste définie. Ainsi, pour obtenir uniquement l’heure, on choisira le second élément de la liste.

# Affichage de la destination du train 2:
print(horaire[1][2])
Aigle

On accède de même aux éléments de la ligne horaire[1]

L’élément horaire[1][2] correspond au troisième élément de la liste horaire[1], donc la destination

horaire[1][2]
'Aigle'

Exercice 3 : accéder à un élément dans le tableau d’affichage#

  • Affichez l’heure de départ du troisième train dans le tableau.

  • Affichez la destination du premier train

  • Affichez la voie d’arrivée du second train

Accéder à une plage#

On peut accéder à une plage d’éléments. La plage entre le premier et le deuxième élément s’écrit horaire[0:2]

horaire[0:2]
[['S22', '8h47', 'Vufflens-la-Ville', 1], ['S2', '8h51', 'Aigle', 4]]

Avec une boucle for nous pouvons itérer sur la liste et afficher les trains ligne par ligne.

for train in horaire[0:2]:
    print(train)
['S22', '8h47', 'Vufflens-la-Ville', 1]
['S2', '8h51', 'Aigle', 4]

Exercice 4 : Affichage d’une plage de l’horaire#

  • Affichez les lignes 3-4 de l’horaire.

Remarque : il existe une seconde possibilité en utilisant une boucle for i in range(4)

Ajouter un nouveau train à l’horaire#

Rappel : on ajoute une nouvelle ligne à la fin avec la fonction list.append() :

# Création d'un nouveau train
train5 =  ['RE', '8h58', 'Annemasse', 2]
# Ajout de ce train à l'horaire
horaire.append(train5)
# Affichage de l'horaire
for train in horaire:
    print(train)
['S22', '8h47', 'Vufflens-la-Ville', 1]
['S2', '8h51', 'Aigle', 4]
['S4', '8h55', 'Palézieux', 3]
['RE', '8h58', 'Annemasse', 2]

On peut ajouter une nouvelle ligne à la position i avec la fonction list.insert(i, element)

train6 =  ['S1', '8h57', 'Lausanne', 4]
horaire.insert(3, train6)
for train in horaire:
    print(train)
['S22', '8h47', 'Vufflens-la-Ville', 1]
['S2', '8h51', 'Aigle', 4]
['S4', '8h55', 'Palézieux', 3]
['S1', '8h57', 'Lausanne', 4]
['RE', '8h58', 'Annemasse', 2]

Modification des informations#

En cet hiver difficile, la ligne de contact souffre. Le train S4 pour Palézieux aura 30 minutes de retard. Il faut modifier l’entrée et ajouter l’information

## Modification de l'horaire du S4
horaire[2][1] = '8h55 + 30min'
## Ajout de l'information
horaire[2].append('Problème sur la ligne de contact')
## Affichage de l'horaire
for train in horaire:
    print(train)
['S22', '8h47', 'Vufflens-la-Ville', 1]
['S2', '8h51', 'Aigle', 4]
['S4', '8h55 + 30min', 'Palézieux', 3, 'Problème sur la ligne de contact']
['S1', '8h57', 'Lausanne', 4]
['RE', '8h58', 'Annemasse', 2]

Suppression de train#

A mesure que le temps passe, les trains entrent en gare, prennent des voyageurs et en laissent descendre d’autres, puis repartent verts leurs destinations. Il faut donc les supprimer de l’horaire

Rappel:

  • list.remove(x) si l’élément x existe

  • list.pop() le dernier élément

  • list.clear() tous les éléments

On enlève l’élément train5 :

# Suppression du train numéro 5
horaire.remove(train5)
# Affichage de l'horaire
for train in horaire:
    print(train)
['S22', '8h47', 'Vufflens-la-Ville', 1]
['S2', '8h51', 'Aigle', 4]
['S4', '8h55 + 30min', 'Palézieux', 3, 'Problème sur la ligne de contact']
['S1', '8h57', 'Lausanne', 4]
# Suppression du dernier train
horaire.pop()
# affichage de l'horaire
for train in horaire:
    print(train)
['S22', '8h47', 'Vufflens-la-Ville', 1]
['S2', '8h51', 'Aigle', 4]
['S4', '8h55 + 30min', 'Palézieux', 3, 'Problème sur la ligne de contact']
# Effacement de tous les trains. Nous sommes en fin de service
horaire.clear()
# Affichage de l'horaire
for train in horaire:
    print(train)

Exercice 5#

Voici votre horaire de départ.

# Création des trains
train1 = ['S22', '8h47', 'Vufflens-la-Ville', 1]
train2 = ['S2', '8h51', 'Aigle', 4]
train3 = ['S4', '8h55', 'Palézieux', 3]
train4 = ['S1', '8h57', 'Lausanne', 4]
train5 = ['RE','8h58','Annemasse',2]

horaire = [train1, train2, train3, train4, train5]
# Affichage de l'horaire
for train in horaire:
    print(train)
['S22', '8h47', 'Vufflens-la-Ville', 1]
['S2', '8h51', 'Aigle', 4]
['S4', '8h55', 'Palézieux', 3]
['S1', '8h57', 'Lausanne', 4]
['RE', '8h58', 'Annemasse', 2]
  1. Ajoutez à l’horaire le régional S1 pour Bussigny qui part à 9h01 sur voie 1

  2. Il est 8h50, le régional S22 pour Bussigny et Vufflens-la-Ville est parti. Supprimez-le de l’horaire

  3. Un problème sur la ligne entre Vevey et Lausanne provoque un retard de 20 minutes. Ajoutez cette information pour le RE de 8h58 pour Annemasse

Exercice 6 (Affichage des quais)#

Chaque quai possède un afficheur de quai. Cet afficheur de quai utilise les mêmes informations que l’horaire complet. En utilisant un test conditionnel, affichez uniquement les trains qui partent du quai 4.

Exercice 7 (Annonce vocale)#

Il est possible de faire parler votre ordinateur. En important le module:

from os import system

et en appelant la fonction system(string)string est une chaîne de caractère qui commence par say, vous pouvez simuler les annonces en gare. Par exemple:

from os import system
train1 = ['S22', '8h47', 'Vufflens-la-Ville', 1]
annonce1 = 'say '+'Arrivée, sur voie '+str(train1[3])+', du train '+train1[0]+', à destination de '+train1[2]+'. Départ '+train1[1]
system(annonce1)

Annoncez les trains arrivant sur voie 4

Exercice 8 : Annonce vocale complète (avec jingle)#

Il est finalement possible de faire jouer le jingle des CFF avant l’annonce en important le module playsound :

import playsound

puis de donner le chemin (le path) du fichier .mp3 à jouer :

playsound.playsound(path, True)

Pour faire cela, il vous faut télécharger sur votre ordinateur, au même emplacement que votre programme python les fichiers MP3 des jingles : version romande, version tessinoise et la version suisse-allemande. Attention à leur donner le bon nom !!!

Conseil Afin de jouer le jingle puis l’annonce, il faut placer un petit retard. Ceci est fait avec la fonction time.sleep(2.4) qui fait dormir le programme pendant le jeu du jingle. Cette fonction provient du module sleep

import os
import pygame
import time
pygame.mixer.init()
pygame.mixer.music.load('sons/bahn_cff_f.mp3')
pygame.mixer.music.play()
time.sleep(2.5)
train1 = ['S22', '8h47', 'Vufflens-la-Ville', 1]
annonce1 = 'say '+'Voie '+str(train1[3])+', arrivée du train '+train1[0]+', à destination de '+train1[2]+'. Départ '+train1[1]
os.system(annonce1)
pygame 2.1.2 (SDL 2.0.16, Python 3.9.2)
Hello from the pygame community. https://www.pygame.org/contribute.html
sh: 1: say: not found
32512