# Potenz mit Schleife berechnen



## Lestas89 (18. Apr 2016)

Guten Tag!

Ich habe folgende Aufgabe zu lösen (Siehe Bild).

Die Potenzierung mit der Schleife habe ich bereits programmiert:


```
import javax.swing.JOptionPane;
class Potenz{
    public static void main(String []args){
       
        int zahl = 1;
       
        String ersteEingabe = JOptionPane.showInputDialog("Geben Sie die Basis der Potenz ein:");
        int basis = Integer.parseInt(ersteEingabe);
       
        String zweiteEingabe = JOptionPane.showInputDialog("Geben Sie den Exponenten der Potenz ein:");
        int exponent = Integer.parseInt(zweiteEingabe);
   
        if(basis == 0){
        zahl = 0;
        } else {
        zahl = 1;
        }
       
        for(int i = 1; i <= exponent; i++){
        zahl *= basis;
       
        }
        JOptionPane.showMessageDialog(null,"Die Potenz hat den Wert " + zahl);
    }
}
```

Allerdings verstehe ich in der Aufgabenstellung folgende Passage nicht: 
" Führen Sie dieses Einlesen und Rechnen wiederholt solange aus, bis beide
Eingaben gleichzeitig gleich 0 sind. "

Was ist damit gemeint? Ich kann doch nur eine Basis und einen Exponenten eingeben.

Vielen Dank im Voraus!


----------



## Dompteur (18. Apr 2016)

Damit ist gemeint, dass du das Programm beenden sollst, sobald der User sowohl für die Basis als auch für den Exponenten 0 eingegeben hat.


----------



## Lestas89 (18. Apr 2016)

Hallo Dompteur,

danke für deine Antwort!
Hab ich das so richtig programmiert?


```
import javax.swing.JOptionPane;
class Potenz{
    public static void main(String []args){
       
        int zahl = 1;
       
        String ersteEingabe = JOptionPane.showInputDialog("Geben Sie die Basis der Potenz ein:");
        int basis = Integer.parseInt(ersteEingabe);
       
        String zweiteEingabe = JOptionPane.showInputDialog("Geben Sie den Exponenten der Potenz ein:");
        int exponent = Integer.parseInt(zweiteEingabe);
   
        if(basis == 0 && exponent == 0)
        System.exit(0);
       
   
        if(basis == 0){
        zahl = 0;
        } else {
        zahl = 1;
        }
       
        for(int i = 1; i <= exponent; i++){
        zahl *= basis;
       
        }
        JOptionPane.showMessageDialog(null,"Die Potenz hat den Wert " + zahl);
    }
}
```


----------



## Dompteur (18. Apr 2016)

Nicht ganz. Du sollst ja die Berechnung öfters als ein Mal machen. Also brauchst du eine Schleife.
Die Schleife bricht ab, wenn basis und exponent 0 sind.

Außerdem solltest du kein exit aufrufen, sondern die main Methode einfach zu Ende gehen lassen.


----------



## Lestas89 (18. Apr 2016)

Aber ich versteh dann das Ergebnis nicht. Ich kann doch nur eine Basis und einen Exponenten für das Endergebnis einlesen. Was soll mir das Programm denn dann am Ende ausgeben? Mehrere Basen und Exponenten? Da liegt mein Verständnisproblem.


----------



## Dompteur (18. Apr 2016)

Du sollst in einer Schleife folgendes machen:
* Einlesen von Basis und Exponent
* Berechnen
* Ausgabe des Ergebnisses

Das ganze wiederholst du solange bis die Eingabe von Basis und Exponent 0 ist.

Also: Jeder Schleifendurchlauf liest neue Werte ein (-> Benutzereingabe), rechnet und gibt das Ergebnis aus.


----------



## Lestas89 (18. Apr 2016)

Und wenn Basis und Exponent 0 sind soll das Programm beendet werden?
Edit: Ich habs verstanden. Ich mache mich nun dran und poste gleich mein Ergebniss.


----------



## Lestas89 (18. Apr 2016)

So meintest du es, oder?


