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

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

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

Напишите программу, которая получает на вход невозрастающую последовательность натуральных чисел. Они означают массу каждого контейнера в ряду. После этого вводится число 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 должно встать на второе место. Не могу понять в чем проблема, помогите разобраться, пожалуйста
Лучший ответ
Андрей Высший разум (425944) 10 месяцев назад
 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 не нужно
Один и тот же контроль ввода в трёх местах кода - выносим в отдельную функцию.
Чтобы не проверять конец массива, добавляем элемент с отрицательным весом.
Веса отсортированы - бинарный поиск, а не последовательный.
Алекс КухаВысший разум (446573) 10 месяцев назад
откуда столько свободного времени? За альтруизм моё почтение
ПапаВысший разум (121945) 10 месяцев назад
А самое главное - сейчас автор выберет чатгптшный ответ лучшим, причём, совершенно сознательно. Такие ученики с ботами друг с дружкой на одной волне, это будущие попугаи-менеджеры, перекидывающие друг другу проблемы, решать которые ни один из них по существу не собирается, т.к. всё равно ни бельмеса в них не понимает.
Остальные ответы
СОВА ⭐ [expert] Мастер (2479) 10 месяцев назад
Основная проблема заключается в том, что вы не проверяете вводимые значения массы контейнеров и нового контейнера на превышение значения 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Мудрец (15218) 10 месяцев назад
А без чата джпт слабо?
СОВА ⭐ [expert] Мастер (2479) Professional Professional, блин, у тебя научилась(( помоги разучиться
ПапаВысший разум (121945) 10 месяцев назад
Решение - отстой полный. Да, знаю, сейчас начнёшь лаять, но решение от этого не перестанет быть отстоем, а ты - ламером.
СОВА ⭐ [expert] Мастер (2479) Папа, да не скули ты,xoxленыш,твоего пятака здесь не было ). Главное - работоспособность программы ,а не эстетика. Хотя,ты то ни разу не одного кода не написал,а лишь советы-пустышки даёшь...)
Professional Professional Мудрец (15218) 10 месяцев назад
Проблема заключается в том, что когда пользователь вводит неверное значение (превышающее 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) 10 месяцев назад
Спасибо большое, совсем не сложная ошибка оказалась. За объяснение отдельная благодарность)
Похожие вопросы