Exercices mélangés — if / while / fonctions

Denis Dréano
PROG5-02

Exercices mélangés — if / while / fonctions

Objectifs cantonaux : O1.6.

Cette page combine tout ce que vous avez appris depuis le début de l’année : fonctions, conditions if/elif/else, boucles for/while. Les exercices suivants sont volontairement plus proches d’une synthèse que d’une découverte.

Priorité des opérations — rappel

▷ Rappel — Ordre d’évaluation

Comme en mathématiques, Python évalue les expressions dans cet ordre :

  1. Parenthèses
  2. Substitution des variables
  3. Évaluation des fonctions (sqrt(...), …)
  4. Puissances (**)
  5. Multiplication / division (*, /, //, %)
  6. Addition / soustraction (+, -)
→ Exemple — évaluer à la main

3 * 10 ** 2 + 20 - 5 / 10 * 9 ** 3 s’évalue ainsi :

3 * 100 + 20 - 5 / 10 * 729
300 + 20 - 0.5 * 729
320 - 364.5
= -44.5

Exercice 1 — simplifier avec elif

Le programme suivant fonctionne mais empile les if ... else ... de manière peu lisible. Réécrivez-le avec une structure if ... elif ... else.

from gturtle import *

def polygone(nb_cotes, couleur):
    setPenColor(couleur)
    for _ in range(nb_cotes):
        forward(100)
        right(360 / nb_cotes)

couleur = input("Couleur du stylo : ")

if couleur == "Jaune":
    couleur = "yellow"
else:
    if couleur == "Rouge":
        couleur = "red"
    else:
        if couleur == "Bleu":
            couleur = "blue"
        else:
            print("Couleur inconnue")

polygone(6, couleur)

! Pourquoi elif est préférable

Avec des if ... else ... imbriqués, même si le premier test est vrai, Python doit quand même descendre dans l’imbrication pour trouver la bonne branche. Avec elif, dès qu’une condition est vraie, les branches suivantes ne sont même pas testées — le code est aussi plus lisible.

Exercice 2 — nombre premier (fonctions + while)

Modifiez la fonction est_premier(n) ci-dessous, écrite avec un nombre fixe de répétitions, pour qu’elle utilise une boucle while au lieu d’une boucle for :

def est_premier(n):
    k = 1
    count_diviseurs = 0
    for _ in range(n):
        if n % k == 0:
            count_diviseurs += 1
        k += 1

    if count_diviseurs == 2:
        print(n, "est premier")
    else:
        print(n, "n'est pas premier")

est_premier(12)
est_premier(17)

! Indication

Il suffit de continuer à répéter la boucle tant que le nombre candidat \(k \leq n\).

Exercice 3 — synthèse : équation du 2e degré

Vous savez résoudre une équation du deuxième degré \(a x^2 + b x + c = 0\) avec le discriminant \(\Delta = b^2 - 4ac\) :

  • Si \(\Delta > 0\) : deux solutions \(x_1 = \dfrac{-b - \sqrt{\Delta}}{2a}\) et \(x_2 = \dfrac{-b + \sqrt{\Delta}}{2a}\)
  • Si \(\Delta = 0\) : une seule solution \(x = \dfrac{-b}{2a}\)
  • Si \(\Delta < 0\) : aucune solution réelle

Développez une fonction solve_quadratic_eq(a, b, c) qui affiche les solutions selon ces trois cas (utilisez if/elif/else et sqrt du module math). Gérez aussi le cas particulier \(a = 0\) (ce n’est alors pas une équation du 2e degré).

◈ Exemples attendus

>>> solve_quadratic_eq(0, 4, 10)
Ceci n'est pas une équation du 2e degré, car a=0

>>> solve_quadratic_eq(1, 0, -4)
Delta = 16
Il y a deux solutions : x1 = -2 et x2 = 2

>>> solve_quadratic_eq(1, 4, 4)
Delta = 0
Il n'y a qu'une seule solution : x = -2

>>> solve_quadratic_eq(1, 4, 5)
Delta < 0
Il n'y a aucune solution réelle à cette équation

Devoir donné par Cédric

Terminer les exercices de synthèse (elif, nombre premier, équation du 2e degré) en vue de la synthèse de mai.