CCCPaste

quadratic.py

import sys
import cmath

class Quadratic:
    domain: str = f"(-∞, ∞)"

    def __init__(self, a: float, b: float, c: float):
        self.a: float = a
        self.b: float = b
        self.c: float = c

        self.h: float = self.b / 2 * self.a
        self.k: float = (self.a * self.h**2) + (b * self.h) + self.c

        self.zero_first: complex = ( -self.b + cmath.sqrt((self.b ** 2) - 4 * self.a * self.c)) / 2 * self.a
        self.zero_second: complex = ( -self.b - cmath.sqrt((self.b ** 2) - 4 * self.a * self.c)) / 2 * self.a
        self.zeroes: list[str] = [
            f"{self.zero_first.real if self.zero_first.imag == 0 else self.zero_first}",
            f"{self.zero_second.real if self.zero_second.imag == 0 else self.zero_second}"
        ]

        self.quad_form: str = f"f(x) = {a if a != 1 else ''}x^2 + {f"{b}x" if b != 0 else '0'} + {c}"
        self.vert_form: str = f"f(x) = {a if a != 1 else ''}(x - {self.h})^2 + {self.k}"
        self.vertex: str = f"({self.h}, {self.k})"
        self.axis_symmetry: str = f"x={self.h}"

        if self.a < 0:
            self.range = f"(-∞, {self.k})"
        elif self.a > 0:
            self.range = f"({self.k}, ∞)"
        else:
            raise Exception

    def __str__(self):
        return self.quad_form

    def print(self) -> None:
        print(f"Quadratic Form: {self.quad_form}")
        print(f"Vertex Form: {self.vert_form}")
        print(f"Vertex: {self.vertex}")
        print(f"Axis of Symmetry: {self.axis_symmetry}")
        print(f"Zeroes:")
        for zero in set(self.zeroes):
            print(f"\t{zero}")
        print(f"Domain: {self.domain}")
        print(f"Range: {self.range}")

    def solve(self, x: float) -> float:
        return self.a * x**2 + self.b * x + self.c


def main() -> int:
    if len(sys.argv) >= 4:
        try:
            a = float(sys.argv[1])
            b = float(sys.argv[2])
            c = float(sys.argv[3])
        except Exception as error:
            print("Invalid arguments. The first through third arguments must be numbers.")
            print(error)
            return 1
    else:
        try:
            a = float(input("a > "))
            b = float(input("b > "))
            c = float(input("c > "))
        except Exception as error:
            print("Invalid arguments. a-c must be numbers.")
            print(error)
            return 1

    print()
    Quadratic(a, b, c).print()

    return 0

if __name__ == '__main__':
    try:
        sys.exit(main())
    except KeyboardInterrupt:
        sys.exit(130)
    except Exception as e:
        print(f"FATAL: {e}")
        sys.exit(1)