3.3 PROGRAMMATION STRUCTURÉE

 

 

INTRODUCTION

 

Le concept de variable est très important en programmation. De ce fait, il faut y prêter une attention particulière et faire un effort spécial pour le comprendre en profondeur. Nous avons déjà vu qu’une variable est une boîte en mémoire référencée par un nom et pouvant contenir des données. On a vu également qu’un paramètre peut être vu comme un emplacement mémoire « volatile » qui reçoit une valeur accessible au sein de la fonction durant son exécution.

CONCEPTS DE PROGRAMMATION: Constantes, programmation procédurale, réutilisabilité

 

 

UNE MOSAÏQUE DE 10x10 PIERRES

 

On vous demande de créer une belle mosaïque constituée de pierres de différentes couleurs dont le côté mesure 10. Il faut les disposer côte à côte sur un canevas de taille 400x400. Comme vous êtes paresseux, vous allez faire appel à l’ordinateur pour cette tâche ennuyeuse et hautement répétitive en lui disant de placer les pierres de couleur aléatoire ligne par ligne. Utiliser delay(1) pour créer une courte pause entre chaque pierre permettant d’observer la construction de la mosaïque.

 
from gpanel import *
makeGPanel(0, 400, 0, 400)

for y in range(0, 400, 10):
    for x in range(0, 400, 10):
        setColor(getRandomX11Color())
        move(x + 5, y + 5)
        fillRectangle(10, 10)
        delay(1)        
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

À chaque fois qu’il faut parcourir une grille, deux boucles for imbriquées constitueront un outil de choix. Réfléchissez pourquoi les pierres sont disposées ligne par ligne du haut vers le bas. On ajoute 5 pixels vers la droite et vers le haut dans l’appel move() parce que le curseur de dessin doit se trouver au centre des rectangles dessinés.

La méthode getRandomX11Color() retourne une chaine de caractères représentant l’une des couleurs de la palette X11 que l’on peut ensuite passer à la fonction setColor(). On commence donc par appeler la fonction getRandomX11Color() et ensuite setColor().

 

 

NOMBRES MAGIQUES

 

Deux semaines plus tard, vous recevez une livraison de pierres qui sont cinq fois plus grandes, avec un côté  de 50. L’ordinateur est censé les disposer sur le même canevas de 400x400. Comment faut-il ajuster le programme ? Vous examinez bien entendu le précédent code mais vous êtes incapables de vous rappeler ce que font les différentes lignes de code.

Vous vous dites alors que vous allez remplacer toutes les occurrences de 10 par 50. Et là, mauvaise surprise, vous vous rendez compte que le programme fait n’importe quoi. Maintenant, la mosaïque ne couvre plus  l’ensemble du canevas.
 

Vous vous résolvez alors à parcourir le programme ligne à ligne pour trouver les erreurs. Si un tel travail est nécessaire pour adapter un programme à une nouvelle situation (réutilisation), vous avez écrit votre programme avec beaucoup d’amateurisme même s’il fonctionne correctement. Il faut s’habituer à coder proprement pour développer des programmes flexibles et facilement ajustables aux nouvelles situations.

Comment faut-il faire pour coder proprement ? Au lieu de coder la taille des pierres en dur dans le code, il serait plus judicieux de définir une variable size qui peut être utilisée en lieu et place de la taille des pierres dans l’ensemble du programme. Dans le but de structurer encore davantage le programme, on devrait également développer à part une fonction drawStone() pour le placement des pierres..

from gpanel import *

def drawStone(x, y):
    setColor(getRandomX11Color())
    move(x + size/2, y + size/2)
    fillRectangle(size, size)

makeGPanel(0, 400, 0, 400)

size = 50

for x in range(0, 400, size):
    for y in range(0, 400, size):
        drawStone(x, y)      
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

De manière générale, l’utilisation de valeurs numériques codées en dur dans le code donne lieu à des programmes peu réutilisables. Il vaut mieux définir des variables et les utiliser à la place des valeurs numériques codées en dur. Pour indiquer que celles-ci ne devraient pas changer, on leur donne un nom entièrement en majuscules et on les appelle alors des constants.

Une variable qui est définie dans le programme principal en dehors de toute autre fonction peut également être lue (mais non écrite) de l’intérieur des fonctions. C’est la raison pour laquelle on les appelle variables globales.

D’autre part, il est judicieux de placer les bouts de code autonomes dans des fonctions séparées. Cela comporte plusieurs avantages : premièrement, on peut facilement reconnaitre le nom de la fonction dans le code et comprendre ce qu’elle fait pour autant que son nom soit bien choisit et descriptif. Deuxièmement, on peut appeler cette fonction en de nombreuses situations sans devoir recopier le code dans tous les coins de notre programme. Finalement, le programme devient bien plus lisible et compréhensible. Cette façon de programmer s’appelle programmation structurée ou programmation procédurale et revêt une importance capitale dans l’art de programmer de manière élégante.

 

 

EXERCICES

 
1.

Le théorème de Pythagore permet de prouver que l’instruction:

fillTriangle(x - math.sqrt(3)/2 * r, y - r/2,
                 x + math.sqrt(3)/2 * r, y - r/2,
                 x, y + r);

dessine un triangle équilatéral dont le cercle circonscrit de rayon r est centré en (x, y). Vérifier ceci dans une fenêtre GPanel avec un repère cartésien dans la plage -1..1 pour les deux axes. Débrouillez-vous pour que l’instruction ci-dessus dessiner un triangle de cercle circonscrit centré à l’origine et de rayon 1.


2.


Réutiliser le code de l’exercice 1 et définir une fonction star(x, y, r) qui dessine une étoile  formée de deux triangles équilatéraux centrés en (x, y) et de taille (rayon du cercle circonscrit) r. Dessiner plusieurs étoiles pour tester la fonction star().


3.

Améliorer la fonction star() avec un paramètre permettant d’indiquer la couleur de remplissage de l’étoile. Dessiner une mosaïque sur un fond gris composée de 50x50 étoiles. Veiller à garder une taille d’étoiles cohérente et à ce qu’aucune des étoile ne soit remplie avec la même couleur que le fond de la fenêtre.