Inscription / Connexion Nouveau Sujet

1 2 +


Niveau première
Partager :

algorithmique - fonction

Posté par
Franca26
26-10-22 à 12:00

Bonjour,

J'ai commencé un exercice mais je suis bloquée à la deuxième question ci dessous :

Ecrire une fonction liste_pas_ordre qui va parcourir une liste L et retourner le booléen True si deux termes consécutifs de la liste ne sont pas rangés dans l'ordre croissant.

Voilà ce que j'ai fait :

def liste_pas_ordre(L):
    b=bool
    c=bool

Dans l'énoncé, il est écrit qu'il faut utiliser une liste et que deux nombres consécutifs ne sont pas rangés dans l'ordre croissant donc :

    for i in range(len(L)):
        if L[b] < L[c]:
            return (false)

et ensuite on sait que comme il y a deux nombres consécutifs qui sont dans l'ordre croissant, l'algorithme va donner la réponse fausse alors :

    for i in range(len(L)):
        if L[b] < L[c]:
            return (true)

Mais je n'arrive pas à faire fonctionner ma formule..... Et je ne vois pas d'autres possibilités.
Je vous remercie par avance de votre aide.

Posté par
carpediem
re : algorithmique - fonction 26-10-22 à 12:17

salut

il est évident que ça ne peut pas marcher ...

comment se notent deux termes consécutifs d'une liste L ?

Posté par
Franca26
re : algorithmique - fonction 26-10-22 à 13:31

Les deux termes consécutifs d'une liste L se notent L[n]+L[n+1] ?

Posté par
carpediem
re : algorithmique - fonction 26-10-22 à 14:19

Franca26 @ 26-10-2022 à 13:31

Les deux termes consécutifs d'une liste L se notent L[n] et L[n+1] ?
ok

donc tu vas parcourir ta liste et comparer tous les couples de termes consécutifs tant qu'ils sont dans le bon ordre :

si tu arrives au bout c'est ok
sinon c'est que tu as trouvé un couple de termes consécutifs qui ne sont pas dans le bon ordre

Posté par
Franca26
re : algorithmique - fonction 26-10-22 à 17:38

Je réponds un peu tard mais je n'arrivais plus à me connecter sur le site.
Donc si j'ai compris :
def liste_pas_ordre(L):
n=abool
for i in range(len(L)):
        if L[n] < L[n+1]:
            return (false)
for i in range(len(L)):
        if L[n] > L[n+1]:
            return (false)
J'ai essayé et cela me marque : list indices must be integeres, not type? Est-ce que je suis bien arrivée au bout?

Posté par
Franca26
re : algorithmique - fonction 26-10-22 à 18:46

J'ai fait une erreur de frappe c'est n=bool et non n=abool.

Posté par
carpediem
re : algorithmique - fonction 26-10-22 à 19:01

ben oui tu utilises la variable n et pas la variable de boucle ... que tu notes ... ?

et il y a un pb de bornes ...

Posté par
Franca26
re : algorithmique - fonction 27-10-22 à 10:08

Je pense qu'il faut changer n par i.   Ensuite, il faut peut-être utiliser if et else au lieu de if seul.

Donc:
def liste_pas_ordre(L):
    for i in range(len(L)):
        if L < L[i+1]:
            return ("false")
        else:
            return ("true")

Dans l'énoncé, il est marqué qu'il faut utiliser "True si deux termes consécutifs ne sont pas rangés dans l'ordre croissant".
C'est ce que j'ai fait mais python me met False au lieu de True au résultat quand les valeurs ne sont pas les premiers chiffres.
Je ne sais pas si je suis assez clair. Par exemple:
>>> (liste_pas_ordre([1,2,3,4,5]))
>>> ('false')
et
>>> (liste_pas_ordre([1,2,3,5,4]))
>>> ('false')    [i]Alors que si j'ai bien compris cela devrait être True.


Alors que
>>> (liste_pas_ordre([2,1,3,4,5]))
>>> ('true')

Posté par
carpediem
re : algorithmique - fonction 27-10-22 à 10:26

il est stupide d'utiliser True quand tout est ok !! vu la logique de fonctionnement des opérateurs booléens ...

on peut toujours répondre ce qu'il faut répondre à la fin en utilisant la fonction not ...

Citation :
Ecrire une fonction liste_pas_ordre qui parcourt une liste L et retourne le booléen False si deux termes consécutifs de la liste ne sont pas rangés dans l'ordre croissant.


maintenant il faut :
1/ prendre les deux premier termes consécutifs et les comparer
2/ tant que ces deux termes sont dans l'ordre continuer en prenant les deux suivants

comment se traduit tant que en ython ?

Posté par
carpediem
re : algorithmique - fonction 27-10-22 à 10:27

3/ si deux termes consécutifs ne sont pas dans l'ordre s'arrêter et sortir en concluant ...

Posté par
Franca26
re : algorithmique - fonction 27-10-22 à 11:37

"Tant que" est "while" en python. Pour le reste, je cherche depuis tout à l'heure. Dès que j'ai quelque chose qui me parait correct, je le poste.

Posté par
Franca26
re : algorithmique - fonction 27-10-22 à 12:17

Je compare les deux premiers termes consécutifs :
L[i]<L[i+1].

Dans la formule, cela donne :

def liste_pas_ordre(L):
    for i in range(len(L)):
        while L[i] < L[i+1]:
            return ("false")

Après pour continuer avec les termes suivants, je ne ne l'ai pas vu en cours et je ne trouve pas.
Est-ce qu'il faudrait ajouter une variable i=0 et i+1=1 et tant que la liste de i est < à la liste de i+1,
i=1 et i+1 = i+1+1, ce qui donnerait :

def liste_pas_ordre(L):
    i=0
     i+1=1
    for i in range(len(L)):
        while L < L[i+1]:
            i=i+1
            i+1=i+1+1
            return ("false")
        


    

Posté par
carpediem
re : algorithmique - fonction 27-10-22 à 12:40

pour les deux premiers termes il n'y a pas de i mais une valeur numérique bien précise

ensuite ça doit être fait dans la fonction !!

rien ne va !!

finalement ma méthode ne va pas (enfin elle va mais pénible à t'expliquer) donc on va continuer avec du (plus) classique

def liste_pas_l'ordre (L) :
  T = False
  for i in range (len(L)) :
     if L[i] ... L[i + 1] :
         ...
   return T


à compléter ... tout en sachant qu'il y a un pb de borne (déjà dit plus haut)

Posté par
Franca26
re : algorithmique - fonction 27-10-22 à 14:08

J 'ai peut-être trouvé la solution mais la flèche exécution sur python n'apparaît plus. Savez-vous quelle manipulation dois-je faire pour récupérer la flèche?

Sinon voici ce que j'ai fait:
def liste_pas_l'ordre (L) :
  T = "False"
  for i in range (len(L)) :
    while L[i] < L[i + 1] :
         T="True"
   return T

Posté par
carpediem
re : algorithmique - fonction 27-10-22 à 14:34

alors là je ne sais pas de quoi tu parles ...

ok pour ton algo, c'est l'idée mais il y a des pb :

1/ encore et toujours un pb de borne    (*)
2/ il faut un test pour changer T en True   (*)
3/ T est un booléen et pas un alphanumérique donc il ne faut pas de guillemet

(*) imagine que tu vas jusqu'au bout ...

Posté par
carpediem
re : algorithmique - fonction 27-10-22 à 14:35

et il faut incrémenter i à chaque tour

Posté par
Franca26
re : algorithmique - fonction 27-10-22 à 15:17

Mon problème de borne serait "for i in range (len(L)) :" que je ne dois pas mettre?
Par contre il faudrait rajouter L=[]
J'enlève les guillemets à False et True.
Et j'incrémente i en créant une variable i=0
Donc

def liste_pas_l'ordre (L) :
  T = False
   L=[]
   i=0
    while L[i] < L[i + 1] :
         T=False         (je change True par False) jusqu'à ce qu'il detecte
          i=1
          if L[i+1]<L[i]       et ensuite il faudrait qu'il renvoie True.  A la fin
          T=True
    return T

Posté par
carpediem
re : algorithmique - fonction 27-10-22 à 15:20

regarde ce qui se passe dans ton script quand len (L) = 5 par exemple

tout ce qui est dans la boucle while ne va pas :

i est constant et égal à 1
tu fais deux tests contraires sans intérêt

Posté par
Franca26
re : algorithmique - fonction 27-10-22 à 16:01

D'accord donc
def liste_pas_l'ordre (L) :
  T = False
   L=[]
   i =1                             ( et non i=0 du coup )

puis
while  L[i] < L[i + 1] :
        T=True
         return (T)

j'ai essayé plein d'autres possibilités et c'est celle qui me parait la plus cohérente....

Posté par
Franca26
re : algorithmique - fonction 27-10-22 à 16:07

Sinon faut-il que j'utilise if et else?

Posté par
carpediem
re : algorithmique - fonction 27-10-22 à 18:56

Franca26 @ 27-10-2022 à 16:01


def liste_pas_l'ordre (L) :
  T = False
   L=[]   ben non tu vides ta liste !!!
   i =1                             ( et non i=0 du coup )   ben non les indices d'une liste commence à combien ?

puis
while  L[i] < L[i + 1] :
        T=True
         return (T)
à nouveau ta boucle while ne fait rien

Posté par
Franca26
re : algorithmique - fonction 27-10-22 à 19:19

D'accord, je rectifie mes erreurs :
L=[i]
et
i=0  car les indices de listes commencent à 0

Je continue à chercher pour la boucle while....

Posté par
carpediem
re : algorithmique - fonction 27-10-22 à 19:59

def liste_blabla (L) :
  T = true
  i = 0
  while L(i) <= L(i + 1) and i < ... :   pour le pb de la borne !!
    i = i + 1
  if i = ... :
    T = ...
  return T


autre script :

def liste_blabla (L) :
  T = false
  for i in range (...) :
     if L[i] ... L[i + 1] :
       T = 
  return T

Posté par
carpediem
re : algorithmique - fonction 27-10-22 à 20:00

pardon : il faut mettre des crochets pour la liste dans le premier script

Posté par
ZEDMAT
re : algorithmique - fonction 27-10-22 à 22:52

@ Franca26

En réponse à ta question :

Citation :
... la flèche exécution sur python n'apparaît plus. Savez-vous quelle manipulation dois-je faire pour récupérer la flèche?

Pour récupérer la main (arrêter une procédure qui ne s'arrête pas), tu saisis la combinaison de touches
Maj +F2
(soit touche majuscule + touche de fonction F2).
Tu vois alors "le triangle vert" qui permet de lancer l'exécution du script, réapparaitre...

Posté par
ZEDMAT
re : algorithmique - fonction 28-10-22 à 06:56

Erreur fâcheuse....
La combinaison de touches est CTRL + F2 pour arrêter un script parti en vrille !

On obtient alors  la fenêtre ci dessous qui permet un temps de réflexion... avant d'agir.

algorithmique - fonction

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 10:01

Merci beaucoup pour les renseignements techniques que je vais noter pour pouvoir utiliser si cela se reproduit.

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 10:08

Pour ce qui est du script
def liste_blabla (L) :
  T = false
  for i in range (...) :
     if L[i] ... L[i + 1] :
       T =
  return T


Voilà ce que j'ai trouvé :
def liste_pas_ordre (L):
    L = False
    for i in range (L):
        if L[i]>L[i+1]:
            L = True
    return (L)

J'arrive à un résultat par contre si je prends un exemple :
les deux derniers chiffres sont inversés, cela me donne False au lieu de True
(:>>> (liste_pas_ordre([1,2,3,4,5]))
False
>>> (liste_pas_ordre([1,2,3,5,4]))
False)

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 10:20

Pour
def liste_blabla (L) :
  T = true
  i = 0
  while L(i) <= L(i + 1) and i < ... :
    i = i + 1
  if i = ... :
    T = ...
  return T

voilà ce que j'ai fait:

def liste_pas_ordre (L):
    T= True
    i=0
    while L[i]<=L[i+1] and i<=i+1:
        i=i+1
        i<i+1
        T= False
    return (T)

J'ai le même résultat si je prends un exemple ..... :
console de Python:
>>> (liste_pas_ordre([1,2,3,5,4]))
False
>>> (liste_pas_ordre([2,1,3,4,5]))
False

Posté par
carpediem
re : algorithmique - fonction 28-10-22 à 10:55

Franca26 @ 28-10-2022 à 10:08

Voilà ce que j'ai trouvé :
def liste_pas_ordre (L):
    T = False
    for i in range (L):
        if L[i]>L[i+1]:
            L = True
    return T

il y a des erreurs (que j'ai corrigées)

cependant il me semble qu'il devrait à avoir une autre erreur au niveau du range ...
je te laisse essayer ceci ... et tu verras bien

Posté par
carpediem
re : algorithmique - fonction 28-10-22 à 10:56

carpediem @ 28-10-2022 à 10:55

Franca26 @ 28-10-2022 à 10:08

Voilà ce que j'ai trouvé :
def liste_pas_ordre (L):
    T = False
    for i in range (L):
        if L[i]>L[i+1]:
            T = True
    return T

il y a des erreurs (que j'ai corrigées)

cependant il me semble qu'il devrait à avoir une autre erreur au niveau du range ...
je te laisse essayer ceci ... et tu verras bien

Posté par
carpediem
re : algorithmique - fonction 28-10-22 à 10:59

Franca26 @ 28-10-2022 à 10:20


def liste_pas_ordre (L):
    T= True
    i=0
    while L[i]<=L[i+1] and i<=i+1:  faux
        i=i+1
       i<i+1 quel est l'intérêt de cette instruction ?
        T= False
    return T  il ne faut as mettre de arenthèse !!
mais ce n'est pas ce que j'ai écrit à 19h59 ...

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 11:48

Pardon, il est vrai que j'avais mis L à la place du T parce que Python mettait list index out of range.
En modifiant for i in range cela donne :

def liste_pas_ordre (L):
    T = False
    for i in range (len(L)):
        if L[i]>L[i+1]:
            T = True
    return (T)

console de python:
list index out of range

Posté par
carpediem
re : algorithmique - fonction 28-10-22 à 11:55

et ben enfin : je te dis qu'il y a un pb de borne dans le range et la liste

prenons ta liste : L = [1, 2, 4, 5, 3] ou ce que tu veux

maintenant déroule le programme à la main sur une feuille et regarde ce qui se passe...

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 11:58

Avec while, j'ai oublié effectivement le "if" que vous aviez écrit.
Je modifie :
def liste_pas_ordre (L) :
  T = true
  i = 0
  while L(i) <= L(i + 1) and i < i+1 :
    i = i + 1
  if i = i+1 :
    T = False
  return T

Posté par
carpediem
re : algorithmique - fonction 28-10-22 à 12:03

Franca26 @ 28-10-2022 à 11:58

def liste_pas_ordre (L) :
  T = true
  i = 0
  while L(i) <= L(i + 1) and i < i+1 :   sans intérêt donc faux car (doit être) en lien avec ce pb de borne !!!
    i = i + 1
  if i = i+1 : penses-tu que i puisse être égal à i + 1 ? toujours cette fameuse borne
    T = False
  return T

au fait un test d'égalité s'écrit avec nu double == (il me semble)

carpediem @ 28-10-2022 à 11:55

et ben enfin : je te dis qu'il y a un pb de borne dans le range et la liste

prenons ta liste : L = [1, 2, 4, 5, 3] ou ce que tu veux

maintenant déroule le programme à la main sur une feuille et regarde ce qui se passe...

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 12:04

Si on prend liste : L = [1, 2, 4, 5, 3], chaque étape est fausse sauf la dernière qui est donc True.

Posté par
carpediem
re : algorithmique - fonction 28-10-22 à 12:06

je m'en fous !!

je veux que

carpediem @ 28-10-2022 à 11:55

et ben enfin : je te dis qu'il y a un pb de borne dans le range et la liste

prenons ta liste : L = [1, 2, 4, 5, 3] ou ce que tu veux

maintenant déroule le programme [b]à la main sur une feuille et regarde ce qui se passe...[/b]

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 12:08


def liste_pas_ordre (L) :
  T = true
  i = 0
  while L(i) <= L(i + 1) and i < 0   :
    i = i + 1
  if i = = i+1 :
    T = False
  return T

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 12:17

Je pensais qu'il s'agissait d'une boucle non bornée car nous ne savons pas combien de fois la boucle va se répéter mais en fait d'après ce que vous voulez me faire comprendre, il s'agirait d'une boucle bornée?

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 12:20

Y a t il un terme en Python qui veut dire "jusqu'à"? C'est peut être de cela que j'ai besoin.

Posté par
carpediem
re : algorithmique - fonction 28-10-22 à 13:22

quel que soit le script les boucles sont bornées soit parce que range l'est soit parce que je prend mes précautions dans la boucle while

mais à chaque fois tu ne traduis pas parle bon test parce que tu ne fais pas ce que je te demande  et trouver le pb de bornes

et tes tests sont donc faux ou inutiles

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 13:54

A priori,  je ne comprends pas ce qu'il m'est demandé de faire puisque je réponds à côté. Ce que j'ai fait ne convient pas, certainement parce que je ne saisis pas correctement ce qu'il faut. Quand vous parlez de problèmes de bornes, cela veut bien dire qu'il y a un problème dans la formule en général?

Posté par
carpediem
re : algorithmique - fonction 28-10-22 à 14:19

carpediem @ 27-10-2022 à 10:26

maintenant il faut :
1/ prendre les deux premier termes consécutifs et les comparer
2/ tant que ces deux termes sont dans l'ordre continuer en prenant les deux suivants
3/ jusqu'où peux-tu aller ?
jusqu'où peux-tu faire le test de comparaison ?

avec ce script :
carpediem @ 28-10-2022 à 11:55

Franca26 @ 28-10-2022 à 11:48

def liste_pas_ordre (L):
    T = False
    for i in range (len(L)):
        if L[i]>L[i+1]:
            T = True
    return T   pas de parenthèse

console de python:
list index out of range   et tu comprendras ce retour de python ... d'ailleurs as-tu compris ce qui t'est dit dans ce msg ? (traduire en français)


prenons ta liste : L = [1, 2, 4, 5, 3]

maintenant déroule le programme à la main sur une feuille et regarde ce qui se passe...

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 15:06

Je reprends et détaille :
1/ prendre les 2 premiers termes et les comparer :
Cela revient à utiliser les signes <=, >=
L[i] <= L[i+1] ou L[i]>=L[i+1]  

2/ J'utilise while L[i] <=L[i+1] ou L[i]>=L[i+1]  
Pour parcourir la liste j'utilise (len(L) -1)  et non (len(L)) comme j'avais mis

En rajoutant -1, python peut accéder à toutes les valeurs car
list index out of range signifie que Python essaie d'accéder à une valeur qui n'est pas présente dans la formule

3/ Je peux aller jusqu'à ce que le programme tombe sur deux nombres inversés

Posté par
carpediem
re : algorithmique - fonction 28-10-22 à 15:16

je t'ai dit de le faire avec le pgm que je t'ai dit à 14h19

non la traduction est fausse

mais comme tu ne comprends pas je vais te le faire avec la liste L = [1,3,2,4, 5] et

Citation :
def liste_pas_ordre (L):
    T = False
    for i in range (len(L)):
        if L[i]>L[i+1]:
            T = True
    return T


i parcourt range (len (L)) donc :

i = 0 : on teste ...?
i = 1 : on teste ... ?

peux-tu finir ?

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 15:41

Si i= 0
L[0] > L[0 + 1] , c'est faux
Si i = 1
L[1] > L[1 + 1], c'est faux
Si i = 3
L[3] > L[3 + 1], c'est faux
Si i = 2
L[2] > L[2 + 1], c'est faux
Si i = 4
L[4] > L[4 + 1], c'est faux
Si i = 5
L[5] > L[5 + 1], c'est faux

Du coup, il faudrait faire plusieurs comparaisons en commençant par la première valeur et en finissant par la dernière jusqu'à atteindre le résultat soit juste, ce qui reviendrait à comparer :
L[0,1,3,2,4,5]
L[0]<L[1] => faux
L[1]<L[3] => faux
L[3]>L[2] => vrai
Le programme s'arrêterait à ce niveau.

Posté par
carpediem
re : algorithmique - fonction 28-10-22 à 15:56

on se moque de savoir si c'est faux ou vrai : pour l'instant c'est sans intérêt

l'important c'est ce qu'on compare !!!

peux-tu recommencer en me calculant les sommes entre crochet ?


et sans tout ce qui suit le "du coup" qui n'a rien à voir avec la question ...

Posté par
Franca26
re : algorithmique - fonction 28-10-22 à 16:15

Si i= 0
L[0] < L[1] ,
Si i = 1
L[1] < L[2],
Si i = 3
L[3] < L[4],
Si i = 2
L[2] < L[3],
Si i = 4
L[4] < L[5],
Si i = 5
L[5] < L[6].

Posté par
ZEDMAT
re : algorithmique - fonction 28-10-22 à 17:40

En attendant que Carpediem soit disponible :

Citation :
Si i = 5
L[5] < L[6].


Si L = [1, 2, 4, 5, 3], que vaut L[6] ?
(idem pour L(5))

1 2 +




Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1675 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !