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 : 
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
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 ?
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
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
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'
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
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 ?
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()
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'
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 ![]()
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
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
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 
Oui, la fonction depiler ne doit pas renvoyer c.val mais c tout court du coup.
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 ?
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.
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