# Nachprüfung 2.: Gerade Zahlen ausgeben



## Cosma (16. Aug 2011)

Hallo, wieder mal ich.
Ich bin gerade bei einem Zahlenspiel, wo der Benutzer 3 Zahlen eingibt, aber ein Unterpunkt lässt mir keine Ruhe.
Es soll ausgegeben werden, wie viele gerade Zahlen eingegeben wurden.
Jetzt habe ich eine Lösung, die aber sehr gepfuscht ist und nur bei so wenigen Benutzerzahlen funktioniert:

```
public class gerade {
    
    public void isGrade(int x, int y, int z)
    {int zaehler = 0;
           
   
     if(x%2==0)
     {zaehler++;}
     else if(x%2==0 && y%2==0)
     {zaehler=2;}
     else if(x%2==0 && y%2==0 && z%2==0)
     {zaehler=3;}
     else if(y%2==0 && z%2==0)
     {zaehler=2;}
     else if(y%2==0)
     {zaehler=1;}
     else if(z%2==0)
     {zaehler=1;}
     else if(x%2==0 && z%2==0)
     {zaehler=2;}
    
     System.out.println("Es sind "+zaehler+" gerade Zahlen");
     
     
         
         
    }    
}
```
Habt ihr eine Idee, wie man dass allgemeiner und effizienter lösen könnte?
Danke, Cosma


----------



## nrg (16. Aug 2011)

"gepfuscht" ist da noch gutmütig formuliert . hast du schonmal mit arrays gearbeitet?


----------



## XHelp (16. Aug 2011)

Zunächste einmal: "Nachprüfung" im Titel ist völlig unnötig

Warum nicht einfach:

```
void nochKomischerName(int x, int y, int z) {
  int counter = 0;
  if (x%2==0) {
    counter++;
  }
  if (y%2==0) {
    counter++;
  }
...
}
```

P.S. Wenn es *IMMER* bei 3 Zahlen bleibt oder wenn du keine Lust hast es anders zu machen


----------



## Fu3L (16. Aug 2011)

```
public void howManyEvenNumbers(int... x) {
  int counter = 0;
  for(int i = 0; i < x.length; i++) {
      if(x[i]%2 == 0) {
         counter++;
      }
  }
  System.out.println(counter);
}

public static void main(String[] args) {
   howManyEvenNumbers(1, 2, 3, 4, 5, 6, 7, 8, 9);
}
```

Für 7te Klasse mit halbem Jahr Java vllt noch etwas zu hart^^


----------



## Cosma (16. Aug 2011)

