Aller au contenu

Programmation Impérative

En cours d'écriture

Ce chapitre n'est pas terminé, attention donc si vous le lisez, il peut y avoir des erreurs !

On a écrit une fonction qui permet de savoir si une fonction est compatible avec une distance au soleil. On aimerait maintenant faire l'inverse, c'est à dire écrire une fonction qui nous donne une distance avec laquelle une station est compatible.

Pour ça, on connaît déjà une méthode, que nous avions trouvé dans le chapitre sur les expressions :

On regarde l'irradiance pour chaque distance à partir de 1 million de kilomètres, en augmentant la distance de 1 million de kilomètre à chaque fois, jusqu'à trouver une irradiance entre les deux valeurs minimale et maximale de la station.

<!-- TODO (prof) ajouter le schema ici -->

Ce qui donne

| Distance (Mkm) | Irradiance (Wm^{-2}$) |
| :------------: | :-------------------: |
|       1        |      30645081,64      |
|       2        |      7661270,41       |
|      ...       |          ...          |
|       50       |       12258,03        |
|       51       |       11782,03        |

La méthode décrite ci-dessus comporte un caractère temporel :

augmenter ... à chaque fois, jusqu'à

On voudrait l'automatiser. C'est ce que nous allons voir dans ce chapitre avec la programmation impérative.

Impérative ?

Jusqu'a présent, on a majoritairement utilisé des expressions, composées de valeurs. On peut directement "remplacer" une expression par sa valeur sans changer ce que le programme calcule. On dit qu'elle est pure.

3 + 2 * (5 - 6)

Peut être remplacée par

3 + 2 * (-1)

ou encore par

1

Les appels aux fonctions que nous avons écrites à l'aide d'expressions pures, ont égalemement cette propriété. On dit que ces fonctions sont pures. Si on définit une fonction f comme suit :

def f(x,y):
    return x + 2 * y

L'expression :

f(4, 5) * 2

peut-être remplacée par

14 * 2

ou encore par

28

Dans une expression pure ou une fonction pure, il n'y a pas d'idée de temps. L'expression représente une valeur, elle est cette valeur.

Python permet, en plus des expression, d'utiliser des instructions. Une instruction est une action que l'ordinateur doit effectuer pour modifier l'état du programme.

Analogie : instruction et état

Une instruction est comme une étape d'une recette. L'état du programme serait alors l'ensemble des ingrédients, préparations, outils etc à un moment donné.

Par exemple.

  • On part d'un état le saladier est vide, la farine est dans le bocal
  • On execute l'instruction verser la farine dans le saladier
  • On arrive dans un état la farine est dans le saladier, le bocal est vide

Les instructions ont donc un aspect temporel il y a un état avant, un état après, et l'état après dépends de l'état d'avant.

On peut donc représenter un programme par une succession d'instruction, appelée séquence, comme une recette de cuisine ! On appelle celà de la programmation impérative.

Remarque

Certains langages excluent volontairement les aspect temporels de la représentation d'un programme. On les appelle les langages déclaratifs, dont les plus connus sont les langages fonctionnels, qui utilisent uniquement des valeurs, des expressions et des fonctions pour représenter un programme.

Ces langages sont on leur lot de désavantages, mais ils ne sont pas moins bien que des langages impératifs, même si on ne les abordera pas dans ce cours.

Etat : les variables

Vulgarisation

La suite de ce chapitre présente des notions sur le fonctionnement d'un ordinateur et d'un programme sous une forme extrêmement simplifiée et imprécise. La réalité est bien plus complexe.

Une instruction permet de changer l'état d'un programme. Mais qu'est-ce que l'état d'un programme ?

Comme les saladiers et les bocaux dans une recette, un ordinateur a également un contenant : la mémoire. La mémoire est un ensemble de petites boîtes vides numérotées, auxquelles on peut donner un nom et une valeur.

Numéro 0 1 2 3 4 5 6 7 ...
Nom ...
Valeur ...

Declaration

En Python, on représente les boites par des variables. On met une valeur dans une boîte avec l'instruction d'affectation, qui a la syntaxe suivante :

nom_variable = expression
a = 10
a = 2 + 5

Quand on exécute l'exemple, Python choisit une boîte, lui donne le nom a (c'est la déclaration de la variable), et y met la valeur 10.

Numéro 0 1 2 3 4 5 6 7 ...
Nom a ...
Valeur 10 ...

Affectation

Si une boîte avec ce nom existe déjà, sa valeur est remplacée par la nouvelle valeur (c'est l'assignation d'une valeur à la variable).

Par exemple, si on exécute a = 15, la mémoire sera ainsi :

Numéro 0 1 2 3 4 5 6 7 ...
Nom a ...
Valeur 15 ...

Utilisation

Quand on écrit le nom d'une variable dans une expression, il est remplacé par la valeur de la variable au moment de l'évaluation de l'expression.

Ainsi, si on fait

a = 10

L'expression

a * 2

Vaut 20.

Si on essaie d'accéder à une variable non déclarée précédemment, Python génère une erreur.

Séquence

Pour exécuter plusieurs instructions à la suite des autres, on utilise en Python la syntaxe suivante :

Chaque instruction est séparée de la précédente par un retour à la ligne :

instruction1
instruction2
instruction3
instruction4
...
a = 10
b = 4 
c = a + b
a = 22 
b = a + 2
c = b + 3
b = c + 5

Exercice

Après l'execution du code suivant, quelles valeurs contiennent les variables a, b et c ?

a = 10
b = 22 
c = a + b 
a = c - 1
c = c + 2

Faites les étapes une par une !

Dans une instruction comme :

a = a + 2

a + 2 est calculée AVANT que la valeur de a soit écrasée.

Donc après

a = 10
a = a + 2

a contient la valeur 12.

Executons chaque instruction pas à pas. Chaque ligne du tableau présente l'état des variables après l'instruction.

Instruction a b c
début
a = 10 10
b = 22 10 22
c = a + b 10 22 32
a = c - 1 31 22 31
c = c + 2 31 22 33

On lit la dernière ligne du tableau, et on trouve :

  • a vaut 31
  • b vaut 22
  • c vaut 33

Affichage en console

On peut écrire des instructions directement dans le fichier Python, elles seront exécutées dans l'ordre.

Si on écrit

a = 20
b = a + 2

Dans la partie fichier de Basthon, et qu'on l'execute ... Rien ne se passe.

En fait, Python execute bien les instructions, mais n'affiche rien.

On peut demander à Python de faire un affichage dans la console en utilisant la fonction print. C'est une fonction un peu particulière qui ne retourne pas de valeur. Elle s'utilise avec la syntaxe suivante :

print(chaine)

Affiche la chaine de caractères chaine suivie d'un retour à la ligne

print(chaine1, chaine2, chaine3, ...)

Affiche chaque chaine de caractère chaine1, chaine2, ... séparées par un espace, et suivies d'un retour à la ligne.

Les valeurs qui ne sont pas des chaînes sont converties en chaîne automatiquement quand c'est possible.

L'appel

print("Hello, World !")

Affiche

Hello, World !

Les appels

print("Hello,")
print("World !")

Affichent

Hello,
World ! 

L'appel

print("Hello,", "World", "!")

Affiche

Hello, World !

L'appel

print("J'ai", 26, "ans")

Affiche

J'ai 26 ans

Exercice

Ecrivez un programme Python qui affiche 5 fois Bonjour ! sur 5 lignes différentes:

Bonjour !
Bonjour !
Bonjour !
Bonjour !
Bonjour !
print("Bonjour !")
print("Bonjour !")
print("Bonjour !")
print("Bonjour !")
print("Bonjour !")

Commentaires

Parfois, on va vouloir préciser le code avec des commentaires en langue française.

Un commentaire est une ligne commençant par un #, qui est ignorée par l'interpréteur.

# Texte du commentaire
# On affiche deux fois bonjour 
# pour s'assurer d'être entendus.
print("Bonjour !")
print("Bonjour !")

Il ne faut pas abuser des commentaires. Les commentaires doivent aider la compréhension du code en apportant des informations qui ne peuvent pas être exprimées dans le code. Dans l'exemple ci-dessus, le commentaire précise pour s'assurer d'être entendus, ce qui ne peut être exprimé autrement que par un commentaire..