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!
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
.