Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Gérer plusieurs boucles.

2 réponses
Avatar
Mat83
Bonjour, je suis en train ce créer un programme afin de convertir des bases 2, 10 et 16 entre elles.
Pour ce faire, j'ai eu nottament besoin d'uttiliser 2 chaines.
Je voudrais pouvoir lescontroler distinctement car a un endroit. Je fait breakpour arreter une boucle, et c'est l'autre qui s'arrete.
voila mon programme avec l'endroit problematique entre #

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
else :
print("ERREUR")
continue
elif base == 10 :
nombre = int(input("nombre"))
convert = int(input("convertion"))
if convert == 2 :
a = conversion_deci_binaire(nombre)
print(a)
break
elif convert == 16 :
a = conversion_deci_hexa(nombre)
print(a)
break
else :
print("ERREUR")
continue
elif base == 2 :
nombre = int(input("nombre"))
nombre = str(nombre)
for s in nombre:
if s not in "01":
print("Erreur")
continue
else:
convert = int(input("convertion"))
if convert == 16 :
a = conversion_binaire_hexa(nombre)
print(a)
b = str(input("reconvertir: oui/non"))
if b == "oui" :
continue
elif b == "non" :
break
else :
print("ERREUR")
break
elif convert == 10 :
a = conversion_binaire_decimal(nombre)
print(a)
break
else :
print("ERREUR")
continue

2 réponses

Avatar
Benoit Izac
Bonjour,
Le 20/11/2021 Í  13:56, Mat a écrit dans le message
 :
Bonjour, je suis en train ce créer un programme afin de convertir des
bases 2, 10 et 16 entre elles.
Pour ce faire, j'ai eu nottament besoin d'uttiliser 2 chaines.
Je voudrais pouvoir lescontroler distinctement car a un endroit. Je fait
breakpour arreter une boucle, et c'est l'autre qui s'arrete.
voila mon programme avec l'endroit problematique entre #

[…]
Je n'ai pas tout lu, c'est trop compliqué, ça fait mal Í  la tête ;-)
[Non testé c'est juste pour donner l'idée]
def convert(nb, base_in, base_out):
nb_int = int(nb, base_in) # on converti en un entier
if base_out == 2:
return bin(nb_int) # représention binaire
if base_out == 16:
return hex(nb_int) # représentation hexadécimale
return nb_int
while True:
base_entree = int(input("Base du nombre en entrée ? "))
base_sortie = int(input("Base du nombre en sortie ? "))
nombre_entree = input("Nombre Í  convertir ? ")
print(convert(nombre_entree, base_entree, base_sortie))
Sinon, pour ton problème, je pense qu'il te faut ajouter une condition
après ton for, un truc du genre
if tout_est_ok:
break
avec tout_est_ok passé Í  True dans ton for avant ton break. Mais ça
reste très compliqué. Dès que l'on voit les répétitions
nombre = int(input("nombre"))
convert = int(input("convertion"))
on se dit qu'il y a un problème.
Après, tu peux t'amuser Í  recoder bin() et hex() pour le fun, c'est un
bon exercice.
--
Benoit Izac
Avatar
Alain Ketterlin
Mat83 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.