Hello everyone, I'm new to these boards but starting to get into C# programming and just wondering if anyone could help me out on this project i have going on. It is called a Gaussian Rational is where a number of the form a+bi where a and b are rationals and that a is called the real part of the number and b the imaginary part. Not i have made already the form and my CRational class. I'm just stuck on where to even begin on this one. Any help will do to get this going, here is the code that i have already made to get it started:

I have a zip file i have attached too if this don't work for anyone.
Any help would be so grateful

Rational Class.zip

namespace Rational_Class
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}

private void btnGo_Click(object sender, EventArgs e)
{
CRational ratNum1, ratNum2, ratSum,ratDiff,ratProd,ratQuot;

ratNum1 = new CRational(txtRat1.Text);
ratNum2 = new CRational(txtRat2.Text);
ratSum = new CRational();
ratDiff = new CRational();
ratProd = new CRational();
ratQuot = new CRational();

ratSum = ratNum1 + ratNum2; //Calculate sum
ratSum.Reduce();
txtSum.Text = ratSum.ToString();

ratDiff = ratNum1 - ratNum2; //Calculate difference
ratDiff.Reduce();
txtDiff.Text = ratDiff.ToString();

ratProd = ratNum1 *ratNum2; //Calculate product
ratProd.Reduce();
txtProd.Text = ratProd.ToString();

ratQuot = ratNum1 / ratNum2; //Calculate quotient
ratQuot.Reduce();
txtQuot.Text = ratQuot.ToString();

}
}
}

Here is the other half

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Rational_Class
{
class CRational
{
#region Fields

private int fiNum;
private int fiDenom;
private bool fbValid;

#endregion
#region Constructors

public CRational()
{
fiNum = 0;
fiDenom = 1;
fbValid = true;
}
public CRational(string strRat)
{
Parse(strRat);
}

#endregion
#region Methods

public override string ToString()
{
string strRat;
if (!fbValid)
strRat = "NaN";
else
{
strRat = fiNum.ToString();
if (fiDenom > 1)
strRat += "/" + fiDenom.ToString();
}
return strRat;
}

public void Parse(string strRat)
{
bool bSlash = false, bLegal = true, bNeg = false;
string strNum = "0", strDenom = "0";
if (strRat != "")
{
for (int i = 0; i < strRat.Length; i++)
{
if (!char.IsDigit(strRat[i]))
{
if ((i == 0 && strRat[i] == '-'))
bNeg = true;
else if ((i > 0 && strRat[i] == '/' && !bSlash))
bSlash = true;
else
bLegal = false;
}
else
{
if (bSlash)
strDenom += strRat[i];
else
strNum += strRat[i];
}
}
if (bLegal)
{
fiNum = int.Parse(strNum);
if (bNeg)
fiNum *= -1;
fiDenom = int.Parse(strDenom);
if (!bSlash)
fiDenom = 1;
if (fiDenom == 0)
fbValid = false;
else
fbValid = true;
}
else
fbValid = false;
}
else
fbValid = false;
}

public void Reduce()
{
if (fbValid) //Reduce only if valid CRational
{
if (fiNum == 0) //To avoid things like 0/8
fiDenom = 1;
else
{
if (fiDenom < 0) //Handles the possibility of negative
{ //fiDenom from / overload
fiNum *= -1;
fiDenom *= -1;
}
int iGCD = 1;
for (int i = 1; i <= fiDenom; i++)
if (fiNum % i == 0 && fiDenom % i == 0)
iGCD = i; //GCD when loop is exited
fiNum = fiNum / iGCD;
fiDenom = fiDenom / iGCD; //Reduced!
}
}
}

#endregion
#region Overloaded Operators

public static CRational operator +(CRational ratNum1, CRational ratNum2)
{
CRational ratSum = new CRational();

if (ratNum1.fbValid && ratNum2.fbValid)
{
ratSum.fiNum = ratNum1.fiNum * ratNum2.fiDenom + ratNum2.fiNum * ratNum1.fiDenom;
ratSum.fiDenom = ratNum1.fiDenom * ratNum2.fiDenom;
ratSum.fbValid = true;
}
else
ratSum.fbValid = false;
return ratSum;
}
public static CRational operator -(CRational ratNum1, CRational ratNum2)
{
CRational ratDiff = new CRational();

if (ratNum1.fbValid && ratNum2.fbValid)
{
ratDiff.fiNum = ratNum1.fiNum * ratNum2.fiDenom - ratNum2.fiNum * ratNum1.fiDenom;
ratDiff.fiDenom = ratNum1.fiDenom * ratNum2.fiDenom;
ratDiff.fbValid = true;
}
else
ratDiff.fbValid = false;
return ratDiff;
}
public static CRational operator *(CRational ratNum1, CRational ratNum2)
{
CRational ratProd = new CRational();

if (ratNum1.fbValid && ratNum2.fbValid)
{
ratProd.fiNum = ratNum1.fiNum * ratNum2.fiNum;
ratProd.fiDenom = ratNum1.fiDenom * ratNum2.fiDenom;
ratProd.fbValid = true;
}
else
ratProd.fbValid = false;
return ratProd;
}
public static CRational operator /(CRational ratNum1, CRational ratNum2)
{
CRational ratQuot = new CRational();
//Handles division by zero
if (ratNum1.fbValid && ratNum2.fbValid && ratNum2.fiNum!=0)
{
ratQuot.fiNum = ratNum1.fiNum * ratNum2.fiDenom;
ratQuot.fiDenom = ratNum1.fiDenom * ratNum2.fiNum;
ratQuot.fbValid = true;
}
else
ratQuot.fbValid = false;
return ratQuot;
}

#endregion
}
}