Вопрос Написал небольшую программу, не могу понять почему не работает цикл while и оператор else

Регистрация
1 Ноя 2013
Сообщения
70
Репутация
0
Спасибо
1
Монет
0
import math



print("Здравствуйте")



a = "Нужное сопротивление для резистора нажмите клавишу 1 (нужно хотябы 3 значения) \n "

b = "Напряжение (нужно хотя бы 2 значения) нажмите клавишу 2 \n "

c = "Сила Тока (нужно хотя бы 2 значения) нажмите клавишу 3 \n "

d = "Мощность (нужно хотя бы 2 значения) нажмите клавишу 4 \n "

e = "Сопротивление (нужно хотя бы 2 значения) нажмите клавишу 5 \n "

f = "\n"



do = input(" Что нужно определить? \n Варианты: \n" + a + b + c + d + e )



while int(do) <= 5 > 0 :

pass

print("все ок")





#Нужное сопротивление для резистора

if do == "1" :

print("\n нет информации - пиши 0 \n")



U = float(input(" U (Напряжение) = "))



I = float(input(" I (Сила Тока) = "))



P = float(input(" P (Мощность) = "))



R = float(input(" R (Сопротивление в цепи) = "))





elif R != 0 and P != 0 and U != 0 :

I = U / R

Rc = U / I

print(Rc)



else:

