цикл while никогда не заканчивается, и я не могу понять, как его остановить

#python #python-3.x

#python #python-3.x

Вопрос:

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

 dim = int(input())
pos = int(input())
v = int(input())
vi = v
a = int(input())
posa = dim  1

print(pos)
while v != 0 or v*vi>0:
    if -dim < pos < dim or pos == dim or pos == -dim:
        pos  = v
    elif pos > dim:
        pos = dim
        v -= a
        v = -v
    elif pos < -dim:
        pos = -dim
        v  = a
        v = -v
    if -dim <= pos <= dim and not posa==pos:
        print(pos)
        posa = pos
 

Для некоторого контекста это программа, предназначенная для определения положения бампера автомобиля, dim и -dim — это стены, в которые автомобиль может врезаться, а затем отскочить назад, pos — начальная позиция, v — начальная скорость, а a — на сколько абсолютное значение значенияопускается, когда натыкается на стену. Предполагается, что в конечном итоге он остановится, когда скорость больше не будет.
Проблема в том, что если входные данные равны 10, -3,6,2; это работает отлично, но если его входные данные равны 10, -3,8,3; цикл никогда не заканчивается, и я не могу понять почему.

РЕДАКТИРОВАТЬ: я не могу использовать for , def, import, break, continue, списки и подобные вещи, в основном только самые простые вещи, такие как if и while.

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

1. Вы пробовали использовать отладчик? Вы пытались проверить, какое значение имеет каждая переменная в начале цикла? Вы пытались проследить логику вручную?

2. Что в коде гарантирует, что v когда-либо будет равно нулю? Например, если v== 1 и a== 2, вы можете перемещать v взад и вперед между -1 и 1, но никогда не достигая нуля.

Ответ №1:

     if -dim < pos < dim or pos == dim or pos == -dim:
        pos  = v
 
     if -dim <= pos <= dim and not posa==pos:
        print(pos)
        posa = pos
 

для этих блоков нет операции v , его значение никогда не менялось, цикл продолжается вечно.

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

1. Смысл в pos том, чтобы изменить так, чтобы в конечном if -dim < pos < dim or pos == dim or pos == -dim итоге произошел сбой, позволяя либо elif pos > dim: или elif pos < -dim: , после v чего может измениться.