Danke (;
ich bin komplette Null im Programmieren (sieht man an der Nachprüfung).
Ja, arbeiten wir öfter. Aber wie sollte das hier gehen?


----------



## XHelp (16. Aug 2011)

Gut, wenn man hier schon auf Eleganz SO viel Wert legt: die Methode sollte die Anzahl der geraden Zahlen *zurückgeben*. Ausgegeben sollte es woanders.


----------



## faetzminator (16. Aug 2011)

Ach Fu3L, das geht doch einfacher :bae:

```
public int getEvenCount(int... nums) {
    int counter = 0;
    for (int n : nums) {
        counter += (n + 1) % 2;
    }
    return counter;
}
```
Schön mathematisch gelöst :bae:

Edit: Auf Fu3L's Antwort: natürlich kann man auch statt [c](n + 1) % 2[/c] einfach [c](n + 1) & 1[/c] verwenden  Dann wärs noch auf Bitebene


----------



## Fu3L (16. Aug 2011)

Wollte nich zu viel auf einmal verändern^^ Man könnte auch mit 


```
(x >> 1) << 1 == x
```

testen, ob eine Zahl gerade ist.. Geht erheblich schneller zur Laufzeit... Zur Programmierzeit dauerts vllt etwas länger^^ 

Seh grad beim Vorschau gucken: @faetzminator: Schöne Lösung 

@faetzminator's edit: Noch schönere Lösung^^  
Trifft vllt nicht mehr ganz das ursprüngliche Problem, aber Programmier*kunst* ist doch auch wichtig


----------



## Cosma (16. Aug 2011)

Fu3L hat gesagt.:


> ```
> public void howManyEvenNumbers(int... x) {
> int counter = 0;
> for(int i = 0; i < x.length; i++) {
> ...



Vom Prinzip ist es nicht zu hart ^^
Ich bin wirklich nicht gut, sonst hätt ich keine Nachprüfung.
Mein abgewandelter Code jetzt:


```
public class gerade {
    public void machGrade(int zahl)
    { int[] allezahlen=new int[zahl];
        int zaehler=0;
        for(int i=0;i<allezahlen.length;i++)
        {if(allezahlen[i]%2==0)
        {zaehler++;}
            
            }
   System.out.println(zaehler);
}
}
```
wenn ich es durchführen lasse und eine gerade Zahl eingegeben hab, gibt es mir die einfach aus?!


----------



## xehpuk (16. Aug 2011)

Cosma hat gesagt.:


> wenn ich es durchführen lasse und eine gerade Zahl eingegeben hab, gibt es mir die einfach aus?!


Weil das Array mit 0en gefüllt ist.

Ich schieß jetzt auch mal den Vogel ab:

```
public static int getEvenCount(int... nums) {
	int counter = 0;
	for (int n : nums)
		counter += n & 1 ^ 1;
	return counter;
}
```


----------



## nrg (16. Aug 2011)

jetzt wird aus istGerade plötzlich machGerade? du fragst, wie du mehrere Zahlen überprüfen könntest und übergibst wieder nur eine einzige? für was soll denn alleZahlen sein? das ist ein array voll n 0en (wobei n hier zahl ist).


----------



## Fu3L (16. Aug 2011)

Erstmal: Das allllllerwichtigste beim Programmieren: Einrückung!


```
class gerade {
		public void machGrade(int zahl) {
			int[] allezahlen = new int[zahl];
			int zaehler = 0;
			for (int i = 0; i < allezahlen.length; i++) {
				if (allezahlen[i] % 2 == 0) {
					zaehler++;
				}
			}
			System.out.println(zaehler);
		}
	}
```

allezahlen enthält nur 0en, deswegen gibts auch zahl viele zahlen bei denen bei division durch 2 kein rest bleibt


----------



## Cosma (16. Aug 2011)

Fu3L hat gesagt.:


> ```
> public void howManyEvenNumbers(int... x) {
> int counter = 0;
> for(int i = 0; i < x.length; i++) {
> ...





Fu3L hat gesagt.:


> Erstmal: Das allllllerwichtigste beim Programmieren: Einrückung!
> 
> 
> ```
> ...



Wie funkt es dann nur, wenn ich die Methode aufrufe, dass dann die eingegebenen Zahlen gleich dem Array sind? Das versteh ich nur grad nicht...


----------



## Fu3L (16. Aug 2011)

Das sind so genannte varargs


```
public void machWasMitEinemArray(int... x) {
  //Hier kannd as Array x benutzt werden!
}
```

Kann aufgerufen werden mit:


```
machWasMitEinemArray(1, 2, 3, 4);
```
oder:

```
int[] i = new int[] { 1, 2, 3, 4 };
machWasMitEinemArray(i);
```

Durch das 
	
	
	
	





```
...
```
 werden alle übergebenen Argumente in ein Array zuzammengefasst.

Edit: Bissl präziser:

```
public void machWasMitEinemArray(String s, int... x) {
  //Hier kannd as Array x benutzt werden und der String s
}
```

Hier werden natürlich nur alle Argumente nach dem String zum Array hinzugefügt:


```
machWasMitEinemArray("Hallo", 1, 2, 3, 4);
```


----------



## Cosma (16. Aug 2011)

Ahhh, jetzt funktioniert es!
Danke


----------

