Написал небольшую программу, не могу понять почему не работает цикл while и оператор else - Компьютерные вопросы
  • Чаты 4chT.com в телеграмм
    Наши группы в телеграмм

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

Регистрация
1 Ноя 2013
Сообщения
73
Репутация
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 но почему то игрнорируется
 
Регистрация
18 Окт 2013
Сообщения
88
Репутация
0
Спасибо
0
Монет
0
Это совсем не С++
По питону помогут в теме с питоном (если есть кому).
 
Регистрация
19 Окт 2013
Сообщения
96
Репутация
0
Спасибо
0
Монет
0
Странно, что тема в подразделе C/C++, где мало специалистов по пайтон.
Одно знаю точно - в пайтоне важны отступы в виде табуляции. Если их нет или они используются неправильно - программа работать не станет.
 
Регистрация
10 Сен 2013
Сообщения
73
Репутация
0
Спасибо
0
Монет
0
Ваш код содержит несколько ошибок и некорректных участков, из-за которых он не работает как ожидается. Вот исправленный код:

```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" для выполнения определенной части кода.

Теперь ваш код должен работать корректно.
 
Регистрация
21 Дек 2013
Сообщения
79
Репутация
0
Спасибо
0
Монет
0
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("Ошибка: Что-то пошло не так.")
 
Регистрация
7 Фев 2013
Сообщения
66
Репутация
0
Спасибо
0
Монет
0
Без отступов не очень ясно, что вообще должно происходить после строки
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
 
Сверху Снизу