CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Python] Besoin d'aide pour terminer mon script sur les piles/files

Wharu
Wharu
Niveau 10
25 février 2021 à 18:08:23

Bonjour/bonsoir j'ai besoin d'aide car je n'arrive pas à trouver comme faire la fonction empilerParCellule, et c'est la dernière étape pour que mon script soit fini si quelqu'un peut m'aider svp..

Le script : https://pastebin.com/fwzzXhGH

Ce que le script devrait me renvoyer à la fin : https://image.noelshack.com/fichiers/2021/08/4/1614273149-screenshot-3.png

Message édité le 25 février 2021 à 18:12:32 par Wharu
PecheurDeGland
PecheurDeGland
Niveau 10
25 février 2021 à 19:00:18

La différence entre empilerParValeur et empilerParCellule et que dans le premier tu crées la cellule dans la fonction et dans l'autre tu passes directement la cellule dans empilerParCellule non ? Donc si j'ai bien compris, empilerParCellule ne fait que décaler le reste de la pile comme tu l'as fait dans les 2 dernières lignes de empilerParValeur

Wharu
Wharu
Niveau 10
25 février 2021 à 19:07:12

Le 25 février 2021 à 19:00:18 PecheurDeGland a écrit :
La différence entre empilerParValeur et empilerParCellule et que dans le premier tu crées la cellule dans la fonction et dans l'autre tu passes directement la cellule dans empilerParCellule non ? Donc si j'ai bien compris, empilerParCellule ne fait que décaler le reste de la pile comme tu l'as fait dans les 2 dernières lignes de empilerParValeur

Je fais comment alors ? Je réecrit exactement la même chose que pour empilerParValeur ?

Wharu
Wharu
Niveau 10
25 février 2021 à 19:19:22

Parce que en gros le empilerParValeur empile la valeur x et la valeur priorité indépendamment et je crois que le empilerParCellule regroupe les 2 pour les empiler en une seule valeur ; elt. Mais du coup je ne sais pas comment rédiger cela dans la fonction avec python

PecheurDeGland
PecheurDeGland
Niveau 10
25 février 2021 à 19:27:36

Si j'ai bien compris par rapport à ce qu'il y a écrit comme description ça donnerait ça :

def empilerParValeur(self, x, p):
        c = Cell(x, p)
        c.next = self.lst
        self.lst = c

    def empilerParCellule(self, elt):
        elt.next = self.lst
        self.lst = elt
Wharu
Wharu
Niveau 10
25 février 2021 à 19:34:47

Le 25 février 2021 à 19:27:36 PecheurDeGland a écrit :
Si j'ai bien compris par rapport à ce qu'il y a écrit comme description ça donnerait ça :

def empilerParValeur(self, x, p):
        c = Cell(x, p)
        c.next = self.lst
        self.lst = c

    def empilerParCellule(self, elt):
        elt.next = self.lst
        self.lst = elt

C'est sûrement ça yep mais j'ai une erreur sur ce que j'ai dû faire auparavant du coup si tu peux m'aider à la résoudre :
Traceback (most recent call last): File "C:\Users\esteb\Desktop\ffffffffff.py", line 169, in <module> element = ma_file.defiler() File "C:\Users\esteb\Desktop\ffffffffff.py", line 142, in defiler self.outbox.empilerParValeur(self.inbox.depiler()) TypeError: empilerParValeur() missing 1 required positional argument: 'p'

PecheurDeGland
PecheurDeGland
Niveau 10
25 février 2021 à 19:36:28

Yes, j'ai exécuté ton code et j'ai eu la même erreur ahah
Mais là il faut bien que tu comprennes l'erreur pour la résoudre. En l'occurence là c'est clair, regarde ta fonction empilerParValeur, ce qu'elle prend en paramètres et regarde ligne 142 ce que tu lui donnes comme paramètres

Message édité le 25 février 2021 à 19:36:38 par PecheurDeGland
Wharu
Wharu
Niveau 10
25 février 2021 à 19:39:08

Le 25 février 2021 à 19:36:28 PecheurDeGland a écrit :
Yes, j'ai exécuté ton code et j'ai eu la même erreur ahah
Mais là il faut bien que tu comprennes l'erreur pour la résoudre. En l'occurence là c'est clair, regarde ta fonction empilerParValeur, ce qu'elle prend en paramètres et regarde ligne 142 ce que tu lui donnes comme paramètres

Les valeurs données c'est x et p mais dans defiler j'ai mit juste self c'est ça ? Du coup faut rajouter x et p en valeur à défiler ?

PecheurDeGland
PecheurDeGland
Niveau 10
25 février 2021 à 19:47:37

Effectivement les valeurs données c'est x et p, le problème vient du fait que ligne 142, au lieu de donner x et p, tu donnes self.inbox.depiler()

Wharu
Wharu
Niveau 10
25 février 2021 à 19:53:21

Le 25 février 2021 à 19:47:37 PecheurDeGland a écrit :
Effectivement les valeurs données c'est x et p, le problème vient du fait que ligne 142, au lieu de donner x et p, tu donnes self.inbox.depiler()

Bon ben du coup j'ai rajouté x et p dans def defiler du coup ça donne ça :
def defiler(self, x, p): if self.outbox.estVide(): while not self.inbox.estVide(): self.outbox.empilerParValeur(self.inbox.depiler(), x.inbox.depiler, p.inbox.depiler) if self.outbox.estVide(): raise IndexError("Pile vide") return self.outbox.depiler()

Mais nouvelle erreur encore :

