<string>

Table des matières

Mission 3 - Fonctions et sous-problèmes

Mission 3 : Fonctions et sous-problèmes

Mission 3 : Fonctions et sous-problèmes

Introduction

UC Louvain

Le service Presse et Communication de l'Université fait appel aux étudiants de l'EPL pour étoffer ses ressources graphiques. Vous êtes chargés de produire des images de drapeaux et logos qui seront utilisés dans les médias de l'université. Pour produire ces dessins de nature géométrique, vous allez utiliser la programmation en Python en utilisant les graphiques tortue.

Objectifs

A l'issue de cette mission, chacun d'entre vous :

  • pourra expliquer et exploiter les notions suivantes en Python :
    • définition et appel de fonctions
    • paramètres et valeurs de retour
    • dessin avec la tortue
  • sera capable de décomposer un problème en sous-problèmes
  • pourra écrire une spécification précise d'un programme informatique

Préparation, étude et apprentissage

Vous devez lire et comprendre ces parties du syllabus pour pouvoir mener à bien cette mission :

Questionnaire de démarrage

Note

Pour vous aider dans la réalisation de ces exercices, certains d'entre eux sont disponibles sur Inginious avec une correction automatisée. Il a été fait en sorte que cette correction automatique soit utile à votre compréhension de la matière, cependant cela ne doit pas vous empêcher de discuter de vos réponses, correctes ou non, avec votre tuteur et les membres de votre groupe.

Questions à choix multiples

Les questions à choix multiples de cette mission sont également accessibles en ligne depuis https://inginious.info.ucl.ac.be/course/LSINF1101-PYTHON/Session3_QCM


        
        

Question 1

Définissez les concepts suivants et donnez un exemple :

  • définition d'une fonction
  • en-tête d'une fonction
  • documentation et spécification d'une fonction
  • corps d'une fonction
 
 
 
 
 
 

Question 2

Ecrivez l'en-tête et le corps d'une fonction baptisée afficheMax qui prend deux nombres entiers comme arguments et affiche le plus grand de ces nombres. La spécification de cette fonction est

pre: --
post: affiche le maximum entre les nombres entiers `a` et `b`


        
        

Que faut-il changer pour faire une fonction calculeMax qui retourne le plus grand nombre au lieu de l'afficher ?

 
 
 
 

Question 3

Un étudiant montre à son tuteur le programme suivant :

hauteur = int(input("Hauteur de la croix: "))
print()
croix('X', hauteur)

Lors de son exécution, il affiche les caractères suivants à l'écran :

Hauteur de la croix: 9

    X
    X
    X
    X
XXXXXXXXX
    X
    X
    X
    X

Réécrivez l'en-tête, la spécification et le corps de la fonction croix utilisée par cet étudiant. (Pour rappel, print(x, end="") imprime x sans aller à la ligne ensuite.)

Question 4

Ecrivez l'en-tête, la spécification et le corps d'une fonction fact(n) qui calcule la factorielle de n : n! = n.(n − 1).(n − 2)…1. Veillez à ce que la méthode que vous écrivez respecte bien les spécifications que vous définissez vous-même.


        
        

Question 5

Le module math définit les constantes et fonctions mathématiques usuelles, telles que sqrt(x) (racine carrée), sin(x), cos(x), log(x) (logarithme), pi, etc. Ecrivez un programme qui imprime les valeurs de sin π/n pour n allant de 1 à 10.


        
        

Question 6

Quelle est la différence entre les trois instructions import suivantes ? Après ces instructions, comment réfère-t-on à la constante math.pi ?

import math
.

import math as m
.

from math import *
.

Question 7

Dans le programme suivant :

import turtle
t = turtle.Turtle()
t.color("blue")
print(t.heading())

Quelle est la nature (module, objet, fonction, méthode, …) des différents identifiants : turtle, Turtle, t, color, print, heading ?

 
 
 
 
 
 

Quelle est la signification de turtle.Turtle ? t.color ?

 
 

Question 8

Ecrivez un programme qui crée une tortue et trace en bleu un escalier de 3 marches de 20 unités descendant vers la droite.

 
 
 
 
 
 
 
 

Question 9

Dans cette mission, vous allez devoir utiliser la tortue pour dessiner le drapeau européen :

Le drapeau européen

Pour écrire un programme qui réalise ce dessin, il n'est pas souhaitable de commencer directement à écrire le code Python correspondant. Il faut d'abord décomposer ce problème complexe en sous-problèmes plus simples. On pourra ensuite écrire des fonctions pour résoudre chacun de ces sous-problèmes, et utiliser ces fonctions dans la fonction principale.

