Re: Saisie de 2 nombres ...

Liste des GroupesRevenir à fcl python 
Sujet : Re: Saisie de 2 nombres ...
De : ram (at) *nospam* zedat.fu-berlin.de (Stefan Ram)
Groupes : fr.comp.lang.python
Date : 20. Oct 2024, 19:12:51
Autres entêtes
Organisation : Stefan Ram
Message-ID : <fonction-20241020191019@ram.dialup.fu-berlin.de>
References : 1 2 3
yves <yves@free.invalid> a écrit ou cité :
Le Fri, 18 Oct 2024 19:42:23 +0200, Olivier Miakinen a écrit:
txt = input("Entrez vos 2 nombres :") n1, n2 =
list(map(int,txt.split(',')))
ou encore :
n1,n2 = [int(elt) for elt in input("Entrez vos 2 nombres : ").split(',')]
Mais il faut mieux être le seul utilisateur, ou alors avoir une grande
confiance en ses utilisateurs.

  On peut aussi se faire une petite fonction qui renvoie un message
  d'erreur en français à balancer à l'utilisateur

from typing import Union, Tuple

def analyser_chaine(s: str) -> Union[Tuple[int, int], str]:
    """
    Analyse une chaîne selon la grammaire L définie par l'expression régulière "\d+,\d+".

    Args:
        s (str): La chaîne à analyser.

    Returns:
        Union[Tuple[int, int], str]: Un tuple contenant les deux nombres trouvés,
        ou une chaîne d'erreur si la grammaire n'est pas respectée.
    """
    if not s:
        return "La chaîne ne peut pas être vide."

    position: int = 0
    premier_nombre: str = ""
    deuxieme_nombre: str = ""
    etat: int = 0

    for caractere in s:
        if etat == 0:
            if caractere.isdigit():
                premier_nombre += caractere
            elif caractere == ',':
                if not premier_nombre:
                    return f"Erreur à la position {position}: Nombre manquant avant la virgule."
                etat = 1
            else:
                return f"Erreur à la position {position}: Caractère inattendu '{caractere}'."
        elif etat == 1:
            if caractere.isdigit():
                deuxieme_nombre += caractere
            else:
                return f"Erreur à la position {position}: Caractère inattendu '{caractere}'."
        position += 1

    if etat == 0:
        return "Erreur: Virgule manquante."
    elif not deuxieme_nombre:
        return f"Erreur à la position {position}: Nombre manquant après la virgule."

    return int(premier_nombre), int(deuxieme_nombre)


print(analyser_chaine("123,456"))  # Sortie: (123, 456)
print(analyser_chaine("0,789"))    # Sortie: (0, 789)
print(analyser_chaine("123,"))     # Sortie: "Erreur à la position 4: Nombre manquant après la virgule."
print(analyser_chaine("123"))      # Sortie: "Erreur: Virgule manquante."
print(analyser_chaine(",456"))     # Sortie: "Erreur à la position 0: Nombre manquant avant la virgule."
print(analyser_chaine("12a,456"))  # Sortie: "Erreur à la position 2: Caractère inattendu 'a'."
print(analyser_chaine(""))         # Lève une ValueError avec le message "La chaîne ne peut pas être vide."



Date Sujet#  Auteur
18 Oct 24 * Saisie de 2 nombres ...6gil203
18 Oct 24 `* Re: Saisie de 2 nombres ...5Olivier Miakinen
20 Oct 24  +* Re: Saisie de 2 nombres ...2gil203
20 Oct 24  i`- Re: Saisie de 2 nombres ...1Olivier Miakinen
20 Oct 24  `* Re: Saisie de 2 nombres ...2yves
20 Oct 24   `- Re: Saisie de 2 nombres ...1Stefan Ram

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal