Mat83 <
nospam_mathias.neritablette@gmail.com.invalid> writes:
Bonjour, je suis en train ce créer un programme afin de convertir des
écritures en base 2, 10 et 16 entre elles.
Pour ce faire, j'ai eu notamment besoin d'utiliser 2 chaînes. Je
voudrais pouvoir les contrôler distinctement car a un endroit je fais
break pour arrêter une boucle, et c'est l'autre qui s'arrête.
Une instruction break arrête la boucle la plus proche, c'est tout.
(En Java on peu nommer les boucles et arrêter n'importe laquelle, mais
pas en Python. En Python on peut écrire "for ... else ..." et "while ....
else ...", avec la partie "else" exécutée seulement si la boucle qui
précède n'a pas exécuté un "break" -- donc juste le contraire de ce que
tu veux -- de toute façon, seuls les illuminés utilisent ce truc.)
voila mon programme avec l'endroit problematique entre #
Il n'y a pas de # dans ton code. Mais comme il n'y a que deux boucles...
Ta structure est la suivante :
while True:
...
for s in nombre:
...
Note que pour sortir du while, il faut déjà sortir du for, et aussi
garder l'information qu'il faut aussi sortir du while. Tu vas donc
arriver à une structure du genre :
interrompu = False
while True:
...
for s in nombre:
...
if ...
interrompu = True
break
...
if interrompu:
break
...
(Et donc, on peut sûrement écrire mieux que "while True".)
C'est assez compliqué à relire. Le mieux est sûrement de placer la
boucle for dans une fonction qui renvoie un booléen qui indique si il
faut continuer ou pas :
while True:
...
if not fonction_contenant_le for (...):
break
...
Mais voir plus bas pour une remarque sur la logique de ton code.
Autre chose :
while True:
base = int(input("base"))
if base == 16 :
nombre = str(input("nombre"))
convert = int(input("convertion"))
if convert == 2 :
a = conversion_hexa_binaire(nombre)
print(a)
break
elif convert == 10 :
a = conversion_hexa_decimal(nombre)
print(a)
break
[...]
Ce n'est pas très malin d'écrire des fonctions comme
"conversion_hex_decimal", puisqu'il n'y a pas de rapport direct entre
les deux écritures. Il vaut donc mieux passer par un entier (int), et
écrire d'un part :
- str_to_int (s, b) (transformer une écriture en base b en un int)
- int_to_str (i, b) (transformer un int en son écriture en base b)
puisque ces conversions sont très similaires pour les différentes bases.
Ton programme deviendrait :
while ...:
base = int (input ("base"))
ecriture = input ("écrture du nombre")
convert = int (input ("convert"))
valeur = str_to_int (ecriture, base)
resultat = int_to_str (valeur, convert)
...
Et effectivement, il y a des fonctions standard pour faire ça :
- int (s, b) calcule str_to_int (s, b)
- "{0:b}".format (i) calcule int_to_str (i, 2) (et on écrit "{0:d}" pour
décimal, et "{0:x}" pour hexadécimal)
(Note que les fonctions bin() et hex() font le même travail mais ajoutent
un préfixe à la chaîne résultante.)
Enfin :
[...]
elif base == 2 :
nombre = int(input("nombre"))
nombre = str(nombre)
for s in nombre:
if s not in "01":
print("Erreur")
continue
[...]
Ton "continue" passe au "tour" suivant de la boucle for. Ce que signifie
ce code c'est : "si un chiffre n'est pas correct, passer au chiffre
suivant". Ça n'a pas l'air correct. (Et la partie "else" -- supprimée
ici -- est encore moins compréhensible).
(On ne voit pas bien non plus pourquoi on ne fait pas un test similaire
des chiffres utilisés pour les autres bases. Au passage, c'est facile à
faire dans la fonction str_to_int().)
-- Alain.