diff --git a/content/en/posts/equation_solver.md b/content/en/posts/equation_solver.md new file mode 100644 index 0000000..c94d527 --- /dev/null +++ b/content/en/posts/equation_solver.md @@ -0,0 +1,301 @@ +--- +author: "Devoalda" +authorEmoji: 🐺 +title: "Go - Equation Solver" +date: 2020-07-12T11:20:23+08:00 +description: Equation Solver with Go +draft: false +hideToc: false +enableToc: true +enableTocContent: true +tocPosition: inner +tocLevels: ["h1", "h2", "h3"] +tags: +- go +- golang +- script +- programming +series: +- Go +categories: +- Go +image: images/postImages/Formula.png +libraries: +- mathjax +--- + +# Introduction +This is a simple linear and quadratic equation solver in the terminal done in go. + +Equation in the form of $ax + b = cx + d$ *or* $ax^2 + bx + c = 0$ + +The program will first ask for type of equation, followed by getting the coefficients of each equation. + +# Dependencies +* [Go](https://golang.org/dl/) +Go Modules: +``` Golang +import ( + "fmt" + "math" + "os" + "strconv" +) +``` + +# Code +Create a new project, and make a new file named `main.go`. +Ensure that project path is in `$GOPATH`, this can be checked in your shell with `echo $GOPATH` + +## FloatToString Method +This program uses floating points to allow for fractions and decimal numbers in the calculation. This method converts float to string +```golang +func FloatToString(input_num float64) string { + // to convert a float number to a string + return strconv.FormatFloat(input_num, 'f', 3, 64) +} +``` +This method will be used throughout the program. + +## Linear Equation Solver +Equation of $ax + b = cx +d$ would be easy to solve by rearranging the function into $(a - c)x = d - b$, solving it with this equation: $$x = {d - b \over a - c}$$ Where $a \ne c$ + +``` golang +func linearEqn() { + // Declare coefficients + var a, b, c, d float64 + + fmt.Println("Linear Equation Solver") + fmt.Println("Eqation in the form of ax + b = cx + d ") + + // Scan and check for null or empty values + _, err := fmt.Scan(&a, &b, &c, &d) + if err != nil { + panic(err) + } + + if a == c && b == d { + fmt.Println("There are infinite solutions to this equation") + } else if a == c { + fmt.Println("This equations are parallel to each other, hence no root") + } else { + x := (d - b) / (a - c) + y := a*x + b + fmt.Println("Equation: (" + FloatToString(a) + ")x + (" + FloatToString(b) + ") = (" + FloatToString(c) + ")x + (" + FloatToString(d) + ")") + fmt.Println("The value of x:", x) + fmt.Printf("OR the line intersects at (%g,%g)\n", x, y) + + } +} +``` + +## Quadratic Equation Solver +A Quadratic equation in the form of $ax^2 + bx + c = 0$, can be solved with the following equation: $$x = {-b \pm \sqrt{b^2-4ac} \over 2a}$$ +The program will first solve for the discriminant $b^2 - 4ac$ to determine the number of roots, and thereafter solve for the roots of the equation where the $discriminant \ge 0$ + +```golang +func quadraticEqn() { + var a, b, c float64 + + fmt.Println("Quadric Equation Solver") + fmt.Println("Equation in the form of ax^2+bx+c = 0") + fmt.Println("Where a > 0") + fmt.Println() + fmt.Println("Enter a, b, c, each in a new line:") + + // Scan and check for null or empty variables + _, err := fmt.Scan(&a, &b, &c) + if err != nil { + panic(err) + } + + // Panic if coefficient of x^2 <= 0 + if a <= 0.0 { + panic("Coefficient of a cannot be <= 0") + } else { + + eqn := "(" + FloatToString(a) + ")x^2 +(" + FloatToString(b) + ")x +(" + FloatToString(c) + ")" + fmt.Println("Equation:", eqn) + fmt.Println("a:", a) + fmt.Println("b:", b) + fmt.Println("c:", c) + + // Solve of discriminant + discriminant := b*b - 4*a*c + fmt.Println("Discriminant:", discriminant) + + if discriminant < 0 { + // No Real Roots + fmt.Println("Equation has no real roots") + + } else if discriminant == 0 { + // 1 real root + alpha := (-b + math.Sqrt(discriminant)) / (2.0 * a) + fmt.Printf("x = %g\n", alpha) + + } else { + //2 real roots + alpha := (-b + math.Sqrt(discriminant)) / (2.0 * a) + beta := (-b - math.Sqrt(discriminant)) / (2.0 * a) + fmt.Printf("x = %g or x = %g\n", alpha, beta) + + } + + } + +} +``` + +## Main method +This will be the Terminal UI(TUI) to get users to choose the type of equation +``` golang +func main() { + fmt.Println("Equation Solver by Devoalda") + fmt.Println("Enter type of equation:") + fmt.Println("1. Linear Equation (ax + b = cx + d)") + fmt.Println("2. Quadratic Equation (ax^2 + bx + c = 0)") + + //Single Variable scan + var choice int + _, err := fmt.Scanf("%d", &choice) + if err != nil { + panic(err) + } + + //Switch case + switch choice { + case 1: + linearEqn() + case 2: + quadraticEqn() + default: + fmt.Println("Unrecognised choice, quitting program now!") + os.Exit(3) + } +} +``` + +# Summary +The Program can be executed with `go run main.go`. All coefficients can be integers or floats. + +## Full Code +``` golang +package main + +import ( + "fmt" + "math" + "os" + "strconv" +) + +func main() { + fmt.Println("Equation Solver by Devoalda") + fmt.Println("Enter type of equation:") + fmt.Println("1. Linear Equation (ax + b = cx + d)") + fmt.Println("2. Quadratic Equation (ax^2 + bx + c = 0)") + + //Single Variable scan + var choice int + _, err := fmt.Scanf("%d", &choice) + if err != nil { + panic(err) + } + + //Switch case + switch choice { + case 1: + linearEqn() + case 2: + quadraticEqn() + default: + fmt.Println("Unrecognised choice, quitting program now!") + os.Exit(3) + } +} + +func linearEqn() { + var a, b, c, d float64 + + fmt.Println("Linear Equation Solver") + fmt.Println("Eqation in the form of ax + b = cx + d ") + + _, err := fmt.Scan(&a, &b, &c, &d) + if err != nil { + panic(err) + } + + if a == c && b == d { + fmt.Println("There are infinite solutions to this equation") + } else if a == c { + fmt.Println("This equations are parallel to each other, hence no root") + } else { + x := (d - b) / (a - c) + y := a*x + b + fmt.Println("Equation: (" + FloatToString(a) + ")x + (" + FloatToString(b) + ") = (" + FloatToString(c) + ")x + (" + FloatToString(d) + ")") + fmt.Println("The value of x:", x) + fmt.Printf("OR the line intersects at (%g,%g)\n", x, y) + + } +} + +func quadraticEqn() { + var a, b, c float64 + + fmt.Println("Quadric Equation Solver") + fmt.Println("Equation in the form of ax^2+bx+c = 0") + fmt.Println("Where a > 0") + fmt.Println() + fmt.Println("Enter a, b, c, each in a new line:") + + _, err := fmt.Scan(&a, &b, &c) + if err != nil { + panic(err) + } + + if a <= 0.0 { + panic("Coefficient of a cannot be <= 0") + } else { + + eqn := "(" + FloatToString(a) + ")x^2 +(" + FloatToString(b) + ")x +(" + FloatToString(c) + ")" + fmt.Println("Equation:", eqn) + fmt.Println("a:", a) + fmt.Println("b:", b) + fmt.Println("c:", c) + + discriminant := b*b - 4*a*c + fmt.Println("Discriminant:", discriminant) + + if discriminant < 0 { + // No Real Roots + fmt.Println("Equation has no real roots") + + } else if discriminant == 0 { + // 1 real root + alpha := (-b + math.Sqrt(discriminant)) / (2.0 * a) + fmt.Printf("x = %g\n", alpha) + + } else { + //2 real roots + alpha := (-b + math.Sqrt(discriminant)) / (2.0 * a) + beta := (-b - math.Sqrt(discriminant)) / (2.0 * a) + fmt.Printf("x = %g or x = %g\n", alpha, beta) + + } + + } + +} + +func FloatToString(input_num float64) string { + // to convert a float number to a string + return strconv.FormatFloat(input_num, 'f', 3, 64) +} +``` +## Building the program +Build the go project at the **project root** with the command `go build` +If `$GOPATH` is in your `$PATH`, you can run the program with the program name `eqn` +The compiled binary is located in `$GOROOT/bin/`, where you can run the program with `./eqn` +{{< expand "Credits" >}} +Formula FX icon icon by Icons8 +{{< /expand >}} diff --git a/static/images/postImages/Formula.png b/static/images/postImages/Formula.png new file mode 100644 index 0000000..00fc96e Binary files /dev/null and b/static/images/postImages/Formula.png differ