Traceback (most recent call last):
  File "C:\Users\esteb\Desktop\ffffffffff.py", line 168, in <module>
    element = ma_file.defiler()
TypeError: defiler() missing 2 required positional arguments: 'x' and 'p'
PecheurDeGland
PecheurDeGland
Niveau 10
25 février 2021 à 20:03:14

C'est pas ça. En gros ligne 142, tu veux empiler tant que la pile inbox n'est pas vide. Pour ça, tu faisais :

self.outbox.empilerParValeur(self.inbox.depiler())

Le problème vient du fait que la fonction empilerParValeur prend comme paramètres x et p. Mais ces paramètres x et p, tu les as, ils sont dans self.inbox.depiler(), que tu essaies de passer en paramètre justement sauf que cette fonction renvoie une cellule, et dans une cellule il y a x et p, et c'est ceux là que tu dois renvoyer à ta fonction :hap:
En gros tu passais une cellule (self.inbox.depiler()) comme paramètres alors que là il faut que tu passes le contenu de la cellule en paramètre.

Il faut donc remplacer

self.outbox.empilerParValeur(self.inbox.depiler())

par

temp = self.inbox.depiler()
self.outbox.empilerParValeur(temp.val,temp.priorite)

pourquoi temp ? Tu pourrais te dire que tu peux faire


self.outbox.empilerParValeur(self.inbox.depiler().val,self.inbox.depiler().priorite)

mais ça ne marcherait pas car tu appelles depiler() deux fois, tu dois donc passer par une variable temporaire, ici temp

Wharu
Wharu
Niveau 10
25 février 2021 à 20:10:12

Le 25 février 2021 à 20:03:14 PecheurDeGland a écrit :
C'est pas ça. En gros ligne 142, tu veux empiler tant que la pile inbox n'est pas vide. Pour ça, tu faisais :

self.outbox.empilerParValeur(self.inbox.depiler())

Le problème vient du fait que la fonction empilerParValeur prend comme paramètres x et p. Mais ces paramètres x et p, tu les as, ils sont dans self.inbox.depiler(), que tu essaies de passer en paramètre justement sauf que cette fonction renvoie une cellule, et dans une cellule il y a x et p, et c'est ceux là que tu dois renvoyer à ta fonction :hap:
En gros tu passais une cellule (self.inbox.depiler()) comme paramètres alors que là il faut que tu passes le contenu de la cellule en paramètre.

Il faut donc remplacer

self.outbox.empilerParValeur(self.inbox.depiler())

par

temp = self.inbox.depiler()
self.outbox.empilerParValeur(temp.val,temp.priorite)

pourquoi temp ? Tu pourrais te dire que tu peux faire


self.outbox.empilerParValeur(self.inbox.depiler().val,self.inbox.depiler().priorite)

mais ça ne marcherait pas car tu appelles depiler() deux fois, tu dois donc passer par une variable temporaire, ici temp

 Traceback (most recent call last):
  File "C:\Users\esteb\Desktop\ffffffffff.py", line 169, in <module>
    element = ma_file.defiler()
  File "C:\Users\esteb\Desktop\ffffffffff.py", line 142, in defiler
    self.outbox.empilerParValeur(temp.v, temp.p)
AttributeError: 'int' object has no attribute 'v'

Nouveau message d'erreur, à chaque fois qu'on corrige un truc y'en a un nouveau qui pop, je commence à me demander si j'ai fait que de la merde https://image.noelshack.com/fichiers/2018/10/1/1520260980-risitas94.png

PecheurDeGland
PecheurDeGland
Niveau 10
25 février 2021 à 20:15:29

Oui, la fonction depiler ne doit pas renvoyer c.val mais c tout court du coup.

Wharu
Wharu
Niveau 10
25 février 2021 à 20:19:03

Le 25 février 2021 à 20:15:29 PecheurDeGland a écrit :
Oui, la fonction depiler ne doit pas renvoyer c.val mais c tout court du coup.

Ca fonctionne khey putain c'est beau, merci beaucoup.
Je viens de voir que je n'avais pas fait la fonction enleverElementPrioritaire, tu pourrais m'aiguiller sur comment la faire ?

PecheurDeGland
PecheurDeGland
Niveau 10
25 février 2021 à 20:41:15

Pour cette fonction c'est assez simple en suivant l'implémentation de ta pile:

Tu vas regarder dans ta pile inbox et dans ta pile outbox quels sont les éléments avec la plus grande priorité. Pour ça tu vas utiliser la fonction prioritaireMax() pour avoir à la fois le rang et la priorité des deux élements des piles inbox et outbox.

Tu renvoies l'élément le plus prioritaire des deux en utilisant retirerElement(n) et en cas d'égalité, tu choisis, comme dit dans l'ennoncé, la pile inbox.

Wharu
Wharu
Niveau 10
25 février 2021 à 20:58:10

Le 25 février 2021 à 20:41:15 PecheurDeGland a écrit :
Pour cette fonction c'est assez simple en suivant l'implémentation de ta pile:

Tu vas regarder dans ta pile inbox et dans ta pile outbox quels sont les éléments avec la plus grande priorité. Pour ça tu vas utiliser la fonction prioritaireMax() pour avoir à la fois le rang et la priorité des deux élements des piles inbox et outbox.

Tu renvoies l'élément le plus prioritaire des deux en utilisant retirerElement(n) et en cas d'égalité, tu choisis, comme dit dans l'ennoncé, la pile inbox.

Ca marche je vais essayer puis au pire je t'enverrai un mp plus tard si je galère encore, merci pour ton aide mon khey

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment