Добавление списка значений в класс принтера

#python #python-3.x #list #function #class

Вопрос:

В этом коде, если пользователь наберет > > > > > > > > > > создать 5

он создаст 5 различных объектов принтера

когда пользователь вводит > > > > > > >>> > > добавить 1 2 3 4 5

программа должна добавить 1 страницу в первый объект принтера

затем добавьте 2 страницы во второй объект принтера

и так далее…

когда пользователь вводит > > > > > > >>> > > добавить 1 2 3 4 5 6

или когда пользователь вводит > > > > > > >>> > > добавить 1 2 3

он должен проверять наличие пустых объектов принтера (экземпляры Printer.isEmpty ()).

затем добавьте значение к этим пустым принтерам, пока больше не останется пустых принтеров, а затем поставьте в очередь остальные задания.

В настоящее время мой вывод таков:

 printSimulation()
create 5
add 1 2 3
status
Printer: 0 Pages to print: 1 Total pages printed: 0
Printer: 1 Pages to print: 2 Total pages printed: 0
Printer: 2 Pages to print: 3 Total pages printed: 0
Printer: 3 Pages to print: 0 Total pages printed: 0
Printer: 4 Pages to print: 0 Total pages printed: 0
add 1 2 3 4 5
status
Printer: 0 Pages to print: 2 Total pages printed: 0
Printer: 1 Pages to print: 4 Total pages printed: 0
Printer: 2 Pages to print: 6 Total pages printed: 0
Printer: 3 Pages to print: 4 Total pages printed: 0
Printer: 4 Pages to print: 5 Total pages printed: 0
add 1 2 3 4 5 6
Traceback (most recent call last):
  Python Shell, prompt 2, line 1
    # Used internally for debug sandbox under external interpreter
    if created[i].isEmpty():
builtins.IndexError: list index out of range
 

Эта программа вовсе не проверяет наличие пустых принтеров, а затем ставит в очередь, если пустых принтеров нет

Это мой код ниже:

 class Queue:
    class Job:
        def __init__(self, element, _next):
            self._element = element
            self._next = _next
            
    
    def __init__(self):
        self._front = None
        self._rear = None
        self._size = 0
    def __str__(self):
        pass
    def enqueue(self, n):
        if self.isEmpty():
            self._front = self.Job(n, None) #setting the front value
            self._rear = self._front #value on the end is now the value in the previous front
            self._size  = 1 #adds 1 to size
            return
        self._rear._next = self.Job(n, None) #rear value is None
        self._rear = self._rear._next #sets the latter value
        self._size  = 1
        return 
    
    def dequeue(self):
        if self.isEmpty():
            raise EmptyError('Queue is empty. Cannot dequeue.')
        dequeued = self._front._element #our popped/dequeued element
        self._front = self._front._next #new front is the next item 
        self._size -= 1 #subtract 1 from size
        if self.isEmpty():
            self._rear = None
        return dequeued
    
    def front(self):
        if self.isEmpty():
            raise EmptyError('Queue is empty. Front element does not exist.')
        return self._front._element
    def __len__(self):
        return self._size
    
    def isEmpty(self):
      
        return self._size == 0

class Printer:
    def __init__(self, number):
        self._number = number
        self._pages = 0
        self._print = 0
        self._cycles = 0
        
    def add(self, n):
        self._pages  = int(n)
        
    def status(self):
        return f'Printer: {self._number} Pages to print: {self._pages} Total pages printed: {self._print}'
    
    def isEmpty(self):
        return self._pages == 0
        
           
def printSimulation():
    jobs = Queue()
    amount = []
    created = []
    while True:
        command = str(input())
        
        if 'create' in command:
            val = command.split(' ')[1] #separation of command from value
            amount.append(val)
            
            for printers in range(int(val)):
                printers = Printer(printers)
                created.append(printers)
                
        if 'status' in command:
            for items in created:
                print(items.status())
               
        if 'add' in command:
            value = command.split(' ')
            value.remove(value[0])
            if len(created) == len(value):
                for i in range(len(created)):
                    created[i].add(value[i])
            if len(created) != len(value):
                for i in range(len(value)):
                    if created[i].isEmpty():
                        created[i].add(value[i])
                    else:
                        jobs.enqueue(int(value[i]))
 

Комментарии:

1. Что такое Queue

2. извините, очередь-это метод связанного списка

3. Нет проблем, просто упомяни об этом

Ответ №1:

             for i in created:
                
                if len(created) == len(value):
                    for x in range(0 , len(created)):
        
                        i.add(value[x])
 

Вы добавляете каждое значение в каждый принтер.
Что вы хотите сделать, так это добавить значения для каждого конкретного принтера:

 if len(created) == len(value):
    for i in range(len(created)):
        created[i].add(value[i])
 

Ответ №2:

В соответствии с вашим if 'add' in command заявлением вы можете сделать следующее, чтобы присвоить каждому принтеру соответствующий номер/значение:

         if 'add' in command:
            value = command.split(' ')
            value.remove(value[0])
            for printer, v in zip(created, value):  # Match printer objects with their corresponding values
                if len(created) == len(value):
                    printer.add(v)
 

Ответ №3:

Я предлагаю вам использовать enumerate()

 if 'add' in command:
    value = command.split(' ')
    value.remove(value[0])
         
    for x,i in enumerate(created):    
          i.add(int(value[x]))
 

Кроме того, обновите свой range()

 if 'create' in command:
    val = command.split(' ')[1] #separation of command from value
    amount.append(val)
            
    for printers in range(1,int(val) 1):
        printers = Printer(printers)
        created.append(printers)
 

Вот пример:

 #=== Input
create 5
add 1 3 2 4 5
status
#== Output
Printer: 1 Pages to print: 1 Total pages printed: 0
Printer: 2 Pages to print: 3 Total pages printed: 0
Printer: 3 Pages to print: 2 Total pages printed: 0
Printer: 4 Pages to print: 4 Total pages printed: 0
Printer: 5 Pages to print: 5 Total pages printed: 0
 

Он также может содержать любые страницы в любом принтере:

 #== Input
create 10
add 1 5 3 2 6 7 8 4 9 10  
status
#== Output
Printer: 1 Pages to print: 1 Total pages printed: 0  
Printer: 2 Pages to print: 5 Total pages printed: 0  
Printer: 3 Pages to print: 3 Total pages printed: 0  
Printer: 4 Pages to print: 2 Total pages printed: 0  
Printer: 5 Pages to print: 6 Total pages printed: 0  
Printer: 6 Pages to print: 7 Total pages printed: 0  
Printer: 7 Pages to print: 8 Total pages printed: 0  
Printer: 8 Pages to print: 4 Total pages printed: 0  
Printer: 9 Pages to print: 9 Total pages printed: 0  
Printer: 10 Pages to print: 10 Total pages printed: 0