# Methoden



## orangata (27. Nov 2011)

Folgende Aufgabe sollte gelöst werden:
Schreiben Sie eine Java-Klasse Teilbarkeit, die die unter 1. bis 3. genannten Methoden besitzt. Schrei- ben Sie dazu eine Testklasse, in der Sie die in der Klasse Teilbarkeit deklarierten Methoden testet.
1. Methode public static boolean istTeiler(int x, int y) mit zwei ganzzahligen Parame- tern, die als Ergebnis liefert, ob der Wert des ersten Parameters durch den zweiten teilbar ist.
2. Methode public static int teilerVielfachheit(int x,int y) mit zwei ganzzahligen Pa- rametern, die als Ergebnis liefert, wie oft der Wert des erste Parameter durch den zweiten teilbar ist.
3. Methode public static int power(int x, int y) mit zwei ganzzahligen Parametern, die als Ergebnis den Wert des ersten Parameters mit dem zweiten potenziert.

Das geschriebene Programm soll dies wiedergeben; es läuft aber nicht 

```
//Diese Programm beinhaltet eine Klasse mit mehreren Methoden zum Thema Teilbarkeit
public class Teilbarkeit
	{
		public static boolean ist Teiler(int x, int y)	//gibt aus, ob x durch y teilbar ist (ganze Zahl betrachtet)
			{ boolean type;
				if ( x % y==0)			/*Wenn der Rest der Division von x und y 0 betraegt, wird true fuer type definiert.
											Andernfalles gilt type=false*/
					{type = true;}
				else 
					{type = false;}
				return type;
			}
	
		public static int teilerVielfachheit(int x, int y)	//gibt aus wie oft x durch y teilbar ist (ganze Zahl betrachtet)
			{
				int i=0;
				while (x>0)		/*Wenn der Rest der Division von x und y 0 betraegt, wird die Zaehlvariable i
										um 1 erhoeht, solange bis der Rest ungleich 0 ist*/
					{
						while(x%y==0)
						{x= x-y;
						}
						i=i+1;
					}
				return i;
			}
	
		public static int power(int x, int y)		//multipliziert x solange mit sich selbst, bis die Zaehlvariable j=y ist (x^y)
			{
				int j=1;
				while (j<y)
					{
						x=x*x;
					}
				return x;
			}
			
		//Am Ende jeder Methode wird die zugehoerige Variable zurueckgegeben
	}
```

Wo liegen meine Fehler?


----------



## faetzminator (27. Nov 2011)

Wie wärs, wenn du uns die Fehlermeldungen posten würdest  ? Oder zuerst versuchen, diese zu interpretieren.
Was mir gerade auffällt, ohne den Code näher anzuschauen, ist der invalide Methodenname [c]ist Teiler[/c], welcher [c]istTeiler[/c] heissen müsste.


----------



## orangata (27. Nov 2011)

Folgende Meldung erhalte ich :

Teilbarkeit.java:4: ';' expected
		public static boolean ist Teiler(int x, int y)	//gibt aus, ob x durch y teilbar ist (ganze Zahl betrachtet)
		                         ^
Teilbarkeit.java:4: invalid method declaration; return type required
		public static boolean ist Teiler(int x, int y)	//gibt aus, ob x durch y teilbar ist (ganze Zahl betrachtet)
		                          ^
2 errors
speedport_w_723v_typ_arogramme MACINTOSH$


----------



## faetzminator (27. Nov 2011)

Genau der Fehler, welchen ich prophezeite. Erste Fehlermeldung kommt, weil der Compiler wegen dem Space denkt, [c]ist[/c] ist eine statische Variable des Types boolean. Da müsste ein ; oder eine Zuweisung folgen. Die Zweite Fehlermeldung kommt, weil er danach erkannt, dass es eine Methodendeklaration sein soll, aber diese wegen des inkorrekten Spaces nicht interpretieren kann.


----------



## dehlen (27. Nov 2011)

