Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt?

Stamp1t

Mitglied
[CODE lang="java" title="Methode"]package Methoden;

public class Program {

public static void main(String[] args) {

Doit(5);




}
public static void Doit(int number1) {
int x = number1;

int result = (5*x+25);
while(result!= 100) {x=x+5;


}
if(result==100) {System.out.println("herzlichen Glückwunsch,das Ergebnis ist" + " "+ x +"!");}




}

}
[/CODE]
 
Was meinst du denn überhaupt mit "Ergebnis"?
Meinst du damit, dass eben der String "15" auf der Konsole ausgegeben wird?
Dann:
Java:
public class Programm {
  public static void main(String[] args) {
    System.out.println(15);
  }
}
Und wieviel "darf" man denn an dem Code ändern, damit das "Ergebnis" eben "15" ist?
 
Java:
    while(result!= 100) {
       x=x+5;
    }

    if(result==100) {
        System.out.println("herzlichen Glückwunsch,das Ergebnis ist" + " "+ x +"!");
    }

Einfach einmal ein paar Worte zu diesem Code:
a) Die While Schleife wird entweder nie ausgeführt (result ist bereits 100) oder es wird eine Endlosschleife, denn Du veränderst result ja in der Schleife nicht. Daher ist die schleife so wie Du diese da geschrieben hast relativ sinnlos.
b) die if Abfrage nach der while Schleife ist unnötig. Denn nach der While Schleife muss result ja 100 sein, denn sonst wäre die Schleife ja nie verlassen worden.

Erster Punkt ist ein fataler Punkt und wäre aus meiner Sicht als Fehler zu werten. Zweiter Punkt ist von mir aus eine Frage der Schönheit....
 

Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt?​

int result = (5*x+25);
result auf Deutsch Ergebnis. --> x = -2 --> result = 15
Du hast wahrscheinlich gemeint: Welcher Parameter erfüllt die Bedingung, dass es zur obigen Ausgabe kommt?
Aus Sicht des Benutzer ist es, dann aber etwas seltsam wenn man, nach der Eingabe von 15 als Feedback.
"herzlichen Glückwunsch,das Ergebnis ist 15 !" bekommt.
 
Java:
    while(result!= 100) {
       x=x+5;
    }

    if(result==100) {
        System.out.println("herzlichen Glückwunsch,das Ergebnis ist" + " "+ x +"!");
    }

Einfach einmal ein paar Worte zu diesem Code:
a) Die While Schleife wird entweder nie ausgeführt (result ist bereits 100) oder es wird eine Endlosschleife, denn Du veränderst result ja in der Schleife nicht. Daher ist die schleife so wie Du diese da geschrieben hast relativ sinnlos.
b) die if Abfrage nach der while Schleife ist unnötig. Denn nach der While Schleife muss result ja 100 sein, denn sonst wäre die Schleife ja nie verlassen worden.

Erster Punkt ist ein fataler Punkt und wäre aus meiner Sicht als Fehler zu werten. Zweiter Punkt ist von mir aus eine Frage der Schönheit....
Ich bin wirklich ein kompletter Neuling deshalb danke für die Erklärung! Meine Gedanken dabei waren, dass solange result nicht 100 ist, bei x 5 hinzugefügt werden. Irgendwann ist x dann 15, sodass result 100 ist. Dann, dachte ich zumindest, sollte ja die While Schleife ja unterbrochen werden und es müsste ausgegeben werden, dass x 15 ist. Wieso ist das nicht so?
 
Wieso sollt result dann 100 sein? Der Code Zeile 1-3 aus dem Zitat sagt:
Solange result nicht 100 ist: Addiere 5 zu x drauf. Mehr nicht.

Wenn dann muss die Zeile
Java:
result = (5*x+25);
auch in die Schleife - die wird ja vor der Schleife nur 1x ausgeführt. Danach nie wieder.
 
@Stamp1t vielleicht verrätst du uns erstmal, was um alles in der Welt du denn überhaupt machen/erreichen willst.
Also: Was ist denn überhaupt das Ziel des ganzen?
Das Ziel ist ja anscheinend nicht, dass "am Ende" 15 "herauskommt" (das kann man ja wie gesagt auch sehr viel einfacher erreichen).
Du willst ja anscheinend irgendwas mit Schleifen machen. Was denn? Und warum?
 
