Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

C+ Object Oriented Programming Assignment 1. Create a Fraction class and add you

ID: 3729081 • Letter: C

Question

C+ Object Oriented Programming Assignment 1. Create a Fraction class and add your Name to the name fraction and use this as your class. For example, if your name is Mark John, then your class name should be FractionMarkl. 2. Create a class constructor for your Fraction class to handle the initialization appropriately. .There will be ONLY one constructor with 2 arguments. The constructor should have code to confirm the call/use of itself through the printing (e.g.," Calling Fraction (int, int)" ) and continue with the display of numerator and denominator after being initialized/built. 3. A member function print() that will print the current Fraction object. 4. A member function extractUncommonDigitt) that will return an array of common digits between the numerator and denominator. Reminderl In your program, no GLOBAL DATA are allowed, and you must write all needed functions (no library functions are allowed - Except for cin and cout and their functions / manipulators) · . Dynamic allocations must be released properly! . Test your output with data to be identified in class ( at least the same as being shown below as appropriate. Attach the output at the end of your application program (as comment). Followed with a comment block about your logic, code issues, and any other comments that you may have- YOU MUST PROVIDE-this comment block even with a "NO COMMENTS!" as content of this block. . .

Explanation / Answer

main.cpp


#include <iostream>
#include "Ex1.h"

using namespace std;

int main() {
    runMenuHw3();
    return 0;
}

Ex1.h


#include "Ex1Fraction.h"

#ifndef EX1_H
#define EX1_H

void runMenuHw3(void);
void displayClassInfoJeremyT(void);
void displayMenuInfo(void);
int isContainingDigit(int, int);
void runTests(void);
void testFraction(int, int);
int inputNum(void);
int inputDenom(void);
void runUpdateMenu(FractionJeremyT*);
void displayUpdateMenuInfo(void);
void displayUncommonDigitInfo(int*, int*);
#endif


Ex1.cpp


#include <iostream>
#include "cis25Spring2018JeremyTHw3Ex1.h"
#include "cis25Spring2018JeremyTHw3Ex1Fraction.h"
using namespace std;

// Function Definitions

void runMenuHw3() {
    int optionMenu;
    int num;
    int denom;
    FractionJeremyT* frPtr = nullptr;
    int* uncommonDigitAry = nullptr;
    int* digitCountAryNum = nullptr;
    int* digitCountAryDenom = nullptr;
  
    displayClassInfoJeremyT();

    do {
   displayMenuInfo();
   cin >> optionMenu;

   switch (optionMenu) {
   case 1:
        if (frPtr) {
       frPtr->print();
       cout << " An update menu is provided next!" << endl;
       runUpdateMenu(frPtr);
        } else {
       num = inputNum();
       denom = inputDenom();
       frPtr = new FractionJeremyT(num, denom);
        }
        break;

   case 2:
        if (frPtr) {
       frPtr->print();
        }
        else
       cout << " No Fraction available!" << endl;
        break;

   case 3:
        if (frPtr) {
       frPtr->print();
       uncommonDigitAry = frPtr->extractUncommonDigit();
       digitCountAryNum = frPtr->getDigitCountAryNum();
       digitCountAryDenom = frPtr->getDigitCountAryDenom();
      
       cout << " "
             << "Using the result returned from "
             << "extractUncommonDigit() - "
             << " The uncommon digit array has "
             << (*uncommonDigitAry - 1)
             << " uncommon digit(s) of"
             << "     From num --" << endl;
       displayUncommonDigitInfo(uncommonDigitAry,
            digitCountAryNum);
      
       cout << "     From denom --" << endl;
       displayUncommonDigitInfo(uncommonDigitAry,
            digitCountAryDenom);

       // what do to do if:
                // - no uncommon digits
       // - uncommon digits only in num
       // - uncommon digits only in denom

       // delete pointers on the object side
       frPtr->releaseDigitCountArrays();

       // delete pointers on the function side
       delete digitCountAryNum;
       digitCountAryNum = nullptr;
       delete digitCountAryDenom;
       digitCountAryDenom = nullptr;

       // cout << endl;
       // cout << "                 Address DCA Num: " << digitCountAryNum << endl;
       // cout << "               Address DCA Denom: " << digitCountAryDenom << endl;
       // frPtr->checkDCAAddresses();
      
       delete[] uncommonDigitAry;
       uncommonDigitAry = nullptr;
        }
        else
       cout << " No Fraction available!" << endl;
        break;

   case 4:
        cout << " Having fun!" << endl;
        break;
  
   default:
        cout << " Wrong Option!" << endl;
   }
    } while (optionMenu != 4);
    delete frPtr;
    frPtr = nullptr;
}

void displayClassInfoJeremyT() {
    cout << "CIS 25 - C++ Programming "
       "Laney College "
   "Jeremy Tsang "
   " "
   "Assignment Information -- "
   " Assignment Number: Homework 03, "
   "                      Coding Assignment -- Exercise #1 "
   " Written by:         Jeremy Tsang "
   " Submitted Date:     2018/03/15" << endl;
}

void displayMenuInfo() {
    cout << " "
   "************************************* "
   "*              MENU HW #3           * "
   "* (1) Creating/Updating Fraction    * "
   "* (2) Displaying the Fraction       * "
   "* (3) Displaying Uncommon Digit(s) * "
   "* (4) Quit                          * "
   "************************************* "
   "Enter your option (1 through 4): ";
}

int inputNum() {
    int num;
    cout << " Enter an int for numerator: ";
    cin >> num;
    return num;
}

int inputDenom() {
    int denom;
    do {
   cout << "Enter an int for denominator: ";
   cin >> denom;
   if (!denom)
        cout << "Please enter a nonzero value for "
       << "denominator!" << endl;
    } while(!denom);
    return denom;
}

void runUpdateMenu(FractionJeremyT* frPtr) {
    int optionUpdate;
    int num;
    int denom;

    do {
   displayUpdateMenuInfo();
   cin >> optionUpdate;
   cout << endl;

   switch (optionUpdate) {
   case 1:
        num = inputNum();
        frPtr->setNum(num);
        break;

   case 2:
        denom = inputDenom();
        frPtr->setDenom(denom);
        break;

   case 3:
        num = inputNum();
        denom = inputDenom();
        frPtr->setNumAndDenom(num, denom);
        break;

   case 4:
        cout << "Returning to previous menu!" << endl;
        break;

   default:
        cout << "Wrong Option!" << endl;
   }
   if (1 <= optionUpdate && optionUpdate < 4) {
        cout << " After updating, the Fraction "
       << "object has" << endl;
        frPtr->print();
   }
    } while (optionUpdate != 4);
}


void displayUpdateMenuInfo() {
    cout << " "
   << "**************************** "
   << "*       Updating MENU      * "
   << "* (1) Updating num         * "
   << "* (2) Updating denom       * "
   << "* (3) Updating num & denom * "
   << "* (4) Return               * "
   << "**************************** "
   << "Enter your option (1 through 4): ";
}

void displayUncommonDigitInfo(int* uncommonDigitAry,
    int* digitCountAry) {
  
    for (int i = 1; i < *(uncommonDigitAry); i++) {
   if (*(digitCountAry + (*(uncommonDigitAry + i))))
        cout << "      " << (*(uncommonDigitAry + i))
       << " (occured "
       << *(digitCountAry + (*(uncommonDigitAry + i)))
       << " time(s))" << endl;
    }
}


Ex1Fraction.cpp


#include <iostream>
#include "Ex1Fraction.h"
using namespace std;

FractionJeremyT::FractionJeremyT() : num(0), denom(1) {
}

FractionJeremyT::FractionJeremyT(int arg1, int arg2) :
    num(arg1), denom(arg2) {
  
    verifyFraction();

    cout << " A call to Fraction(int, int) was made to build a "
   << "Fraction! "
   << " num : " << getNum() << " "
   << " denom : " << getDenom() << endl;
}

void FractionJeremyT::setNum(int arg) {
    num = arg;
    verifyFraction();
}

int FractionJeremyT::getNum() {
    return num;
}

void FractionJeremyT::setDenom(int arg) {
    denom = arg;
    verifyFraction();
    // add check for 0?
}

int FractionJeremyT::getDenom() {
    return denom;
}

void FractionJeremyT::setNumAndDenom(int arg1, int arg2) {
    num = arg1;
    denom = arg2;
    verifyFraction();
}

int* FractionJeremyT::getDigitCountAryNum() {
    return digitCountAryNum;
}

int* FractionJeremyT::getDigitCountAryDenom() {
    return digitCountAryDenom;
}

void FractionJeremyT::releaseDigitCountArrays() {
    delete[] digitCountAryNum;
    digitCountAryNum = nullptr;
    delete[] digitCountAryDenom;
    digitCountAryDenom = nullptr;
}

// void FractionJeremyT::checkDCAAddresses(void) {
//     cout << "   Address DCA Num (FROM OBJECT): "
//    << digitCountAryNum << endl;
//     cout << " Address DCA Denom (FROM OBJECT): "
//    << digitCountAryDenom << endl;
// }

void FractionJeremyT::print() {
    cout << " The current Fraction object has "
   << " num : " << getNum() << " "
   << " denom : " << getDenom() << endl;
}

void FractionJeremyT::verifyFraction() {
  
    int gcd;

    setSign();

    // compute gcd after denominator has been forced positive
    gcd = getGCD((num < 0) ? -num : num, denom);
  
    // reduce the fraction
    num /= gcd;
    denom /= gcd;
}

void FractionJeremyT::setSign() {
    if (denom < 0) {
        num = -num;
        denom = -denom;
   }
}

int FractionJeremyT::getGCD(int arg1, int arg2) {
    // Assumes arg1 and arg2 are nonnegative integers that are not
    // both zero.
  
    if (arg2 == 0)
   return arg1;
    else
   return getGCD(arg2, arg1 % arg2);
}

int* FractionJeremyT::extractUncommonDigit() {
    int* uncommonDigitAry = nullptr;
    int uncommonDigitCount = 0;
    int j = 1; // start inputing digits into array at index 1
    int digitCountArySize = 10;

    digitCountAryNum = updateDigitCountAry(num,
   digitCountAryNum, digitCountArySize);
  
    digitCountAryDenom = updateDigitCountAry(denom,
   digitCountAryDenom, digitCountArySize);
  
    for (int i = 0; i < 10; i++) {
   // use the "!=" as an XOR since the expressions return 0 or 1
   if (((*(digitCountAryNum + i) == 0)
       != ((*(digitCountAryDenom + i)) == 0)))
        uncommonDigitCount++;
    }
  
    uncommonDigitAry = new int[uncommonDigitCount + 1]
   {uncommonDigitCount + 1};
  
    for (int i = 0; i < 10; i++) {
   if (((*(digitCountAryNum + i) == 0)
       != ((*(digitCountAryDenom + i)) == 0)))
        *(uncommonDigitAry + (j++)) = i;
    }
  
    return uncommonDigitAry;
}

int* FractionJeremyT::updateDigitCountAry(int arg, int* digitCountAry,
    int size) {
  
    int tmp = (arg < 0) ? -arg : arg;

    if (!digitCountAry)
   digitCountAry = new int[size] {0};

    for (int i = 0; i < size; i++)
       *(digitCountAry + i) = 0;
  
    do {
   (*(digitCountAry + (tmp % 10)))++;
   tmp /= 10;
    } while (tmp != 0);

    return digitCountAry;
}

Ex1Fraction.h

#ifndef EX1FRACTION_H
#define EX1FRACTION_H

class FractionJeremyT {
public:
    FractionJeremyT();
    FractionJeremyT(int, int);

    void setNum(int);
    int getNum(void);
    void setDenom(int);
    int getDenom(void);
    void setNumAndDenom(int, int);
    int* getDigitCountAryNum(void);
    int* getDigitCountAryDenom(void);
    void print(void);
    int* extractUncommonDigit(void);
    void releaseDigitCountArrays(void);
    void checkDCAAddresses(void);


private:
    int num;
    int denom;
    int* digitCountAryNum = nullptr;
    int* digitCountAryDenom = nullptr;
    void verifyFraction(void);
    void setSign(void);
    int getGCD(int, int);
    int* updateDigitCountAry(int, int*, int);
};

#endif