Bonjour à tous,
j'ai un petit exercice que allez surement trouvé facile,que nous devons réaliser en étude supérieur ( nous venons d'apprendre ce language ). Cependant je coince et donc si quelqu'un pouvait m'aider. l'énoncé :
Programme qui lit une chaine de caractères texte et un mot m et qui affiche le nombre de fois où m apparait dans texte.
Aide Vous devez gérer deux indices i et j qui vont parcourir respectivement les caractères du texte et les caractères du mot à chercher. Vous devrez utiliser deux boucles while imbriquées, une pour parcourir le texte, et une pour parcourir le mot.
texte=input("le texte choisi ? ")
mot=input("le mot à chercher ?")
long=len(texte)
lon=len(mot)
compte = 0
i = 0
j=0
while i <=len(texte)-1:
if texte[i]==texte[j] :
while j<=len(mot) :
if texte[j]==mot :
compte=compte+1
j=j+1
i=i+1
print("le mot",mot,"apparait",compte,"fois")
Si vous pouvez m'indiquer des pistes car j'ai fait plsuieurs essais et je n'arrive vraiment pas.
merci
Si c'est un exercice universitaire, pourrais-tu donner en particulier ce que tu as déjà vu comme cours et applications (mais vite fait hein).
L'objectif de cet exercice c'est l'utilisation de while?
Car pour faire ce genre d'exercice, j'utiliserais tout sauf les boucles while.
Est-ce que l'on considère les erreurs dans le texte ( 2 espaces ou plus entre 2 mots ) ? Les ponctuations ? La différence entre minuscule et majuscule ?
Bonsoir;
oui c'est un exercice universitaire et on est dans la partie "enonce itératif" donc utilisation du while.
Nous avons déja vu les variables et les énoncés conditionels ( if else elif ).
Je n'ai pas compris votre question sur les erreurs ? j'ai donné l'énoncé tel qu'il était écrit...
L'énoncé est ambigü puisque quand on parle de "mot" on doit définir un délimiteur, par exemple un espace. Donc apparemment, on ne te demande pas de chercher un mot dans un texte, mais une chaîne dans une autre chaîne.
De plus, l'énoncé est doublement stupide car il te demande de faire du C. La solution en python est :
def compter( texte, mot ):
l = len( mot )
return sum( mot == texte[x:x+l] for x in range( len(texte)-l+1 ))
print compter( "anticonstitutionnellement", "con" )
print compter( "tululululu", "lu" )
Maintenant, puisque ton prof veut que fasses du C, tu vas donc le faire avec 2 while imbriqués (ça me donne déjà mal à la tête) : n'oublie pas de lui dire ce que j'en pense. En effet utiliser une boucle while pour itérer sur des indices de chaînes, c'est non seulement chiant, mais une "certaine probabilité" d'avoir une erreur "off by one" (genre il manque un caractère parce que t'as mis un < au lieu d'un <=...) donc, lol.
D'ailleurs tu t'es planté massivement, et tu as toute ma compassion XDDDDD
Par exemple, pour écrire le code ci-dessus, ben je l'ai tapé et puis il a marché du premier coup, ça prend dans les 20 secondes.
Pour le while, il faudrait que je fasse ça :
- tu prends un papier
- tu dessines 2 bandes l'une en dessous de l'autre, avec des petites cases dedans qui sont tes lettres
- tu mets une flèche pour i et une pour j
- tu déroules l'algo
mais je vais pas le faire (toi, oui).
- le j=0 n'est pas à la bonne place
- change de condition dans le second while
comme en maths, tu peux faire un changement d'indice ... ta condition est :
texte[i] == mot[j]
ce qui est chiant, change la en
texte[i+j] == mot[j]
comme ça, tu peux tester tous les caractères du mot si le premier correspond, en itérant seulement j.
Désolé, j'ai été méchant avec le C, car en C on utiliserait en fait un double for().
Faire ça sans utiliser de for devrait être assimilé à la torture, c'est presque aussi ignoble que l'asm x86...
merci pour ta reponse je vais regarder sa mais le code que tu as posté ,a pars le print le reste c'est du chinoix pour moi.
Mais quel est le rapport avec le C ? Car on apprend pas le C mais juste le python.
Et on vient de commencer le python donc c'est censé etre un exercice facile --'
Fin bon je vais essayer de faire comme tu m'a dit mais j'ai peur de ne pas avoir tout capté...
Fais un dessin tu verras, sur un post-it tu mets le texte (avec une lettre par case), sur un autre post-it tu mets le mot à chercher (avec une lettre par case aussi), au départ tu alignes les post-it, ensuite tu en décales un d'une lettre ... et voilà la première boucle...
Mais quel est le rapport avec le C ? Car on apprend pas le C mais juste le python
Car ton professeur pense en C pour coder en python, et du coup un code élégant en python (concision), la chose la plus importante se démarquant du C devient affreusement ressemblante à la taille d'un code C et retire toute son élégance.
De plus pour faire un exercice avec une ou deux boucles while d'autres exercices sont plus aptes à être utilisés.
texte = input("Entrez un texte :")
lettre = input("Le mot à chercher est : ")
longueur=len(texte)
count=0
i=int(0)
j=int(0)
while i<=(longueur-1):
k = i
while j<len(lettre) and texte[k]==lettre[j]:
while i<longueur and j<len(lettre) and texte[i]==lettre[j]:
i = i+1
k = k+1 j = j+1
if j==len(lettre)-1:
count=count+1
j = 0
i = i+1
print("Le mot",lettre,"apparait",count,"fois.")
Personnellement, j'ai que quelques erreurs d'indentation (dues au copier/coller ?).
Tu as bien Python 3.* ? Si tu as la 2.* il faut en plus que tu remplaces tes "input" par des "raw_input" ainsi que le 'à' par 'a' dans ton deuxième input.
Moi pour ton exo, je penserai plus à un split() et une boucle qui compare et incrémente..
Un truc de ce genre (je code ici, donc non testé):
mot = raw_input("Le mot: ")
t = open("f.txt","r")
r = t.read()
s = r.split(' ')
i = 0
size = len(s)
nombre_apparition = 0
while(i<size):
if s[i] == mot:
nombre_apparition += 1
i+=1
print("%s apparait %d fois dans le fichier\n"%(mot,nombre_apparition))
t.close()
Voilà, après cela ne reste qu'un opinion
EDIT: j'ai corrigé quelques petites erreurs dans mon script.
EDIT 2: Mon script ne m'affiche pas le nombre exact.. Ça m'énerve.
ch=input("entrer une chaine de caractére: ")
mot=input("entrer le mot a rechercher dans la chaine: ")
n=len(ch)
i=0
u=0
s=str()
while i<n:
while i<n:
if s==" "+mot:
u+=1
if ch[i]==" ":
s=str()
s+=ch[i]
i+=1
print("le mot",mot,"apparait",u,"fois")
mais la solution que j'ai donner c'est pour rechercher des mots (séparer par des espaces).
tu as reperer l'erreur dans mon code ou bien tu as juste tester
voila qui est régler :
ch=input("entrer une chaine de caractére: ")
ch+=" "
mot=input("entrer le mot a rechercher dans la chaine: ")
n=len(ch)
i=0
u=0
s=str()
while i<n:
while i<n:
if s==" "+mot:
u+=1
if ch[i]==" ":
s=str()
s+=ch[i]
i+=1
print("le mot",mot,"apparait",u,"fois")
résultat:
entrer une chaine de caractére: bonjour vous allez bien
entrer le mot a rechercher dans la chaine: bien
le mot bien apparait 1 fois
Bien que l'utilisation de la fonction count donne la solution la plus simple, je trouve la solution de Lord Casque Noir très élégante. Je ne pense jamais à utiliser le fait que l'on peut "sommer" (en quelques sortes) des booleeins.
Voilà, HS, mais cette solution est vraiment sympa, et très pythonesque
Je me suis cassé la tête avec ce programme et deux boucles while, n'importe quoi, mais c'est un challenge d'une certaine façon.
Il prend en compte les espacements
chaine = input("Entre une chaine de caracteres :")
mot = input("Entre le mot a chercher :")
compteur = 0
ch = ""
i = 0
while i < len(chaine) :
if chaine[i] == mot[0] :
j = 0
while j < len(mot) :
ch += chaine[i+j]
j += 1
if ch == mot :
compteur += 1
ch = ""
ch = ""
i += 1
print(compteur)
On est d'accord que c'est affreusement moche. Je serais le prof j'aimerais pas lire cela
bon j'ai toruvé,enfin comme cela il marche...donc peut etre des mauvaises notations mais bon...
Sinon j'utilise python 3 ( 3.1.6 )en effet
voici le code
texte = input("Entrez un texte :")
lettre = input("Le mot à chercher est : ")
longueur=len(texte)
count=0
i=int(0)
j=int(0)
## k=int(0)
while i<=(longueur-1):
k = i
##while j<len(lettre) and texte[k]==lettre[j]:
while i<longueur and j<len(lettre) and texte[i]==lettre[j]:
i = i+1
##k = k+1
j = j+1
if j==len(lettre)-1:
count=count+1
j = 0
i = i+1
print("Le mot",lettre,"apparait",count,"fois.")
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Python c'est bon, mangez-en.