Wieso sollt result dann 100 sein? Der Code Zeile 1-3 aus dem Zitat sagt:
Solange result nicht 100 ist: Addiere 5 zu x drauf. Mehr nicht.

Wenn dann muss die Zeile
Java:
result = (5*x+25);
auch in die Schleife - die wird ja vor der Schleife nur 1x ausgeführt. Danach nie wieder.
Ich habe mir das so vorgestellt, dass man am Anfang, wie im Beispiel, 5 in Doit einfügt, dann wird die Rechnung durchgeführt und das Ergebnis ist ungleich 100, also wird zu x 5 zugefügt, dann wird wieder durchgerechnet, das Ergebnis ist immer noch nicht 100, also wird nochmal 5 zugefügt (Jetzt ist x 15) und result ist 100. Jetzt wird die schleife verlassen und es müsste x=15ausgegeben werden.
 
@Stamp1t vielleicht verrätst du uns erstmal, was um alles in der Welt du denn überhaupt machen/erreichen willst.
Also: Was ist denn überhaupt das Ziel des ganzen?
Das Ziel ist ja anscheinend nicht, dass "am Ende" 15 "herauskommt" (das kann man ja wie gesagt auch sehr viel einfacher erreichen).
Du willst ja anscheinend irgendwas mit Schleifen machen. Was denn? Und warum?
Ich wollte einfach ein bisschen rumprobieren und üben. Ich habe mir das so vorgestellt, dass man am Anfang, wie im Beispiel, 5 in Doit einfügt, dann wird die Rechnung durchgeführt und das Ergebnis ist ungleich 100, also wird zu x 5 zugefügt, dann wird wieder durchgerechnet, das Ergebnis ist immer noch nicht 100, also wird nochmal 5 zugefügt (Jetzt ist x 15) und result ist 100. Jetzt wird die schleife verlassen und es müsste x=15ausgegeben werden
 
Ich habe mir das so vorgestellt, dass man am Anfang, wie im Beispiel, 5 in Doit einfügt, dann wird die Rechnung durchgeführt und das Ergebnis ist ungleich 100, also wird zu x 5 zugefügt, dann wird wieder durchgerechnet, das Ergebnis ist immer noch nicht 100, also wird nochmal 5 zugefügt (Jetzt ist x 15) und result ist 100. Jetzt wird die schleife verlassen und es müsste x=15ausgegeben werden.
Ja, dazu muss, wie @LimDul bereits geschrieben hat, das result in der Schleife aber neu berechnet werden.
 
Wieso sollt result dann 100 sein? Der Code Zeile 1-3 aus dem Zitat sagt:
Solange result nicht 100 ist: Addiere 5 zu x drauf. Mehr nicht.

Wenn dann muss die Zeile
Java:
result = (5*x+25);
auch in die Schleife - die wird ja vor der Schleife nur 1x ausgeführt. Danach nie wieder.
Danke! Das wars, was gefehlt hat.
Ich will mit diesem Program ja beliebige Gleichungen lösen. Wenn ich jetzt also auch Ergebnise mit Kommazahlen möchte, muss ich doch float oder double verwenden, oder? Das habe ich hier getan, und komischerweise kommt als Ergebnis 95.0 raus, obwohl es 47.5 sein müsste. Was muss ich änder? Danke schonmal 🙂


[CODE lang="java" title="Gleichung"]package Methoden;

public class Program {

public static void main(String[] args) {

Doit(1);




}
public static void Doit(double number1) {
double x = number1;

double result = (10*x+25);
while(result!=500) {x++; result = (5*x+25);}


if(result == 500)
{System.out.println("herzlichen Glückwunsch,das Ergebnis ist" + " "+ x +"!");}





}


}[/CODE]
 
Ja, dazu muss, wie @LimDul bereits geschrieben hat, das result in der Schleife aber neu berechnet werden.
Danke! Das wars, was gefehlt hat.
Ich will mit diesem Program ja beliebige Gleichungen lösen. Wenn ich jetzt also auch Ergebnise mit Kommazahlen möchte, muss ich doch float oder double verwenden, oder? Das habe ich hier getan, und komischerweise kommt als Ergebnis 95.0 raus, obwohl es 47.5 sein müsste. Was muss ich änder? Danke schonmal 🙂

[CODE lang="java" title="."]package Methoden;

