Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите разобраться в чем проблема

Diana) Ученик (167), закрыт 11 месяцев назад
Контейнеры на складе лежат в ряд в порядке невозрастания (меньше либо равно) массы в килограммах. На склад привезли ещё один контейнер, который тоже нужно положить на определённое место.

Напишите программу, которая получает на вход невозрастающую последовательность натуральных чисел. Они означают массу каждого контейнера в ряду. После этого вводится число X — масса нового контейнера. Программа выводит номер, под которым будет лежать новый контейнер. Если в ряду есть контейнеры с массой, как у нового, то его нужно положить после них.

Обеспечьте контроль ввода: все числа не превышают 200.

мой код:
number = int(input('Кол-во контейнеров: '))
count = 0
container_list = []
for _ in range(number):
weight = int(input('Введите вес контейнера: '))
if weight > 200:
print('Ошибка. Значение не должно превышать 200')
weight = int(input('Введите вес контейнера: '))
else:
container_list.append(weight)

new_weight = int(input('\nВведите вес нового контейнера: '))
if new_weight > 200:
print('Ошибка. Значение не должно превышать 200')
new_weight = int(input('\nВведите вес нового контейнера: '))

while count < len(container_list) and container_list[count] >= new_weight:
count += 1
print('\nНомер, куда встанет контейнер:', count + 1)

ВЫВОД В КОНСОЛЬ:
Кол-во контейнеров: 4
Введите вес контейнера: 1234
Ошибка. Значение не должно привышать 200
Введите вес контейнера: 200
Введите вес контейнера: 466456
Ошибка. Значение не должно привышать 200
Введите вес контейнера: 190
Введите вес контейнера: 180
Введите вес контейнера: 170

Введите вес нового контейнера: 195

Номер, куда встанет контейнер: 1

По задачи 200 тоже должен учитывать, но он его не учитывает, 195 должно встать на второе место. Не могу понять в чем проблема, помогите разобраться, пожалуйста
Лучший ответ
Андрей Высший разум (439758) 1 год назад
 def inp(s):
while True:
v = int(input(s))
if 0 < v <= 200: return v
print('Ошибочное значение. Повторите ввод.')

container_list = [inp('Вес контейнера: ') for _ in range(inp('Кол-во контейнеров: '))] + [-1]
new_weight = inp('Вес нового контейнера: ')
left, right = 0, len(container_list) - 1
while left < right:
middle = (left + right) // 2
if container_list[middle] >= new_weight: left = middle + 1
else: right = middle - 1
left += container_list[left] >= new_weight
print(left + 1) # если нумерация с нуля, + 1 не нужно
Один и тот же контроль ввода в трёх местах кода - выносим в отдельную функцию.
Чтобы не проверять конец массива, добавляем элемент с отрицательным весом.
Веса отсортированы - бинарный поиск, а не последовательный.
Алекс КухаВысший разум (452480) 1 год назад
откуда столько свободного времени? За альтруизм моё почтение
ПапаВысший разум (131150) 1 год назад
А самое главное - сейчас автор выберет чатгптшный ответ лучшим, причём, совершенно сознательно. Такие ученики с ботами друг с дружкой на одной волне, это будущие попугаи-менеджеры, перекидывающие друг другу проблемы, решать которые ни один из них по существу не собирается, т.к. всё равно ни бельмеса в них не понимает.
Остальные ответы
СОВА ⭐ [expert] Мастер (2479) 1 год назад
Основная проблема заключается в том, что вы не проверяете вводимые значения массы контейнеров и нового контейнера на превышение значения 200. Кроме того, ваш цикл while неправильно определяет позицию, на которую нужно вставить новый контейнер.

 number = int(input('Кол-во контейнеров: ')) 
count = 0
container_list = []

for _ in range(number):
weight = int(input('Введите вес контейнера: '))
if weight > 200:
print('Ошибка. Значение не должно превышать 200')
weight = int(input('Введите вес контейнера: '))
container_list.append(weight)

new_weight = int(input('\nВведите вес нового контейнера: '))
if new_weight > 200:
print('Ошибка. Значение не должно превышать 200')
new_weight = int(input('\nВведите вес нового контейнера: '))

while count < len(container_list) and container_list[count] >= new_weight:
count += 1

container_list.insert(count, new_weight)
print('\nНомер, куда встанет контейнер:', count + 1)
Professional ProfessionalМудрец (15768) 1 год назад
А без чата джпт слабо?
СОВА ⭐ [expert] Мастер (2479) Professional Professional, блин, у тебя научилась(( помоги разучиться
ПапаВысший разум (131150) 1 год назад
Решение - отстой полный. Да, знаю, сейчас начнёшь лаять, но решение от этого не перестанет быть отстоем, а ты - ламером.
СОВА ⭐ [expert] Мастер (2479) Папа, да не скули ты,xoxленыш,твоего пятака здесь не было ). Главное - работоспособность программы ,а не эстетика. Хотя,ты то ни разу не одного кода не написал,а лишь советы-пустышки даёшь...)
Professional Professional Мудрец (15768) 1 год назад
Проблема заключается в том, что когда пользователь вводит неверное значение (превышающее 200), он вводит его снова, но вы не добавляете это новое значение в список контейнеров. Ваш код просто продолжает следующую итерацию цикла, пропуская шаг добавления веса в список. Из-за этого, когда вы вводите 200 после того, как ввели неверное значение 1234, это значение 200 не учитывается в вашем списке.

Вот исправленная версия вашего кода:

```python
number = int(input('Кол-во контейнеров: '))
count = 0
container_list = []

for _ in range(number):
while True:
weight = int(input('Введите вес контейнера: '))
if weight > 200:
print('Ошибка. Значение не должно превышать 200')
else:
container_list.append(weight)
break

while True:
new_weight = int(input('\nВведите вес нового контейнера: '))
if new_weight > 200:
print('Ошибка. Значение не должно превышать 200')
else:
break

while count < len(container_list) and container_list[count] >= new_weight:
count += 1

print('\nНомер, куда встанет контейнер:', count + 1)
```

Теперь, когда пользователь вводит неверное значение, цикл while продолжает просить его ввести вес контейнера, пока он не введет корректное значение.
Diana)Ученик (167) 1 год назад
Спасибо большое, совсем не сложная ошибка оказалась. За объяснение отдельная благодарность)
Похожие вопросы