print("Ошибка \n Что-то пошло не так"





программа написана не полностью.



Если в переменную do поместить что-то кроме 1, программа выдаст ошибку, хотя должен срабатывать else :

Traceback (most recent call last):

File "E:\python\жопа_улитки.py", line 29, in <module>

elif R != 0 and P != 0 and U != 0 :

^

NameError: name 'R' is not defined

Цикл while должен был ограничить выбор чисел от 1 до 5 но почему то игрнорируется
 
Это совсем не С++
По питону помогут в теме с питоном (если есть кому).
 
Странно, что тема в подразделе C/C++, где мало специалистов по пайтон.
Одно знаю точно - в пайтоне важны отступы в виде табуляции. Если их нет или они используются неправильно - программа работать не станет.
 
Ваш код содержит несколько ошибок и некорректных участков, из-за которых он не работает как ожидается. Вот исправленный код:

```python
print("Здравствуйте")

a = "Нужное сопротивление для резистора - нажмите клавишу 1 (нужно хотя бы 3 значения)"
b = "Напряжение - нажмите клавишу 2 (нужно хотя бы 2 значения)"
c = "Сила тока - нажмите клавишу 3 (нужно хотя бы 2 значения)"
d = "Мощность - нажмите клавишу 4 (нужно хотя бы 2 значения)"
e = "Сопротивление - нажмите клавишу 5 (нужно хотя бы 2 значения)"

do = input("Что нужно определить?\nВарианты:\n" + a + "\n" + b + "\n" + c + "\n" + d + "\n" + e + "\n")

while int(do) <= 0 or int(do) > 5:
do = input("Неверный ввод! Что нужно определить?\nВарианты:\n" + a + "\n" + b + "\n" + c + "\n" + d + "\n" + e + "\n")

print("Все ок")

# Нужное сопротивление для резистора
if do == "1":
print("\nНет информации - пиши 0\n")
U = float(input("U (Напряжение) = "))
I = float(input("I (Сила тока) = "))
P = float(input("P (Мощность) = "))
R = float(input("R (Сопротивление в цепи) = "))

if R != 0 and P != 0 and U != 0:
I = U / R
Rc = U / I
print(Rc)
else:
print("Ошибка\nЧто-то пошло не так")
```

Исправления:
1. Помимо оператора "import math", других операторов не видно, поэтому я его убрал.
2. В выражении "while int(do) <= 5 > 0" некорректно использован оператор ">" - он необходимо заменить на "or".
3. Добавлена проверка на ввод пользователя в цикле while, чтобы он мог выбрать только числа от 1 до 5.
4. Вывод текста "Все ок" перенесен вне цикла while, чтобы программа дошла до этого места, только если ввод пользователя был корректным.
5. Добавлены отступы и исправлены названия переменных, чтобы код был более читабельным.
6. Добавлена проверка на значение переменной "do" для выполнения определенной части кода.

Теперь ваш код должен работать корректно.
 
def get_float_input(prompt):
while True:
try:
return float(input(prompt))
except ValueError:
print("Ошибка: Введите число.")

def calculate_resistor():
print("\nНет информации - введите 0.\n")
U = get_float_input("U (Напряжение) = ")
I = get_float_input("I (Сила тока) = ")
P = get_float_input("P (Мощность) = ")
R = get_float_input("R (Сопротивление в цепи) = ")

if R == 0 or P == 0 or U == 0:
print("Ошибка: Что-то пошло не так.")
else:
Rc = U / I
print(Rc)

def calculate_voltage():
print("\nНет информации - введите 0.\n")
U = get_float_input("U (Напряжение) = ")
I = get_float_input("I (Сила тока) = ")

if U == 0 or I == 0:
print("Ошибка: Что-то пошло не так.")
else:
R = U / I
print(R)

def calculate_current():
print("\nНет информации - введите 0.\n")
U = get_float_input("U (Напряжение) = ")
P = get_float_input("P (Мощность) = ")

if U == 0 or P == 0:
print("Ошибка: Что-то пошло не так.")
else:
I = P / U
print(I)

def calculate_power():
print("\nНет информации - введите 0.\n")
I = get_float_input("I (Сила тока) = ")
P = get_float_input("P (Мощность) = ")

if I == 0 or P == 0:
print("Ошибка: Что-то пошло не так.")
else:
U = P / I
print(U)

def calculate_resistance():
print("\nНет информации - введите 0.\n")
R = get_float_input("R (Сопротивление в цепи) = ")
I = get_float_input("I (Сила тока) = ")

if R == 0 or I == 0:
print("Ошибка: Что-то пошло не так.")
else:
P = R * I ** 2
print(P)

if __name__ == "__main__":
print("Здравствуйте")

options = [
"Нужное сопротивление для резистора (нажмите клавишу 1) (нужно хотя бы 3 значения)",
"Напряжение (нажмите клавишу 2) (нужно хотя бы 2 значения)",
"Сила тока (нажмите клавишу 3) (нужно хотя бы 2 значения)",
"Мощность (нажмите клавишу 4) (нужно хотя бы 2 значения)",
"Сопротивление (нажмите клавишу 5) (нужно хотя бы 2 значения)",
]

print("\n".join(options))
do = input("Что нужно определить?\nВарианты: 1, 2, 3, 4, 5: ")

while do not in ["1", "2", "3", "4", "5"]:
do = input("Пожалуйста, введите корректный вариант: ")

if do == "1":
calculate_resistor()
elif do == "2":
calculate_voltage()
elif do == "3":
calculate_current()
elif do == "4":
calculate_power()
elif do == "5":
calculate_resistance()
else:
print("Ошибка: Что-то пошло не так.")
 
Без отступов не очень ясно, что вообще должно происходить после строки
if do == "1"

Первое условие проверяет do == "1" и, видимо, при его истинности в U, I, P и R кладутся новые инпуты. А вот при do ≠ "1" начинается беда: как только выясняется, что do ≠ "1", проверяется следующий elif (потому что на вид if — elif — else это все ветвление одного и того же условия):
elif R != 0 and P != 0 and U != 0 :

Но вот беда: если первый if не выполнился, то U, I, P и R даже не объявлены, и поэтому этот elif физически нельзя проверить, что и написано в ошибке.

Если хочется внутри внешнего if’а проверить, не делим ли мы на нуль, то это лучше делать через вложенное условие (внутрь внешнего if’а, а не как его продолжение в виде elif), либо через стандартную конструкцию для отлова исключений try — except
 
Назад
Сверху