添加到一类列表

时间:2018-11-22 05:08:17

标签: python

编程不是我最擅长的方法,尽管未满足此任务的截止日期,但我至少想在重新开始明年的课程之前了解它的工作原理。

该程序的重​​点是建立一个造船厂管理系统,该系统可以处理布置在不能超过2000磅的集装箱中的新包裹,否则它将为同一目的地创建一个新集装箱。

编辑3:这是更新的代码。对不起,您不清楚! :<< / p>

class Shipyard:
    def __init__(self):
        self._cont = self.Container(None, None, None, None) 
        self._size = 0

    def __len__(self):
        return self._size

    def isEmpty(self):
        return self._size == 0

    def add_pack(self, owner, dest, weight):
        # adds package when container check is done

        # If shipyard is empty or container name is alphabetically lower than
        # the first container by destination name.

        if self.isEmpty() or dest < self._cont._first._dest:
            self._size += 1
            self._cont._first = self.Container(owner, dest, \
                                               weight, self._cont._first)
            self._cont._first.add_pack(owner, dest, weight)

            return  

        # Else will go through the contents of the linkedlist to find the spot
        # it belongs to.

        cur_Cont = self._cont._first


        while(cur_Cont._next != None and  dest > cur_Cont._next._dest):
            cur_Cont = cur_Cont._next

        if dest == cur_Cont._dest:
            if (cur_Cont._weight + weight) > 2000:
                self._size += 1
                cur_Cont._next = self.Container(owner, dest, \
                                                weight, cur_Cont._next)
                cur_Cont._next.add_pack(owner, dest, weight)
                return

            if (cur_Cont._weight + weight) <= 2000:
                cur_Cont.add_pack(owner, dest, weight)
                return

            if (cur_Cont._next._weight + weight) <= 2000:
                cur_Cont._next.add_pack(owner, dest, weight)
                return


        self._size += 1

        # Creates a new container with the given sepcifications.
        cur_Cont._next = self.Container(owner, dest, weight, cur_Cont._next)
        cur_Cont._next.add_pack(owner, dest, weight)

        return

    def traversePrint(self) :                      # Use for Printing Container
        cur_Cont = self._cont._first               # Modify to include details
        c_weight = cur_Cont._weight

        while cur_Cont != None: # of container or packages
            c_weight = cur_Cont._weight
            print(cur_Cont._dest, c_weight)
            cur_Cont.traversePrint()
            cur_Cont = cur_Cont._next


# -----------------------------------------------------------------------------
# Nested within the Shipyard

    class Container:
        def __init__(self, owner, dest, weight, next):
            self._owner = owner
            self._dest = dest
            self._first = None
            self._size = 0
            self._weight = 0
            self._next = next
            self._pack = self.Packages(None, None, None, None)

        def __len__(self):
            return self._size

        def isEmpty(self):
            return self._size == 0

        def add_pack(self, owner, dest, weight):
            # Add pack for container class which adds a package.

            if self.isEmpty() or weight < self._pack._first._weight:
                self._size += 1
                self._pack._first = self.Packages(owner, dest, \
                                                  weight, self._pack._first)
                self._weight += weight
                return

            cur_Pack = self._pack._first

            while(cur_Pack._next != None and weight > cur_Pack._next._weight):
                cur_Pack = cur_Pack._next

            if weight == cur_Pack._weight:
                self._size += 1
                cur_Pack._next = self.Packages(owner, dest, \
                                                weight, cur_Pack._next)
                self._weight += weight
                return

            self._size += 1
            cur_Pack._next = self.Packages(owner, dest, \
                                           weight, cur_Pack._next)
            self._weight += weight

            return

        def traversePrint(self):
            cur_Pack = self._pack._first               # Modify to include details

            p_weight = cur_Pack._weight

            while cur_Pack != None: # of container or packages
                p_weight = cur_Pack._weight
                if cur_Pack._dest == self._pack._dest:
                    print(cur_Pack._owner, cur_Pack._dest, p_weight, end = " ")
                    cur_Pack = cur_Pack._next
                else:
                    print(cur_Pack._owner, cur_Pack._dest, p_weight)
                    cur_Pack = cur_Pack._next    