public class Program {

public static void main(String[] args) {

Doit(1);




}
public static void Doit(double number1) {
double x = number1;

double result = (10*x+25);
while(result!=500) {x++; result = (5*x+25);}


if(result == 500)
{System.out.println("herzlichen Glückwunsch,das Ergebnis ist" + " "+ x +"!");}





}


}[/CODE]
 
Das habe ich hier getan, und komischerweise kommt als Ergebnis 95.0 raus, obwohl es 47.5 sein müsste. Was muss ich änder?
Wie kommst Du auf die Idee, dass es 47,5 sein müsste?

a) x wird immer um 1 erhöht. Damit kann eine 47,5 gar nicht raus kommen.
b) 500 = 5 *x + 25 ==> x = (500 - 25) / 5 = 95
 
Wie kommst Du auf die Idee, dass es 47,5 sein müsste?

a) x wird immer um 1 erhöht. Damit kann eine 47,5 gar nicht raus kommen.
b) 500 = 5 *x + 25 ==> x = (500 - 25) / 5 = 95
Hast vollkommen Recht, blöd von mir... Bin etwas neben der Kappe :/
Habe jetzt was neues gecoded:
[CODE lang="java" title="."]package Methoden;

public class Program {

public static void main(String[] args) {

Doit(1);




}
public static void Doit(double number1) {
double x = number1;

double result = (10*x);
while(result!=501) {x=x+0.1; result = (10*x);}


if(result == 501)
{System.out.println("herzlichen Glückwunsch,das Ergebnis ist" + " "+ x +"!");}





}


}[/CODE]



Hier müsste ja als Ergebnis kommen x=50,1. Kommt aber nicht :/
 
Ich will mit diesem Program ja beliebige Gleichungen lösen.
Ahh... jetzt kommen wir der Sache näher. 🙂
Dann willst du quasi numerische Nullstellensuche (z.B. Newton-Verfahren) implementieren.
(hint: das Lösen jeder Gleichung mit einer Unbekannten kann als das Finden der Nullstelle einer Funktion angesehen werden, indem man jeden Term auf der linken und rechten Seite des Gleichheitszeichens einfach auf dieselbe Seite bringt (und die andere Seite zu 0 werden lässt) und diese Seite als Funktionsterm ansieht. Jetzt kannst du dich ganz auf das Lösen von Nullstellen beschränken.)

Bei `500 = 5 * x + 25` etwa suchst du die Nullstelle der Funktion `f(x) = 5 * x + 25 - 500`
 
Ahh... jetzt kommen wir der Sache näher. 🙂
Dann willst du quasi numerische Nullstellensuche (z.B. Newton-Verfahren) implementieren.
(hint: das Lösen jeder Gleichung mit einer Unbekannten kann als das Finden der Nullstelle einer Funktion angesehen werden, indem man jeden Term auf der linken und rechten Seite des Gleichheitszeichens einfach auf dieselbe Seite bringt (und die andere Seite zu 0 werden lässt) und diese Seite als Funktionsterm ansieht. Jetzt kannst du dich ganz auf das Lösen von Nullstellen beschränken.)

Bei `500 = 5 * x + 25` etwa suchst du die Nullstelle der Funktion `f(x) = 5 * x + 25 - 500`
Stimmt, du hast recht.. Wie bringe ich das in den Code? Ist wahrscheinlich ziemlich einfach, aber ich habe gestern erst angefangen mit dem Coden. Danke schonmal 🙂
 
Ich denke erst einmal ist etwas "spielen" angesagt um die Grundlagen von Java zu verstehen....

Das erste wichtige ist jetzt, dass man double versteht und die Problematik, dass es bei der Umrechnung vom Dezimalsystem in das Dualsystem zu Ungenauigkeiten kommen kann.

Um das zu verstehen, können wir einfach einmal in der Schleife result ausgeben:
Java:
            System.out.println("result: " + result);

Und dann bekommen wir eine Ausgabe - ich zeige diese einfach mal in den ersten Zeilen:
Java:
result: 11.0
result: 12.000000000000002
result: 13.000000000000004
result: 14.000000000000004
result: 15.000000000000004

Das Problem ist, dass 0,1 im Dezimalsystem nicht so im Dualen System abgebildet werden kann. Statt 0,1 wird da dann ein Wert addiert, der etwas größer ist und dadurch kommt es dann zu der Ungenauigkeit.

Die Problematik verstärkt sich von Schritt zu Schritt, weil immer statt 0,1 ein kleines bisschen mehr addiert wird,

