Depuis les premiers programmes les fonctions int et str sont utilisées
pour respectivement “convertir” une chaîne de caractères (telles qu’elle pourrait
être saisie par l’utilisateur) en nombre et inversement (pour affichage).
L’objectif de cette activité d’approfondissement est de reprogrammer ces fonctions
pour comprendre le mécanisme opéré. L’utilisation des fonctions int et str
du python est interdite.
Il est intéressant en premier lieu de comprendre qu’en mémoire, une chaîne de caractère représentant en nombre n’est pas la même chose que le nombre lui-même. Les fonctions suivantes permettent un affichage hexadécimal d’un nombre (représenté sur 32 bits / 4 octets / 8 caractères hexadécimaux) et un texte :
hexInt32 = lambda v: v.to_bytes(4,'big').hex() #4 = 32 // 8
hexStr = lambda v: v.encode().hex()
Expérimentation :
chaine = input("Saisir un nombre compris entre 0 et 2**32 (4 milliards) : ")
nombre = int(chaine)
print(hexStr(chaine))
print(hexInt32(nombre))
Expliquer le résultat obtenu.
Cette fonction à compléter convertit une chaîne de caractères en nombre.
L’algorithme consiste à parcourir la chaîne caractère par caractère :
- pour chaque caractère, on utilise la table ASCII pour obtenir sa valeur numérique à laquelle on soustrait 48 — cf : ord(“0”) = 48, ord(“1”) = 49…
- le nombre ainsi obtenu doit être multiplié par la puissance de 10 correspondant à son ranf et ajouté au total.
Exemple “456" :
- le premier caractère de la chaîne est “4” (52 dans la table ASCII) ; 52 - 48 est bien égal à 4 ; 4 102 = 400 (rappel : 10*2 = 10²) ;
- le second caractère est “5" ; 5 10*1 = 50 ; 400 + 50 = 450 ;
- le troisième caractère est “6" ; 6 10*0 = 6 ; 450 + 6 = 456.
Il faut une variable pour déterminer la puissance de 10 à appliquer ; remarquer que pour l’exemple “123”, elle vaut 2, 1, puis 0. Pour le nombre “2048”, la puissance serait 3, 2, 1 et enfin 0…
def str2int(text: str) -> int:
"""
Convertit une chaîne de caractères représentant un nombre en entier (cf fonction int)
@param text la chaîne de caractères représentant le nombre
@return le nombre entier correspondant
préconditions: le texte représente un nombre entier (sans autres caractères
que des chiffres éventuellements précédés de "-")
>>> str2int("0")
0
>>> str2int("1")
1
>>> str2int("123")
123
>>> str2int("-1024")
-1024
"""
assert text.lstrip("-").isnumeric() #précondition
#A COMPLETER
Cette fonction convertit un nombre en chaîne de caractères. une stratégie consiste à diviser plusieurs fois le nombre par 10 (jusqu’à ce que le quotient soit 0) en récupérant les restes (de la division) ; ici encore, utiliser la table ASCII pour reconstruire la chaîne de caractères.
Exemple : 713
- 713 % 10 = 3 (reste) ; chr(3 + 48) = "3" ; 713 // 10 = 71 (quotient) ;
- 71 % 10 = 1…
- 7 % 10 = 7…
def int2str(value: int) -> str:
"""
Convertit un nombre en une chaîne de caractères le représentant (cf fonction str)
@param value un nombre entier
@return la chaîne de caractères représentant le nombre
>>> int2str(0)
'0'
>>> int2str(1)
'1'
>>> int2str(123)
'123'
>>> int2str(-1024)
'-1024'
"""
#A COMPLETER