WarmUp : 1 NSI

A1 : trace d'exécution et pseudo code

Permutation de deux variables

1. Écrire l'algorithme en pseudocode permettant d'échanger les valeurs de deux variables a (initialisée à 5) et b (initialisée à 12).

2. Réaliser la trace d'exécution sous forme de tableau retraçant l'état de la mémoire à chaque étape.

Correction

Pseudocode :

Variables : a, b, temp : Entiers
Début
    a <- 5
    b <- 12
    temp <- a
    a <- b
    b <- temp
Fin
                

Trace d'exécution :

Ligne    | a  | b  | temp | Action
--------------------------------------------------
Ligne 1  | 5  | ?  | ?    | Initialisation de a
Ligne 2  | 5  | 12 | ?    | Initialisation de b
Ligne 3  | 5  | 12 | 5    | Copie de a dans temp
Ligne 4  | 12 | 12 | 5    | Copie de b dans a
Ligne 5  | 12 | 5  | 5    | Copie de temp dans b
                

Saisie utilisateur et calcul d'âge

1. Écrire en pseudocode un algorithme qui demande l'année de naissance de l'utilisateur, calcule son âge au cours de l'année 2026, puis affiche le résultat.

2. Effectuer la trace d'exécution dans l'hypothèse où l'utilisateur saisit la valeur 2008.

Correction

Pseudocode :

Variables : annee, age : Entiers
Début
    Afficher "Saisir votre année de naissance :"
    Saisir annee
    age <- 2026 - annee
    Afficher "Votre âge est :", age
Fin
                

Trace d'exécution (entrée utilisateur = 2008) :