Eine Lösung dabei wäre es, wenn wir dann im Anschluss immer runden. Man könnte z.B. bei Dir auf eine Stelle hinter dem Komma runden und so die Ungenauigkeit immer wieder weiter reduzieren.
https://wiki.byte-welt.net/wiki/Fließkommazahlen_mit_Java_runden zeigt da diverse Möglichkeiten.

Nehmen wir von der Seite:
Java:
   /**
   * Rundet den übergebenen Wert auf die Anzahl der übergebenen Nachkommastellen
   *
   * @param value ist der zu rundende Wert.
   * @param decimalPoints ist die Anzahl der Nachkommastellen, auf die gerundet werden soll.
   */
   private double round(double value, int decimalPoints) {
      double d = Math.pow(10, decimalPoints);
      return Math.round(value * d) / d;
   }
(Die Methode machen wir noch static, denn wir wollen ja keine Instanz erzeugen.)

Das könnten wir nun mit aufnehmen und x immer auf 1 Nachkommastelle runden:
Java:
    public static void Doit(double number1) {
        double x = number1;

        double result = (10 * x);
        while (result != 501) {
            x = round(x + 0.1,1);
            result = (10 * x);
            System.out.println("result: " + result);
        }

        if (result == 501) {
            System.out.println("herzlichen Glückwunsch,das Ergebnis ist" + " " + x + "!");
        }
    }

Das wäre dann jetzt ein korrekterer Umgang mit double.
 
Ach ja - Duale Zahlen könnte man sich ja einmal ansehen um zu sehen, was für werte man da hat:
0.1 ==> 0,5 (2^-1)
0.01 ==> 0,25 (2^-2)
0.001 ==> 0,125 (2^-3)
0.0001 ==> 0.0625 (2^-4)
0.00001 ==> 0,03125 (2^-5)
...
Die interne Darstellung selbst ist noch etwas komplexer, aber mir geht es erst einmal um die reine Verständnisfrage. Die interne Darstellung unterteilt es in eine Form x * 2 ^ y und dabei wird y so gewählt, dass x mit einer 1,.... anfängt, so dass dieses erste Bit nicht gespeichert werden muss ... Aber man erkennt durch diese Aufstellung, dass man bei der Dezimal 0,1 keine einfache Duale Darstellung hat...
 
[CODE lang="java" title="."]

public class Program {

public static void main(String[] args) {

Doit(1);




}
public static void Doit(double number1) {
double x = number1;

double result = (10*x);
while(result!=501) {x=x+0.1; result = (10*x);}


if(result == 501)
{System.out.println("herzlichen Glückwunsch,das Ergebnis ist" + " "+ x +"!");}





}


}[/CODE]
Mal off-topic: Wäre es möglich, hier im Forum dem code-Tag einen Java-Autoformatter zu spendieren? Den meist völlig unformatierten Code mit den zehn Millionen unnötigen Leerzeilen zu lesen, ist manchmal wirklich anstrengend. 🙂 Schreiben Leute wirklich so ihren Code?
"Hmmm... so, jetzt schreibe ich diese Zeile vom Code zuende und danach setze ich einfach erstmal acht Leerzeilen. Ja, so mache ich das."
 
Ach ja - Duale Zahlen könnte man sich ja einmal ansehen um zu sehen, was für werte man da hat:
0.1 ==> 0,5 (2^-1)
0.01 ==> 0,25 (2^-2)
0.001 ==> 0,125 (2^-3)
0.0001 ==> 0.0625 (2^-4)
0.00001 ==> 0,03125 (2^-5)
...
Die interne Darstellung selbst ist noch etwas komplexer, aber mir geht es erst einmal um die reine Verständnisfrage. Die interne Darstellung unterteilt es in eine Form x * 2 ^ y und dabei wird y so gewählt, dass x mit einer 1,.... anfängt, so dass dieses erste Bit nicht gespeichert werden muss ... Aber man erkennt durch diese Aufstellung, dass man bei der Dezimal 0,1 keine einfache Duale Darstellung hat...
Vielen Dank für Ihre ausführliche Antwort und für die Zeit, die Sie sich für mich nehmen 🙂 Ich werde mir das alles nochmal genau anschauen, da ich mit meinem WIssensstand hier noch nicht so viele verstehe.
 

Zurück
Oben