Expliquez en français quels sous-problèmes vous pouvez identifier dans ce problème. Discutez-en avec votre tuteur durant la séance intermédiaire afin d'identifier les fonctions que vous allez réaliser. Pour répondre à cette question, vous devez avoir une idée de la spécification et des paramètres de vos fonctions, il n'est pas nécessaire d'avoir déjà leur réalisation.

 
 
 
 
 
 
 
 
 
 

Mission 3

Mission 3

L'objectif final de cette mission est de produire à l'écran un dessin du drapeau de l'Union Européenne :

Le drapeau européen

Le drapeau européen

Pour y parvenir, vous allez devoir décomposer votre problème en une combinaison de sous-problèmes plus simples, et correctement et précisément spécifier ces sous-problèmes, les résoudre sous forme de fonctions Python, que vous utiliserez ensuite pour résoudre votre problème principal.

Vous allez travailler avec les graphiques tortue de Python, en utilisant le module turtle. Vous allez procéder par étapes.

  1. Organisation : vous travaillerez à nouveau en binômes de deux étudiants. Associez-vous à un étudiant différent de la semaine dernière; faites une tournante au sein de votre groupe.

  2. Considérez le programme suivant :

    import turtle                # module des graphiques tortue
    tortue = turtle.Turtle()     # créer une nouvelle tortue
    tortue.speed("fastest")      # tracé rapide
    
    def square(size, color):
        """Trace un carré plein de taille `size` et de couleur `color`.
    
        pre: `color` spécifie une couleur.
             La tortue `tortue` est initialisée.
             La tortue est placée à un sommet et orientée en direction d'un
             côté du carré.
        post: Le carré a été tracé sur la droite du premier côté.
              La tortue est à la même position et orientation qu'au départ.
        """
        tortue.color(color)
        tortue.pendown()
        tortue.begin_fill()
        for i in range(4):
            tortue.forward(size)
            tortue.right(90)
        tortue.end_fill()
        tortue.penup()
    

    Ce programme définit une fonction square qui trace un carré avec la tortue. Essayez de lire et de comprendre ce programme. Sur base de la spécification en tête de la définition de square, pouvez-vous prédire précisément le résultat de l'exécution de square(200, "red") ?

  3. Créez un nouveau fichier flags.py qui contiendra votre programme pour cette mission, et recopiez-y le programme ci-dessus. Exécutez-le dans Thonny, puis exécutez l'instruction square(200, "red") et observez son comportement. Le résultat est-il conforme à votre prédiction ? Testez les différentes couleurs disponibles :

    ["black", "blue", "green", "red", "magenta", "cyan", "yellow", "white"]
    

    Exécutez help(square) dans l'interpréteur pour afficher la documentation de square [1].

  4. Dans votre fichier, écrivez une fonction rectangle(width, height, color) qui trace un rectangle de dimensions width x height et de couleur color. Ecrivez d'abord la spécification, développez ensuite le code qui réalise cette spécification. Exécutez et testez votre programme.

  5. Ecrivez (et spécifiez) une fonction belgian_flag(width) qui dessine un drapeau belge de largeur width et de proportions 3/2. Utilisez bien sûr la fonction rectangle que vous venez de construire.

  6. Ecrivez (et spécifiez) une fonction plus générale three_color_flag(width, color1, color2, color3) qui dessine un drapeau tricolore de couleurs données. belgian_flag peut maintenant être re-défini comme three_color_flag("black", "yellow", "red"). Ecrivez de même des fonctions dutch_flag, german_flag, luxemburg_flag et french_flag qui dessinent les drapeaux des pays voisins de la Belgique. Sur quelle fonction plus générale allez-vous vous baser ?

    Drapeaux de la Belgique et ses voisins
  7. Considérez maintenant le problème de dessiner le drapeau européen, comme représenté ci-dessus. Réfléchissez à comment décomposer ce problème en sous-problèmes, et spécifiez les différents sous-problèmes. Ecrivez ensuite les différentes fonctions réalisant ce problème, avec une fonction european_flag(width) qui dessine le drapeau.

  8. Pour parachever votre travail, écrivez un programme (en fin de votre fichier flags.py) qui affiche tous vos drapeaux dans une disposition de votre choix, par exemple :

    Tous les drapeaux
[1]Selon la version de Thonny que vous utilisez, il se peut que les caractères accentués ne s'affichent pas correctement dans la fonction help.

Remise de votre solution

Pour cette mission, vous devez soumettre votre programme flags.py et votre fichier README.txt au serveur de soumissions de programmes du cours. Votre fichier flags.py doit au moins contenir les fonctions :

square(size, color)
rectangle(width, height, color)
belgian_flag(width)
three_color_flag(width, color1, color2, color3)
european_flag(width)

        
        

Challenge

Pour aller plus loin, vous pouvez créer des fonctions pour dessiner d'autres drapeaux plus complexes, par exemple :

D'autres drapeaux

Grèce, Etats-Unis, Australie, Géorgie