Du machst dir das Leben unnötig schwer 
Anstatt die boolean variable type zu deklarieren geb einfach true oder false zurück.
In der zweiten Methode einfach x/y zurückgeben, denn bei ints ist z.B 12:7 = 1, weil es bei int keine Kommazahlen gibt.
Bei power benutz einfach die Methode Math.pow(x,y).


----------



## orangata (27. Nov 2011)

So , ich habe jetzt "istTeiler" erst einmal verändert.


```
//Diese Programm beinhaltet eine Klasse mit mehreren Methoden zum Thema Teilbarkeit
public class Teilbarkeit
	{
		public static boolean istTeiler(int x, int y)	//gibt aus, ob x durch y teilbar ist (ganze Zahl betrachtet)
			{ boolean type;
				if ( x % y==0)			/*Wenn der Rest der Division von x und y 0 betraegt, wird true fuer type definiert.
											Andernfalles gilt type=false*/
					{type = true;}
				else 
					{type = false;}
				return type;
			}
	
		public static int teilerVielfachheit(int x, int y)	//gibt aus wie oft x durch y teilbar ist (ganze Zahl betrachtet)
			{
				int i=0;
				while (x>0)		/*Wenn der Rest der Division von x und y 0 betraegt, wird die Zaehlvariable i
										um 1 erhoeht, solange bis der Rest ungleich 0 ist*/
					{
						while(x%y==0)
						{x= x-y;
						}
						i=i+1;
					}
				return i;
			}
	
		public static int power(int x, int y)		//multipliziert x solange mit sich selbst, bis die Zaehlvariable j=y ist (x^y)
			{
				int j=1;
				while (j<y)
					{
						x=x*x;
					}
				return x;
			}
			
		//Am Ende jeder Methode wird die zugehoerige Variable zurueckgegeben
	}
```

Aber es läuft nicht, Fehlermeldung lautet: main fehlt.


----------



## dehlen (27. Nov 2011)

Ok also das steht in jedem Lehrbuch auf Seite 1. Google mal bitte danach 

Testweise könnte deine main Methode z.B so aussehen:

```
public static void main(String[] args) {
		System.out.println("istTeiler: 12:4 = "+istTeiler(12,4));
		System.out.println("teilerVielfachheit: 12:4 = "+teilerVielfachheit(12,4));
		System.out.println("power: 5^5 = "+power(5,2));
	}
```

Hast du dir meine Verbesserungsvorschläge durchgelesen ?


----------



## TKausL (27. Nov 2011)

```
public class Teilbarkeit
    {

       public static void main(String[] args){
           System.out.println("Do anything...");
        }
        public static boolean istTeiler(int x, int y)   //gibt aus, ob x durch y teilbar ist (ganze Zahl betrachtet) {
                return x%y==0;
            }
    
        public static int teilerVielfachheit(int x, int y)  //gibt aus wie oft x durch y teilbar ist (ganze Zahl betrachtet)
            {
                int i=0;
                while (x>0)     /*Wenn der Rest der Division von x und y 0 betraegt, wird die Zaehlvariable i
                                        um 1 erhoeht, solange bis der Rest ungleich 0 ist*/
                    {
                        while(x%y==0)
                        {x= x-y;
                        }
                        i=i+1;
                    }
                return i;
            }
    
        public static int power(int x, int y)       //multipliziert x solange mit sich selbst, bis die Zaehlvariable j=y ist (x^y)
            {
                return Math.pow(x, y);
            }
            
        //Am Ende jeder Methode wird die zugehoerige Variable zurueckgegeben
    }
```


----------



## orangata (27. Nov 2011)

Ok, danke erst einmal. 
Die Test Klasse zu Teilbarkeit sieht dann so aus:


```
public class Test
	{
		public static void main (String[]args)
			{
				int x=8;
				int y=2;
				
				int i;
				i= Teilbarkeit.teilerVielfachheit(x,y);
				System.out.println(i);
				
				boolean type;
				type= Teilbarkeit.istTeiler(x,y);
				System.out.println(type);
				
				x= Teilbarkeit.power(x,y);
				System.out.println(x);
				
			}
	}
```

