javaclass-hierarchyacm-java-libraries

Why is my output not as expected? Java ACM


For the following program I am expecting output as:

5 * 2^3 = 40

But the output is:

40 * 2^0 = 40

First I build a class "HandyInt":

/**
* An integer that provides arithmetic operations for great glory.
*/
public class HandyInt {

/** The integer represented by an instance of this class. */
private int theInt;

/**
 * Constructs a new handy integer representing the given int.
 * 
 * @param theInt
 *            the integer to be represented by this instance.
 */
public HandyInt(int theInt) {
    this.theInt = theInt;
}

/**
 * Constructs a new handy integer representing the integer represented by
 * the given handy integer.
 * 
 * @param handyInt
 *            the handy integer to intialize the new object with.
 */
public HandyInt(HandyInt handyInt) {
    this.theInt = handyInt.theInt;
}

/**
 * Returns the integer represented by this instance.
 * 
 * @return the represented integer.
 */
public int getInt() {
    return theInt;
}

/**
 * Returns a handy integer that represents the sum of this and the other
 * handy integer.
 * 
 * @param other
 *            the handy integer to add.
 * @return sum of the two handy integers.
 */
public HandyInt add(HandyInt other) {
    theInt += other.theInt;
    return this;
}

/**
 * Returns a handy integer that represents the result of subtracting the
 * other integer from this one.
 * 
 * @param other
 *            the handy integer to subtract from this one.
 * @return difference of the two handy integers.
 */
public HandyInt sub(HandyInt other) {
    theInt -= other.theInt;
    return this;
}

@Override
public String toString() {
    return Integer.toString(theInt);
 }
}

And when I build a public run code, that build on my class "HandyInt":

import acm.program.ConsoleProgram;

public class ComplexMathSolver extends ConsoleProgram {
@Override
public void run() {
    HandyInt factor = new HandyInt(5);
    HandyInt exp = new HandyInt(3);

    HandyInt result = multiplyWithPowerOfTwo(factor, exp);

    println(factor + " * 2^" + exp + " = " + result);
}

/**
 * Returns the result of multiplying {@code factor} with 2 to the power of
 * {@code exp}.
 * 
 * @param factor
 *            the handy integer to multiply with the power.
 * @param exp
 *            the exponent of the power.
 * @return the result of the multiplication.
 */
private HandyInt multiplyWithPowerOfTwo(HandyInt factor, HandyInt exp) {
    HandyInt one = new HandyInt(1);

    while (exp.getInt() > 0) {
        factor = factor.add(factor);
        exp = exp.sub(one);
    }

    return factor;
 }   
}

What is wrong in my class "HandyInt" to fix the output? Thank you!


Solution

  • Objects are mutating, because when you called multiplyWithPowerOfTwo() method you changed the internals of the objects factor and exp. Also, your result is pointing to the same object as factor.