2011-09-16 3 views
0

J'ai un projet pour créer une classe tableau circulaire, et la langue que je vais utiliser est python. Je suis nouveau pour les cours en python, mais après avoir lu quelques pages et chapitres de livres, je pense avoir une compréhension de leur fonctionnement. Cependant, j'ai besoin d'aide, alors j'ai pensé que je viendrais aux enseignants merveilleux ici à SO :)classe tableau circulaire en python

Notre classe doit être en mesure d'implémenter plusieurs opérations; insérer à l'avant, insérer à l'arrière, insérer à l'index, retirer de l'avant, retirer de l'arrière, retirer de l'index.

J'ai commencé à coder mais je rencontre des problèmes, et je ne suis pas sûr à 100% que ma syntaxe est correcte.

Voici ce que j'ai jusqu'à présent:

class circular: 

    def __init__(self): 
     self.store = [] 
     self.capacity = len(self.store) 
     self.size = 0 
     self.startIndex = 0 
     self.endIndex = 0 

    def decrementIndex(self): 
     index = index - 1 
     if index < 0: 
      self.store = self.store + self.capacity 

    def incrementIndex(self): 
     index = index + 1 
     if index == self.capacity: 
      index = index - self.capacity 

    def addToBack(self, value): 
     self.store[self.endIndex] = value 
     self.endIndex = incrementIndex(self.endIndex) 
     self.size += 1 

    def addToFront(self, value): 
     if self.size == 0: 
      addToBack(self, value) 
     else: 
      self.startIndex = decrementIndex(self.startIndex) 
      self.store[self.startIndex] = value 
      self.size += 1 

Je me suis arrêté là pour commencer à tester certaines des fonctions, principalement t-il addTofront et addToback. En les testant dans IDLE en utilisant c = circular() et c.addToBack (2), j'obtiens une erreur d'index ... et je ne sais pas pourquoi. Ce n'est pas le seul problème, c'est juste là où je suis coincé et j'ai besoin d'aide pour aller de l'avant.

Je poste ici parce que j'ai besoin d'aide et que je veux apprendre, pas parce que je suis paresseux et n'ai pas essayé de rechercher mon problème. Merci déjà!

+0

'a = []; a [1] = 3' va créer la même erreur. vous ne pouvez pas écrire dans un index inexistant. qu'est-ce que vous essayez de faire, est-ce un tampon (taille fixe) * tampon *? –

+0

@yi_H oui c'est un projet pour écrire un tampon circulaire fixe qui effectue les opérations ci-dessus. J'ai corrigé le problème d'index et je reçois maintenant des erreurs non définies pour chaque fonction que j'appelle, donc quelque chose ne va pas avec ma syntaxe que je devine. – roboman

+0

vous devez utiliser 'self .' –

Répondre

1

En __init__ vous définissez

self.store = [] 

Dans addToBack vous

self.store[self.endIndex] = value 

Si c'est la première opération sur le réseau circulaire, et vous passez 2 comme value, puis qui se transforme en

[][0] = 2 

Le problème devrait être évident - une liste vide n'a pas d'index de 0, il n'a aucun index du tout.

Vous devez ajouter l'article à la liste d'une manière différente.

Je ne vais pas vous dire exactement comment cela fait partie de vos devoirs pour comprendre cela.

+0

Ouais je savais quel était le problème. J'ai écrit tout ce code basé sur une lecture que nous avions qui explique les tableaux circulaires, et notre professeur pseudo-codé comment fonctionnait chaque fonction. Devrais-je être en train de l'annexer? ou serait-il préférable de définir self.store = [None] ou serait-ce la même chose? Également en testant c.addToFront (2) j'obtiens une erreur disant que addToBack n'est pas défini ... pourquoi serait-ce? Merci pour la réponse. – roboman

+0

@roboman - Pour votre première question: Si vous définissez 'self.store = [None]' alors vous auriez juste le problème quand l'index était 1 au lieu de 0. Vous devez agrandir la liste - 'append' sons comme un bon moyen pour 'addToBack' de le faire.Pour 'addToFront', il cherche' addToBack' en tant que variable locale, englobante, globale ou intégrée - ce n'est pas le cas, c'est une méthode d'instance, donc vous devez le référencer sur l'instance, comme 'size ',' startindex', etc. – agf

+0

Okay. Le seul problème avec la croissance de la liste est que cela doit être un tampon de taille fixe, celui qui a une capacité définie. J'ai l'impression que la croissance de la liste la rendrait dynamique, ce qui est mon prochain projet après celui-ci. Ai-je raison? – roboman