From 2a95fcb7a1ab6f0870e78b9c5d520be1ff635be3 Mon Sep 17 00:00:00 2001 From: Lohedami <105177511+Lohedami2003@users.noreply.github.com> Date: Tue, 16 Sep 2025 00:43:48 +0100 Subject: [PATCH 1/9] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To find the roots of the quadratic equation ax² + bx + c = 0 using x = -b ± √b² - 4ac --- README.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index aa4e50b..52e76b3 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,54 @@ -# pythonlab +def quadratic_solver(a: float, b: float, c: float): + """ + Solves quadratic equation ax^2 + bx + c = 0 + Returns tuple (x1, x2) if real roots, or string if complex roots. + Note: a must be > 0 + """ + if a <= 0: + raise ValueError("Coefficient 'a' must be greater than 0 for a quadratic equation.") -Python Lab + d = b**2 - 4*a*c # discriminant + + if d >= 0: + x1 = (-b + d**0.5) / (2*a) + x2 = (-b - d**0.5) / (2*a) + return (x1, x2) + else: + return "complex roots found" + + +def get_positive_float_input(prompt: str) -> float: + """Keep asking until user enters a valid number greater than 0.""" + while True: + try: + value = float(input(prompt)) + if value > 0: + return value + else: + print("❌ Coefficient 'a' must be greater than 0.") + except ValueError: + print("❌ Invalid input! Please enter a number.") + + +def get_float_input(prompt: str) -> float: + """Keep asking until user enters a valid number (can be negative or positive).""" + while True: + try: + return float(input(prompt)) + except ValueError: + print("❌ Invalid input! Please enter a number.") + + +if __name__ == "__main__": + print("Quadratic Equation Solver: ax² + bx + c = 0") + a = get_positive_float_input("Enter coefficient a (must be > 0): ") + b = get_float_input("Enter coefficient b: ") + c = get_float_input("Enter coefficient c: ") + + result = quadratic_solver(a, b, c) + + if isinstance(result, tuple): + print(f"The roots are: x1 = {result[0]}, x2 = {result[1]}") + else: + print(result) + Python Lab From 85b2b8793b71a2e11c5040673eba5c92789f515e Mon Sep 17 00:00:00 2001 From: Lohedami <105177511+Lohedami2003@users.noreply.github.com> Date: Tue, 16 Sep 2025 00:47:02 +0100 Subject: [PATCH 2/9] Update README.md Group_13 members and mat numbers; Lohedami MOGBOLU; ENG2403540 ORITSEGBUGBEMI Oritsesholaja Ephraim; ENG2403565. AGINDOTAN Boyowa Solomon ENG2410267 GODFREY-ARIAVE Jason; ENG2403523. UMOH Mmekobong Ime; ENG2403576. OHAHMEN Superior Afudah; ENG2403553. OKPISA Ilamosi Theresa; ENG2403557. From 097e03f4052c6fc15e4c04b5ec3ff39b99f8e170 Mon Sep 17 00:00:00 2001 From: Lohedami <105177511+Lohedami2003@users.noreply.github.com> Date: Tue, 16 Sep 2025 00:51:06 +0100 Subject: [PATCH 3/9] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 52e76b3..8222254 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +#pythonlab + def quadratic_solver(a: float, b: float, c: float): """ Solves quadratic equation ax^2 + bx + c = 0 From 36a4cbdbe82e482c28f4f7d75a5cb255b266fda7 Mon Sep 17 00:00:00 2001 From: Lohedami <105177511+Lohedami2003@users.noreply.github.com> Date: Tue, 16 Sep 2025 01:14:36 +0100 Subject: [PATCH 4/9] Create quadratic_solver.py Add quadratic_solver.py --- quadratic_solver.py | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 quadratic_solver.py diff --git a/quadratic_solver.py b/quadratic_solver.py new file mode 100644 index 0000000..f57891d --- /dev/null +++ b/quadratic_solver.py @@ -0,0 +1,53 @@ +def quadratic_solver(a: float, b: float, c: float): + """ + Solves quadratic equation ax^2 + bx + c = 0 + Returns tuple (x1, x2) if real roots, or string if complex roots. + Note: a must be > 0 + """ + if a <= 0: + raise ValueError("Coefficient 'a' must be greater than 0 for a quadratic equation.") + + d = b**2 - 4*a*c # discriminant + + if d >= 0: + x1 = (-b + d**0.5) / (2*a) + x2 = (-b - d**0.5) / (2*a) + return (x1, x2) + else: + return "complex roots found" + + +def get_positive_float_input(prompt: str) -> float: + """Keep asking until user enters a valid number greater than 0.""" + while True: + try: + value = float(input(prompt)) + if value > 0: + return value + else: + print("❌ Coefficient 'a' must be greater than 0.") + except ValueError: + print("❌ Invalid input! Please enter a number.") + + +def get_float_input(prompt: str) -> float: + """Keep asking until user enters a valid number (can be negative or positive).""" + while True: + try: + return float(input(prompt)) + except ValueError: + print("❌ Invalid input! Please enter a number.") + + +if __name__ == "__main__": + print("Quadratic Equation Solver: ax² + bx + c = 0") + a = get_positive_float_input("Enter coefficient a (must be > 0): ") + b = get_float_input("Enter coefficient b: ") + c = get_float_input("Enter coefficient c: ") + + result = quadratic_solver(a, b, c) + + if isinstance(result, tuple): + print(f"The roots are: x1 = {result[0]}, x2 = {result[1]}") + else: + print(result) From ed0494fddbd5fdd987c21ad3e5c1e7d86d71bccd Mon Sep 17 00:00:00 2001 From: Lohedami <105177511+Lohedami2003@users.noreply.github.com> Date: Tue, 16 Sep 2025 01:17:41 +0100 Subject: [PATCH 5/9] Create test_quadratic_solver.py Add Pytest file for quadratic solver. --- test_quadratic_solver.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 test_quadratic_solver.py diff --git a/test_quadratic_solver.py b/test_quadratic_solver.py new file mode 100644 index 0000000..f34c461 --- /dev/null +++ b/test_quadratic_solver.py @@ -0,0 +1,24 @@ +import pytest +from quadratic_solver import quadratic_solver + +def test_real_distinct_roots(): + result = quadratic_solver(1, -5, 6) # roots 2 and 3 + assert pytest.approx(result[0]) in (2, 3) + assert pytest.approx(result[1]) in (2, 3) + +def test_real_equal_roots(): + result = quadratic_solver(1, -4, 4) # root 2 (double) + assert result == (2, 2) + +def test_complex_roots(): + result = quadratic_solver(1, 1, 1) # complex roots + assert result == "complex roots found" + +def test_large_coefficients(): + result = quadratic_solver(2, -8, 8) # root 2 (double) + assert result == (2, 2) + +def test_negative_a(): + result = quadratic_solver(-1, 3, -2) # roots 1 and 2 + assert pytest.approx(result[0]) in (1, 2) + assert pytest.approx(result[1]) in (1, 2) From 672107240302c97c3e1d17c4deb22774009c85b3 Mon Sep 17 00:00:00 2001 From: Lohedami <105177511+Lohedami2003@users.noreply.github.com> Date: Tue, 16 Sep 2025 01:27:20 +0100 Subject: [PATCH 6/9] Update README.md Documentation on our quadratic_solver and test_quadratic_solver Python programs. --- README.md | 120 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 66 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 8222254..0cd4655 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,68 @@ #pythonlab -def quadratic_solver(a: float, b: float, c: float): - """ - Solves quadratic equation ax^2 + bx + c = 0 - Returns tuple (x1, x2) if real roots, or string if complex roots. - Note: a must be > 0 - """ - if a <= 0: - raise ValueError("Coefficient 'a' must be greater than 0 for a quadratic equation.") - - d = b**2 - 4*a*c # discriminant - - if d >= 0: - x1 = (-b + d**0.5) / (2*a) - x2 = (-b - d**0.5) / (2*a) - return (x1, x2) - else: - return "complex roots found" - - -def get_positive_float_input(prompt: str) -> float: - """Keep asking until user enters a valid number greater than 0.""" - while True: - try: - value = float(input(prompt)) - if value > 0: - return value - else: - print("❌ Coefficient 'a' must be greater than 0.") - except ValueError: - print("❌ Invalid input! Please enter a number.") - - -def get_float_input(prompt: str) -> float: - """Keep asking until user enters a valid number (can be negative or positive).""" - while True: - try: - return float(input(prompt)) - except ValueError: - print("❌ Invalid input! Please enter a number.") - - -if __name__ == "__main__": - print("Quadratic Equation Solver: ax² + bx + c = 0") - a = get_positive_float_input("Enter coefficient a (must be > 0): ") - b = get_float_input("Enter coefficient b: ") - c = get_float_input("Enter coefficient c: ") - - result = quadratic_solver(a, b, c) - - if isinstance(result, tuple): - print(f"The roots are: x1 = {result[0]}, x2 = {result[1]}") - else: - print(result) - Python Lab + +Group_13 +Group Report on Quadratic Equation Solver + +Group Members: +Lohedami MOGBOLU [ENG2403540], +ORITSEGBUGBEMI Oritsesholaja Ephraim [ENG2403565], +GODFREY-ARIAVE Jason [ENG2403523], +UMOH Mmekobong Ime [ENG2403576], +AGINDOTAN Boyowa Solomon [ENG2410267], +OKPISA Ilamosi Theresa [ENG2403557], +OHAHMEN Superior Afudah [ENG2403553] + +Date: Sept. 2025 + +Course: CPE112 + +Lecturer: Dr. E. Olaye + +INTRODUCTION +This report documents the team work in writing, implementing, debugging and testing of a +Python program to find the roots of the quadratic equation 𝑎𝑥2 + 𝑏𝑥 + 𝑐 = 0 using x=-bb2-4ac2a +The program, developed by Group_13 handles two cases: two normal roots and complex roots. The work was completed using Visual Studio Code, tested with Pytest and using draw.io, the flowchart was designed. After which it was documented using MS Word. + + ORITSEGBUGBEMI Oritsesholaja Ephraim implemented the Python code and also tested the program using the Pytest framework alongside UMOH Mmekobong Ime. + + Lohedami MOGBOLU documented the process. + + GODFREY-ARIAVE Jason designed the flowchart. + +FLOWCHART DEVELOPMENT +The flowchart was designed to outline the procedure used in solving the quadratic equation. +GODFREY-ARIAVE Jason led this task, using the online flowchart tool draw.io: +● Step 1- Start: The program begins here. +Step 2 - Input: The user is asked to input their values for each unknown. + +Step 3 - The discriminant 𝑑 =b² − 4𝑎𝑐 is calculated. And, based on d the roots are calculated: + If d >= 0: compute x1, x2 and output otherwise output complex roots. +Step 4 - End: The program ends here. + + +IMPLEMENTATION + +The program was implemented by ORITSEGBUGBEMI Oritsesholaja Ephraim using VS Code ● Code structure: +A quadratic_solver() function computers and displays roots based on the +discriminant. +A get_positive_float_input() function ensures the user does not input any number less than 1. +A get_float_input() function validates numeric input with an while loop and try-except. + + The file was saved as quadratic_solver.py and tested. + +TESTING +The program was tested by ORITSEGBUGBEMI Oritsesholaja Ephraim and UMOH Mmekobong Ime using the Pytest framework. This was done in two stages: + +Stage 1: The Manual Testing Stage +Test case 1: a = 1; b = 3; c = 1. Two real roots were found: -0.3819 and -2.6180. +Tested by Lohedami MOGBOLU. +Test Case 2: a =2; b =4; c = 4. Two complex roots were found: -1 + 4i and -1 – 4i. +Tested by Lohedami MOGBOLU + +Stage 2: The Automated Testing Stage. +ORITSEGBUGBEMI Oritsesholaja Ephraim created test_quadratic_solver.py All tests passed as reviewed by the group. + +CONCLUSION +The quadratic equation solver was successfully created. Lohedami MOGBOLU after executing the code observed there was no if statement should a user decide to input zero as the coefficient of x^2. She suggested that to ORITSEGBUGBEMI Oritsesholaja Ephraim. UMOH Mmekobong Ime tested the initial file program but when Lohedami MOGBOLU suggested an edit, ORITSEGBUBEMI Oritsesholaja Ephraim stepped up to write the final test file. + From e1e80f4a78b84924dc3713b1fc962d0e46aa979e Mon Sep 17 00:00:00 2001 From: Lohedami <105177511+Lohedami2003@users.noreply.github.com> Date: Tue, 16 Sep 2025 03:34:28 +0100 Subject: [PATCH 7/9] Update README.md Added a few edits to the report for better clarification; such as fixing formulas, and wrong spellings, etc. --- README.md | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 0cd4655..e48b4df 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ Lecturer: Dr. E. Olaye INTRODUCTION This report documents the team work in writing, implementing, debugging and testing of a -Python program to find the roots of the quadratic equation 𝑎𝑥2 + 𝑏𝑥 + 𝑐 = 0 using x=-bb2-4ac2a -The program, developed by Group_13 handles two cases: two normal roots and complex roots. The work was completed using Visual Studio Code, tested with Pytest and using draw.io, the flowchart was designed. After which it was documented using MS Word. +Python program to find the roots of the quadratic equation 𝑎𝑥2 + 𝑏𝑥 + 𝑐 = 0 using x=-b ± ✓(b² - 4ac)/2a +The program, developed by Group_13 handles two cases: two normal roots and two complex roots. The work was implemented using Visual Studio Code, tested with Pytest and using draw.io, the flowchart was designed. After which it was documented using MS Word. ORITSEGBUGBEMI Oritsesholaja Ephraim implemented the Python code and also tested the program using the Pytest framework alongside UMOH Mmekobong Ime. @@ -31,38 +31,39 @@ The program, developed by Group_13 handles two cases: two normal roots and compl GODFREY-ARIAVE Jason designed the flowchart. FLOWCHART DEVELOPMENT -The flowchart was designed to outline the procedure used in solving the quadratic equation. +The flowchart was designed to outline the procedure used in solving the quadratic equation ax² + bx + c = 0. GODFREY-ARIAVE Jason led this task, using the online flowchart tool draw.io: -● Step 1- Start: The program begins here. -Step 2 - Input: The user is asked to input their values for each unknown. +• Step 1- Start: The program begins here. +•Step 2 - Input: The user is asked to input their values for each unknown. -Step 3 - The discriminant 𝑑 =b² − 4𝑎𝑐 is calculated. And, based on d the roots are calculated: - If d >= 0: compute x1, x2 and output otherwise output complex roots. -Step 4 - End: The program ends here. +•Step 3 - The discriminant 𝑑 =b² − 4𝑎𝑐 is calculated. And, based on d the roots are calculated: + If d >= 0: compute x1, x2 and output otherwise print complex roots found. +•Step 4 - End: The program ends here. IMPLEMENTATION -The program was implemented by ORITSEGBUGBEMI Oritsesholaja Ephraim using VS Code ● Code structure: -A quadratic_solver() function computers and displays roots based on the +The program was implemented by ORITSEGBUGBEMI Oritsesholaja Ephraim using VS Code + ● Code structure: +A quadratic_solver() function computes and displays roots based on the discriminant. A get_positive_float_input() function ensures the user does not input any number less than 1. -A get_float_input() function validates numeric input with an while loop and try-except. +A get_float_input() function validates numeric input with a while loop and try-except block. The file was saved as quadratic_solver.py and tested. TESTING -The program was tested by ORITSEGBUGBEMI Oritsesholaja Ephraim and UMOH Mmekobong Ime using the Pytest framework. This was done in two stages: +The program was tested by ORITSEGBUGBEMI Oritsesholaja Ephraim, Lohedami MOGBOLU and UMOH Mmekobong Ime using the Pytest framework. This was done in two stages: Stage 1: The Manual Testing Stage Test case 1: a = 1; b = 3; c = 1. Two real roots were found: -0.3819 and -2.6180. Tested by Lohedami MOGBOLU. -Test Case 2: a =2; b =4; c = 4. Two complex roots were found: -1 + 4i and -1 – 4i. +Test Case 2: a = 2; b = 4; c = 4. Two complex roots were found: -1 + 4i and -1 – 4i. Tested by Lohedami MOGBOLU Stage 2: The Automated Testing Stage. ORITSEGBUGBEMI Oritsesholaja Ephraim created test_quadratic_solver.py All tests passed as reviewed by the group. CONCLUSION -The quadratic equation solver was successfully created. Lohedami MOGBOLU after executing the code observed there was no if statement should a user decide to input zero as the coefficient of x^2. She suggested that to ORITSEGBUGBEMI Oritsesholaja Ephraim. UMOH Mmekobong Ime tested the initial file program but when Lohedami MOGBOLU suggested an edit, ORITSEGBUBEMI Oritsesholaja Ephraim stepped up to write the final test file. +The quadratic equation solver was successfully created. Lohedami MOGBOLU after executing the code observed there was no if statement should a user decide to input zero as the coefficient of x². She suggested that to ORITSEGBUGBEMI Oritsesholaja Ephraim. UMOH Mmekobong Ime tested the initial file program but when Lohedami MOGBOLU suggested an edit, ORITSEGBUBEMI Oritsesholaja Ephraim stepped up to rewrite the final test file. From feda9f141a0e84dfead25be156eaa950fdd40ca6 Mon Sep 17 00:00:00 2001 From: Lohedami <105177511+Lohedami2003@users.noreply.github.com> Date: Mon, 15 Sep 2025 19:45:51 -1100 Subject: [PATCH 8/9] Add files via upload Flowchart for quadratic_solver.py assignment to visualize the workflow. --- Flowchart for quadratic solver assignment.jpg | Bin 0 -> 28433 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Flowchart for quadratic solver assignment.jpg diff --git a/Flowchart for quadratic solver assignment.jpg b/Flowchart for quadratic solver assignment.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c430f63a4571cf577ea2103813473080fe63aa4 GIT binary patch literal 28433 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 literal 0 HcmV?d00001 From 16d4b56ecfeabf47fcd2b0dc04ac6cf711b4e95a Mon Sep 17 00:00:00 2001 From: Ephraim1234 <93047676+Ephraim1234@users.noreply.github.com> Date: Tue, 16 Sep 2025 09:39:57 +0000 Subject: [PATCH 9/9] Create requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e079f8a --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pytest