Pourquoi tracer l’exécution d’un programme ?

Tracer l’exécution d’un programme est une technique utilisée pour tester un algorithme et prédire, étape par étape, comment l’ordinateur va exécuter l’algorithme. Elle peut être utilisée pour comprendre ou prédire ce que fait un algorithme et pour identifier les erreurs logiques potentielles (lorsque le programme se compile, mais ne produit pas le résultat attendu).

Lorsqu’un programme ne fonctionne pas correctement, on doit être capable de comprendre les étapes de son exécution pour trouver le problème. On peut bien sûr utiliser un débogueur symbolique, mais il est important de pouvoir le faire également « à la main ». Cela permet par exemple de faire la trace de l’exécution d’un programme écrit sur du papier ou d’analyser une petite portion de code d’un grand programme. Cela vous permet également de bien comprendre le fonctionnement des structures de contrôle et de l’affectation.

Les résultats de la simulation sont généralement représentés sous forme d’un tableau qui constitue la trace d’exécution en prenant une “photo” de toutes les variables de cet algorithme aux instants.

La trace d’exécution est un “compte rendu” de l’exécution de l’algorithme.


Un tableau de suivi typique est illustré ici.

Exemple n°1 :

  • Le programme

  • La trace d’exécution sous forme de tableau

Pour aller plus loin

Python: Debugger simplement avec l’IDE Tommy

Variables sans tracas.

Une fois que vous avez terminé avec code, sélectionnez Affichage → Variables et voyez comment vos programmes et commandes shell affectent les variables Python.

Variables table

Débogueur simple.

Appuyez simplement sur Ctrl + F5 au lieu de F5 et vous pouvez exécuter vos programmes étape par étape, aucun point d’arrêt n’est nécessaire. Appuyez sur F6 pour un grand pas et F7 pour un petit pas. Les étapes suivent la structure du programme, pas seulement les lignes de code.

Stepping through statements

Parcourez l’évaluation des expressions.

Si vous utilisez de petites étapes, vous pouvez même voir comment Python évalue vos expressions. Vous pouvez considérer cette boîte bleu clair comme un morceau de papier où Python remplace les sous-expressions par leurs valeurs, pièce par pièce.

Visualization of expression evaluation

Représentation fidèle des appels de fonction.

Entrer dans un appel de fonction ouvre une nouvelle fenêtre avec une table de variables locales et un pointeur de code séparés. Une bonne compréhension du fonctionnement des appels de fonction est particulièrement importante pour comprendre la récursivité.

Visualization of call frames

Met en évidence les erreurs de syntaxe.

Les guillemets et parenthèses non fermés sont les erreurs de syntaxe les plus courantes des débutants. L’éditeur de Thonny les rend faciles à repérer.

Visualization of syntax errors

Explique les portées de variable.

La mise en évidence des occurrences de variables vous rappelle que le même nom ne signifie pas toujours la même variable et aide à repérer les fautes de frappe. Les variables locales se distinguent visuellement des globales.

Local and global names are visually distinguished

Mode d’explication des références.

Les variables sont initialement présentées selon un modèle simplifié (nom → valeur) mais vous pouvez passer à un modèle plus réaliste (nom → adresse / id → valeur).

Variables table vs values table

Pour aller plus loin

IDE Tommy

 

Python NSI: Tutoriel python

de daniel PERARNAUD (Auteur), daniel perarnaud (Auteur)


NSI sujet bac 2021 – Exercice n°2

Nature de l’épreuve  de NSI au bac en terminale

  • Durée : 3 heures 30 + 1 heure
  • Coefficient : 16
  • Format : L’épreuve terminale obligatoire de spécialité est composée de deux parties :
    • une partie écrite, comptant pour 12 points sur 20,
    • et une partie pratique comptant pour 8 points sur 20.

La note globale de l’épreuve est donnée sur 20 points.

Partie écrite de l’épreuve  de NSI au bac en terminale

  • Durée : 3 heures 30
  • Modalités
    • La partie écrite consiste en la résolution de trois exercices permettant d’évaluer les connaissances et les capacités attendues conformément aux programmes de première et de terminale de la spécialité.
    • Chaque exercice est noté sur 4 points.
    • Le sujet propose cinq exercices, parmi lesquels le candidat choisit les trois qu’il traitera.
    • Ces cinq exercices permettent d’aborder les différentes rubriques du programme, sans obligation d’exhaustivité. Le sujet comprend obligatoirement au moins un exercice relatif à chacune des trois rubriques suivantes : traitement de données en tables et bases de données ; architectures matérielles, systèmes d’exploitation et réseaux ; algorithmique, langages et programmation.

Exercice n°2

L’exercice n°2 est extrait du sujet de bac 2021 de l’épreuve de Spécialité ; Numérique et Sciences Informatiques (NSI) de la filière générale. La calculatrice était interdite.

Thèmes abordés

Il s’agit d’un exercice sur la programmation Python, les tuples et les listes. On cherche à mettre en place une modélisation d’un jeu de labyrinthe.

Cliquez sur lien pour télécharger l’exercice n°2 du sujet de bac officiel.

Programmation d’une liste chainée en Python

Introduction

Les listes chaînées sont une structure de données qui représente une collection linéaire de nœuds. Une caractéristique spécifique des listes chaînées est que l’ordre des nœuds n’est pas dicté par leur présence en mémoire, mais plutôt par les pointeurs que chaque nœud possède vers le nœud suivant dans la séquence.

