Я написал очень простой c квадратичный c код уравнения, и он не возвращает «Нет», как я намереваюсь. Он просто печатает правильный ответ дважды - PullRequest
0 голосов
/ 10 апреля 2020
import math
def quadratic_equation(first_coefficient,
                       second_coefficient,
                       free_coefficient):

    discriminant = (second_coefficient**2) - (4*first_coefficient*free_coefficient)
    first_solution = (-(second_coefficient)+(math.sqrt(discriminant)))/2*first_coefficient
    second_solution = (-(second_coefficient)-(math.sqrt(discriminant)))/2*first_coefficient

    if first_solution != 0 and second_solution != 0:
        return first_solution, second_solution
    elif first_solution != 0 and second_solution == 0:
        return first_solution, None
    elif first_solution == 0 and second_solution != 0:
        return None, second_solution
    elif first_solution == 0 and second_solution == 0:
        return None

print(quadratic_equation(1, -8, 16))

так что это мой код. Требование для назначения состоит в том, что, когда существует только один жизнеспособный ответ, он вернет правильный и «Нет». Однако, когда я запускаю его (печатая), если есть только один жизнеспособный ответ, он просто напечатает этот ответ дважды. Кто-нибудь может понять, почему он это делает? спасибо, и извините за то, что вы новичок. ps - я должен только вернуть его, а не распечатать, а также в задании указано, что не следует ожидать какого-либо отрицательного дискриминанта, поэтому я не получу код ошибки. Я не получаю никаких кодов ошибок при печати кода, он просто не возвращает то, к чему я намереваюсь.

1 Ответ

0 голосов
/ 10 апреля 2020

Вы просто не делаете нужную проверку, поэтому вы можете добавить еще одну elif после всех проверок на 0, которые у вас есть:

elif first_solution == second_solution:
    return first_solution, None

Кроме того, я бы предложил переписать все эти проверки полностью иметь много четкого кода, например:

import math


def quadratic_equation(a, b, c):

    d = (b**2) - (4 * a * c)
    x = [None] * 2

    for i, t in enumerate([1, -1]):
        # t is a sign before discriminant

        # you should never check floating point calculations be equal to the exact numbers more details here: https://docs.python.org/2/tutorial/floatingpoint.html
        # For some reason you want to have None instead 0, usually that is not the best choise, but here you are: 
        if t * d == b**2:
            x[i] = None
        elif d >= 0:
            x[i] = (-b + t * math.sqrt(d)) / (2 * a)
    # If both solutions are same, just set the second one as None
    if d == 0:
        x[1] = None

    # If for some reason you want to return None instead of (None, None), why not
    if not any(x):
        return None

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