« Discussion:INFO719 : rappels et compléments de programmation » : différence entre les versions
(Solution de la question 1 (recherche des deux valeurs distinctes les plus grandes)) |
|||
(9 versions intermédiaires par 3 utilisateurs non affichées) | |||
Ligne 15 : | Ligne 15 : | ||
== Solution de la question 1 (recherche des deux valeurs distinctes les plus grandes) == |
== Solution de la question 1 (recherche des deux valeurs distinctes les plus grandes) == |
||
def recherche(tableau): |
def recherche(tableau): |
||
"""Cette fonction va chercher les deux valeurs les distinctes les plus grandes""" |
"""Cette fonction va chercher les deux valeurs les distinctes les plus grandes""" |
||
maximum=tableau[0] |
maximum=tableau[0] |
||
Ligne 28 : | Ligne 28 : | ||
maximum2=e |
maximum2=e |
||
return maximum2,maximum |
return maximum2,maximum |
||
---- |
|||
:'''rq :''' |
|||
:* pour écrire des morceaux de programme, le plus simple est de se débrouiller pour que chaque ligne commence par un espace. Comme ça, tout le programme se retrouve dans un cadre et le wiki respecte les sauts de lignes, l'indentation et tout le reste. |
|||
:* un peu mieux, mais un peu plus long : on met un <tt><nowiki><source lang="python"></nowiki></tt> avant le programme et un <tt><nowiki></source></nowiki></tt> après le programme. Comme ça, le wiki rajoute des couleurs pour les mots clé de python... |
|||
:* Cette fonction marche souvent, mais dans quelques cas particulier elle donne un résultat faux. Que se passe-t'il, et comment le corriger ? |
|||
>>> recherche (range(100)) |
|||
(98, 99) |
|||
>>> recherche (range(100,0,-1)) |
|||
(100, 100) |
|||
:'''Question subsidiaire :''' peut-on trouver les deux valeurs (distinctes) maximales en n'utilisant qu'une seule boucle ? |
|||
: --[[Utilisateur:Hyvernat|Hyvernat]] 17 septembre 2009 à 11:37 (CEST) |
|||
On a réessayé de faire la question en changeant la deuxième partie du code, on a incrementé la variable maximum pour qu'elle se distingue, mais on ne voit pas du tout ou purrait être l'erreur maintenant dans le nouveau code, qui est: |
|||
<source lang="python"> |
|||
for e in tableau: |
|||
if e>maximum2 and maximum<>e: |
|||
maximum2=maximum+1 |
|||
maximum2=e |
|||
return maximum2,maximum |
|||
</source> |
|||
---- |
|||
: C'est un peu étrange : tu fais 2 affectation de suite pour <tt>maximum2</tt>, ce qui veut dire que la première ne sert à rien. Cette variante dois se comporter exactement comme la précédente et ne doit donc pas marcher sur <tt>range(100,0,-2)</tt> par exemple. |
|||
: Le plus simple est probablement de rajouter une condition dans le <tt>if</tt> qui se trouve dans la seconde boucle : |
|||
<source lang="python"> |
|||
for e in tableau: |
|||
if (maximum2 < e < maximum) or (maximum2 == maximum): |
|||
maximum2 = e |
|||
</source> |
|||
: De cette manière, quand on commence avec <tt>maximum</tt> et <tt>maximum2</tt> égaux, <tt>maximum2</tt> prend la valeur suivante dans le tableau... |
|||
: --[[Utilisateur:Hyvernat|Hyvernat]] 23 septembre 2009 à 11:55 (CEST) |
|||
De plus, on a testé (sans grand succés) de ne faire "qu'une seule boucle", ce qui donnerait: |
|||
<source lang="python"> |
|||
for e in tableau: |
|||
if e>maximum: |
|||
maximum=e |
|||
if e>maximum2 and e<>maximum: |
|||
maximum2=e |
|||
</source> |
|||
mais ça ne change qu'une valeur pour range(100) |
|||
On a aussi essayé de ne pas imbriquer les boucles if (dans ce cas il n'y en aurai plus qu'une seule) et le résultat est le même que précedement! |
|||
Pouvez vous nous donner une piste? |
|||
---- |
|||
: '''Hint :''' après initialisation de <tt>maximum1</tt> et <tt>maximum2</tt>, il faut faire une boucle ; et suivant les cas possibles : |
|||
:* <tt>e < maximum2</tt> |
|||
:* <tt>maximum2 < e < maximum</tt> |
|||
:* <tt>maximum < e</tt> |
|||
: il faut soit ne rien faire, soit mettre <tt>maximum</tt> et/ou <tt>maximum2</tt> à jour... (Il y a d'autre cas à prendre en compte pour être sûr de bien faire l'initialisation, comme pour la variante à 2 boucles.) |
|||
: --[[Utilisateur:Hyvernat|Hyvernat]] 23 septembre 2009 à 11:55 (CEST) |
|||
On a essayer tant bien que mal avec vos indications et le code final auquel nous sommes arriver est le suivant: |
|||
<source lang="python"> |
|||
def recherchebis (tableau): |
|||
"""Cette fonction va chercher les deux valeurs les distinctes les plus grandes""" |
|||
maximum=tableau[0] |
|||
maximum2=tableau[0] |
|||
for e in tableau: |
|||
if maximum>e: |
|||
e=maximum |
|||
if maximum2<e<maximum : |
|||
maximum2=e |
|||
return maximum2,maximum |
|||
</source> |
|||
Mais on retombe sur le meme probleme que precedement les valeurs sont tout le temps les meme |
|||
---- |
|||
:C'est parce que vous ne mettez pas les bonnes valeurs à jours : quand <tt>maximum < e</tt>, il faut faire <tt>maximum2 = maximum</tt> et <tt>maximum = e</tt>. (Et aussi, vous avez mis <tt>maximum>e</tt> au lieu de <tt>maximum<e</tt>. |
|||
:Voici une solution qui devrait marcher : |
|||
<source lang="python"> |
|||
def max2(l): |
|||
"""recherche les deux valeurs maximales distinctes dans le tableau l. |
|||
Si toutes les valeurs sont égales, renvoie une seule valeur.""" |
|||
# mm contient le vrai maximum, m contient la valeur suivante. |
|||
# Autrement dit, on a tout le temps m <= mm |
|||
m = mm = l[0] |
|||
for e in l: |
|||
if m == mm: |
|||
if e > mm: mm = e |
|||
if e < m: m = e |
|||
elif e > mm: |
|||
m, mm = mm, e |
|||
elif m < e < mm: |
|||
m = e |
|||
if m == mm: |
|||
return(m) |
|||
else: |
|||
return(m,mm) |
|||
</source> |
|||
:--[[Utilisateur:Hyvernat|Hyvernat]] 28 septembre 2009 à 16:00 (CEST) |
|||
== Problème sur l'exercice du palindrome (question3) == |
|||
Voici le code qui marche |
|||
def identique(c): |
|||
"""Cette fonction va compter le nombre de lettre identique a la fin et au debut du mot""" |
|||
n=len(c)/2 |
|||
i=0 |
|||
l=0 |
|||
while (c[i]==c[-i-1]) and (i'''<'''n):#ici on a mit un strictement inférieur et ça marche!!! |
|||
l=l+1 |
|||
i=i+1 |
|||
return (l) |
|||
sauf que vous vouliez que l'on mette un <= et dans ce cas là le code ne marche plus et met false dans chaque cas. POURQUOI? |
|||
def palindrome(c): |
|||
"""Cette fonction retourne vraie si le compte est égale à la taille divisée par deux du mot, False sinon""" |
|||
if identique(c) ==len(c)/2: |
|||
return (True) |
|||
else: |
|||
return (False) |
|||
---- |
|||
: En fait, ce que je demandais, c'était de compter 3 pour <tt>identique("abcba")</tt>. Pour aller jusqu'à la case du milieu, le plus simple est de faire la boucle jusqu'à <tt>(len(c)+1)/2</tt>. Si on fait simplement un <tt><=</tt>, ca marche quand la taille est impaire, mais pas quand la taille est paire. Voici une possibilité : |
|||
<source lang="python"> |
|||
def identique(c): |
|||
"""Cette fonction va compter le nombre de lettre identique a la fin et au debut du mot""" |
|||
n = len(c) |
|||
if n == 0: |
|||
return(0) |
|||
elif n == 1: |
|||
return(1) |
|||
i=0 |
|||
l=0 |
|||
while (c[i]==c[-i-1]) and (i<(n+1)/2): |
|||
l=l+1 |
|||
i=i+1 |
|||
return (l) |
|||
def palindrome(c): |
|||
"""Cette fonction retourne vraie si le compte est égale à la taille divisée par deux du mot, False sinon""" |
|||
if identique(c) == (1+len(c))/2: |
|||
return (True) |
|||
else: |
|||
return (False) |
|||
</source> |
|||
: --[[Utilisateur:Hyvernat|Hyvernat]] 17 septembre 2009 à 12:01 (CEST) |
Dernière version du 28 septembre 2009 à 14:00
Présentation...
Salut, moi c'est Pierre, et mon bureau est le 22 dans le bâtiment Chablais...
Plus sérieusement, pour commencer une discussion, il suffit de cliquer sur le + en haut de la page. Vous pouvez alors rentrer un sujet de discussion et éditer le texte comme pour le wiki.
C'est mieux de signer vos intervention en utilisant l'avant dernier bouton d'édition, ou avec --~~~~.
- Pour répondre, il faut « modifier » la section correspondante...
- Par soucis de visibilité, il est parfois préférable de rajouter une marge à gauche (comme ici). Pour faire ça, il faut commencer votre ligne par un «:». (Ou un «::»...)
--Hyvernat 8 septembre 2009 à 10:05 (CEST)
Solution de la question 1 (recherche des deux valeurs distinctes les plus grandes)
def recherche(tableau): """Cette fonction va chercher les deux valeurs les distinctes les plus grandes""" maximum=tableau[0] maximum2=tableau[0] for e in tableau: if e>maximum: maximum=e for e in tableau: if e>maximum2 and e<maximum: maximum2=e return maximum2,maximum
- rq :
- pour écrire des morceaux de programme, le plus simple est de se débrouiller pour que chaque ligne commence par un espace. Comme ça, tout le programme se retrouve dans un cadre et le wiki respecte les sauts de lignes, l'indentation et tout le reste.
- un peu mieux, mais un peu plus long : on met un <source lang="python"> avant le programme et un </source> après le programme. Comme ça, le wiki rajoute des couleurs pour les mots clé de python...
- Cette fonction marche souvent, mais dans quelques cas particulier elle donne un résultat faux. Que se passe-t'il, et comment le corriger ?
>>> recherche (range(100)) (98, 99) >>> recherche (range(100,0,-1)) (100, 100)
- Question subsidiaire : peut-on trouver les deux valeurs (distinctes) maximales en n'utilisant qu'une seule boucle ?
- --Hyvernat 17 septembre 2009 à 11:37 (CEST)
On a réessayé de faire la question en changeant la deuxième partie du code, on a incrementé la variable maximum pour qu'elle se distingue, mais on ne voit pas du tout ou purrait être l'erreur maintenant dans le nouveau code, qui est:
<source lang="python"> for e in tableau:
if e>maximum2 and maximum<>e: maximum2=maximum+1 maximum2=e return maximum2,maximum
</source>
- C'est un peu étrange : tu fais 2 affectation de suite pour maximum2, ce qui veut dire que la première ne sert à rien. Cette variante dois se comporter exactement comme la précédente et ne doit donc pas marcher sur range(100,0,-2) par exemple.
- Le plus simple est probablement de rajouter une condition dans le if qui se trouve dans la seconde boucle :
<source lang="python">
for e in tableau: if (maximum2 < e < maximum) or (maximum2 == maximum): maximum2 = e
</source>
- De cette manière, quand on commence avec maximum et maximum2 égaux, maximum2 prend la valeur suivante dans le tableau...
- --Hyvernat 23 septembre 2009 à 11:55 (CEST)
De plus, on a testé (sans grand succés) de ne faire "qu'une seule boucle", ce qui donnerait:
<source lang="python">
for e in tableau:
if e>maximum: maximum=e if e>maximum2 and e<>maximum: maximum2=e
</source>
mais ça ne change qu'une valeur pour range(100) On a aussi essayé de ne pas imbriquer les boucles if (dans ce cas il n'y en aurai plus qu'une seule) et le résultat est le même que précedement! Pouvez vous nous donner une piste?
- Hint : après initialisation de maximum1 et maximum2, il faut faire une boucle ; et suivant les cas possibles :
- e < maximum2
- maximum2 < e < maximum
- maximum < e
- il faut soit ne rien faire, soit mettre maximum et/ou maximum2 à jour... (Il y a d'autre cas à prendre en compte pour être sûr de bien faire l'initialisation, comme pour la variante à 2 boucles.)
- --Hyvernat 23 septembre 2009 à 11:55 (CEST)
On a essayer tant bien que mal avec vos indications et le code final auquel nous sommes arriver est le suivant:
<source lang="python"> def recherchebis (tableau):
"""Cette fonction va chercher les deux valeurs les distinctes les plus grandes""" maximum=tableau[0] maximum2=tableau[0] for e in tableau: if maximum>e: e=maximum if maximum2<e<maximum : maximum2=e return maximum2,maximum
</source>
Mais on retombe sur le meme probleme que precedement les valeurs sont tout le temps les meme
- C'est parce que vous ne mettez pas les bonnes valeurs à jours : quand maximum < e, il faut faire maximum2 = maximum et maximum = e. (Et aussi, vous avez mis maximum>e au lieu de maximum<e.
- Voici une solution qui devrait marcher :
<source lang="python"> def max2(l):
"""recherche les deux valeurs maximales distinctes dans le tableau l.
Si toutes les valeurs sont égales, renvoie une seule valeur."""
# mm contient le vrai maximum, m contient la valeur suivante. # Autrement dit, on a tout le temps m <= mm m = mm = l[0] for e in l: if m == mm: if e > mm: mm = e if e < m: m = e elif e > mm: m, mm = mm, e elif m < e < mm: m = e if m == mm: return(m) else: return(m,mm)
</source>
- --Hyvernat 28 septembre 2009 à 16:00 (CEST)
Problème sur l'exercice du palindrome (question3)
Voici le code qui marche
def identique(c): """Cette fonction va compter le nombre de lettre identique a la fin et au debut du mot""" n=len(c)/2 i=0 l=0 while (c[i]==c[-i-1]) and (i<n):#ici on a mit un strictement inférieur et ça marche!!! l=l+1 i=i+1 return (l)
sauf que vous vouliez que l'on mette un <= et dans ce cas là le code ne marche plus et met false dans chaque cas. POURQUOI?
def palindrome(c): """Cette fonction retourne vraie si le compte est égale à la taille divisée par deux du mot, False sinon""" if identique(c) ==len(c)/2: return (True) else: return (False)
- En fait, ce que je demandais, c'était de compter 3 pour identique("abcba"). Pour aller jusqu'à la case du milieu, le plus simple est de faire la boucle jusqu'à (len(c)+1)/2. Si on fait simplement un <=, ca marche quand la taille est impaire, mais pas quand la taille est paire. Voici une possibilité :
<source lang="python"> def identique(c):
"""Cette fonction va compter le nombre de lettre identique a la fin et au debut du mot""" n = len(c) if n == 0: return(0) elif n == 1: return(1) i=0 l=0 while (c[i]==c[-i-1]) and (i<(n+1)/2): l=l+1 i=i+1 return (l)
def palindrome(c):
"""Cette fonction retourne vraie si le compte est égale à la taille divisée par deux du mot, False sinon""" if identique(c) == (1+len(c))/2: return (True) else: return (False)
</source>
- --Hyvernat 17 septembre 2009 à 12:01 (CEST)