PORTÉE D'EXÉCUTION DU CODE :
exécution par cellule (chaque cellule s'exécute indépendamment des autres)
CODE ÉLÈVE
#############################################################################
# Question 1 : Mise en évidence du problème des flottants #
#############################################################################
# Écrire ci-dessous la fonction calcul_recettes() et son appel
#############################################################################
# Question 2 : Conversion BCD vers Décimal #
#############################################################################
# Écrire ci-dessous la fonction convertir_BCD_vers_decimal(liste_quartets)
# et l'assertion de test demandée
#############################################################################
# Code fourni pour les questions 3 et 4 #
#############################################################################
def convertir_dec_vers_BCD(decimal):
"""
Convertit une chaîne représentant un décimal vers une liste de quartets BCD.
Convention : virgule implicite avant les deux derniers quartets.
"""
ajouter_zero = False
liste_quartets = []
if '.' not in decimal:
decimal = decimal + '.00'
for i in range(len(decimal)):
if decimal[i] != '.':
quartet = bin(int(decimal[i]))[2:].zfill(4)
liste_quartets.append(quartet)
# Si le nombre n'a qu'un seul chiffre après la virgule
if decimal[i] == '.' and i == len(decimal) - 2:
ajouter_zero = True
if ajouter_zero:
liste_quartets.append('0000')
return liste_quartets
def additionner_binaire_quartets(quartet1, quartet2, retenue):
"""
Additionne bit à bit deux quartets binaire purs.
Renvoie un tuple (somme_binaire_str, nouvelle_retenue_int).
"""
somme = ""
for i in range(4):
# Lecture de la droite vers la gauche
bit1 = int(quartet1[3 - i])
bit2 = int(quartet2[3 - i])
total = bit1 + bit2 + retenue
if total == 0:
somme = '0' + somme
retenue = 0
elif total == 1:
somme = '1' + somme
retenue = 0
elif total == 2:
somme = '0' + somme
retenue = 1
elif total == 3:
somme = '1' + somme
retenue = 1
return somme, retenue
def corriger_BCD(somme, retenue):
"""
Applique la correction BCD si le quartet dépasse 9 ou génère une retenue.
Ajoute '0110' (6) au quartet invalide.
"""
# Si somme >= 10 ('1010' ou '1011' ou '1100' etc.)
if somme[0] == '1' and (somme[1] == '1' or somme[2] == '1'):
somme, retenue = additionner_binaire_quartets(somme, '0110', 0)
return somme, retenue
# S'il y a eu dépassement naturel lors de l'addition binaire
if retenue == 1:
somme, _ = additionner_binaire_quartets(somme, '0110', 0)
return somme, retenue
return somme, retenue
def aligner_quartets(q1: list, q2: list) -> tuple:
"""
Doit équilibrer les deux listes en ajoutant des '0000' à gauche
de la liste la plus courte.
"""
return q1, q2
def additionner_nombres_format_BCD(a, b):
"""
Additionne deux nombres au format BCD, quartet par quartet.
"""
liste_quartets1 = convertir_dec_vers_BCD(a)
liste_quartets2 = convertir_dec_vers_BCD(b)
# Ajustement de la longueur
liste_quartets1, liste_quartets2 = aligner_quartets(liste_quartets1, liste_quartets2)
retenue = 0
resultat = []
longueur_max = max(len(liste_quartets1), len(liste_quartets2))
for i in range(longueur_max):
index = longueur_max - i - 1
# Addition binaire simple des quartets
somme, retenue = additionner_binaire_quartets(liste_quartets1[index], liste_quartets2[index], retenue)
resultat.insert(0, somme)
# Gestion de la dernière retenue éventuelle
if retenue == 1:
resultat.insert(0, '0001')
return resultat
CODE ENSEIGNANT
SOLUTION POSSIBLE