# Zahl in Ziffern zerlegen



## Jo.Mo. (28. Nov 2010)

...ich sitze gerade an einer Aufgabe, bei der man 2 Methoden schreiben soll, die dann in einer Klasse getestet werden sollen. Eine Methode habe ich bereits fertig, nur an der anderen haperts. Hier das Problem:

Die Methode soll eine natürliche Zahl testen (also nehme ich mal int als optimal hin) ob alle ihre Ziffern gleich 1 sind. Übergabe dieser Zahl erfolgt als Parameter und rückgabe als boolean, also true/false.


Daneben stellt sich mir noch die Frage (da auch die andere Methode ihren Wert als Parameter übergeben bekommen soll) wie ich da bei Programmstart eine Methodenauswahl realisiere.

Hier mal die 2 Methode und den Rahmen (unfertig, wie erwähnt):

```
public class SimpleMethoden {


    // Befehle

    public class nurEinsen() {



    }

    public class flaecheNachUmfang(double flaeche) {

        double r, u;
        r = Math.sqrt(flaeche / Math.PI);
        u = 2 * Math.PI * r;
        return u;
    }


    public static void main (String args[]){
    
      int zahl;
      double flaeche;
      System.out.println("Eingabe der Kreisfläche: ");
      flaeche = in.nextDouble();

      if (flaeche <= 0){
        	System.out.println("Berechnung nicht moeglich, bitte einen Wert > Null eingeben !");
      else

      }
    }  
}
```

...der main Teil ist natürlich so nicht richtig, ich hatte die Wertübergabe als Parameter überlesen...


----------



## eRaaaa (28. Nov 2010)

Gibt mehrere Möglichkeiten !

- mathematisch %10 & / 10
- in einen String umwandeln und mit charAt prüfen
- Regex
- .....

deine Methodensignatur stimmt auch noch nicht!


----------



## Jo.Mo. (28. Nov 2010)

...ja, das erste finde ich zuviel Gewurschtel, auch wenn das mittels String nicht viel kürzer ist, sitz ich da grad dran, poste es dann gleich mal...


----------



## Jo.Mo. (28. Nov 2010)

...so, die Richtung müsste doch stimmen, jetzt überleg ich gerad wie ich möglichst einfach alle Ziffern gegen 1 vergleiche... (so wie es ist gehts ja leider nicht...)


```
public class SimpleMethoden {


    // Befehle

    public boolean nurEinsen(int zahl) {
          
        int i;
        int j = 0;
        string str = Integer.toString (i);
        int [] ia = new int [str.length()];
        for (char c : str.toCharArray()){
        	ia [j++] = Character.getNumericValue (c);
        }   
        if (c == 1){
           	return true;
        }	
        else{
        	return false;
        }

    }

    public double flaecheNachUmfang(double flaeche) {

        double r, u;
        r = Math.sqrt(flaeche / Math.PI);
        u = 2 * Math.PI * r;
        return u;
    }


    public static void main (String args[]){

      int zahl;
      double flaeche;
      System.out.println("Eingabe der Kreisfläche: ");
      flaeche = in.nextDouble();

      if (flaeche <= 0){
        	System.out.println("Berechnung nicht moeglich, bitte einen Wert > Null eingeben !");
      else

      }
    }
}
```

...achso, was ist denn bei der Sig falsch...?


----------



## eRaaaa (28. Nov 2010)

Naja, Eigeninitiative war ja da (und steht eh schon tausendfach hier im Forum) 


```
public boolean allOnes(int i) {
		while (i != 0) {
			if (i % 10 != 1) {
				return false;
			}
			i /= 10;
		}
		return true;
	}

	public boolean allOnes2(int i) {
		String s = String.valueOf(i);
		for (int j = 0; j < s.length(); j++) {
			if (s.charAt(j) != '1') {
				return false;
			}
		}
		return true;
	}

	public boolean allOnes3(int i) {
		return String.valueOf(i).matches("1+");
	}
```

suche dir ne` Variante aus 

Finde eig. nicht dass das Erste viel "Gewurschtel" ist, jedenfalls ist es weniger als bei dir *g* Verstehe nicht was das int-Array, Integer.toString und char-Array da sollen. Nur char-Array, drüber iterieren und gucken obs '1' ist sollte doch genügen(wäre dann ca. das was ich bei Nr.2 gemacht habe)



> ...achso, was ist denn bei der Sig falsch...?



jetzt nichts mehr :toll: (hatte mich oben verguckt! Du hattest ja noch gar keine Methode deklariert ;>)


----------



## Jo.Mo. (28. Nov 2010)

...danke, bin jetzt nochmal drübergegangen, jetzt brauch ich nur noch einen Tip wie ich das mit der Parameterübergabe bewerkstellige - es geht da mehr um eine Verständnissache, da für beide Aufgaben der Wert als Parameter übergeben werden soll - vermutlich soll gar keine Auswahl zw. den Methoden erfolgen, sondern beide für den jew. Parameter durchlaufen werden.Problem ist nur, das eine Aufgabe double verwendet, die andere Integer - mir fällt jetzt nur eine, den Parameter in der jew. Methode jeweils in den jew. Datentyp umzuwandeln, aber ob das so babsichtigt ist...  

Bei der Kreisflächenberechnung soll der Rückgabewert Auskunft darüber geben, ob die Berechnung erfolgreich war - da habe ich jetzt einfach eine Schleife eingebaut (für neg. Werte liefert er die Entsprechende aussage, - ist das so O.K.?


```
public class SimpleMethoden {


    // Befehle
    public boolean nurEinsen(args[]) {

        String s = String.valueOf(args[]);
        for (int j = 0; j < s.length(); j++) {
            if (s.charAt(j) != '1') {
                return false;
            }
        }
        return true;
    }


    public double flaecheNachUmfang(args[]) {

        double flaeche;
        flaeche = Double.parseDouble(args[]);
        if (flaeche >= 0){
            double r, u;
            r = Math.sqrt(flaeche / Math.PI);
            u = 2 * Math.PI * r;
            return u;
        }
        else {
        	System.out.println("Negativert Wert, keine berechnung möglich");
        }
    }


    public static void main (String args[]){

      //int zahl;
      //double flaeche;

      //flaeche = in.nextDouble();

      System.out.println("Die Kreisfläche betraegt:");
      System.out.println(" " +u+ "Laengeneinheiten.");

      //for (flaeche <= 0){
        	System.out.println("Berechnung nicht moeglich, bitte einen Wert > Null eingeben !");

      //}

    }

}
```

...irgendwo hängts noch, er erzählt mir bei beiden Methoden was von <identifier> expected und .class expected bei der Parameterübergabe, was habe ich denn da schon wieder vergessen...?


----------



## eRaaaa (28. Nov 2010)

Jo.Mo. hat gesagt.:


> ...irgendwo hängts noch, er erzählt mir bei beiden Methoden was von <identifier> expected und .class expected bei der Parameterübergabe, was habe ich denn da schon wieder vergessen...?


Hö, was haste denn da jetzt gemacht? Hattest es doch vorher schon richtig ?! Vergleiche 

```
public boolean nurEinsen([B]args[][/B])
```
 mit 
	
	
	
	





```
public boolean nurEinsen([B]int zahl[/B])
```
 ....


----------



## Jo.Mo. (28. Nov 2010)

...ja, aber die Werteabfrage soll ja nicht im Programm erfolgen (was auch zu schön und einfach wäre, da hätte ich es dann ja so lassen können) sondern per Parameterübergabe, also dachte ich das ich jew. gleich die enstprechenden parameter übergebe, also args.

Ich habe jetzt folgendes geändert:


```
String s = String.valueOf(args[0]);
flaeche = Double.parseDouble(args[0]);
```

...dadurch fällt zumindest mal der Fehler .class expected weg. Für


```
public boolean nurEinsen(args[]) {
public double flaecheNachUmfang(args[]) {
```

liefert es aber aber immer noch <identifier> expected - nur, ich weiss nicht was da nicht passt... ;(


----------



## eRaaaa (28. Nov 2010)

Jo.Mo. hat gesagt.:


> nur, ich weiss nicht was da nicht passt... ;(



dein Parameter  Da fehlt z.B. der Datentyp -> String ! Nur dann müsstest du eben ein String-Array übergeben, ich verstehe noch immer nicht wieso du das willst / wo jetzt genau dein Problem liegt?!


----------



## Jo.Mo. (28. Nov 2010)

...vielleicht bin ich zu doof das zu umschreiben, ich poste mal den Aufgabentext:



> Schreiben Sie eine Klasse SimpleMethoden und implementieren Sie die folgenden statischen
> Methoden:
> • Eine Methode nurEinsen, die von einer natürlichen Zahl bestimmt, ob alle ihre Ziffern gleich 1
> sind. Die natürliche Zahl wird als Parameter übergeben. Der Rückgabewert soll den booleschen
> ...



...die Methoden sollten ja so passen, nur so wie ich das verstehe, haue ich bei methodenaufruf einfach einen Parameter rein (der einfachheit halber sag ich mal "5"), und der wird bei beiden Methoden eingesetzt. Je nachdem was man einsetzt bekommt man dann eine Ausgabe True oder false (ich kann in der Aufgabenstellung nirgendwo erkennen das das Ergebnis für die andere Methode eine Rolle spielt) sowie für die andere Methode Berechnung oder Rückgabe eines Default-wertes (ich nehme der einfachheit halber 1).

So siehts jetzt aus, und ich bin irgendwie mit meinem Latein am Ende... ;(


```
public class SimpleMethoden {


    // Befehle
    public boolean nurEinsen(args[]) {

        String s = String.valueOf(args[0]); //Umwandlung Parameter in String
        for (int j = 0; j < s.length(); j++) {
            if (s.charAt(j) != '1') { //pruefen des jew. char ob nicht 1
                return false;
            }
        }
        return true;
    }


    public double flaecheNachUmfang(args[]) {

        double flaeche;
        flaeche = Double.parseDouble(args[0]); //Umwandlung des Parameters in Double
        if (flaeche >= 0){
            double r, u;
            r = Math.sqrt(flaeche / Math.PI); //Berechnung Radius
            u = 2 * Math.PI * r;              //Berechnung Kreisumfang
            return u;
        }
        else {
        	return 1; //Rueckgabe eines default-Wertes, hier 1
        	System.out.println("Negativert Wert, keine berechnung möglich");
        }
    }


    public static void main (String args[]) {


      if(args.length>0){ //pruefen ob Parameter groesser 0
      //int zahl;
      //double flaeche;

      //flaeche = in.nextDouble();

      System.out.println("Die Kreisfläche betraegt:");
      System.out.println(" " +u+ "Laengeneinheiten.");
      }

      else {
        	System.out.println("Berechnung nicht moeglich, bitte einen Wert > Null eingeben !");

      }

   }

}
```


----------