Questions complémentaires

Questions complémentaires

The Greatest Divisor of a number a is the biggest number ( except a itself) such that the division of a by this natural is an entire division.

Since \(0\) is divisible by any natural this may cause some problems if you will look for the bigger one, so we expect you to return None.

Recall that the operator % returns the remainder of the Euclidian division.


        
        

Suppose you now have base € on your savings account.

If you leave it x years on that account at a fixed cummulative interest rate of y %, what will be the balance on your account after these x years?

Return that amount.


        
        

The Greatest Common Divisor of two natural numbers a and b is the biggest natural number k such that the division of a and b by this natural k is an entire division.

Euclid found a very simple recursive algorithm to find the GCD of two numbers: $$\text{gcd}(a,0) = a$$ $$\text{gcd}(a,b) = \text{gcd}(b,a\%b)$$

Recall that the operator % returns the remainder of the euclidian division.


        
        

In mathematics, the Fibonacci series are the numbers in the following sequence of integers, which is characterized by the fact that every number after the first two is the sum of the two preceding ones:

/Example: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

A very simple algorithm would be: $$\text{F}_0 = 0$$ $$\text{F}_1 = 1$$ $$\text{F}_n = \text{F}_{n-1} + \text{F}_{n-2}$$

Create a function fibonacci(n) that prints the nth element of the Fibonacci sequence.


        
        

The Body mass index (BMI) or Quetelet index, used by dieticians, is indicative of the condition of a person.

A normal person should have an index between 20 and 25. Below 20, she is considered thin, above 25 overweight. Beyond 30, the person is obese!

This index is calculated as the ratio between a person's weight, expressed in kg, and the square of the person's height, expressed in meters.

Create a function quetelet(height, weight) to calculate a person's Quetelet index and return thin string for a person with an index strictly less than 20, normal for a person whose index is between 20 and 25, overweight if the index is strictly greater than 25 and less than or equal to 30 and obese when it is strictly greater than 30.


        
        

The police is hiring you to develop a program to calculate the fine that a car driver will have to pay in the event of a violation. The law stipulates that the driver will have to pay 5 euros per km/h above the maximum authorized speed, with a minimum fine of 12.5€.

For any speeding of more than 10 km/h above the authorized speed, the fine is DOUBLED!

Your program takes as input the maximum allowed speed and the actual speed of the car. It calculates the possible fine.

Example:

  • If the maximum speed is 50km/h and the vehicle is traveling at 62km/h, the penalty will be 12 * 5 * 2 = 120€.
  • If the maximum speed is 50km/h and the vehicle is traveling at 56km/h, the penalty will be 6 * 5 = 30€.
  • If the maximum speed is 50km/h and the vehicle is traveling at 51km/h, the fine will be 12.5€.


        
        

Les équations du second degré sont des équations de la forme suivante:

ax2 + bx + c = 0

avec a ≠ 0

Pour déterminer si l'équation dispose d'une solution, on calcule le nombre ρ = b2 − 4ac. Si ρ est strictement positif, l'équation a exactement deux solutions. La première solution s'obtient via la formule suivante :

( − b + (ρ))/(2a)

Et la seconde racine s'obtient via la formule suivante :

( − b − (ρ))/(2a)

Si ρ est nul, l'équation a exactement une solution, dont la valeur est égale à  − b ⁄ (2a). Si ρ est négatif, l'équation n'a aucune solution.

Pour montrer que vous maîtrisez la décomposition en sous-problèmes, vous devrez définir trois fonctions. Chacune d'entre elles prendra uniquement comme paramètres les valeurs de a, b et c. Tout d'abord, définissez et implémentez la fonction rho, qui retourne la valeur du nombre ρ.

Ensuite, définissez et implémentez la fonction n_solutions, qui retourne le nombre de solutions de l'équation définie par a, b et c.

Finalement, définissez et implémentez la fonction solution, qui retourne la solution d'une équation qui n'a qu'une seule solution et la plus petite solution d'une équation qui a deux solutions. La fonction ne sera jamais appelée pour une équation qui ne dispose pas de solution.

Les fonctions n_solutions et solution doivent impérativement faire appel à la fonction rho .

Pour résoudre l'exercice, vous aurez besoin de la fonction racine_carree, décrite ci-dessous. Cette fonction est déjà implémentée, vous ne devez donc pas l'écrire vous-même.

def racine_carree(n):
"""
Calcule une racine carree
pre: n est un nombre réel
     n >= 0
post: retourne la racine carrée réelle de n
"""

Voici un exemple d'utilisation des fonctions que vous devez implémenter, avec l'équation x2 + 2x + 1 = 0 :

rho(1, 2, 1)
>>> 0

n_solutions(1, 2, 1)
>>> 1

solution(1, 2, 1)
>>> -1.0