2017-10-18 3 views
0

J'ai besoin d'aide pour répondre à cette question simple. Je commence à en apprendre plus sur les boucles while et je ne suis pas sûr de ce que je fais mal.While Loops (Et, Non, Ou)

Il y a 3 critères:

1) La chaîne doit commencer par "b" ou "B"

2) La chaîne doit avoir 6 caractères

3) La dernière lettre du La chaîne doit être "z" ou "Z"

Il affichera "Erreur" et demandera de nouveau à l'utilisateur si l'une des conditions n'est pas remplie. Il imprimera "Nice!" s'il répond aux critères.

Ceci est mon code:

string = input("Enter a string: ") 
length = len(string) 

while (not(string[0] == "b" or string[0] == "B" or string[length-1] == "z" or string[length-1] == "Z" and length < 6)): 
    print("Error!") 
    string = input("Enter a string: ")  
print("Nice! ") 

Si j'entre "1000", la sortie sera "Erreur!" Si je saisis "bz", la sortie sera "Nice!". Il faut imprimer le message d'erreur que la longueur est inférieure à 6.

+2

On dirait que vous avez besoin des expressions régulières. –

+0

Vous ne mettez pas à jour 'longueur' après avoir entré plusieurs chaînes. – mouviciel

Répondre

1

Vous pouvez faire quelque chose d'aussi simple que d'utiliser str.startswith et str.endswith pour tester les caractères limites:

s = input("Enter a string: ") 
while True: 
    if len(s) == 6 and s.startswith(('b', 'B')) and s.endswith(('z', 'Z')): 
     print('Nice') 
     break 
    else: 
     print('Error, try again!') 
     s = input("Enter a string: ") 

La longueur est vérifié d'abord pour que la conditionnel court-circuit une fois que l'expression len (une opération O()) échoue.

+0

TIL 'startswith' et' endswith' peuvent accepter un tuple de chaînes de test –

0

changer cette

string = input("Enter a string: ") 
    length = len(string) 
    while (not(string[0] == "b" or string[0] == "B" or string[length-1] == "z" 
    or string[length-1] == "Z" and length < 6)): 
    print("Error!") 
    string = input("Enter a string: ")  
    print("Nice! ") 

à

string = input("Enter a string: ") 
    length = len(string) 
    while (not((string[0] == "b" or string[0] == "B") and (string[length-1] 
    == "z" or string[length-1] == "Z") and (length == 6))): 
      print("Error!") 
      string = input("Enter a string: ")  
    print("Nice! ") 
+0

Ceci n'est toujours pas correct.Si la chaîne commence par 'b', elle ignore quand elle se termine par, et si elle se termine par 'z', elle ignore ce qu'elle commence par. C'est le même problème OP –

+0

N'est-ce pas la même chose? # @ interntseekho – Jane

+0

non "et" signifie à la fois la condition doit être vrai et "ou" signifie que si un seul qualifie son OK il suffit de faire tous ou et vérifiez qu'il ne fonctionne pas l'activer "et" et vérifier – interntseekho

0

L'un des plus importants idiomes de python est de garder votre code facilement lisible. Cela vous aide à repérer les erreurs très rapidement et d'autres personnes peuvent comprendre votre code sans trop d'efforts. Je propose donc de coder votre problème comme suit:

string = input("Enter a string: ") 

def conditions_satisfied(string): 
    cond1 = string[0] == "b" or string[0] == "B" 
    cond2 = string[-1] == "z" or string[-1] == "Z" 
    cond3 = len(string) == 6 
    return cond1 and cond2 and cond3 

while (not conditions_satisfied(string)): 
    print("Error!") 
    string = input("Enter a string: ") 
print("Nice! ") 

impressions:

Enter a string: 1000 
Error! 
Enter a string: bz 
Error! 
Enter a string: b1234z 
Nice! 

Comme déjà mentionné:

  • vous ne mettez pas à jour lengh dans la boucle while
  • vous
  • disons que la longueur de la chaîne doit être égale à 6 mais vous écrivez la condition "il doit être plus petit que 6": <6
0

Une autre façon d'écrire la condition (semble plus lisible pour moi):

string = input("Enter a string:") 

while string[0] not in ["b", "B"] or string[-1] not in ["z", "Z"] or len(string) != 6: 
    print("Error!") 
    string = input("Enter a string:") 
print("Nice!") 
0
import re 
string = input("Enter a string: ") 
length = len(string) 

if length == 8: 
    if (re.match(r'(b|B).*.(z|Z)$', string)): 
     print("Nice! ") 
    else: 
     print("Error!")