Exercice que je n'arrive pas à faire

Bonjour,
est-ce que quelqu’un aurait la gentillesse de m’aider sur un exercice ?? J’ai réaliser un programme mais je ne comprends pas pourquoi ce dernier ne marche pas.
Voici l’énoncé:
Ecrire une fonction qui prend un paramètre qui est une chaine de caractère. Cette fonction retourne le nombre de fois où la chaîne de caractères ‘bob’ est présente dans la chaîne de caractères passée en argument.

Par exemple, si la fonction est appelé avec comme argument la chaîne de caractères suivante : ‘azcbobobegghakl’, elle doit retourner : 2.

Voici ce que j’ai fais :

def bob(x):
    compteur = 0
    for i in range(0, len(x)):
        if 'bob' in x:
            compteur += 1
    return compteur

print(bob('bobekhgrabobobob'))

Merci beaucoup
Bonne journée

Bonjour @Force1402, bienvenu !

Tel que je comprend ta fonction actuelle : Une boucle parcourant toutes les possitions possibles dans la chaîne regarde si “bob” est dans la chaîne complète, et incrémente un compteur si c’est le cas.

Donc par exemple :

  • bob("bob") renvoie 3 (la chaîne “bob” y est, et la boucle tourne trois fois).
  • bob("bob-") renvoie 4 (la chaîne “bob” y est, et la boucle tourne quatre fois).
  • bob("bob---") renvoie 6 (la chaîne “bob” y est, le if et la boucle tourne six fois).
  • bob("---") renvoie 0 (la chaîne bob n’y est pas, le if n’est jamais vrai)

Le souci est donc que le if est soit toujours vrai, soit toujours faux. Je pense donc que tu peux t’en sortir en modifiant ton if, sans toucher au reste qui est un très bon début !

PS : Lorsque tu colle du code, tu peux poser ```python avant et ``` après pour avoir la coloration syntaxique (j’ai fait la modif dans ton message).

Merci beaucoup ! Je vais essayer de l’améliorer.
Mais ce que je cherche, c’est que si j’entre la chaîne de caractères « bobaboblolo »,par exemple, je veux que mon compteur retourne 2 et non pas 6. Est-ce que si c’est cela mon problème, je dois changer mon programme au if ?
Je ne sais pas si je suis clair, désolée si ce n’est pas le cas…

Oui c’est exactement ton problème, et c’est bien uniquement la ligne du if qu’il faut corriger. Son souci c’est qu’elle est soit toujours vraie, soit toujours fausse : donc soit ta fonction fait compteur += 1 pour toutes les lettres, soit elle ne le fait pour aucune lettre.

Bonsoir, j’ai essayé de l’améliorer toute la journée et je suis arrivée à cela :

def bob(x):
    compteur=0
    for i in range(0,len(x)):
        if x[i]=='b' and x[i+1]=='o' and x[i+1+1]=='b':
            compteur += 1
        else:
            i+= 1
    return compteur

print(bob("boblololobob"))

Cela ne marche toujours pas et je ne comprends pas pourquoi…
Merci

Désolée, j’ai oublié d’utiliser votre astuce pour copier coller le programme

L’idée est bonne ! Tu n’en es pas loin du tout.

Le else: i += 1 n’est pas utile, le for s’occupe de i tout seul, tu peux supprimer ces deux lignes sans que ça ne change rien.

Ton if est beaucoup mieux, il ne souffre que d’un souci : lorsque tu arrives à la fin de la chaîne tu essayes d’accéder à des lettres qui sont “en dehors” de la chaîne.

Par exemple bob("b"), au premier (et seul) tour de boucle, avec i == 0, va tester x[i] == 'b' qui sera vrai, puis x[i+1]=='o' mais x[i+1] c’est la 2ème lettre de la chaîne "b", qui n’en a qu’une, boom, IndexError.

Il existe plusieurs moyens pour contourner ce problème :

  • Demander à range de produre 2 valeurs de moins, de manière à ce que x[i+1+1] existe toujours.
  • Utiliser une tranche (un slice) du mot plutôt que trois accès manuels, car les tranches ne lèvent jamais d’IndexError.
  • utiliser startswith, qui gère bien la fin de la chaîne.
  • Sortir l’artillerie lourde avec un try: / except IndexError:.
1 « J'aime »

Merci beaucoup pour votre aide grâce à votre aide j’ai réussi à faire ce programme.
En revanche, je suis toujours bloquée sur un exercice que je n’arrive pas à faire. Auriez-vous la gentillesse de m’aider s’il vous plait ?

Voici l’énoncé:

En supposant que s est une chaine de caractères en minuscules. Ecrire un programme qui affiche la plus longue sous chaine de caractères dans s sans laquelle les lettres sont dans l’ordre alphabétique. Par exemple, pour s=“azcbobbobegghakl”, votre programme doit écrire :

La plus longue sous chaine de caractères dans l’ordre alphabétique est: beggh

S’il y a une égalité, afficher la première sous chaine de caractères. Par exemple, si s=“abcbcd”, votre programme doit écrire :

La plus longue sous chaine de caractères dans l’ordre alphabétique est: abc

Voici mon programme (qui je pense est totalement faux):

s="sqlsqabcdefdoz"
cs=""
for i in range(0,len(s)-1):
    while s[i]<s[i+1]:
        cs+=s[i]
        break
print(cs)

je n’arrive pas à faire la modification pour copier-coller mon code

Bonjour,

J’ai édité le message pour mettre les annotations correctes. Il s’agit de trois fois l’accent situé sur le chiffre 7 du clavier et lle s’obtient en appuyant sur la touche “Alt. Gr” en même temps : `

Concernant le programme en lui-même, avez-vous écrit quelque chose sur un bout de papier ? Réfléchi à la manière dont vous, vous le feriez ?

Typiquement, j’obtiens quelque chose comme ça (sans réfléchir plus avant) :

  1. Je lis la première lettre
  2. Si la seconde est plus loin dans l’ordre alphabétique (ou égale à celle que je viens de lire)
    2.1 Si oui, j’ajoute cette lettre à une chaine temporaire (qui contient donc déjà la lettre d’avant)
    2.2 Et je recommence en 2
  3. Si non, je stocke la chaine temporaire et je recommence en 1

Alors, forcément là je me rends compte que je dois lire toutes les lettres, que je dois initialiser cette chaine temporaire et l’écraser uniquement si la nouvelle est plus grande, etc…

Une fois toute cette réflexion faite, il faut la traduire en code :wink:

1 « J'aime »

J’ai essayé d’écrire sur un brouillon les étapes mais je n’arrive pas du tout à les traduire en code. Pouvez-vous me l’expliquer d’une autre façon s’il vous plaît ?
Merci

Lorsque tu les exécutes dans ta tête avec des exemples, les étapes de ton brouillon fonctionnent-elles ?

Oui, en tout cas j’en ai l’impression

Ça me fait penser que tu tente un exercice trop compliqué (tu essaye de « franchir une marche trop haute »), il faudrait que tu te fasse la main sur quelques exercices plus faciles avant, et revenir dessus plus tard.

Si tu manque d’inspiration pour les exercices tu as :

Mercii beaucoup je vais voir cela.