Cours02 23
Cours02 23
Cours02 23
Romain Demangeon
18/09/2023
Distribution des polys
▶
def perimetre ( largeur : int , longueur : int) −> int:
""" Precondition : ( longueur >= 0) and ( largeur >= 0)
Precondition : longueur >= largeur
retourne le perimetre du rectangle defini par sa largeur et sa longueur ."""
# Jeu de tests
assert perimetre (2, 3) == 10
assert perimetre (4, 9) == 26
assert perimetre (0, 0) == 0
assert perimetre (0, 8) == 16
Spécification
Définition
La spécification d’une fonction est la partie du code qui:
1. décrit le problème que la fonction résout.
2. décrit comment on utilise la fonction.
Définition
L’implémentation d’une fonction est l’écriture de l’algorithme qui calcule
le résultat de la fonction dans un langage informatique.
Approche Contractuelle
▶ un client avec un problème,
▶ un programmeur avec une solution.
▶ solution = une fonction.
▶ Expressions:
▶ atomiques / composées,
▶ comprises par l’interpréteur,
▶ évaluées par l’interpréteur,
▶ sémantique: régles d’évaluation.
▶ Fonctions:
▶ une seule instruction: return
▶ expressions paramétrées,
▶ évaluation de l’appel de fonction,
▶ Expressivité:
▶ uniquement des expressions qui se réduisent.
▶ calculatrice d’expressions mathématiques,
▶ expressivité suffisante avec la récursion:
▶ programmation récursive/fonctionnelle
▶ pas au programme.
Instructions
Définition
Une instruction est un ordre de calcul donné à la machine.
Le corps d’une fonction est une séquence d’instructions.
Instruction return
+ −→ + −→ . . .
1 ∗ 1 ∗
$
2 perimetre 2 10
z $
2 3
Appel d’une fonction dans une fonction
Problème: Calculer le périmètre d’un rectangle obtenu en accolant nb
rectangles identiques par la largeur.
Solution:
Appel d’une fonction dans une fonction
Problème: Calculer le périmètre d’un rectangle obtenu en accolant nb
rectangles identiques par la largeur.
Solution:
def perimetre n (larg : float , long : float , nb : int) −> float:
""" precondition : larg >= 0 and long >= 0
precondition : nb > 0"""
Idée
Décomposer un processus en tâches séquentielles.
Analogies
▶ Recettes de cuisine.
▶ Meubles suédois en kit / Jouets de construction.
▶ Patron de couture.
1 Brider une grosse poularde en entrée, la barder, la faire pocher à blanc. Lever les filets ; supprimer les os de l’estomac ; garnir l’intérieur
de la poularde avec un appareil à mousse de volaille préalablement préparé de la façon suivante :
2 Mousse de volaille : Décortiquer les chairs d’un poulet reine poché à blanc et refroidi. Parer ces chairs et les piler au mortier en leur
ajoutant un tiers de leur poids de foie gras cuit. Passer ce mélange au tamis fin ; le mettre dans une terrine ; le travailler en pleine glace
en lui ajoutant 2 décilitres de gelée de volaille mi-prise assez réduite, et 3 décilitres de crème fouettée bien ferme.
3 Napper de sauce chaud-froid blanche les parties inférieures de la poularde farcie. Mettre cette dernière dans une coupe en cristal ovale,
sur un fond de gelée solidifiée.
4 Garnir le dessus de la poularde avec les filets détaillés en aiguillettes, ces dernières légèrement arrondies sur un bout, décorées avec truffes
et moitiés de pistaches mondées, et lustrées à la gelée. (Afin de bien égaliser le dressage de ces aiguillettes et de le rendre solide, pousser
au cornet, sous chaque aiguillette, un mince cordon de mousse.) Lustrer la poularde à la gelée. Faire bien refroidir au rafraı̂chissoir.
Instructions en Python
Jusqu’ici:
▶ Utilisation du processeur pour:
▶ évaluer des expressions,
▶ interpréter des instructions.
▶ Utilisation de la mémoire pour:
▶ stocker les arguments.
▶ stocker les fonctions définies par l’utilisateur.
Paramètres en mémoire
Evaluation de perimetre(3, 2 ∗ 2)
▶ on met l’argument 3 dans le paramètre largeur
▶ on met l’argument 4 dans le paramètre longueur
▶ On interprète l’instruction return en évaluant l’expression,
▶ on accede à largeur, puis à longueur, puis à largeur, puis à longueur.
Aire du triangle
Objectif
Utiliser la mémoire pour plus que les arguments, de manière explicite.
Problème
Calculer l’aire d’un triangle à partir des longueurs de ses trois côtés.
Contrat
aire triangle(3, 4, 5) doit faire
Aire du triangle
Objectif
Utiliser la mémoire pour plus que les arguments, de manière explicite.
Problème
Calculer l’aire d’un triangle à partir des longueurs de ses trois côtés.
Contrat
aire triangle(3, 4, 5) doit faire 6.
Spécification
Méthode:
1. Que doit calculer la fonction ?
▶ donne le nom
▶ ici: aire d’un triangle à partir de ses côtés.
2. Quels sont les paramètres et leurs types ?
▶ donne leur nombre, leurs noms, leurs types
▶ ici: les trois côtés a, b, c,
▶ ici: tous les trois de type float.
3. Quelle est valeur de retour de la fonction ?
▶ donne le type de la sortie et la description de la fonction.
▶ ici: l’aire du triangle, de type float (on utilise /).
4. Que doivent vérifier les paramètres ?
▶ donne les precondition
▶ ici: les longueurs sont positives,
▶ ici: elles correspondent à un triangle (par exemple, pas 3, 4, 10).
Spécification
Méthode:
1. Que doit calculer la fonction ?
▶ donne le nom
▶ ici: aire d’un triangle à partir de ses côtés.
2. Quels sont les paramètres et leurs types ?
▶ donne leur nombre, leurs noms, leurs types
▶ ici: les trois côtés a, b, c,
▶ ici: tous les trois de type float.
3. Quelle est valeur de retour de la fonction ?
▶ donne le type de la sortie et la description de la fonction.
▶ ici: l’aire du triangle, de type float (on utilise /).
4. Que doivent vérifier les paramètres ?
▶ donne les precondition
▶ ici: les longueurs sont positives,
▶ ici: elles correspondent à un triangle (par exemple, pas 3, 4, 10).
Algorithme
▶ Programme indépendant du langage: suite d’instructions.
▶ Beaucoup d’algorithmes sont déjà connus:
▶ Euclide, Exponentiation rapide, Médiane en temps linéaire, Tri de
Hoare, Ford-Fulkerson, Martelli-Montanari.
▶ Trouver un algorithme est difficile.
▶ imagination, créativité, vision mathématique, internet.
▶ formellement: indécidable.
Ici:
Algorithmique
Algorithme
▶ Programme indépendant du langage: suite d’instructions.
▶ Beaucoup d’algorithmes sont déjà connus:
▶ Euclide, Exponentiation rapide, Médiane en temps linéaire, Tri de
Hoare, Ford-Fulkerson, Martelli-Montanari.
▶ Trouver un algorithme est difficile.
▶ imagination, créativité, vision mathématique, internet.
▶ formellement: indécidable.
Ici:
Formule d’Héron d’Alexandrie
a+b+c
1. Calculer le demi-périmètre du triangle: s = 2
p
2. L’aire vaut s(s − a)(s − b)(s − c)
Implémentation
Problème
Implémentation
Problème
▶ On calcule 4 fois le demi-périmètre.
▶ La fonction est difficile à lire.
Objectif: analogie avec la formule, calculer s 1 fois puis l’utiliser 4 fois.
Implémentation (II)
s : float = (a + b + c) / 2
Définition
Une variable est une case mémoire locale à une fonction.
Une variable est définie par:
1. un nom choisi par le programmeur.
2. un type de contenu: int, float, ...
3. une valeur correspondant à son contenu.
v1 : U1 = expr1
v2 : U2 = expr2
...
vn : UN = exprN
Réaffectation
▶ Instruction qui modifie la valeur d’une variable.
▶ Syntaxe : var = expr
▶ = n’est pas symétrique.
▶ Principe d’interprétation:
1. On évalue expr.
2. On remplace le contenu de var par la valeur de expr.
Représentation
n : int = 0
m : int = 58
n = m − 16
m = m + 1
return n + m
variable n m
4. apres la 4eme étape (réaffectation de m):
valeur 42 59
▶ Calcul de l’expression m + 1.
Nommer les variables
▶ A la discrétion du programmeur.
▶ en pensant aux relecteurs.
▶ Recommandations:
▶ (Monde Réel) Doit être explicite.
▶ utiliser, si nécessaire, des noms longs.
▶ demi perimetre plutôt que s.
▶ (PEP8) mots en minuscules de lettres a à z séparés par des
▶ chiffres autorisés à la fin du nom.
▶ Bon: compteur, plus grand nombre, calcul1, min liste1
▶ Mauvais: Compteur, plusgrandnombre, 1calcul, min liste 1
▶ (PEP8) Même règle pour les noms de fonctions.
▶ (LU1IN001) doit décrire le résultat.
Alternative
Définition
Instruction permettant de choisir entre deux séquences d’instructions
selon la valeur d’une condition.
(aussi: conditionnelle, branchement)
Valeur Absolue
x si x ≥ 0,
Définie en mathématiques par |x| =
−x sinon.
▶ on fait un choix entre deux calculs (x ou −x) selon une condition
(x ≥ 0).
▶ On utiliser une alternative pour implémenter:
def valeur absolue (x : float ) −> float :
""" retourne la valeur absolue de x."""
Alternative
if x >= 0:
abs x = x # consequent
else:
abs x = −x # alternant
return abs x
# Jeu de tests
assert valeur absolue (3) == 3
assert valeur absolue(−3) == 3
assert valeur absolue (1.5 − 2.5) == valeur absolue (2.5 − 1.5)
assert valeur absolue (0) == 0
assert valeur absolue(−0) == 0
if x >= 0:
return x # consequent
else:
return −x # alternant
# Jeu de tests
assert valeur absolue2 (3) == 3
assert valeur absolue2(−3) == 3
assert valeur absolue2 (1.5 − 2.5) == valeur absolue2 (2.5 − 1.5)
assert valeur absolue2 (0) == 0
assert valeur absolue2(−0) == 0
Définition
Fonction qui renvoie un booléen.
Définition
Fonction qui renvoie un booléen.
delta : float = b ∗ b − 4 ∗ a ∗ c
if delta > 0:
return 2
else:
if delta == 0:
return 1
else:
return 0
Alternatives Multiples
delta > 0
False
x '
True
return 2 delta == 0
False
w &
True
return 1 return 0
Alternatives Multiples
delta > 0
False
x '
True
return 2 delta == 0
False
w &
True
return 1 return 0
Alternative multiples:
def nb solutions2 (a : float , b : float , c : float ) −> int :
""" donne le nombre de solutions de l’equation a∗x^2 + b∗x + c = 0"""
delta : float = b ∗ b − 4 ∗ a ∗ c
if delta > 0:
return 2
elif delta == 0:
return 1
else:
return 0
Alternatives Multiples
▶ Principe d’interprétation:
1. On évalue la condition1
2. ▶ Si elle vaut True, on interprète uniquement le consequent1.
▶ Si elle vaut False, on évalue la condition2.
3. ▶ Si elle vaut True, on interprète uniquement le consequent2.
▶ Si elle vaut False, on évalue la condition3.
4. . . . on évalue la condition42.
▶ Si elle vaut True, on interprète uniquement le consequent42.
▶ Si elle vaut False, on interprète uniquement l’alternant.
▶ On n’évalue qu’un seul conséquent ou alternant.
Conditionnelle: Pas d’alternant
if cond:
consequent
▶ Principe d’interprétation:
1. On évalue la condition
2. ▶ Si elle vaut True, on interprète le conséquent.
▶ Utile pour faire quelque chose sous condition.
▶ ”Sinon ne rien faire.”
▶ Sanctionné à l’examen.
Effets de bords
Définition
Un effet de bord est une instruction d’une fonction qui modifie un état
(la mémoire, l’affichage) autre que la valeur de retour de la fonction.
▶ souvent son interprétation n’a pas d’effet direct sur le calcul.
n : int = 0
print ("la valeur de n est:", format (n))
m : int = x
print ("la valeur de n est:", format (n), "la valeur de m est:", format (m))
n = m + x
print ("la valeur de n est:", format (n), "la valeur de m est:", format (m))
m = n + 1
print ("la valeur de n est:", format (n), "la valeur de m est:", format (m))
n = m + x
print ("la valeur de n est:", format (n), "la valeur de m est:", format (m))
return n
nombre : int = 42
# ########################
Terminaison
Une fonction (informatique) f termine sur l’entrée e quand l’exécution de
f(e) finit par s’arrêter. Elle termine quand elle termine sur toutes ses
entrées.
▶ Toutes nos fonctions terminent trivialement.
Que nous manque t-il ?
Actions Répétitives
Objectif
Pouvoir répéter une action aussi longtemps que nécessaire.
▶ Analogie culinaire:
▶ monter des blancs en neige,
▶ cuire un gâteau.
▶ Répéter des actions similaires, potentiellement différentes.
▶ Comment exprimer aussi longtemps que nécessaire ?
▶ Terminaison ?
Calcul de la somme des premiers entiers
Problème
Calculer la somme des n premiers entiers.
Calcul de la somme des premiers entiers
Problème
Calculer la somme des n premiers entiers.
Pn n.(n+1)
(willing suspension of disbelief: ”Gauss n’a jamais existé: i=1 i = 2 est inconnue.”)
return 1 + 2 + 3 + 4 + 5
# Test
assert somme5 () == 15
Calcul de la somme des premiers entiers
Problème
Calculer la somme des n premiers entiers.
Pn n.(n+1)
(willing suspension of disbelief: ”Gauss n’a jamais existé: i=1 i = 2 est inconnue.”)
return 1 + 2 + 3 + 4 + 5
# Test
assert somme5 () == 15
▶ Malaise:
▶ solution spécifique à n = 5.
▶ définir une fonction pour chaque entier.
▶ Ecriture fastidieuse quand n = 100000.
▶ On voudrait:
▶ une définition générale def somme(n : int) −>int,
Calcul de la somme des premiers entiers (II)
▶ Calculs répétitifs: nombre d’étapes n’est pas fixe.
▶ Math: formule générale ni=1 i = 1 + 2 + · · · + n.
P
▶ n est paramètre de la formule (pas i).
▶ A la main, approche itérative:
▶ la somme s vaut 0 initialement,
▶ on ajoute le premier entier 1, s vaut 1,
▶ on ajoute l’entier suivant 2, s vaut 3,
▶ on ajoute l’entier suivant 3, s vaut 6,
▶ on ajoute l’entier suivant 4, s vaut 10,
▶ on ajoute l’entier suivant 5, s vaut 15,
▶ on a atteint la borne 5, on s’arrête et la somme vaut 15.
s = s + 1
s = s + 2
s = s + 3
s = s + 4
s = s + 5
return s
Calcul de la somme des premiers entiers (III)
while i <= 5:
s = s + i
i = i + 1
return s
# Test
assert somme while5 () == 1 + 2 + 3 + 4 + 5
while cond
instruction 1
instruction 2
...
instruction n
instruction n1
while i <= n:
s = s + i
i = i + 1
return s
Exercices
Somme des carrés.
Donner une fonction somme carres qui prend en entrée un entier naturel n et
renvoie la somme des carrées des entiers de 0 jusque n.
▶ Spécification:
Exercices
Somme des carrés.
Donner une fonction somme carres qui prend en entrée un entier naturel n et
renvoie la somme des carrées des entiers de 0 jusque n.
▶ Spécification: def somme carres(n : int) −>int
▶ Précondition:
Exercices
Somme des carrés.
Donner une fonction somme carres qui prend en entrée un entier naturel n et
renvoie la somme des carrées des entiers de 0 jusque n.
▶ Spécification: def somme carres(n : int) −>int
▶ Précondition: n >= 0
▶ Algorithme:
Exercices
Somme des carrés.
Donner une fonction somme carres qui prend en entrée un entier naturel n et
renvoie la somme des carrées des entiers de 0 jusque n.
▶ Spécification: def somme carres(n : int) −>int
▶ Précondition: n >= 0
▶ Algorithme: ajouter incrémentalement le carré de chaque entier, en
partant de 0 et en s’arrêtant à n
▶ Implémentation:
Exercices
Somme des carrés.
Donner une fonction somme carres qui prend en entrée un entier naturel n et
renvoie la somme des carrées des entiers de 0 jusque n.
▶ Spécification: def somme carres(n : int) −>int
▶ Précondition: n >= 0
▶ Algorithme: ajouter incrémentalement le carré de chaque entier, en
partant de 0 et en s’arrêtant à n
▶ Implémentation:
def somme carres (n : int) −> int:
""" Precondition : n >= 0 """
i : int = 0
s : int = 0
while i <= n:
s = s + i ∗ i
i = i + 1
return s
▶ Validation:
Exercices
Somme des carrés.
Donner une fonction somme carres qui prend en entrée un entier naturel n et
renvoie la somme des carrées des entiers de 0 jusque n.
▶ Spécification: def somme carres(n : int) −>int
▶ Précondition: n >= 0
▶ Algorithme: ajouter incrémentalement le carré de chaque entier, en
partant de 0 et en s’arrêtant à n
▶ Implémentation:
def somme carres (n : int) −> int:
""" Precondition : n >= 0 """
i : int = 0
s : int = 0
while i <= n:
s = s + i ∗ i
i = i + 1
return s
▶ Validation:
#Test
assert somme carres (4) == 30
Exercices (II)
Somme des entiers impairs.
Donner une fonction somme impairs qui prend en entrée un entier naturel n
et renvoie la somme des entiers impairs compris entre 0 et n (inclus).
▶ Spécification:
Exercices (II)
Somme des entiers impairs.
Donner une fonction somme impairs qui prend en entrée un entier naturel n
et renvoie la somme des entiers impairs compris entre 0 et n (inclus).
▶ Spécification: def somme impairs(n : int) −>int
▶ Précondition:
Exercices (II)
Somme des entiers impairs.
Donner une fonction somme impairs qui prend en entrée un entier naturel n
et renvoie la somme des entiers impairs compris entre 0 et n (inclus).
▶ Spécification: def somme impairs(n : int) −>int
▶ Précondition: n >= 0
▶ Algorithme:
Exercices (II)
Somme des entiers impairs.
Donner une fonction somme impairs qui prend en entrée un entier naturel n
et renvoie la somme des entiers impairs compris entre 0 et n (inclus).
▶ Spécification: def somme impairs(n : int) −>int
▶ Précondition: n >= 0
▶ Algorithme:
▶ parcourir incrémentalement les entiers, partant de 0 et en s’arrêtant à
n, et n’ajouter que ceux impairs.
▶ parcourir de 2 en 2, en partant de 1 et en s’arrêtant à n.
▶ parcourir incrémentalement les entiers de 0 à (n − 1) // 2, et ajouter
le successeur de leur double à chaque étape.
▶ Implémentation:
def somme impairs1 (n : int) −> int:
""" Precondition : n >= 0 """ def somme impairs2 (n : int) −> int: def somme impairs3 (n : int) −> int:
""" Precondition : n >= 0 """ """ Precondition : n >= 0 """
i : int = 0 i : int = 1 i : int = 0
s : int = 0 s : int = 0 s : int = 0
while i <= n: while i <= n: while i <= (n − 1) // 2:
if i % 2 == 1: s = s + i s = s + 2 ∗ i + 1
s = s + i i = i + 2 i = i + 1
i = i + 1 return s return s
return s
▶ Validation:
Exercices (II)
Somme des entiers impairs.
Donner une fonction somme impairs qui prend en entrée un entier naturel n
et renvoie la somme des entiers impairs compris entre 0 et n (inclus).
▶ Spécification: def somme impairs(n : int) −>int
▶ Précondition: n >= 0
▶ Algorithme:
▶ parcourir incrémentalement les entiers, partant de 0 et en s’arrêtant à
n, et n’ajouter que ceux impairs.
▶ parcourir de 2 en 2, en partant de 1 et en s’arrêtant à n.
▶ parcourir incrémentalement les entiers de 0 à (n − 1) // 2, et ajouter
le successeur de leur double à chaque étape.
▶ Implémentation:
def somme impairs1 (n : int) −> int:
""" Precondition : n >= 0 """ def somme impairs2 (n : int) −> int: def somme impairs3 (n : int) −> int:
""" Precondition : n >= 0 """ """ Precondition : n >= 0 """
i : int = 0 i : int = 1 i : int = 0
s : int = 0 s : int = 0 s : int = 0
while i <= n: while i <= n: while i <= (n − 1) // 2:
if i % 2 == 1: s = s + i s = s + 2 ∗ i + 1
s = s + i i = i + 2 i = i + 1
i = i + 1 return s return s
return s
▶ Spécification:
Exercices (III)
Racine cubique approchée.
Donner une fonction racine cubique entiere qui prend en entrée un entier
naturel n et renvoie la partie entière de sa racine cubique.
Pour interpréter
while cond:
instruction 1
...
instruction n
instruction apres 1
...
1. on évalue cond
et on revient en 1.
3. si la valeur de cond est False, on sort de la boucle et on interprète la
suite:
instruction apres 1
...
Simulation de boucle
Tables de simulation
1. Fixer les valeurs des paramètres (on simule sur un exemple précis)
2. Fixer les valeurs des variables non modifiées par la boucle.
3. Créer un tableau avec:
3.1 une colonne tour de boucle,
3.2 une colonne par variable modifiée par la boucle.
4. Remplir une ligne entrée avec les valeurs avant la boucle.
5. Décider s’il y a un tour de boucle en évaluant la condition.
6. Si oui, remplir une nouvelle ligne avec les valeurs en fin de tour.
7. Sinon, on écrit (sortie) au dernier tour.
Simulation de boucle: Exemple
while i <= n:
s = s + i
i = i + 1
return s
somme entiers(5)
Simulation de boucle: Exemple
while i <= n:
s = s + i
i = i + 1
return s
somme entiers(5)
tour de boucle variable s variable i
entrée 0 1
1 1 2
2 3 3
3 6 4
4 10 5
5 (sortie) 15 6
Utilisation de print
i : int = 1 # compteur
s : int = 0 # somme
return s
Suites récursives
Définition
Une suite récursive (un )n∈N est définie par un premier terme k et une
fonction de récursion f . On note:
u0 = k
un+1 = f (un ) pour n ∈ N
Exemple
u0 = 7
(un )n∈N définie par
un+1 = 2 ∗ un + 3 pour n ∈ N
while i < n:
u = 2 ∗ u + 3
i = i + 1
return u
while i < n:
u = 2 ∗ u + 3
i = i + 1
return u
while i < n:
u = f(u)
i = i + 1
return u
Somme et produit des termes d’une suite
Objectif
Calcul des sommes et produits partiels des termes d’une suite.
Suite dyadique:
1
∀n ∈ N, un = P 2n
n Pn 1
∀n ∈ N, Sn = k=0 uk = k=0 2k
Somme et produit des termes d’une suite
Objectif
Calcul des sommes et produits partiels des termes d’une suite.
Suite dyadique:
1
∀n ∈ N, un = P 2n
n Pn 1
∀n ∈ N, Sn = k=0 uk = k=0 2k
while k <= n:
s = s + ((1/2) ∗∗ k)
k = k + 1
return s
Somme et produit des termes d’une suite (II)
Factorielle: Qn
∀n ∈ N∗ , n! = k=1 k
Somme et produit des termes d’une suite (II)
Factorielle: Qn
∀n ∈ N∗ , n! = k=1 k
while k <= n:
f = f ∗ k
k = k + 1
return f
Somme et produit des termes d’une suite (III)
i : int = 0 # iterateur
u : int = k # premier terme de la suite
s : int = k # somme accumulee
while i < n:
u = f(u)
s = s + u
i = i + 1
return s
Calcul du PGCD
Problème
Calculer le plus grand commun diviseur de deux entiers positifs.
Méthode standard
▶ pgcd doit calculer le pgcd de ses paramètres.
▶ deux paramètres a et b, entiers tels que a>= b >= 0.
▶ résultat est un entier.
▶
def pgcd(n : int , m : int) −> int:
""" Precondition : n >= m > 0
Retourne le plus grand commun diviseur de n et m."""
if m == 0:
return n
else:
return max ensemble ( diviseurs (n) & diviseurs (m))
▶ Meilleur algorithme ?
Algorithme d’Euclide
▶ le pgcd de 4199 et 1530 est le pgcd de 1530 et 1139 (4199 = 1530 ∗ 2 + 1139)
▶ le pgcd de 1530 et 1139 est le pgcd de 1139 et 391 (1540 = 1139 ∗ 1 + 391)
▶ le pgcd de 1139 et 391 est le pgcd de 391 et 357 (1139 = 391 ∗ 2 + 357).
▶ le pgcd de 391 et 357 est le pgcd de 357 et 34 (391 = 357 ∗ 1 + 34).
▶ le pgcd de 357 et 34 est le pgcd de 34 et 17 (357 = 34 ∗ 10 + 17).
▶ le pgcd de 34 et 17 est le pgcd de 17 et 0 (34 = 17 ∗ 10 + 0).
▶ le pgcd de 17 et 0 est 17.
le pgcd de 4199 et 1530 est 17.
Algorithme d’Euclide: Implémentation
def pgcd(n : int , m : int) −> int:
""" Precondition : n >= m > 0
Retourne le plus grand commun diviseur de n et m."""
▶ Variables:
Algorithme d’Euclide: Implémentation
def pgcd(n : int , m : int) −> int:
""" Precondition : n >= m > 0
Retourne le plus grand commun diviseur de n et m."""
temp = d % r
d = r
r = temp
Algorithme d’Euclide: Implémentation
def pgcd(n : int , m : int) −> int:
""" Precondition : n >= m > 0
Retourne le plus grand commun diviseur de n et m."""
temp = d % r
d = r
r = temp
▶ Cours 07: d, r = r, d % r
Algorithme d’Euclide: Implémentation (II)
d : int = n
r : int = m
temp :int = 0 # variable temporaire
while r != 0:
temp = d % r
d = r
r = temp
return d
d : int = n
r : int = m
temp :int = 0 # variable temporaire
while r != 0:
temp = d % r
d = r
r = temp
return d
Problème
Pour un entier positif n fixé, combien y existe t’il de couples d’entiers
(i, j) tels que i + j soit divisible par 3.
i : int = 0
j : int = 0
nb : int = 0
while i <= n:
j = 0
while j <= n:
if (i + j) % 3 == 0:
nb = nb + 1
j = j +1
i = i + 1
return nb
Problème
Décider si une fonction des entiers f s’annule sur l’intervalle entier Ja; bK.
Méthode standard
▶ la fonction annule doit décider si une fonction est égale à 0.0 sur un
entier x compris entre deux bornes.
▶ trois arguments: une fonction f de type Callable[[int], float], une
borne inférieure a entière et une borne supérieure b entière.
▶ un résultat booléen.
▶ Algorithme: utiliser une boucle pour calculer successivement toutes
les valeurs de f sur les entiers entre a et b
▶ l’itérateur x va commencer à a puis être incrémenté successivement
jusque valoir b.
Zéro d’une fonction sur un intervalle (II)
return x ∗ x + x − 6
Typage
Donner un type à une expression c’est indiquer la nature d’une expression.
▶ Objectifs:
▶ Vérifier les appels de fonctions.
▶ Valider le code (homogénéité).
▶ Gérer la mémoire.
▶ Typage plus ou moins forts
▶ OCaml: float of int(x) +. 2.3
▶ Javascript: (2 + 3) + " saucisses"
▶ Typage explicite: le programmeur doit lui-même indiquer les types
(déclarations).
▶ Typage implicite: le type est inféré par un programme (algorithme
d’unification).
Sous-Typage
Définition
Un type A est un sous-type de B si toutes les expressions (les objets) de
type A sont aussi de type B.
▶ ▶ int est un sous-type de float.
▶ ”entier naturel” est un sous-type de ”entier”.
▶ ”poisson” est un sous-type de ”animal”.
▶ Si on a besoin d’une expression de type B, et que A est un sous-type
de B, on peut prendre une expression de type A.
▶ si f prend un entier, je peux calculer f (3).
▶ si j’ai besoin d’un animal, je peux prendre un poisson.
▶ Attention au sens:
▶ si f prend un entier naturel, je ne peux pas (forcément) calculer
f (−3).
▶ si j’ai besoin d’un poisson, je ne peux pas (forcément) prendre un
serpent.
▶ Dans les signatures des fonctions: + général pour les paramètres, +
particulier pour le résultat.
▶ Héritage dans les langages objets (11).
Grammaires d’expressions
PLUS
{ #
INT 3 INT 4
Grammaires d’expressions (II)
Définition
Un effet de bord est une instruction d’une fonction qui modifie un état
(la mémoire, l’affichage) autre que la valeur de retour de la fonction.
▶ souvent son interprétation n’a pas d’effet direct sur le calcul.
n : int = 0
print ("la valeur de n est:", format (n))
m : int = x
print ("la valeur de n est:", format (n), "la valeur de m est:", format (m))
n = m + x
print ("la valeur de n est:", format (n), "la valeur de m est:", format (m))
m = n + 1
print ("la valeur de n est:", format (n), "la valeur de m est:", format (m))
n = m + x
print ("la valeur de n est:", format (n), "la valeur de m est:", format (m))
return n
▶ A utiliser en TME.
Fonctions partielles
▶ primitive print:
▶ utilisation courante: afficher des chaı̂nes de caractères.
▶ peut contenir des expressions de différents types.
▶ la valeur de retour de print est
Fonctions partielles
▶ primitive print:
▶ utilisation courante: afficher des chaı̂nes de caractères.
▶ peut contenir des expressions de différents types.
▶ la valeur de retour de print est Rien
Fonctions partielles
▶ primitive print:
▶ utilisation courante: afficher des chaı̂nes de caractères.
▶ peut contenir des expressions de différents types.
▶ la valeur de retour de print est Rien (en Python: None).
▶ le type de None est
Fonctions partielles
▶ primitive print:
▶ utilisation courante: afficher des chaı̂nes de caractères.
▶ peut contenir des expressions de différents types.
▶ la valeur de retour de print est Rien (en Python: None).
▶ le type de None est None:
▶ Fonctions qui n’ont pas de valeur de retour:
def affiche trois fois (n : int) −> None:
print (n)
print (n)
print (n)
nombre : int = 42
i : int = 0 # compteur
while True:
i = i + 1
return 1
▶
def somme entiers2 (n : int) −> int:
""" retourne la somme des n premiers entiers naturels . """
i : int = 1 # entier courant , en commencant par 1
s : int = 0 # la somme cumulee
while i <= n:
s = s + i
i = i− 1
return s
▶ On définit alors:
def diago (f):
i = 0
if arret (f,f):
while True:
i = i + 1
else:
return i
▶ On définit alors:
def diago (f):
i = 0
if arret (f,f):
while True:
i = i + 1
else:
return i
TD-TME 02
▶ Thèmes 02 et 03 du cahier d’exercices.
Activité 02
▶ Approximation de pi
Cours 03 - 25/09/2023
▶ ”ces boucles qui nous gouvernent” (deuxième partie)