# Hilfe zur Do while schleife...



## vin030 (16. Nov 2016)

Dies ist meine Aufgabe zum lösen: Erstellen Sie ein Programm Umrechnung im Paket praktikum4, welches mit einem selbst zu  erstellenden Algorithmus die Umrechnung einer positiven Dezimalzahl (int) in ein Zahlensystem mit einer Basis (int) zwischen 2 und 16 durchführt. Für Stellenwerte größer 9 sind  Buchstaben (A, B, C,…) zu verwenden. Die Stellenwerte sind in einer String – Konstanten zu  hinterlegen. Prüfen Sie bei der Eingabe die Dezimalzahl und die Basis und beenden Sie bei  Verletzung der Anforderungen das Programm mit einer entsprechenden Fehlermeldung.

Meine Frage nun ich soll einen Algorithmus schreiben welcher die Zahlensystem zwischeb 2 und 16 umwandeln kann richtig ?
soweit so gut dies wollte ich mit einer do while schleife tun, da die Zahl auch noch positiv sein soll wollte ich nach der do while schleife ein break setzen vorausgesetzt (x<0) dann soll in die Zeile zurückgesprungen werden in der steht "Bitte geben sie eine beliebige POSÌTIVE Zahl ein:" was passiert ist dass der compiler nun die aussage bei einem Wert unter 0 einfach unendlich lange wiederholt. Ich bitte um hilfe.
liebe grüße Vin.


----------



## Robat (16. Nov 2016)

Hey vin030,

du hast die Aufgabe falsch verstanden (mMn.)

Lt. Aufgabe, sollst ein User eine beliebige positive Zahl eingeben können und diese dann in einem Zahlensystem mit der Basis 2 - 16 ausgeben. Das bedeutet, du baust einen Rechner der Zahlen in andere Zahlensysteme umrechnet.

Wenn du nicht weißt wie das funktioniert, dann hier eine schöne Seite. http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm .. dort kannst du jede Zahl in jedes Zahlensystem umrechnen lassen. 
Du sollst vom Dezimalsystem in jedes andere Zahlensystem umrechnen lassen. Dort wird dir auch erklärt wie man das macht.

Tipp: Der Algo ist immer der selbe. Du teilst die Zahl solange durch die Basis und merkst dir den Rest, bis der Quotient 0 ist. (wenn der Rest > 9 < 15 ist, dann nimmt man die Buchstaben A-F.. also 10=A, 11=B, 12=C, 13=D, 14=E, 15=F).

Gruß
Robert


----------



## vin030 (16. Nov 2016)

@Robat erstmal danke für die schnelle Antwort und hilfe, ich weiß wie ich die Zahlen umrechene wie ich es für das Binärsystem umsetzen würde wäre x/2= Y
X%2= R
When(Y>0) do y/2 = y und 
Y%2= R.
Ich hoffe der Ansatz dessen ist richtig .
Mein Problem ist aber wenn die Zahl die als Integer eingegeben wird eine negative ist soll halt das ganze so ausgeführt werden dass man zurück zur Eingabe verwiesen wird mit Aufforderung jetzt doch bitte eine positive zahl einzugeben.

Btw Sorry falls ich wie ein Noob wirke lol der prof hält die Vorlesungen immer erst nach den Aufgaben...


----------



## VfL_Freak (16. Nov 2016)

tja, wenn Du den Code posten würdest, hätte man vielleicht auch eine Chance, das Ganze nachzuvollziehen ...


----------



## vin030 (16. Nov 2016)

@VfL_Freak wird gleich gemacht


----------



## Robat (16. Nov 2016)

Du willst also eine Schleife einbauen, die solange den Text ausgibt, bis eine positive Zahl eingegeben wurde?

Das geht so:


```
public static void main(String args[])
{
     Scanner s = new Scanner(System.in);
     int input = 0;
   
     while(input<= 0)
     {
          System.out.print("Bitte eine positive Zahl eingeben: ");
          input = Integer.parseInt(s.nextLine());  
     }
}
```


----------



## Robat (16. Nov 2016)

vin030 hat gesagt.:


> X%2= R
> When(Y>0) do y/2 = y und
> Y%2= R.
> Ich hoffe der Ansatz dessen ist richtig .



Der Ansatz stimmt.. ums mal in Java auszudrücken:

```
int number = 5;
        String convertedNumber = "";
       
        StringBuilder b = new StringBuilder(convertedNumber);
       
        while(number != 0)
        {
            b.append(String.valueOf(number%2));
            number /= 2;
        }
       
        System.out.println(b.reverse().toString());
```

Das ganze musst du jetzt noch mit der o.g. while verknüpfen und eben für alle Zahlensysteme machen. (von 2 - 16). Wie gesagt als kleiner Tipp: Du teilst ja immer nur die Basis.. bei den Zahlensystemen wo es > 9 sein kann musst du eben mit der replace() Methode die Zahlen durch A-F ersetzten.


----------



## vin030 (16. Nov 2016)

@Robat Genau dass mit den Strings ist für mich alles nachvollziehbar danke ! Ich hatte Probleme das umzusetzen.
Wäre es eigentlich möglich via Array alle Systeme anzugeben dass man sich ein gewünschtes halt aussucht über dieses Feld ?


----------



## vin030 (16. Nov 2016)

Leider hab ich den Code nicht mehr aber ich hab mir ne Vorlage via PaP Designer gemacht so einen Ablaufplan halt


----------



## Robat (16. Nov 2016)

Du könntest alle Basen in einem int[] Array ablegen, das Array durchlaufen, prüfen ob das Array an der Stelle i deiner eingegebenen Basis entsprechicht und dann über eine eigene Methode die Zahl und die Basis übergeben.
Dann teilst du deine Zahl eben nicht durch 2 sondern durch die mitgelieferte / übergebene Basis:


```
public static void main(String[] args)
{
     int[] baseArray = { 2, 3, 4, 5,..,16 };
 
     for(int i =0; i < baseArray.length; i++)
    { 
         if(baseArray[i] == inputBase) convert(num, baseArray[i]);
    }

}

public String convert(int num, int base)
{
         String convertedNumber ="";
    
        StringBuilder b =new StringBuilder(convertedNumber);
 
      // dann sieht das hier halt so aus:
     while(number != 0)
     {
           b.append(String.valueOf(num%base));
          num /= base;
     }

    return b.reverse(;
}
```

Wobei es nicht ganz so einafch ist.. mit Base 16 bswp hast du ja noch A-F drinne, da musst du dann einfach mit replace die Zahlen ersetzten


----------



## vin030 (16. Nov 2016)

@Robat Das war halt mein Gedanke bin mir nur nicht so sicher gewesen ob das mit dem Array sinnvoll wäre aber wenn man sich die Basis auswählt wäre es im Grunde genommen einfacher und das ganze über ein array.
Gut danke nochmals


----------



## vin030 (18. Nov 2016)

```
package praktikum4;

import util.IO;

public class StringSpilt {

    void execute(){
   
    System.out.println("Programm zur Umrechnung von Zahlensystem (Basen von 2-16)");
    System.out.println("Bitte geben Sie die gewschte Base an:");
    int ziffer = IO.readInt("");
    System.out.println("jetzt nur noch eine positive Zahl angeben die Sie konvertieren m鐼hten");
    int base = IO.readInt("");
   
   
    int [] baseArray = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; {for(
    int i = 0;i<baseArray.length;i++)
    {
        if (baseArray[i] == base)
            convert (ziffer, baseArray[i]);
    }
    }

public String convert (int ziffer, int base){
    String convertedNumber = "";
    StringBuilder b = new StringBuilder (convertedNumber);
   
    while (ziffer != 0)
    {
        b.append(String.valueOf(num%base));
        num/=base;
    }
   
    return b.reverse ( ;
    }

    public static void main(String[] args) {
        StringSpilt prg = new StringSpilt();
        prg.execute();
    }

       
    }

    private void convert(int ziffer, int i) {
        // TODO Auto-generated method stub
       
    }
}
```


Was hab ich falsch gemacht ?._.


----------



## VfL_Freak (18. Nov 2016)

vin030 hat gesagt.:


> Was hab ich falsch gemacht ?


was genau meinst Du ??


----------



## vin030 (18. Nov 2016)

Naja es lässt sich nicht kompilieren


----------



## VfL_Freak (18. Nov 2016)

und was heißt das?? Welche Fehler kommen denn ??? 

Muss man Dir jede Einzelheit aus der Nase ziehen ??


----------



## vin030 (18. Nov 2016)

Haha wie gesagt ich bin ein Noob 
Also die Variablen wurden zugeordnet return muss ich noch vervollständigen aber irgendetwas fehlt noch


----------



## VfL_Freak (18. Nov 2016)

vin030 hat gesagt.:


> Haha wie gesagt ich bin ein Noob
> Also die Variablen wurden zugeordnet return muss ich noch vervollständigen aber irgendetwas fehlt noch


http://www.java-forum.org/forum-faq-beitraege/7407-man-fragen-richtig-stellt.html


----------



## vin030 (18. Nov 2016)

@VfL_Freak ok danke


----------



## Joose (18. Nov 2016)

Ich habe deinen Code halbwegs korrekt eingerückt:

```
package praktikum4;

import util.IO;

public class StringSpilt {

   void execute() {
     System.out.println("Programm zur Umrechnung von Zahlensystem (Basen von 2-16)");
     System.out.println("Bitte geben Sie die gew?schte Base an:");
     int ziffer = IO.readInt("");
     System.out.println("jetzt nur noch eine positive Zahl angeben die Sie konvertieren m?hten");
     int base = IO.readInt("");


     int [] baseArray = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; {for(
     int i = 0;i<baseArray.length;i++)
     {
       if (baseArray[i] == base)
         convert (ziffer, baseArray[i]);
     }
     }

     public String convert (int ziffer, int base) {
       String convertedNumber = "";
       StringBuilder b = new StringBuilder (convertedNumber);

       while (ziffer != 0)
       {
         b.append(String.valueOf(num%base));
         num/=base;
       }

       return b.reverse ( ;
     }

     public static void main(String[] args) {
       StringSpilt prg = new StringSpilt();
       prg.execute();
     }
   }

   private void convert(int ziffer, int i) {
     // TODO Auto-generated method stub
   }
}
```

Dadurch sollte dir schon das erste Problem ersichtlich werden: Methoden dürfen nur innerhalb einer Klasse deklariert werden, aber nicht innerhalb einer anderen Methode.
Zwar kein Fehler aber eine sehr eigenartige Schreibweise: Der Kopf deiner for-Schleife ist irgendwie aufgeteilt. Auch kein Fehler, aber fehler anfällig: Auch wenn du das if ohne {}-Klammern schreiben kannst (weil der Compiler es erlaubt), gewöhne dir an sie trotzdem zu schreiben.

EDIT: Desweiteren beachte in Zukunft wenn du eine Frage stellst und Code postest, dass du auch die Fehler welche der Compiler wirft oder die Exception die vom Programm geworfen werden hier zu posten. Wir wollen nicht erst raten müssen wo was für ein Problem vorliegt.


----------