# -----------------------------------------------------------------------------
# Nested within Container doesn't contain any methods

        class Packages:

            def __init__(self, owner, dest, weight, next):
                self._first = None
                self._size = 0
                self._owner = owner
                self._dest = dest
                self._weight = weight
                self._next = next

# -----------------------------------------------------------------------------

class Weight(Exception):
    pass

# -----------------------------------------------------------------------------
shipyard = Shipyard()

len(shipyard)

shipyard.add_pack("Lori", "Bristol", 300)
shipyard.add_pack("Mallory", "Bristol", 200)
shipyard.add_pack("Chung", "Alabama", 700)
shipyard.add_pack("Roger", "Alabama", 900)
shipyard.add_pack("Ali", "Giza", 45)
shipyard.add_pack("Soumick", "New Delhi", 600)
shipyard.add_pack("Mizuki", "Tokyo", 1900)
shipyard.add_pack("Tadashi", "Tokyo", 120)
shipyard.add_pack("Kanna", "Tokyo", 220)


shipyard.traversePrint()

这是程序运行时出现的内容:

Alabama 1600
Chung Alabama 700
Roger Alabama 900
Bristol 500
Mallory Bristol 200
Lori Bristol 300
Giza 45
Ali Giza 45
New Delhi 600
Soumick New Delhi 600
Tokyo 220
Kanna Tokyo 220
Tokyo 120 # THIS AND Tokyo 220 must be added into the same container
Tadashi Tokyo 120 # I don't know what I didn't include because
Tokyo 1900 # It seems to me that Alabama 700 and Alabama 900 were
Mizuki Tokyo 1900 # Adding Correctly.

问题编辑:应该添加的程序包不会加在一起,而是创建一个全新的容器。我不知道现在T_T弄乱了代码的哪一部分。

如果有问题,请在下面的评论中问我。

感谢您阅读。

编辑:我计划在“容器”部分中使用一个附加的add_pack(所有者,目标,重量)来保存所有者输入/参数,并将在船厂版本的add_pack(所有者,目标,重量)中调用

编辑2:所以我能够解决最初的问题,但是现在我有另一个问题。是的,学校要求我们使用LinkedLists,否则我们不会获得分数。现在我的新问题是,我不知道是否应该在 Shipyard方法add_pack 中更新容器类的权重,还是在Container类中使用 add_pack时是否应该更新它。 / strong>

编辑3.5:所以我更新了代码,现在它清楚地显示了两个add_pack方法:一个在Shipyard类中,一个在Container类中。抱歉,修改和格式设置不正确。我真为无法解决这个问题而感到沮丧。

编辑4:我在容器和造船厂都拥有traversePrint。船厂的traversePrint列出了集装箱,而集装箱的traversePrint列出了集装箱内的包裹。我能够显示带有w / c的软件包,使我相信它们已正确添加。

编辑5:我主要是想出了如何添加容器以及将包装装入容器的方法,但是要进行一些条件检查,即如果两件东西的重量加起来超过2000磅,另外一件东西加到同一件中<-这是行不通的。< / p>

1 个答案:

答案 0 :(得分:1)

将问题分解为可移植的块:

  1. 记录所需的可交付物品(如您目前所做的那样)
  2. 确定每个目的地需要多少个容器(可能是math.ceil(weight(dest) / 2000.0)或类似的东西)

因此您的用法将变为

shipyard.add_pack("X", "dest", 500)
shipyard.add_pack("X", "dest", 1500)
shipyard.add_pack("X", "dest", 2200)
...

containers = {
   dest: shipyard.containers_for(dest)
   for dest in shipyard.destinations()
}