# Anzahl un/gerader Zahlen aus Array auslesen



## mipflip (26. Apr 2017)

Ich mach auf der Uni grad den Java-Grundkurs und hab da leider so meine Probleme da es weder Support noch Lösungen gibt. Ich steh hier leider an und komme nicht weiter, daher bitte ich um Lösungshinweise. 

*Angabe:*

```
public abstract class AusgabeEinfach {
  // Gibt die Anzahl der geraden Zahlen
  // im übergebenen Array "zahlen" auf der Konsole aus
  public abstract void ausgabeGerade(int[] zahlen);

  // Gibt die Anzahl der ungeraden Zahlen
  // im übergebenen Array "zahlen" auf der Konsole aus
  public abstract void ausgabeUngerade(int[] zahlen);
}
```
Beschreibung:
Das Ziel der Aufgabe ist es eine Klasse zu schreiben, die für ein Array die Anzahl der
geraden bzw. ungeraden Zahlen berechnet und auf der Konsole ausgibt. Schreiben
Sie die konkrete Klasse „LoesungEinfach“ als Erweiterung der oben definierten
abstrakten Klasse „AusgabeEinfach“.Implementieren Sie die beiden Methoden „ausgabeGerade(int[] zahlen)“ und „ausgabeUngerade(int[] zahlen)“. Die Methoden geben jeweils die Anzahl der geraden bzw. ungeraden Zahlen des übergebenen Arrays (Parameter „int[] zahlen“)  auf der Konsole aus.
Hinweis:
Modulo berechnet den Rest der Division, in Java ist es der „%“- Operator.
Beispiel: 17 % 10 ist gleich 7.

*Mein Lösungsansatz* wäre hier in *Eclipse*:

```
public abstract class AusgabeEinfach {
   public static void main(String[] args){
   }
      public abstract void ausgabeGerade(int[] zahlen);
      public abstract void ausgabeUngerade(int[] zahlen);
   }


public class LoesungEinfach extends AusgabeEinfach {
      int [] zahlen = {1,2,3,4,5,6,7,8,9,10};
   
public void ausgabeGerade(int[] zahlen){
         int istGerade = 0;
 
         for(int i=0; i<zahlen.length; i++){
      if (zahlen[I]%2 == 0){
         istGerade++;
             }
}
         System.out.print(istGerade);
       }
 
public void ausgabeUngerade(int[] zahlen){
              int istUngerade = 0;
       for(int i=0; i<zahlen.length; i++){
              if (zahlen[I]%2 != 0){
                  istUngerade++;
                 }
          }
       System.out.println(istUngerade);
       }
   }
```
Sieht hier jemand meinen Fehler? Die Konsole gibt leider keine Werte aus...[/I][/I]


----------



## stg (26. Apr 2017)

mipflip hat gesagt.:


> Sieht hier jemand meinen Fehler? Die Konsole gibt leider keine Werte aus..



Deine main-Methode ist _leer_. Dein Program macht also mehr oder weniger _nichts_, bevor es terminiert.


----------



## VfL_Freak (26. Apr 2017)

Moin,



mipflip hat gesagt.:


> *if* (zahlen[I]%2 == 0){


na, der Index ... 'I' != 'i'
Oder war das 'nur' ein Tippfehler ?

Gruß Klaus


----------



## VfL_Freak (26. Apr 2017)

stg hat gesagt.:


> Deine main-Methode ist _leer_. Dein Program macht also mehr oder weniger _nichts_, bevor es terminiert.


oops, ja das auch !!


----------



## mipflip (26. Apr 2017)

Vielen Dank für die schnelle Antwort.

@VfL_Freak: komisch, hat sich anscheinend beim Kopieren verändert, im Eclipse steht es noch richtig drinen. 
@stg: Ich hab immer so meine Probleme mit der main-Methode. Wenn ich die abstacten Methoden allerdings in den main-Methodenblock packe, bekomm ich eine Fehlermeldung. 






```
public abstract class AusgabeEinfach {
  
public static void main(String[] args){
          
    public abstract void ausgabeGerade(int[] zahlen);
   
    public abstract void ausgabeUngerade(int[] zahlen);
         }
}
```

wie wäre es richtig?


----------



## VfL_Freak (26. Apr 2017)

Moin,

ok ... aber eine abtrakte Klasse hat *KEINE* main-Methode !!!
Du kannst sie ja auch nicht direkt ausführen !!

Dein Programm hat aber keine ... das war das was @stg ausdrücken wollte !

Gruß Klaus

EDIT: hier noch schnell Link: https://www.tutorialspoint.com/java/java_abstraction.htm


----------



## stg (26. Apr 2017)

VfL_Freak hat gesagt.:


> ok ... aber eine abtrakte Klasse hat *KEINE* main-Methode !!!



Wieso nicht? Wie gebräuchlich das nun ist sei mal dahin gestellt, aber im Grunde ist's doch furchtbar egal, wo die main-Methode(n) liegen. Falsch ist's jedenfalls nicht.


----------



## VfL_Freak (26. Apr 2017)

Moin,
das heißt, es würde grundlegend so funktionieren und alle ableitenden Klassen bräuchten keine 'main' ?????


mipflip hat gesagt.:


> public abstract class AusgabeEinfach {
> public static void main(String[] args){
> 
> public abstract void ausgabeGerade(int[] zahlen);
> ...


hmm, ist mir zugegebenermaßen noch nie untergekommen ...

Gruß Klaus


----------



## Flown (26. Apr 2017)

VfL_Freak hat gesagt.:


> das heißt, es würde grundlegend so funktionieren und alle ableitenden Klassen bräuchten keine 'main' ?????


Nö, ist eine `static` Methode und wird nicht mitvererbt. Sie ist zwar "sichtbar" aber gehört definitiv zur super-Klasse.


----------



## looparda (26. Apr 2017)

mipflip hat gesagt.:


> ```
> public abstract class AusgabeEinfach {
> public static void main(String[] args){
> 
> ...


Um dich mal auf den richtigen Weg zu bringen:

```
public abstract class AusgabeEinfach {
    public abstract void ausgabeGerade(int[] zahlen);
    public abstract void ausgabeUngerade(int[] zahlen);
    public static void main(String[] args){
    }
}
```
Noch einmal zur Verdeutlichung: du hattest die abstrakten Methoden in deiner Main-Methode. Die Definitionen gehören jedoch zur Klasse AusgabeEinfach und nicht in die main-Methode.

Jedoch ist deine main-Methode leer - wenn ich es richtig verstanden habe ist das nur durch das Kopieren entstanden. Da mir der Rest richtig erscheint ist der Code, an dem es nun hakt nicht hier im Thread zu finden. Also kann man schlecht helfen oder Tips geben.

Das Einzige, was mir auffällt ist: 
- Die Main-Methode hast du gerade irgendwo in den Code gewurstelt - das kann man, wie schon geklärt machen. Üblicherweise spendiert man der Main-Methode jedoch eine eigene Klasse und packt sie nicht in eine abstrakte Klasse.
- Du übergibst die Zahlen an _ausgabeGerade _und _ausgabeUngerade_. Wieso hast du dann ein extra Feld für weitere Zahlen in der _LoesungEinfach _Klasse?


----------



## mipflip (3. Mai 2017)

Ich hab mich die letzten Tage intensive mit Java beschäftigt, bin allerdings was das Problem anbelangt immer noch nicht weiter gekommen. Bin momentan auf diesem Stand:


```
public abstract class AusgabeEinfach {
  
   public abstract void ausgabeGerade(int[] zahlen);
  
   public abstract void ausgabeUngerade(int[] zahlen);
}
```



```
public class LoesungEinfach extends AusgabeEinfach{
  
   public void ausgabeGerade(int[] zahlen) {
       for (int i = 0; i<zahlen.length;i++){
           if(zahlen[i]%2 == 0){
               int istGerade = 0;
               istGerade++;
               System.out.println("Anzahl gerade Zahlen im Array: "+ istGerade);
           }
       }
   }

       public void ausgabeUngerade(int[] zahlen) {
       for (int i = 0; i<zahlen.length;i++){
           if(zahlen[i]%2 != 0){
               int istUngerade = 0;
               istUngerade++;
               System.out.println("Anzahl ungerade Zahlen im Array: "+istUngerade);
           }
       }
   }
       public static void main(String[]args){
           // das Array zahlen wird hier von den oberen Methoden nicht gesehen
           int [] zahlen = new int[] {1,2,3,4,5,6,7,8,9,10,11,12,13};
          
           }
       }
```

ich hab hier das Problem dass ich die Main-Methode nicht zum laufen bekomm. Was müsste ich denn hier reinschreiben dass diese läuft und die oberen Methoden ausführt.
ich hätte an soetwas gedacht wie:

```
public void run(methode){
system.out.println();
}
```


----------



## looparda (3. Mai 2017)

Die Klammerung sieht nun gut aus. Dir scheint es jedoch an einfachen Java-Kenntnissen zu fehlen - insbesondere was Objekte erzeugen und OOP angeht. Das ist aber nicht schlimm, weil man es schnell lernen kann. Im Prinizip musst du nun ein Objekt von deiner Klasse LoesungEinfach erstellen, auf das du dann die beiden Methoden aufrufen kannst. Schau dir mal das an: http://www.spinfo.phil-fak.uni-koeln.de/29940.html und versuche es auf dein Problem zu übertragen. 
Eine weitere run-Methode benötigst du nicht. Außerdem hast du die beiden Implementierungen von ausgabeGerade und ausgabeUngerade verschlimmbessert - die waren letzte Mal korrekt, wenn ich mich richtig erinnere. Aber das kannst du nach deinem Problem mit der Main-Methode und der Objekterzeugung nochmal angehen - eins nach dem anderen.


----------



## mipflip (4. Mai 2017)

Erstmal ein riesen Danke an alle für euren Input. Hat bei mir zwar leider etwas länger gedauert bis ichs gecheckt habe, aber nun sollte es funktioniert haben. Glaubt ihr wurde die Aufgabenstellung damit erfüllt?
Hier der Code:

```
public abstract class AusgabeEinfach {
 
   public abstract void ausgabeGerade(int[] zahlen);
 
   public abstract void ausgabeUngerade(int[] zahlen);
}
```


```
public class LoesungEinfach extends AusgabeEinfach{
 
           public void ausgabeGerade(int[] zahlen) {
               int istGerade = 0;
               for (int i = 0; i<zahlen.length;i++){
               if(zahlen[i]%2 == 0){
               istGerade++;
               System.out.println("Anzahl an gerader Zahlen im Array :"+istGerade);
                   }
               } 
           }
   public void ausgabeUngerade(int[] zahlen) {
           int istUngerade = 0;
           for (int i = 0; i<zahlen.length;i++){
               if(zahlen[i]%2 != 0){
                   istUngerade++;
                   System.out.println("Anzahl an ungerader Zahlen im Array :"+istUngerade);
           }
       } 
   }
           public static void main(String[]args){
                                     
           int [] zahlen = new int[] {1,2,3,4,5,6,7,8,9,10};
         
           LoesungEinfach loesung = new LoesungEinfach();
               loesung.ausgabeGerade(zahlen);
               System.out.println();
               loesung.ausgabeUngerade(zahlen);
               }
}
```
Hier die Ausgabe:

```
Anzahl an gerader Zahlen im Array :1
Anzahl an gerader Zahlen im Array :2
Anzahl an gerader Zahlen im Array :3
Anzahl an gerader Zahlen im Array :4
Anzahl an gerader Zahlen im Array :5

Anzahl an ungerader Zahlen im Array :1
Anzahl an ungerader Zahlen im Array :2
Anzahl an ungerader Zahlen im Array :3
Anzahl an ungerader Zahlen im Array :4
Anzahl an ungerader Zahlen im Array :5
```
lg Michi


----------



## looparda (4. Mai 2017)

looparda hat gesagt.:


> Außerdem hast du die beiden Implementierungen von ausgabeGerade und ausgabeUngerade verschlimmbessert - die waren letzte Mal korrekt, wenn ich mich richtig erinnere. Aber das kannst du nach deinem Problem mit der Main-Methode und der Objekterzeugung nochmal angehen - eins nach dem anderen.



Ich würde sagen, dass die Aufgabe nicht optimal erfüllt ist. Die Funktion soll die Antwort ausgeben und nicht hochzählen, denke ich.


----------



## mipflip (4. Mai 2017)

Da haben Sie wohl recht. Dh. ich schreib die System.out.println Methode einfach außerhalb der for-Schleifen dann sollte nur noch das Ergebnis ausgegeben werden...
Vielen Dank für das Feedback. Super Support


----------



## looparda (4. Mai 2017)

Ganz genau so funktioniert das


----------