```
import javax.swing.JOptionPane;
class Potenz{
    public static void main(String []args){
       
        int zahl = 1;
        boolean b = false;
        int basis = 1;
        int exponent = 1;
       
        while(!b){
       
       
        String ersteEingabe = JOptionPane.showInputDialog("Geben Sie die Basis der Potenz ein:");
        basis = Integer.parseInt(ersteEingabe);
       
        String zweiteEingabe = JOptionPane.showInputDialog("Geben Sie den Exponenten der Potenz ein:");
        exponent = Integer.parseInt(zweiteEingabe);
       
        if(basis == 0 && exponent == 0){
        b = true;
        System.exit(0);
        }
   
        if(basis == 0){
            zahl = 0;
        } else {
            zahl = 1;
        }
       
        for(int i = 1; i <= exponent; i++){
        zahl *= basis;
       
        }
        JOptionPane.showMessageDialog(null,"Die Potenz hat den Wert " + zahl);
   
   
   
        }
   
       
    }
}
```


----------



## Dompteur (18. Apr 2016)

Das "exit" gefällt mir immer noch nicht ;-)

Vorschlag:

```
b = basis == 0 && exponent == 0;
         if ( !b ) {
           zahl = basis;
           for(int i = 2; i <= exponent; i++){
             zahl *= basis;
           }
           JOptionPane.showMessageDialog(null,"Die Potenz hat den Wert " + zahl);
         }
```
 
Wobei es dann noch sprechender wird, wenn du die Variable "b" auf "fertig" umbenennst.


----------



## Lestas89 (18. Apr 2016)

Hallo Dompteur.

Wo genau im Code muss ich deins einfügen? Kannst du es mal in meinen Code reinpacken, sodass ich weiß, wo das hingehört?


----------



## Dompteur (18. Apr 2016)

Hey, das schaffst du doch auch allein !
Ich habe deinen Code nur ein klein wenig verändert. Wenn du deinen Code selbst geschrieben hast, dann solltest du auch meinen Code verstehen.


----------



## Lestas89 (18. Apr 2016)

Ich habe meinen Code wirklich selbst geschrieben. Verstehe deinen Code aber wirklich nicht. Was muss ich denn bei mir ersetzen? Und warum läuft deine Schleife erst bei 2 los?


----------



## Dompteur (18. Apr 2016)

Lestas89 hat gesagt.:


> Und warum läuft deine Schleife erst bei 2 los?


Weil ich der Variable "zahl" mit dem Wert von "basis" vorbelege. 
Wenn es dir besser gefällt, kannst du es mit 1 vorbelegen und die Schleife bei 1 beginnen lassen.
Wenn du etwas nicht verstehst, versuche den Ablauf des Programms am Papier nachzuvollziehen.


----------



## Lestas89 (18. Apr 2016)

Ich frage mal anders, vllt versteh ich es dann und weiß wie ich es verändern muss:

Was ist an deinem Programmausschnitt anders als bei meinem? Wie muss ich das verändern? Ich verstehe nämlich deinen Code nicht.


----------



## Dompteur (18. Apr 2016)

Der Hauptunterschied ist, dass du System.exit aufrufst. Du hast zwar eine Abbruchvariable in der Schleife, diese kommt aber nicht zur Wirkung.

Ich berechne den Wert dieser Variablen direkt. Dabei verwende ich kein if, sondern weise das Ergebnis der Vergleichsoperation der Variablen direkt zu. Aber das ist nur ein kosmetischer Unterschied.
Dann kommt ein if, in dem geprüft wird, ob weitergemacht werden soll. Wenn kein Abbruch gewünscht ist, erfolgt die Berechnung und die Ergebnisausgabe.
Nach dem if bist du am Ende der Schleife. Wenn ein Abbruch gewünscht wird, bist du am Ende der Methode und das Programm endet.


----------



## Lestas89 (18. Apr 2016)

Danke für die Antwort. Aber ich könnte doch mein Programm so lassen, oder? Die Aufgabenstellung wird doch abgedeckt meine ich.


----------



## Dompteur (18. Apr 2016)

Lestas89 hat gesagt.:


> Aber ich könnte doch mein Programm so lassen, oder?


Das hängt von deinem Lehrer ab. 

Dein Programm funktioniert so, wie du es geschrieben hast und erfüllt die Aufgabenstellung.
Allerdings gibt es beim Programmieren bestimmte Konventionen, an die man sich halten sollte. Die werden an einigen Stellen verletzt.


----------



## Lestas89 (18. Apr 2016)

Ich weiß nämlich immer noch nicht an welcher Stelle ich deinen Code ersetzen muss.  Aber wenn es so klappt, dann lass ich es mal so  Danke für deine Hilfe


----------

