CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 2 of 2

Thread: Fraction Calculator

Hybrid View

  1. #1
    Join Date
    Mar 2015
    Posts
    7

    Fraction Calculator

    I have created a basic form with 2 inputs and 1 output with 4 buttons that have the addition, subtracting, multiple and divide. I have a class (CRational) made where it does all the calculation and reducing for me. Now the issue is I have to use what is there and now have it perform some advance calculations. For example:

    (a+bi) + (c+di) = (a+c) +(b+d)i for adding
    (a+bi) - (c+di) = (a-c) +(b-d)i for subtracting
    (a+bi) * (c+di) = (ac-bd) +(ad+bc)i for multiplying
    (a+bi)/(c+di) = (ac+bd/c2 +d2)/(bc-ad/c2+d2)i for dividing

    In this case i have to use fractions in replace of the letters.
    (3/4 + 1/2i) * (1/4 -2i)
    would return 19/16 - 11/8i

    Now the one other thing is i have to use another class to make this work or that is what I've been told. Here is my code up to now:

    Code:
    namespace Rational
    {
        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
        }
    }
    This is my simple form that i have also:
    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace Rational
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btnAdd_Click(object sender, EventArgs e)
            {
    
            }
            
            private void btnSub_Click(object sender, EventArgs e)
            {
                
            }
    
            private void btnTime_Click(object sender, EventArgs e)
            {
    
            }
    
            private void btnDivd_Click(object sender, EventArgs e)
            {
    
            }      
        }
    }
    So any helpful this all made sense message me if you have questions

  2. #2
    Join Date
    Mar 2015
    Posts
    7

    Re: Fraction Calculator

    Anyone?

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  


Windows Mobile Development Center


Click Here to Expand Forum to Full Width




On-Demand Webinars (sponsored)