#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