Re: Gérer plusieurs boucles.

Liste des GroupesRevenir à fcl python 
Sujet : Re: Gérer plusieurs boucles.
De : alain (at) *nospam* universite-de-strasbourg.fr.invalid (Alain Ketterlin)
Groupes : fr.comp.lang.python
Date : 21. Nov 2021, 19:10:50
Autres entêtes
Organisation : Université de Strasbourg
Message-ID : <87wnl1h1t1.fsf@universite-de-strasbourg.fr.invalid>
References : 1
User-Agent : Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)
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.

Date Sujet#  Auteur
20 Nov 21 * Gérer plusieurs boucles.3Mat83
20 Nov 21 +- Re: Gérer plusieurs boucles.1Benoit Izac
21 Nov 21 `- Re: Gérer plusieurs boucles.1Alain Ketterlin

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal