Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec un scrypt tout bête [Python]

Sujet résolu
28 avril 2009 à 21:56:55

Bonsoir, je programme depuis très très peu avec python, je suis actuellement en train de suivre le cour deSwinnen et je bloque sur un exercice. Et je ne comprend pas pourquoi :euh:

Écrivez un script qui détermine si une chaîne contient ou non le caractère « e ».

Mon code étant :

ch = 'qul bl xmpl?'
y = len(ch)
x = 0

while ch[x] != 'e' and x != y:
x = x + 1

if ch[x] == 'e':
print('La chaîne de car caractère contient au moins un "e"')
else:
print('La chaîne de car caractère ne contient pas de "e"')

Le compilateur m'envoie l'erreur suivante : Traceback (most recent call last):
File "E:\Programmation\exe\contientE.py", line 8, in <module>
while ch[x] != 'e' and x != y:
IndexError: string index out of range

Alors que le scrypt marche sans soucis lorsque j'ai au moins un 'e' dans ma variable ch :o
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
28 avril 2009 à 22:40:07

Salut, j'ai modifié ton script et ajouté une meilleure solution ;)
ch = 'quel bl xmpl?'

#Première solution pas top du tout :
contientE = False
for i in range(len(ch)): #Parcourt toute la chaîne (équivalent à for(i = 0; i < strlen(ch); i++) en C)
	if ch[i] == 'e': #Si on a un e on met contientE à vrai.
		contientE = True
		break #On arrête la boucle (pas besoin d'aller plus loin)
if contientE:
	print 'La chaîne de car caractère contient au moins un "e"' 
else:
	print 'La chaîne de car caractère ne contient pas de "e"'

#Seconde solution utilisant le 'in' de Python, une seule ligne à écrire ! :
if 'e' in ch: #Une simple instruction pour savoir si il y a un e dans (in) ch
	print 'La chaîne de car caractère contient au moins un "e"' 
else:
	print 'La chaîne de car caractère ne contient pas de "e"'
  • Partager sur Facebook
  • Partager sur Twitter
28 avril 2009 à 22:45:35

mcc> Impassible est entrain d'apprendre le python, il ne comprendra pas forcément du premier coup d'oeil ce que tu as fais, ne pense-tu pas que quelques explications lui seraient bénéfiques?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
28 avril 2009 à 23:06:16

Ouais désolé,
je vais éditer mon message
  • Partager sur Facebook
  • Partager sur Twitter
28 avril 2009 à 23:26:06

Merci pour ta réponse, et merci pour les commentaire qu'on t'as fait rajouter ^^...
La seconde version est géniale, merci pour l'astuce en tout cas ;)
Encore une petite chose pourquoi est-ce que mon programme ne fonctionnait pas?
Que se ne soit pas la meilleure façon de programmer le problème ok, mais où avais-je faux?
  • Partager sur Facebook
  • Partager sur Twitter
29 avril 2009 à 20:06:19

mcc, ta première solution pue, t'as rien compris au for.

Impassible -> la deuxième solution n'est pas géniale, du moins pas pour toi. Si dans un projet tu devras vérifier ça, alors oui, il faudra que tu te serves du "if 'e' in machin". Mais là, le but de l'exo, c'est que tu apprennes à programmer, et donc il faut que tu le fasses toi-même.

Si je te dis "créer une fonction qui calcule la somme d'une liste" et que tu me sors :
def somme(liste):
    return sum(liste)
ou encore :
somme = sum
Ça n'a absolument aucun intérêt. Et ben là, c'est pareil.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
29 avril 2009 à 20:42:23

Citation : Maxibolt

mcc, ta première solution pue, t'as rien compris au for.



J'ai rarement vu une phrase aussi puérile.
  • Partager sur Facebook
  • Partager sur Twitter
29 avril 2009 à 20:57:35

T'as pas visité souvent le forum alors. Et au lieu de le prendre comme si je t'agressais, si tu te renseignais dessus ?
  • Partager sur Facebook
  • Partager sur Twitter
29 avril 2009 à 21:58:41

Je met de coté les petites gueguerres et je t'explique ton erreur Impassible:

tout d'abord, si tu as des bugs de ce genre, je te conseille je modifier ton code pour faire apparaitre tes différentes variable à chaque cycle, voilà le code que j'aurais utilisé pour trouver l'erreur:
ch = 'qul bl xmpl?'
y = len(ch)
x = 0

while ch[x] != 'e' and x != y:
   x = x + 1
   print str(x)+":"+ch[x]

concernant la dernière ligne du code, j'ignore si tu as déjà appris la concaténation des chaînes, en gros, j'affiche, à chaque fois que l'on lit la boucle while, la valeur de x le ch[x] correspondant

en testant ce code, voilà ce qui est retourné:
1:u
2:l
3:
4:b
5:l
6:
7:x
8:m
9:p
10:l
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
IndexError: string index out of range

Il y a donc deux choses à remarquer:
-x ne prend pas comme valeur 0:
c'est problématique car la première lettre d'une chaine de caractère va avoir 0 pour index, tu peux même voir que la première lettre de "ch" est un "q" alors que la première lettre affichée par le code est un "u", en fait, tout est décalé d'une unité.

-il y a une erreur d'index
eh oui, la dernière ligne "IndexError: string index out of range" signifie que tu demande un caractère qui n'est pas dans la chaîne, ici on demande ch[11] alors que la chaine ne va que jusqu'à ch[10]


Tu peux en déduire que x est trop élevé de 1 (vu que le code va chercher un index trop haut et qu'il n'affiche pas le premier caractère, si il allait jusqu'à ch[12] et qu'il n'affichait pas les deux premiers caractères, tu aurais du diminuer x de 2, ...)

Je te propose donc deux solutions:
-soit du définit au début de code x=-1, tu règle ainsi le problème de l'index trop élevé.
ch = 'qul bl xmpl?'
y = len(ch)
x = -1

while ch[x] != 'e' and x != y:
  x = x + 1

  if ch[x] == 'e':
    print('La chaîne de car caractère contient au moins un "e"')
  else:
    print('La chaîne de car caractère ne contient pas de "e"')

-soit tu met le x=x+1 après ton "if-else-end, comme ça, ta boucle testera correctement le ch[0].
ch = 'qul bl xmpl?'
y = len(ch)
x = 0

while ch[x] != 'e' and x != y:
  if ch[x] == 'e':
    print('La chaîne de car caractère contient au moins un "e"')
  else:
    print('La chaîne de car caractère ne contient pas de "e"')

  x = x + 1


Teste l'une des deux solutions, tu remarquera que cela bug toujours

en effet, avec la chaine testée, on a y=len(ch)=11
et ta condition fait que la boucle continue tant que x!=p (et donc x!=11),
mais dès que x=11, on demande à la boucle de nous retourner ch[11] qui n'existe pas (vu qu'on se limite ici à ch[10]),
cette fois, c'est y qui est trop élevé de 1, donc encore deux solution:
définir y par la formule: y=len(ch)-1
modifier la condition: while ch[x]!='e' ans x!=y-1

cette fois-ci ça devrais fonctionner correctement ^^
enfin, ça devrais fonctionner comme ton script sans les bugs, tu remarquera que l'affichage du résultat s'effectu mal, à toi d'y trouver une solution ;-)

voilà un code possible corrigé:
ch = 'qul bl xmpl?'
y = len(ch)-1
x = 0

while ch[x] != 'e' and x != y:
  if ch[x] == 'e':
    print('La chaîne de car caractère contient au moins un "e"')
  else:
    print('La chaîne de car caractère ne contient pas de "e"')

  x = x + 1
  • Partager sur Facebook
  • Partager sur Twitter
17 septembre 2009 à 20:07:27

Dsl pour la réponse vraiment très très tardive. Mais merci! ^^
  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2022 à 20:33:11

Bonjour je viens de remarquer que ce n'est pas l'exacte réponse à la question :

"Écrivez un script qui détermine si une chaîne contient ou non le caractère « e »."

Ici on vous demande si la chaine de caractères complète contient des "e" , donc on doit écrire un programme qui vérifie touts les caractères de la chaine puis écrire à la fin si elle contient des "e" ou non.

La commande   ch[x] != "e"    n'est pas nécessaire elle est fausse comme si que ici vous lui avait déjà donné la condition que le caractère n'est pas un "e" et DANS la condition vous avez mis une autre condition avec "if" si ch[x] == "e" print qu'il y a un "e" ce n'est pas faisable car le résultat sera toujours qu'il n'y aura pas de "e" se qui fait que c'est faut.

Et aussi dans x =! y la faute est qu'il ne prendra pas en considération le dernier caractère.

Donc la bonne réponse est :

ch = "qul bl exmple?"   #ici la chaine contient 2 "e"

y = len(ch)-1   #le -1 est indispensable car ici le résultat de len est 14 alors que le compte commence par 0

x = 0   #c'est x du départ

t = 0    #cette variable sera à la fin le nombre de "e" que la chaine contient

while x <= y:    #tant que x est plus petit OU égal à y

  if ch[x] == "e":

      t=t+1

  x = x + 1

if t==0:

    print("Cette chaine ne contient pas de e")

elif t==1:

    print("Cette chaine contient",t,"e")

else:

    print("Cette chaine contient",t,"e(s)")

#et le résultat sera 2 "e"

  • Partager sur Facebook
  • Partager sur Twitter
3 juin 2022 à 15:20:47

depuis 2009 ça a dû être bien résolu
  • Partager sur Facebook
  • Partager sur Twitter
24 septembre 2022 à 9:14:54

ch = 'qul bl xmpl?'
y = len(ch)-1
x = 0

while ch[x] != 'e' and x != y:
    x = x + 1

if ch[x] == 'e':
    print('La chaîne de car caractère contient au moins un "e"')
else:
    print('La chaîne de car caractère ne contient pas de "e"')

Moi aussi je me suis mis à apprendre (il y a 3 semaines) avec le cours de M. Swinnen et j'avais réussi avec un code lourdingue à mort. La solution de Impassible m'a semblé tellement plus logique est simple que la mienne que j'avais les nerfs de ne pas avoir vu et compris comme lui. Quoi qu'il en soit j'ai lu et testé toutes les solutions au débat et le code ci-dessus marche parfaitement.

  • Partager sur Facebook
  • Partager sur Twitter
24 septembre 2022 à 10:20:32

@UnePersonne6 et @AlexandreMoquet1 Bonjour, merci de ne pas déterrer d'ancien sujet résolu.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter