2017-01-29 3 views
0

Im Folgenden finden Sie die Lösung und Ausgabe des Thema-Puzzles, und ich habe Probleme zu verstehen, wie es funktioniert.Head First Java Puzzle4 (Kapitel 4, S. 91) Erläuterung

public class Puzzle4 { 
    public static void main(String[] args) { 

    Puzzle4b[] obs = new Puzzle4b[6]; 
    int y = 1; 
    int x = 0; 
    int result = 0; 

    while (x<6) { 
     obs[x] = new Puzzle4b(); 
     obs[x].ivar = y; 
     y = y*10; 
     x = x+1; 
    } 

    x = 6; 

    while (x>0) { 
     x = x-1; 
     result = result + obs[x].doStuff(x); 
    } 

    System.out.println("result " + result); 
    } 
    } 

    class Puzzle4b { 

    int ivar; 

    public int doStuff(int factor) { 

    if (ivar>100) { 
     return ivar*factor; 
     } else { 
     return ivar*(5-factor); 
    } 
    } 
    } 

Ausgang:

result 543345 

Von meinem Verständnis, die ersten While-Schleife durch 6-mal ausgeführt wird (von x == 0 bis x == 5). Die y-Variable und wiederum 'ivar' wird einen Wert von 1.000.000 haben (ich denke, das ist der Punkt, an dem ich falsch liege, aber ich werde fortfahren in der Hoffnung, korrigiert zu werden).

Die zweite While-Schleife ist ein bisschen verwirrend für mich. Es wird sechs Mal durchlaufen, wobei die zweite Zeile der Schleife die 'x' Werte an die doStuff Methode übergibt, um einen Wert zurückzugeben. Die Zahlen, die ich für das Ergebnis erstelle, stimmen nicht mit dem tatsächlichen Ergebnis überein.

Jede Hilfe hier würde geschätzt werden. Bitte lassen Sie es mich wissen, wenn ich falsch darüber nachdenke. Wenn jemand meinen Code neu formatieren möchte, um ihn besser an Industriestandards auszurichten, wäre es großartig, von Anfang an gute Gewohnheiten zu lernen!

+3

Es würde helfen, wenn Sie das Puzzle zuerst erklärten. – shmosel

+1

Haben Sie den Code in Ihrem Debugger um eine Zeile einzeln durchlaufen? Wenn nicht, ist das der richtige Ort, um zu beginnen. Wenn du dann den genauen Ort identifizierst, an dem es sich nicht so verhält, wie du es erwartest, wenn du noch eine Frage hast, dann bearbeite deinen Beitrag und füge Details hinzu, was du nicht verstehst. –

+0

1. Es ist nur eine Übung, die den Leser bittet, einige Lücken mit Code aus einem Pool von Möglichkeiten zu füllen. Nicht wirklich ein Puzzle. – Boris

Antwort

1

dieses Stück Code `

obs[x].ivar = y; 
     y = y*10; 

es ersten Ivar = y = 1 dann mehrere y so würde verursachen {1 - 10-100 - 1.000 - 10.000 - 100.000}

die zweite Schleife x ist {5, 4, 3, 2, 1, 0} , also wird es wie folgt beginnen: result + obs [5] .doStuff [5];

ich alle Mißverständnis vermuten, dass 1 in Element X wird y in Element gleich 5 und x in Element 2 wird y in Element 4 gleich und so weiter ", weil x wird inkrementiert und y Dekrementieren

es so gehen wie diese

(ivar > 100) 
    ivar * (5-factor) 
    x[3] * y[2] = 1000 * (5-2) = 3000 
    x[4] * y[1] = 10000 * (5-1) = 40000 
    x[5] * y [0] = 100000 * (5-0) = 500000 

then (ivar < 100) 
    ivar * factor 
x[1] * y [5] = 1 * 5 = 5 
x[2] * y [4] = 10 * 4 = 40 
x[3] * y [3] = 100 * 3= 300 

dann, wenn Sie alle Zahlen addieren Sie Ihre Ausgabe für mich

0

haben, würden eine einfache Möglichkeit, diese zu brechen durch verstärkt und zu sehen, wo genau die Werte kommen aus . ICH' Ich habe das unten gemacht und es in den Code kommentiert.

public class Puzzle4 { 
    public static void main(String[] args) { 

    Puzzle4b[] obs = new Puzzle4b[6]; 
    int y = 1; 
    int x = 0; 
    int result = 0; 

    // let's break out of the loops 
    obs[0] = new Puzzle4b(); 
    obs[0].ivar = 1; 
    obs[1] = new Puzzle4b(); 
    obs[1].ivar = 10; 
    obs[2] = new Puzzle4b(); 
    obs[2].ivar = 100; 
    obs[3] = new Puzzle4b(); 
    obs[3].ivar = 1000; 
    obs[4] = new Puzzle4b(); 
    obs[4].ivar = 10000; 
    obs[5] = new Puzzle4b(); 
    obs[5].ivar = 100000; 
    // ivar's = 1, 10, 100, 1000, 10000, 100000 

    result = result + obs[5].doStuff(5); // 0 + (5 * 100000) 
    result = result + obs[4].doStuff(4); // 500000 + (4 * 10000) 
    result = result + obs[3].doStuff(3); // 540000 + (3 * 1000) 
    result = result + obs[2].doStuff(2); // 543000 + ((5 - 2) * 100) 
    result = result + obs[1].doStuff(1); // 543300 + ((5-1) * 10) 
    result = result + obs[0].doStuff(0); // 543340 + ((5-0) * 1) 
    // result = 543345 
    } 

    System.out.println("result " + result); 
    } 
    } 

    class Puzzle4b { 

    int ivar; 

    public int doStuff(int factor) { 

    if (ivar>100) { 
     return ivar*factor; 
     } else { 
     return ivar*(5-factor); 
    } 
    } 
    } 

Ich hoffe, dies hat Ihnen geholfen, das Beispiel zu verstehen.