Showing posts with label FeetInches Class Copy Constructor Multiplication. Show all posts
Showing posts with label FeetInches Class Copy Constructor Multiplication. Show all posts

Tuesday, January 2, 2018

Programming Challenge 14.11 - FeetInches Class Copy Constructor and Multiply Function

Example Files: FeetInchesCcMult.7z

FeetInches.h


#ifndef FEET_INCHES_H_
#define FEET_INCHES_H_

#include <iostream>
using std::istream;
using std::ostream;

class FeetInches
{
    private:
        int feet;                        // To hold a number of feet
        int inches;                        // To hold a number of inches

        void simplify();                // Defined in FeetInches.cpp

    public:
        FeetInches(int f = 0, int i = 0)
        {
            feet = f;
            inches = i;
            simplify();
        }

        // Copy Constructor
        FeetInches(const FeetInches &obj)
        {
            feet = obj.feet;
            inches = obj.inches;
        }

        // Mutator functions
        void setFeet(int f)
        {
            feet = f;
        }

        void setInches(int i)
        {
            inches = i;
             simplify();
        }

        FeetInches multiply(const FeetInches &);

        // Accessor functions
        int getFeet() const
        { return feet; }

        int getInches() const
        { return inches; }

        // Overload operator functions
        FeetInches operator + (const FeetInches &);            // Overloaded +
        FeetInches operator - (const FeetInches &);            // Overloaded -
        FeetInches operator ++ ();                                    // Prefix ++
        FeetInches operator ++ (int);                                // Postfix ++
   
        bool operator > (const FeetInches &);                    // Overloaded >
        bool operator < (const FeetInches &);                    // Overloaded <
        bool operator == (const FeetInches &);                    // Overloaded ==
        bool operator >= (const FeetInches &);                    // Greater Equal
        bool operator <= (const FeetInches &);                    // Lesser Equal
        bool operator != (const FeetInches &);                    // Inequal

        // Friends
        friend ostream &operator << (ostream &, const FeetInches &);
        friend istream &operator >> (istream &, FeetInches &);
};

#endif

FeetInches.cpp


#include "FeetInches.h"

#include <cstdlib>

#include <iostream>
using std::cout;

/* **********************************************************
            FeetInches::simplify()
    This function checks for values in the inches member
    greater than twelve or less than zero. If such a value is
    found, the numbers in feet and inches are adjusted to
    conform to a standard feet & inches expression. For
    example:

    3 feet 14 inches would be adjusted to 4 feet 2 inches and
    5 feet -2 inches would be adjusted to 4 feet 10 inches.

    The standard library function abs() is used to get the
    absolute value of the inches member. The abs() function
    requires to #include <cstdlib>.
   ********************************************************** */

void FeetInches::simplify()
{
    if (inches >= 12)
    {
        feet += (inches / 12);
        inches = inches % 12;
    }
    else if (inches < 0)
    {
        feet -= ((abs(inches) / 12) + 1);
        inches = 12 - (abs(inches) % 12);
    }
}

/* **********************************************************
            Overloaded binary + operator
   ********************************************************** */

FeetInches FeetInches::operator + (const FeetInches &right)
{
    FeetInches temp;

    temp.inches = inches + right.inches;
    temp.feet = feet + right.feet;
    temp.simplify();

    return temp;
}

/* **********************************************************
            Overloaded binary - operator
   ********************************************************** */

FeetInches FeetInches::operator - (const FeetInches &right)
{
    FeetInches temp;

    temp.inches = inches - right.inches;
    temp.feet = feet - right.feet;
    temp.simplify();

    return temp;
}

/* **********************************************************
            Overloaded prefix ++ operator
    Causes the inches member to be incremented. Returns the
    incremented object.
   ********************************************************** */

FeetInches FeetInches::operator++()
{
    ++inches;
    simplify();

    return *this;
}

/* **********************************************************
            Overloaded postfix ++ operator
    Causes the inches member to be incremented. Returns the
    value of the object before the increment.
   ********************************************************** */

FeetInches FeetInches::operator++(int)
{
    FeetInches temp(feet, inches);

    inches++;
    simplify();

    return temp;
}

/* **********************************************************
            Overloaded > operator
    Returns true if the current object is set to a value
    greater than that of right.
   ********************************************************** */

bool FeetInches::operator > (const FeetInches &right)
{
    bool status;

    if (feet > right.feet)
    {
        status = true;
    }
    else if (feet == right.feet && inches > right.inches)
    {
        status = true;
    }
    else
    {
        status = false;
    }

    return status;
}

/* **********************************************************
            Overloaded < operator
    Returns true if the current object is set to a value less
    than that of right.
   ********************************************************** */

bool FeetInches::operator < (const FeetInches &right)
{
    bool status;

    if (feet < right.feet)
    {
        status = true;
    }
    else if (feet == right.feet && inches < right.inches)
    {
        status = true;
    }
    else
    {
        status = false;
    }

    return status;
}

/* **********************************************************
            Overloaded == operator
    Returns true if the current object is set to a value equal
    to that of right.
   ********************************************************** */

bool FeetInches::operator == (const FeetInches &right)
{
    bool status;

    if (feet == right.feet && inches == right.inches)
    {
        status = true;
    }
    else
    {
        status = false;
    }

    return status;
}

/* **********************************************************
            Overloaded Greater Equal => operator
    Returns true if the current object is set to a value
    greater than or equal to that of right.
   ********************************************************** */

bool FeetInches::operator >= (const FeetInches &right)
{
    bool status;

    if (feet >= right.feet)
    {
        return true;
    }
    else if (feet == right.feet && inches >= right.inches)
    {
        status = true;
    }
    else
    {
        status = false;
    }

    return status;
}

/* **********************************************************
            Overloaded Less Equal <= operator
    Returns true if the current object is set to a value less
    than or equal to that of right.
   ********************************************************** */

bool FeetInches::operator <= (const FeetInches &right)
{
    bool status;

    if (feet <= right.feet)
    {
        status = true;
    }
    else if (feet == right.feet && inches <= right.inches)
    {
        status = true;
    }
    else
    {
        status = false;
    }

    return status;
}

/* **********************************************************
            Overloaded Inequal != operator
    Returns true if the current object is set to a value not
    equal to that of right.
    ********************************************************** */

bool FeetInches::operator != (const FeetInches &right)
{
    bool status;

    if (feet != right.feet)
    {
        status = true;
    }
    else if (feet == right.feet && inches != right.inches)
    {
        status = true;
    }
    else
    {
        status = false;
    }

    return status;
}

/* **********************************************************
            FeetInches::FeetInches multiply() : const obj &
    This function multiplies two FeetInches objects. The feet
    and inches attributes are multiplied by the calling feet
    and inches object's feet and inches attributes, and a
    FeetInches object holding the result is returned.
    ********************************************************** */

FeetInches FeetInches::multiply(const FeetInches &right)
{
    FeetInches temp;

    temp.inches = ((feet * 12 + inches) * (right.feet * 12 + right.inches));
    temp.inches /= 12;
    temp.simplify();

    return temp;
}

/* **********************************************************
            Overloaded << operator
    Gives cout the ability to directly display FeetInches
    objects.
   ********************************************************** */

ostream &operator << (ostream &strm, const FeetInches &obj)
{
    strm << obj.feet << " feet, " << obj.inches << " inches.";

    return strm;
}

/* **********************************************************
            Overloaded >> operator
    Gives cin the ability to directly store user input into
    FeetInches objects.
   ********************************************************** */

istream &operator >> (istream &strm, FeetInches &obj)
{
    // Prompt the user for the feet
    cout << "Feet: ";
    strm >> obj.feet;

    // Prompt the user for the inches
    cout << "Inches: ";
    strm >> obj.inches;

    // Normalize the values
    obj.simplify();

    return strm;
}

FeetInchesDm.cpp


#include "FeetInches.h"

#include <iostream>
using std::cin;
using std::cout;

int main()
{
    FeetInches first(15, 4);
    FeetInches second = first;   
    FeetInches third, fourth;

    cout << "FEET INCHES - COPY CONSTRUCTOR & MULTIPLICATION DEMO\n\n"
          << "This program asks you to input two distances, measured in feet and inches.\n"
          << "It will multiply both values, and output the result in feet and inches.\n";
    cout << "Here is an example:\n\n";

    cout << first << " multiplied by " << second << " equals:\n";
    cout << first.multiply(second) << " \n\n";

    cout << "Enter a distance in feet and inches:\n";
    cin >> third;
   
    cout << "\nEnter another distance in feet and inches.\n";
    cin >> fourth;
   
    cout << "\n" << third << " multiplied by " << fourth << " equals:\n";
    cout << (third.multiply(fourth));

    cout << "\n\nThank you for using this demo. Have a nice day!";

    cin.get();
    cin.ignore();
    return 0;
}

Example Output: