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ères0et1(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 à
valeurce1multiplié par2son 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 à
valeurce1multiplié par2son 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') 14Une 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') 3236Une 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_hexapour convertir en chiffre hexadécimal un entier compris entre0et15?
Appelez l'enseignant pour vérifier votre réponse. -
Utilisez l'algorithme précédent et la chaîne
chiffres_hexapour compléter le corps de la fonctionecriture_hexa()qui doit renvoyer l'écriture hexadécimale de l'entiernbsous 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'