2016-12-08 5 views
1

Pour le programme suivant, je me attends à la sortie comme:Pourquoi ma sortie n'est-elle pas conforme aux attentes? Java ACM

5 * 2^3 = 40

Mais la sortie est:

40 * 2^0 = 40

Première Je construis une classe « 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); 
} 
} 

Et quand je construis un code d'exécution publique, qui se fondent sur ma classe « 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; 
} 
} 

Quel est le problème dans ma classe "HandyInt" pour corriger la sortie? Merci!

+1

vos objets sont en mutation – GurV

Répondre

1

Les objets sont en mutation, car lorsque vous avez appelé la méthode multiplyWithPowerOfTwo(), vous avez modifié les composants internes des objets factor et exp. En outre, votre result pointe vers le même objet que factor.

+0

Merci, je le corrige dans la classe "HandyInt". Dans la méthode 'add()' et 'sub()' j'ai créé un nouveau HandyInt: \t \t 'HandyInt sub = new HandyInt (theInt); \t \t sub.theInt - = autre.l'Int; \t \t return sub; ' –