Factorizing Quadratic Equations (practice and solver)
Overview
There are several different methods for solving Quadratic equations. This application focuses on solving by Factorizing.
The application is primarily a revision aid, being comprised of a practice app. and a solver app.
**Figure 1. Manually solving practice questions.
**
**Figure 2. Solving programmatically.
**
The program consists of one Form and two UserControls:
The bracket UC is a dual purpose control...:
...and is shown in Figure 1, where it is used for input, and in Figure 2 (the lower control) in readonly mode as an output control.
The equation UC...:
...is an input control which can be seen in Figure 2 (the top control).
The code – The bracket UC
Both the bracket control (in input mode) and the equation control are restricted in the input they will accept. I haven’t included the input restricting code here.
The code includes a Boolean [readonly] Property and four String Properties for retrieving and setting text in the Labels and TextBoxes. The Paint event is handled to draw highlighting lines below the TextBoxes.
This UC also has two Public methods, alignControls which moves the controls to accommodate different text, and reset which resets the control’s text back to the default values.
Public Class bracket
Private _readonly As Boolean = False
Public Property [readonly]() As Boolean
Get
Return _readonly
End Get
Set(ByVal value As Boolean)
_readonly = value
TextBox1.ReadOnly = value
TextBox2.ReadOnly = value
End Set
End Property
Public Property a1() As String
Get
Return Label1.Text
End Get
Set(ByVal value As String)
Label1.Text = value
End Set
End Property
Public Property a2() As String
Get
Return Label4.Text
End Get
Set(ByVal value As String)
Label4.Text = value
End Set
End Property
Public Property i1() As String
Get
Return TextBox1.Text
End Get
Set(ByVal value As String)
TextBox1.Text = value
End Set
End Property
Public Property i2() As String
Get
Return TextBox2.Text
End Get
Set(ByVal value As String)
TextBox2.Text = value
End Set
End Property
Private Sub bracket_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
e.Graphics.DrawLine(Pens.Black, TextBox1.Left - 1, TextBox1.Bottom - 4, TextBox1.Left - 1, TextBox1.Bottom + 1)
e.Graphics.DrawLine(Pens.Black, TextBox1.Left - 1, TextBox1.Bottom + 1, TextBox1.Right + 1, TextBox1.Bottom + 1)
e.Graphics.DrawLine(Pens.Black, TextBox1.Right + 1, TextBox1.Bottom - 4, TextBox1.Right + 1, TextBox1.Bottom + 1)
e.Graphics.DrawLine(Pens.Black, TextBox2.Left - 1, TextBox2.Bottom - 4, TextBox2.Left - 1, TextBox2.Bottom + 1)
e.Graphics.DrawLine(Pens.Black, TextBox2.Left - 1, TextBox2.Bottom + 1, TextBox2.Right + 1, TextBox2.Bottom + 1)
e.Graphics.DrawLine(Pens.Black, TextBox2.Right + 1, TextBox2.Bottom - 4, TextBox2.Right + 1, TextBox2.Bottom + 1)
End Sub
Public Sub alignControls()
TextBox1.Left = Label1.Right + 6
Label2.Left = TextBox1.Right + 6
Label4.Left = Label2.Right - 2
TextBox2.Left = Label4.Right + 6
Label3.Left = TextBox2.Right + 6
Me.Invalidate()
End Sub
Public Sub reset()
Label1.Text = "(x"
Label4.Text = "(x"
TextBox1.Clear()
TextBox2.Clear()
End Sub
The code – The equation UC
This UC has three String Properties, which expose the TextBoxes’ Text Properties. It also contains a Public reset method which resets the input control’s text back to the default values.
Public Class equation
Public Sub reset()
TextBox1.Clear()
TextBox2.Clear()
TextBox3.Clear()
End Sub
Public Property a() As String
Get
Return TextBox1.Text
End Get
Set(ByVal value As String)
TextBox1.Text = value
End Set
End Property
Public Property b() As String
Get
Return TextBox2.Text
End Get
Set(ByVal value As String)
TextBox2.Text = value
End Set
End Property
Public Property c() As String
Get
Return TextBox3.Text
End Get
Set(ByVal value As String)
TextBox3.Text = value
End Set
End Property
End Class
The code – The Form
The Form code is organized into five distinct regions:
Ø common variables
These are Form level and used by the practice part of the application.
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim r As New Random
Dim i1 As Integer
Dim i2 As Integer
Dim solutions As String = ""
Ø practise
The practice part of the application formulates random equations, and checks your answers.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label4.Text = ""
Dim a1 As Integer
Dim a2 As Integer
a1 = r.Next(-9, 13)
a2 = r.Next(-9, 13)
a = a1 * a2
While a = 0
a1 = r.Next(-9, 13)
a2 = r.Next(-9, 13)
a = a1 * a2
End While
Do
i1 = r.Next(-9, 13)
i2 = r.Next(-9, 13)
b = a1 * i2 + i1 * a2
c = i1 * i2
Loop While b = 0 Or c = 0
'(3x - 2)(x + 3)
Label3.Text = String.Format("Solve:{0}{1}x² {2}x {3} = 0", Environment.NewLine, a, If(b > 0, "+" & b.ToString, b.ToString), If(c > 0, "+" & c.ToString, c.ToString))
Bracket1.a1 = String.Format("({0}x", If(a1 = 1, "", a1.ToString))
Bracket1.a2 = String.Format("({0}x", If(a2 = 1, "", a2.ToString))
Bracket1.i1 = ""
Bracket1.i2 = ""
Bracket1.alignControls()
solutions = String.Format("x = {0} or x = {1}", simplify(i1, a1), simplify(i2, a2))
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim int1, int2 As Integer
If Integer.TryParse(Bracket1.i1.TrimStart("+"c), int1) AndAlso Integer.TryParse(Bracket1.i2.TrimStart("+"c), int2) Then
If i1 = int1 AndAlso i2 = int2 Then
MsgBox("Correct answer", MsgBoxStyle.Information)
Label4.Text = solutions
Else
MsgBox("Try again", MsgBoxStyle.Exclamation)
End If
End If
End Sub
Ø solve
The solve part of the application allows you to specify a Quadratic Equation and programmatically solve that equation.
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Bracket2.reset()
Label5.Text = ""
Dim quadratic, linear, constant As Integer
If Integer.TryParse(Equation1.a, quadratic) AndAlso Integer.TryParse(Equation1.b, linear) AndAlso Integer.TryParse(Equation1.c, constant) Then
Dim aDivisors As List(Of Point) = getDivisors(quadratic)
Dim cDivisors As List(Of Point) = getDivisors(constant)
'(3x - 2)(x + 3)
For x1 As Integer = aDivisors.Count - 1 To 0 Step -1
For x2 As Integer = 0 To cDivisors.Count - 1
If aDivisors(x1).X * cDivisors(x2).Y + cDivisors(x2).X * aDivisors(x1).Y = linear Then
Bracket2.a1 = String.Format("({0}x", If(aDivisors(x1).X = 1, "", aDivisors(x1).X.ToString))
Bracket2.a2 = String.Format("({0}x", If(aDivisors(x1).Y = 1, "", aDivisors(x1).Y.ToString))
Bracket2.i1 = If(cDivisors(x2).X > 0, "+" & cDivisors(x2).X.ToString, cDivisors(x2).X.ToString)
Bracket2.i2 = If(cDivisors(x2).Y > 0, "+" & cDivisors(x2).Y.ToString, cDivisors(x2).Y.ToString)
Bracket2.alignControls()
Label5.Text = String.Format("x = {0} or x = {1}", simplify(cDivisors(x2).X, aDivisors(x1).X), simplify(cDivisors(x2).Y, aDivisors(x1).Y))
Return
End If
Next
Next
End If
End Sub
Private Function getDivisors(ByVal x As Integer) As List(Of Point)
Dim divisors As New List(Of Point)(Enumerable.Range(If(x > 0, -x, x), Math.Abs(x) * 2).Except(New Integer() {0}).Where(Function(n) x Mod n = 0).Select(Function(n) New Point(n, (x \ n))).ToArray)
Return divisors
End Function
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Bracket2.reset()
Equation1.reset()
Label5.Text = ""
End Sub
Ø common methods
Common methods contains just one Function which is used for simplifying fractions.
Private Function simplify(ByVal n As Integer, ByVal d As Integer) As String
If d = 1 Or d = -1 Then Return n.ToString
Dim hcd As Integer = Enumerable.Range(2, Math.Max(Math.Abs(n), Math.Abs(d))).LastOrDefault(Function(x) n Mod x = 0 AndAlso d Mod x = 0)
If hcd > 0 Then
n \ hcd
d \ hcd
If d = 1 Or d = -1 And n < 0 Then
Return (n \ d).ToString
ElseIf d = -1 And n > 0 Then
Return "-" & (n \ d).ToString
End If
Return String.Format("{2}{0}/{1}", Math.Abs(n), Math.Abs(d), If((n / d) < 0, "-", ""))
Else
Return String.Format("{2}{0}/{1}", Math.Abs(n), Math.Abs(d), If((n / d) < 0, "-", ""))
End If
Return ""
End Function
Ø form
The general Form code handles the TabPage Paint events and adds some extra functionality to the application.
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.F2 Then
If TabControl1.SelectedIndex = 0 Then
MsgBox(String.Format("{0}, {1}", i1, i2))
End If
ElseIf e.KeyCode = Keys.F3 Then
If TabControl1.SelectedIndex = 0 Then
TabControl1.SelectedIndex = 1
Bracket2.reset()
Equation1.reset()
Equation1.a = a.ToString
Equation1.b = If(b > 0, "+" & b.ToString, b.ToString)
Equation1.c = If(c > 0, "+" & c.ToString, c.ToString)
End If
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TabControl1.SelectedIndex = 0
Button1.PerformClick()
Me.KeyPreview = True
End Sub
Private Sub TabPage1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles TabPage1.Paint
For c As Integer = 0 To Me.Width Step 25
e.Graphics.DrawLine(Pens.LightGray, c, 0, c, Me.Height)
Next
For r As Integer = 0 To Me.Height Step 25
e.Graphics.DrawLine(Pens.LightGray, 0, r, Me.Width, r)
Next
End Sub
Private Sub TabPage2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles TabPage2.Paint
For c As Integer = 0 To Me.Width Step 25
e.Graphics.DrawLine(Pens.LightGray, c, 0, c, Me.Height)
Next
For r As Integer = 0 To Me.Height Step 25
e.Graphics.DrawLine(Pens.LightGray, 0, r, Me.Width, r)
Next
End Sub
Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
If e.KeyCode = Keys.Up Then
TextBox1.SelectedText = "²"
End If
End Sub
**See Also **
Download here