TP - Conversions d'une base à une autre☘
Dans le dossier [NSI]
, créez le dossier [A01-Entiers positifs]
.
Téléchargez le fichier « à trous » TPA01.11.py
(clic droit -> [Enregistrer sous]) et enregistrez-le dans ce dossier.
Dans ces travaux pratiques, l'écriture binaire et l'écriture hexadécimale d'un
entier seront données sous la forme d'une chaîne de caractères.
Il est interdit d'utiliser les fonctions pré-programmées bin()
et hex()
.
Exemple
L'entier 117
s'écrira :
- en décimal avec l'entier
117
(typeint
) ; - en binaire avec la chaîne
'1110101'
constituée uniquement des caractères0
et1
(typestr
) ; - en hexadécimal avec la chaîne
'75'
constituée des caractères inclus dans0123456789ABCDEF
(typestr
).
Important
Dans chaque fonction à programmer, remplacez le mot-clef pass
par les
instructions nécessaires.
De plus, ne vous précipitez pas sur les pistes !
Prenez le temps de réflechir et chercher par vous-même en suivant les conseils
ci-après
Conseils
- Pour exécuter ce programme, il suffit de le sauvegarder puis d'appuyer sur la touche
[F5]
. - Avez-vous bien fait un schéma au brouillon pour visualiser le problème posé ?
- Avez-vous essayé de rédiger un algorithme en français, avec vos propres mots, avant de vous lancer dans la programmation sur machine ?
- Avez-vous utilisé des affichages intermédiaires, des
print()
, pour visualiser au fur et à mesure le contenu des variables ? - Avez-vous testé le programme avec les propositions de tests fournies ?
- Avez-vous testé le programme avec de nouveaux tests, différents de ceux proposés ?
Partie A - Conversion de binaire à décimal☘
Complétez le corps de la fonction binaire_2_decim()
en respectant ses
spécifications.
1 2 3 4 5 6 |
|
Exemple de Tests
>>> binaire_2_decim('1110101')
117
>>> binaire_2_decim('110010100100')
3236
Une piste
Pensez à utiliser la longueur de la chaîne
Une autre piste - l'algorithme explicité
Prenons l'exemple ci-dessous : nb = '1110101'
(c'est une chaîne de caractères - type str
).
Pour déterminer la valeur décimale correspondant à l'écriture binaire de nb
, on utilise un algorithme d'accumulation :
- On initialise une variable nommée
valeur
(par exemple) à zéro ; - On parcourt chaque caractère de la chaîne :
- Ce parcours commence par le premier
'1'
, que l'on transforme en entier. - Quel est le poids de ce
1
? (rappelez-vous la piste précédente) - On ajoute à
valeur
ce1
multiplié par2
son poids, comme en classe (et c'est la machine qui fera les calculs, il suffit de lui dire quoi calculer). - Puis le parcours passe au
'1'
suivant, que l'on transforme en entier. - Quel est le poids de ce
1
? (il faudra une variable pour modifier ce poids à chaque tour de boucle) - On ajoute à
valeur
ce1
multiplié par2
son poids, comme avant. - Puis le parcours passe au
'1'
suivant, que l'on transforme en entier. - etc...
- Ce parcours commence par le premier
Partie B - Écriture binaire par divisions successives☘
Pour obtenir, un à un, les chiffres d'une écriture binaire, on peut utiliser
Les divisions en cascade.
Raisonnons sur l'exemple de l'entier n = 17 :
-
Le chiffre de poids 0 dans l'écriture binaire de n est le reste de la division euclidienne de n par 2 :
Le chiffre de poids 0 est donc 1. -
Le chiffre de poids 1 dans l'écriture binaire de n est le reste de la division du quotient précédent par 2 :
Le chiffre de poids 1 est donc 0. -
Et on continue ainsi jusqu'à obtenir un quotient nul...
On peut résumer ce raisonnement par une "division en cascade" :
Dans cette division en cascade, on voit que les restes successifs (chiffres rouges) sont les chiffres de l'entier (obtenu à contre-sens de l'écriture usuelle puisqu'on obtient en premier le chiffre des unités) : n = (10001)_2
Lorsqu'on obtient un quotient (nombre noir) nul, on arrête la cascade.
Travail à faire☘
Utilisez l'algorithme précédent pour compléter le corps de la fonction
ecriture_binaire()
qui doit renvoyer l'écriture binaire de l'entier nb
sous la forme d'une chaîne de caractère.
1 2 3 4 5 6 |
|
Exemple de Tests
>>> ecriture_binaire(117)
'1110101'
>>> ecriture_binaire(3236)
'110010100100'
Partie C - Conversion d'hexadécimal à décimal☘
-
Complétez le corps de la fonction
chiffre_hexa_2_decim()
en respectant ses spécifications.1 2 3 4 5
def chiffre_hexa_2_decim(chiffre): """ chiffre – str, un seul caractère, qui est un chiffre hexadécimal entre '0' et 'F' Sortie: int – la valeur décimale de ce chiffre """
Exemple de Tests
>>> chiffre_hexa_2_decim('7') 7 >>> chiffre_hexa_2_decim('E') 14
Une piste
On pourra utiliser la variable
chiffres_hexa = '0123456789ABCDEF'
.
Testez les instructions>>> chiffres_hexa[5]
et
>>> chiffres_hexa[12]
pour vous convaincre de l'utilité de cette chaîne de caractères.
-
Complétez le corps de la fonction
hexa_2_decim()
. Vous pouvez faire appel à la fonctionchiffre_hexa_2_decim()
.1 2 3 4 5 6
def hexa_2_decim(nb): """ nb – str, écriture hexadécimale d'un entier positif donc formé uniquement des chiffres hexadécimaux de '0' à 'F' Sortie: int – l'écriture décimale de nb """
Exemple de Tests
>>> hexa_2_decim('75') 117 >>> hexa_2_decim('CA4') 3236
Une piste
Pensez à utiliser la longueur de la chaîne
Partie D - Écriture hexadécimale par divisions successives☘
Pour obtenir, un à un, les chiffres d'une écriture hexadécimale, on peut utiliser les Les divisions en cascade.
Raisonnons sur l'exemple de l'entier n = 43 981 :
-
Le chiffre de poids 0 dans l'écriture hexadécimale de n est le reste de la division euclidienne de n par 16 :
Le chiffre de poids 0 est donc D. -
Le chiffre de poids 1 dans l'écriture binaire de n est le reste de la division du quotient précédent par 16 :
Le chiffre de poids 1 est donc C. -
Et on continue ainsi jusqu'à obtenir un quotient nul...
On peut résumer ce raisonnement par une "division en cascade" :
Dans cette division en cascade, on voit que les restes successifs (chiffres rouges) sont les chiffres de l'entier (obtenu à contre-sens de l'écriture usuelle puisqu'on obtient en premier le chiffre des unités) : n = (ABCD)_{16}
Lorsqu'on obtient un quotient (nombre noir) nul, on arrête la cascade.
Travail à faire☘
-
On considère la chaîne de caractères
chiffres_hexa = '0123456789ABCDEF'
.
Comment utiliserchiffres_hexa
pour convertir en chiffre hexadécimal un entier compris entre0
et15
?
Appelez l'enseignant pour vérifier votre réponse. -
Utilisez l'algorithme précédent et la chaîne
chiffres_hexa
pour compléter le corps de la fonctionecriture_hexa()
qui doit renvoyer l'écriture hexadécimale de l'entiernb
sous la forme d'une chaîne de caractère.1 2 3 4 5 6
def ecriture_hexa(nb): """ nb – int, entier positif ou nul Sortie: str – chaîne de caractères, formée de chiffres hexadécimaux entre '0' et 'F', qui correspond à l'écriture hexadécimale de n """
Exemple de Tests
>>> ecriture_hexa(117) '75' >>> ecriture_hexa(3236) 'CA4'
Partie E - Écriture binaire par soustractions successives☘
Cette dernière partie a pour but de reprogrammer la fonction
ecriture_binaire()
en utilisant cette fois-ci l'algorithme des soustractions
successives utilisé en cours.
-
Compléter le corps de la fonction
plus_grand_puissance2()
en respectant ses spécifications.1 2 3 4 5
def plus_grande_puissance2(n): """ n – int, entier naturel non nul Sortie: int – le plus grand entier p tel que 2^p <= n """
Exemple de Tests
>>> plus_grande_puissance2(117) 6 >>> plus_grande_puissance2(3236) 11
-
Utilisez la fonction
plus_grand_puissance2()
pour compléter le corps de la fonctionecriture_binaire_bis()
.1 2 3 4 5 6 7
def ecriture_binaire_bis(nb): """ nb – int, entier positif ou nul Sortie: str – chaîne de caractères formée de '0' et de '1' qui correspond à l'écriture binaire de nb Cette chaîne est obtenue par la méthode des soustractions """
Exemple de Tests
>>> ecriture_binaire_bis(117) '1110101' >>> ecriture_binaire_bis(3236) '110010100100'