Ist die korrekt?


----------



## TKausL (27. Nov 2011)

Probier es aus


----------



## dehlen (27. Nov 2011)

Und wieso nicht so ?!

```
public class Teilbarkeit
{
	public static boolean istTeiler(int x, int y)
	{ 
		if ( x % y==0)        
										
		{return true;}
		else 
		{return false;}
	}

	public static int teilerVielfachheit(int x, int y)  
	{
		int i = x/y;
		return i; 
	}

	public static double power(int x, int y)     
	{
		double z = Math.pow(x,y);
		return z;            
	
	}

	public static void main(String[] args) {
		System.out.println("istTeiler: 12:4 = "+istTeiler(12,4));
		System.out.println("teilerVielfachheit: 12:4 = "+teilerVielfachheit(12,4));
		System.out.println("power: 5^5 = "+power(5,2));
	}
}
```


----------



## orangata (27. Nov 2011)

@TKlausL: dein Programm spuckt hier gerade 8Fehler aus.
Läuft es bei dir?


----------



## dehlen (27. Nov 2011)

beim dem Vorschlag von TKlausL steht die Klammer der Methode istTeilbar in den Kommentaren, daher gibt's nen Klammerfehler. Außerdem wird das Ergebnis von Matt.pow in einer int Variable gespeichert, die Methode gibt aber ein double zurück.


----------



## orangata (27. Nov 2011)

Welche Zeile meinst du?

Ok gefunden, ok math.POW auch korrigiert


----------



## orangata (29. Nov 2011)

Hier noch einmal mit dem gleichen Problem 

Math.Pow sollte nicht verwendet werden, sondern int .Power zur Potenzierung.

Mit math.pow lief alles prächtig, mit int.pow, spuckt er die Potenz nicht mehr aus, gemeint ist wirklich nur die letzte, die dritte Methode:

```
public class Teilbarkeit
{
    public static boolean istTeiler(int x, int y) //Methode 1
    { 
        if ( x % y==0) //kommt beim Quotienten eine ganze Zahl heraus, dann ist x%y==0x      
                                        
        {return true;}
        else 
        {return false;}
    }
 
    public static int teilerVielfachheit(int x, int y) //Methode2  
    {
        int i = x/y; //'wie oft passt y in x hinein'  
        return i; 
    }
    public static int power(int x, int y)		//multipliziert x solange mit sich selbst, bis die Zaehlvariable j=y ist (x^y)
    {
        int j=1;
        while (j<y)
        {
            x=x*x;
        }
        return x;
    }    
    public static void main(String[] args) { //Testklasse
        System.out.println("istTeiler: 12:4 = "+istTeiler(12,4));
        System.out.println("teilerVielfachheit: 12:4 = "+teilerVielfachheit(12,4));
        System.out.println("power: 5^5 = "+power(5,2));
    }
}
[/Java]
```


----------



## faetzminator (29. Nov 2011)

[c]j[/c] muss noch jeweils um eins erhöht werden, also z.B. damit, dass man den Schleifenkopf so anpasst: 
	
	
	
	





```
while (j++ < y)
```


----------



## TKausL (29. Nov 2011)

orangata hat gesagt.:


> Hier noch einmal mit dem gleichen Problem
> 
> Math.Pow sollte nicht verwendet werden, sondern int .Power zur Potenzierung.
> 
> ...


----------



## dehlen (29. Nov 2011)

Naja das du Math.pow nicht verwenden darfst, können wir ja nicht riechen.
Versuch doch mal die Methode power rekursiv zu lösen, ich denke so ist das sehr einfach.
Also:
methode(basis, exponent)
if(exponent == 0) {
gib 1 zurück
}
else
gib zurück Methode(basis*exponent-1);


----------



## faetzminator (29. Nov 2011)

dehlen, er hat ja bereits einen Ansatz einer _iterativen_ Implementierung. Mit der _resursiven_ Lösung verwirren wir ihn höchstens noch mehr


----------

