2016-12-08 5 views
1

Für das folgende Programm ich erwarte Ausgabe als:Warum ist meine Ausgabe nicht wie erwartet? Java ACM

5 * 2^3 = 40

Aber der Ausgang ist:

40 * 2^0 = 40

Erste ich baue eine Klasse „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); 
} 
} 

Und wenn ich einen öffentlichen Lauf Code bauen, die bauen auf meiner Klasse „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; 
} 
} 

Was ist falsch in meiner Klasse "HandyInt", um die Ausgabe zu beheben? Vielen Dank!

+1

Ihre Objekte mutieren – GurV

Antwort

1

Objekte mutieren, weil beim Aufruf der Methode die Interna der Objekte factor und exp geändert wurden. Auch Ihre result zeigt auf das gleiche Objekt wie factor.

+0

Danke, ich repariere es in der "HandyInt" Klasse. In der 'add()' und 'sub()' Methode habe ich eine neue HandyInt erstellt: \t \t 'HandyInt sub = new HandyInt (theInt); \t \t sub.theInt - = other.theInt; \t \t zurück sub; ' –

Verwandte Themen