Étape | Variable annee | Variable age | Affichage écran
------------------------------------------------------------------
1     | non définie    | non définie  | "Saisir votre année de naissance :"
2     | 2008           | non définie  | (l'utilisateur entre 2008)
3     | 2008           | 18           | (calcul : 2026 - 2008)
4     | 2008           | 18           | "Votre âge est : 18"
                

Trace d'exécution : portée des variables en Python

Soit le programme Python suivant :

def ajouter_cinq(x):
    x = x + 5
    print("Dans la fonction, x =", x)
    return x

x = 10
y = ajouter_cinq(x)
print("Dans le programme principal, x =", x)
print("y =", y)
                

Établir la trace d'exécution en distinguant l'espace mémoire principal et l'espace local de la fonction, puis donner les affichages console.

Correction

-- Espace global --
x = 10
Appel de ajouter_cinq(10)

  -- Espace local (ajouter_cinq) --
  x = 10
  x = 15
  Affichage : "Dans la fonction, x = 15"
  Retourne : 15

-- Espace global --
y = 15
Affichage : "Dans le programme principal, x = 10"
Affichage : "y = 15"
                

Trace d'exécution : composition de fonctions en Python

Soit le code Python suivant :

def carre(x):
    return x * x

def double(x):
    return x * 2

a = 3
res1 = double(carre(a))
res2 = carre(double(a))
print("res1 =", res1)
print("res2 =", res2)
                

Effectuer la trace d'exécution pas à pas pour déterminer les valeurs finales affichées.

Correction

a = 3

1. Calcul de res1 = double(carre(3)) :
   - Appel carre(3) -> renvoie 9
   - Appel double(9) -> renvoie 18
   - res1 = 18

2. Calcul de res2 = carre(double(3)) :
   - Appel double(3) -> renvoie 6
   - Appel carre(6) -> renvoie 36
   - res2 = 36

Affichage console :
res1 = 18
res2 = 36
                

LP1 : langage de programmation 1

Analyse d'erreur de type en Python

Un élève propose le code Python suivant :

annee_naissance = input("Votre année de naissance : ")
age = 2026 - annee_naissance
print("Vous avez", age, "ans.")
                

Expliquer l'erreur produite lors de l'exécution et proposer une version corrigée en Python.

Correction

input() renvoie une chaîne de caractères (str). On ne peut pas effectuer une soustraction entre un nombre entier et du texte (TypeError).

Code Python corrigé :

annee_naissance = int(input("Votre année de naissance : "))
age = 2026 - annee_naissance
print("Vous avez", age, "ans.")
                

Créer une fonction de conversion de température en Python

On souhaite convertir une température de Celsius vers Fahrenheit avec la formule : \(F = C \times 1.8 + 32\).

Écrire en Python une fonction celsius_vers_fahrenheit(celsius) qui prend une température en degrés Celsius en paramètre et renvoie la température correspondante en degrés Fahrenheit.

Faire un appel de la fonction avec la valeur 20 et afficher le résultat.

Correction

Code Python :

def celsius_vers_fahrenheit(celsius):
    f = celsius * 1.8 + 32
    return f

print(celsius_vers_fahrenheit(20))
                

Le programme affiche 68.0.

Créer une fonction avec un paramètre par défaut en Python

Écrire en Python une fonction prix_ttc(prix_ht, taux_tva=20) qui prend en paramètre un prix hors taxe et un taux de TVA, égal à 20 par défaut, puis renvoie le prix TTC.

Faire deux appels de la fonction avec les appels un prix de 50 et une TVA de 10, ainsi qu'in prix de 100.

Correction

Code Python :

def prix_ttc(prix_ht, taux_tva=20):
    res = prix_ht * (1 + taux_tva / 100)
    return res

print(prix_ttc(50, 10))
print(prix_ttc(100))
                

Le programme affiche successivement 55.0 et 120.0.

Analyse d'erreur de type en Python

Un élève propose le code Python suivant :

annee_naissance = input("Votre année de naissance : ")
age = 2026 - annee_naissance
print("Vous avez", age, "ans.")
                

Expliquer l'erreur produite lors de l'exécution et proposer une version corrigée en Python.

Correction

input() renvoie une chaîne de caractères (str). On ne peut pas effectuer une soustraction entre un nombre entier et du texte : Python produit une TypeError.

Code Python corrigé :

annee_naissance = int(input("Votre année de naissance : "))
age = 2026 - annee_naissance
print("Vous avez", age, "ans.")
                

LP2 : tests en Python

Tests et opérateurs booléens en Python

On considère les variables suivantes :

age = 17
note = 12
absences = 3

Pour chacune des expressions suivantes, indiquer si Python renvoie True ou False.

age < 18

note >= 10

absences == 0

note != 12

age >= 16 and note >= 10

age >= 18 or note >= 10

note > 15 or absences < 5

Écrire ensuite une expression Python permettant de tester si :

  1. l'élève est majeur ;
  2. la note est comprise entre 10 et 15 inclus ;
  3. l'élève a moins de 5 absences et une note supérieure ou égale à 10 ;
  4. l'élève a une note inférieure à 10 ou au moins 5 absences ;
  5. la note est différente de 0.

Correction

Valeurs des expressions :

age < 18
# True

note >= 10
# True

absences == 0
# False

note != 12
# False

age >= 16 and note >= 10
# True

age >= 18 or note >= 10
# True

note > 15 or absences < 5
# True

Expressions à écrire :

# L'élève est majeur
age >= 18

# La note est comprise entre 10 et 15 inclus
10 <= note <= 15

# Moins de 5 absences ET note supérieure ou égale à 10
absences < 5 and note >= 10

# Note inférieure à 10 OU au moins 5 absences
note < 10 or absences >= 5

# La note est différente de 0
note != 0

Gaming : déterminer le rang d'un joueur

Dans un jeu vidéo, on souhaite déterminer le rang obtenu par un joueur à la fin d'une partie.

On dispose des informations suivantes :

  • score : nombre de points obtenus ;
  • vies : nombre de vies restantes ;
  • boss : booléen qui vaut True si le boss final a été vaincu ;
  • temps : durée de la partie en minutes.

Le rang est déterminé selon les règles suivantes :

  • si le joueur n'a plus de vie, il obtient le rang "GAME OVER", quels que soient ses autres résultats ;
  • il obtient le rang "S" s'il a vaincu le boss, possède au moins 2 vies restantes, a obtenu au moins 10 000 points et a terminé la partie en moins de 30 minutes ;
  • il obtient le rang "A" s'il a vaincu le boss et possède au moins 8 000 points, ou s'il possède au moins 12 000 points ;
  • il obtient le rang "B" s'il possède au moins 5 000 points et au moins une vie restante ;
  • dans tous les autres cas, il obtient le rang "C".

Écrire une fonction rang_joueur(score, vies, boss, temps) qui renvoie le rang obtenu par le joueur.

La fonction devra utiliser if, elif, else, ainsi que les opérateurs and et or.

Tester ensuite la fonction avec les appels suivants :

print(rang_joueur(15000, 0, True, 20))
print(rang_joueur(11000, 3, True, 25))
print(rang_joueur(9000, 1, True, 40))
print(rang_joueur(12500, 1, False, 50))
print(rang_joueur(6500, 2, False, 35))
print(rang_joueur(3000, 3, False, 20))

Pour chacun des appels, prévoir le résultat avant d'exécuter le programme.

Correction

def rang_joueur(score, vies, boss, temps):

    if vies == 0:
        return "GAME OVER"

    elif boss == True and vies >= 2 and score >= 10000 and temps < 30:
        return "S"

    elif (boss == True and score >= 8000) or score >= 12000:
        return "A"

    elif score >= 5000 and vies >= 1:
        return "B"

    else:
        return "C"

Les appels donnent :

print(rang_joueur(15000, 0, True, 20))
# GAME OVER

print(rang_joueur(11000, 3, True, 25))
# S

print(rang_joueur(9000, 1, True, 40))
# A

print(rang_joueur(12500, 1, False, 50))
# A

print(rang_joueur(6500, 2, False, 35))
# B

print(rang_joueur(3000, 3, False, 20))
# C

Attention à l'ordre des conditions : le cas vies == 0 doit être testé en premier. Par exemple, un joueur ayant 15 000 points mais aucune vie restante doit obtenir "GAME OVER" et non le rang "A".