Как я могу распечатать заявление, только если уравнение не выполняется? - PullRequest
4 голосов
/ 10 февраля 2020

Я пытаюсь найти, для каких значений x и y в диапазоне (-10,10) выполняется уравнение, и если решение не найдено, я пытаюсь вывести «Нет решения».

Однако, при попытке вывести «Нет решения», я либо получаю «Нет решения» на каждой отдельной итерации, и в конце выдает «Нет решения» независимо от того, удовлетворен ли for-l oop. ,

Мне трудно понять, как добавить в мое утверждение для печати информацию, когда решения не существует.

Вот что я имею до сих пор:

''' Read in first equation, ax + by = c '''
a = int(input())
b = int(input())
c = int(input())

''' Read in second equation, dx + ey = f '''
d = int(input())
e = int(input())
f = int(input())

for x in range(-10,10):
    for y in range(-10,10):
        if ((a*x) + (b*y)) == c and ((d*x) + (e*y)) == f:
            print(x, y)
            break

Ответы [ 6 ]

5 голосов
/ 10 февраля 2020

Вы можете использовать предложение else с for l oop. Он выполняется только в том случае, если for l oop не прерывается break.

for i in range(3):
    print(i)
else:
    print('hello')
# prints:
0
1
2
hello

for i in range(3):
    print(i)
    if i==1:
        break
else:
    print('world')
# prints:
0
1

Обратите внимание, что world не печатается, поскольку l oop было прервано break оператор.

Однако, поскольку у вас есть 2 для циклов, ваш оператор break сломает только самый внутренний l oop. Чтобы разорвать оба цикла, вы можете использовать флаг, чтобы остановить выполнение.

HALT = False
for x in range(-10,10):
    for y in range(-10,10):
        if ((a*x) + (b*y)) == c and ((d*x) + (e*y)) == f:
            print(x, y)
            HALT = True
            break
    if HALT:
        break
else:
    print('No solution')

Используя itertools.product, вы можете обойтись без внутреннего l oop и флага HALT.

from itertools import product


for x, y in product(range(-10, 10), repeat=2):
    if ((a*x) + (b*y)) == c and ((d*x) + (e*y)) == f:
        print(x, y)
        break
else:
    print('No solution')
3 голосов
/ 10 февраля 2020

Вы можете встроить свою логику c в функцию для лучшего контроля потока (например, оператор return немедленно выйдет из функции)

'''Read in first equation, ax + by = c'''
a = int(input())
b = int(input())
c = int(input())

''' Read in second equation, dx + ey = f '''
d = int(input())
e = int(input())
f = int(input())


def find_solution():
    for x in range(-10, 10):
        for y in range(-10, 10):
            if ((a * x) + (b * y)) == c and ((d * x) + (e * y)) == f:
                return x, y

solution = find_solution()
if solution is not None:
    print(solution)
else:
    print("No solutions found")
1 голос
/ 10 февраля 2020

В Python 3.8 вы можете использовать выражение присваивания и функцию any для захвата значений x и y, которые удовлетворяют уравнению.

from itertools import product


if any((solution:=(x,y)) and a*x + b*y == c and d*x + e*y == f for x, y in product(range(-10, 10), repeat=2):
    print(solution)
else:
    print('No solution')
1 голос
/ 10 февраля 2020

Сделать ядро ​​«поиск решения» логи c функцией и вернуть либо первое решение, либо None. Кстати, функции, у которых нет явного return <...>, автоматически возвращают None.

Затем вызывайте эту функцию и выводите либо результат, либо сообщение об ошибке.

I также взял на себя смелость извлечь раздел ввода пользователя в автономную функцию. И я написал - я надеюсь - полезные комментарии, чтобы немного улучшить Python.

1 голос
/ 10 февраля 2020

Вы можете просто обернуть свой текущий код в функцию и использовать return вместо break, чтобы пропустить оба уровня l oop:

def calc(a, b, c, d, e, f):
    for x in range(-10,10):
        for y in range(-10,10):
            if ((a*x) + (b*y)) == c and ((d*x) + (e*y)) == f:
                return x, y
    return "No solution"

print(calc(a, b, c, d, e, f))
0 голосов
/ 10 февраля 2020

Во-первых, вам нужно определить логическое значение False, чтобы определить, есть ответ или нет. Когда вы получите решение, включите его в True, чтобы вы не вызывали print («Нет решения»), даже если у вас есть ответ. Затем вы проверяете, прошли ли вы последний тест, и вызываете оператор elif, который выдает «No Solution». Вот код:

''' Read in first equation, ax + by = c '''
a = int(input())
b = int(input())
c = int(input())

''' Read in second equation, dx + ey = f '''
d = int(input())
e = int(input())
f = int(input())
#Define boolean that will know if you printed a solution or not
isSolution = False

for x in range(-10,10):
    for y in range(-10,10):
        if ((a*x) + (b*y)) == c and ((d*x) + (e*y)) == f:
            #If you find a solution
            print(x, y)
            isSolution = True
            break
        elif (y==9 and x==9 and isSolution==False):
            #If there are no solutions
            print("No solution")

Скажите, есть ли случай, когда он печатает решение, а затем печатает «Нет решения», потому что я хотел бы исправить свою ошибку. Я надеюсь, что приведенный выше код поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...