Il existe plusieurs types de listes chaînées :

  • Listes chaînées simples – Une liste chaînée classique, comme celle présentée dans l’image ci-dessus. Les nœuds des listes à liens simples contiennent un pointeur vers le nœud suivant de la liste.
  • Listes doublement chaînées – Ce type de liste chaînée contient à la fois un pointeur vers le nœud suivant, mais aussi un pointeur vers le nœud précédent de la liste.
  • Listes chaînées circulaires – Au lieu de contenir un pointeur nul à la fin de la liste, le dernier nœud de ces listes contient un pointeur vers le premier nœud, ce qui les rend circulaires.

Nous aborderons ici la liste chainée simple.

Liste chaînée simple

Une seule liste chaînée est la plus simple de toutes les variantes de listes chaînées. Chaque nœud d’une liste chaînée unique contient un élément et une référence à l’élément suivant, et c’est tout.

Dans cette partie, nous verrons comment créer un nœud pour la liste chaînée unique ainsi que les fonctions pour les différents types d’insertion, de parcourt et de suppression.

Création de la classe de nœuds

La première chose à faire est de créer une classe pour les nœuds. Les objets de cette classe seront les nœuds réels que nous insérerons dans notre liste de liens. Nous savons qu’un nœud pour une seule liste chaînée contient l’objet et la référence au nœud suivant. Par conséquent, notre classe de nœuds contiendra deux variables membres : item et ref. La valeur de l’élément sera fixée par la valeur passée dans le constructeur, tandis que la référence sera initialement fixée à zéro.

Exécutez le script suivant :

class Node:
    def __init__(self, data):
        self.item = data
        self.ref = None

Création de la classe de liste chainée simple

Ensuite, nous devons créer une classe pour la liste des liens. Cette classe contiendra les méthodes pour insérer, supprimer, parcourir et trier la liste. Au départ, la classe ne contiendra qu’un seul membre start_node qui pointera vers le nœud de départ ou le premier nœud de la liste. La valeur de start_node sera fixée à null à l’aide du constructeur puisque la liste liée sera vide au moment de sa création. Le script suivant crée une classe pour la liste chaînée.

class LinkedList:
    def __init__(self):
        self.start_node = None

 

Nous avons maintenant créé une classe pour notre liste unique. L’étape suivante consiste à ajouter une fonction d’insertion pour insérer des éléments dans la liste chaînée. Mais avant cela, nous allons ajouter une fonction pour parcourir une liste chaînée. Cette fonction nous aidera à lire les données de notre liste.

Parcourir les éléments de la liste liée

Le code Python pour la fonction de parcours est le suivant. Ajoutez la fonction ci-dessous à la classe LinkedList que nous avons créée dans la dernière section.

def traverse_list(self):
    if self.start_node is None:
        print("Pas d'élément dans la liste")
        return
    else:
        n = self.start_node
        while n is not None:
            print(n.item , " ")
            n = n.ref

 

Voyons ce qui se passe dans la fonction ci-dessus. Cette fonction comporte deux parties principales. Premièrement, elle vérifie si la liste chaînée est vide ou non. Le code suivant vérifie cela :

    if self.start_node is None:
        print("Pas d'élément dans la liste")
        return

 

Si la liste chaînée est vide, cela signifie qu’il n’y a pas d’élément à itérer. Dans ce cas, la fonction traverse_list() affiche simplement l’instruction que la liste n’a pas d’élément.

Sinon, si la liste comporte un élément, le code suivant s’exécutera :

        n = self.start_node
        while n is not None:
            print(n.item , " ")
            n = n.ref

 

Comme nous l’avons dit précédemment, la variable de départ contiendra une référence aux premiers nœuds. Par conséquent, nous initialisons une variable n avec la variable de départ. Ensuite, nous exécutons une boucle qui s’exécute jusqu’à ce que n devienne nul. À l’intérieur de la boucle, nous imprimons l’élément stocké au nœud actuel, puis nous fixons la valeur de la variable n à n.ref, qui contient la référence au nœud suivant. La référence du dernier noeud est None puisqu’il n’y a pas de noeud après cela. Par conséquent, lorsque n devient None, la boucle se termine.

Maintenant, nous avons une fonction pour parcourir une liste chaînée, nous verrons dans un prochain article  comment nous pouvons ajouter des éléments à une  liste chaînée.

 

Dopamine (8/8) – Twitter

Tu ne rates aucun tweet et tu checkes ton smartphone constamment ? C’est irrésistible et tu fais tout pour ne rater aucune info. C’est normal car l’appli est basée sur un mécanisme essentiel et primitif de ton cerveau, l’ANXIÉTÉ qui se manifeste par la peur de passer à côté de ce qui se passe online, te poussant à rester continuellement connecté.

Source : Dopamine (8/8) – Twitter | ARTE

Pour en savoir plus


Les Metiers du Web

Métier : Retoucheur – retoucheuse d’image

Le travail des retoucheurs numériques se situe après celui des photographes et avant une utilisation définitive de l’image pour impression ou publication. Le retoucheur doit améliorer ou modifier les photos à l’aide de logiciels de retouche numérique. Il travaille l’image afin de corriger ou d’améliorer la couleur, la luminosité, le contraste, de gommer les imperfections et parfois même de composer des montages. Dans certains cas, comme dans le domaine de la publicité, l’image modifiée est très différente de la photographie initiale.

Pour en savoir plus


Les Metiers du Web

Dopamine (7/8) – Uber

Ça y est ! Tu t’es enfin décidé(e) à devenir chauffeur Uber. Tu penses être libre et indépendant(e) mais c’est plus compliqué. L’appli va tout faire pour te donner des ordres sans que tu t’en aperçoives en utilisant la technique du NUDGE, des petits coups de coude pour te pousser vers ce qu’Uber considère comme une meilleure décision pour toi… ou pour ses actionnaires !

Source : Dopamine (7/8) – Uber | ARTE

Pour en savoir plus


Les Metiers du Web

Show Buttons
Hide Buttons
Translate »