# Methoden mit arrays? Könnt ihr helfen Bitte



## java.asker123 (16. Feb 2016)

Hallo Leute, ich werde bald eine Prüfung im Fach programmieren schreiben. Ich selber bin ein neueinsteiger und beschäftige mich zurzeit auch mit den basics. Nur was ich nicht verstehe ist wie ich Methoden mit arrays schreiben kann. Wir haben 3-4 Aufgaben wo diese meistens auftauchen. Das Problem ist da gibt es die meisten Punkte. Ich hoffe jemand hat das erforderliche wissen dazu und kann mir dabei helfen. Danke im voraus


----------



## VirtualIndex (16. Feb 2016)

Was heißt Methoden mit Arrays? Sollen Arrays empfangen (Parameter), zurückgegeben (return) oder damit gearbeitet werden? Zeige doch mal eine solche Aufgabe und sag uns wo du da genau deine Probleme hast.


----------



## java.asker123 (16. Feb 2016)

Aufgabe 2) 12 Punkte
Schreiben Sie eine Methode public static int[] verschiebe(int[] zahlen, int schrittweite) ,
die die Zahlen eines Arrays vum die angegebene Schrittweite verschiebt, die Zahlen
die hinten aus em Array laufen sollen vorne wieder eingefügt werden. Beispiel: {1, 2, 3,
4, 5} mit einer Schrittweite von 2 soll {4, 5, 1, 2, 3} ergeben.
Aufgabe 3) 12 Punkte 
Schreiben Sie eine Methode public static boolean hatUngeradeZiffern(int zahl) die nur
dann true liefert wenn alle Ziffern ungerade sind. Ohne Schleifen und if-Anweisungen.
Aufgabe 4) 15 Punkte 
Schreiben Sie eine Methode public static boolean enthaeltPaar(String[] woerter) die
true liefert wenn das übergebene Array zwei aufeinanderfolgende gleich Wörter
enthält.
Aufgabe 5)
Schreiben Sie hinter die System.out.println Anweisung die Bildschirmausgabe oder
den Effekt der auftritt.
String[] t = new String[2];
String[] u = new String[3];
t[0] = "Haus";
t[1] = t[0];
t[0] = t[0].substring(0,3);
System.out.println(t[0] + "-" + t[1]);
System.out.println(t[1] + "-" + t[1]);
u = t;
t[0] = t[0] + "x";
u[1] = u[1] + "y";
System.out.println(t[0] + "-" + u[0]);
System.out.println(t[1] + "-" + t[1]);
System.out.println(u[2]);

Also so sieht mein Arbeitslatt aus und das ist erst 1/3 teil. Aber die meisten Punkte gibt es auch bei sowas. 
Ich hoffe ich konnte dir zeigen was ich damit meine. Danke im.voraus


----------



## Flown (16. Feb 2016)

Meine Frage ist: Willst du dir das selbst, mit unserer Hilfe, erarbeiten oder nichts machen? Wenn es Letzteres ist, dann bitte HIER nochmal eine Anfrage stellen und auch eine Preisvorstellung mitliefern - denn im Leben ist nichts geschenkt.


----------



## java.asker123 (16. Feb 2016)

Wenn ich Geld ausgeben würde hätte ich es hier nicht gepostet. Ich würde mich freuen wenn ich es mit eurer Hilfe lösen kann


----------



## kneitzel (16. Feb 2016)

Dann such Dir eine Aufgabe aus und versuch sie zu lösen. Wie weit kommst Du? An welchem Punkt kommst Du nicht weiter? Welche konkreten Fragen hast Du?

Es bringt Dich doch nicht weiter, wenn Du Musterlösungen vorgesetzt bekommst. Du willst doch in der Lage sein, solche Aufgaben zu lösen. Also setz Dich einfach dran und versuche es. Und schreib, wo du genau Hilfe brauchst. Wenn Du gar keinen Ansatzpunkt hast, würde mir jetzt nur eine Einführung in Java einfallen, die Du erst einmal durcharbeiten solltest.


----------



## java.asker123 (16. Feb 2016)

Ich kenne arrays nur mit int Double float was man davor deklariert. Hier hat er mir eine Methode gegeben mit Array und ehrlich gesagt weiss ich nicht wie ich voran gehen muss. Danke für die hilfreiche Antwort kneitzel


----------



## Flown (16. Feb 2016)

Fangen wir mal von vorne an: Aufgabe 2)

```
public static int[] verschiebe(int[] zahlen, int schrittweite) {
  // Schritt 1: Erstellen eines neuen Arrays mit der gleichen Länge
  // Schritt 2: Füllen des Arrays mit einem Offset (Schrittweite) - Schleife/System.arraycopy(falls schon behandelt?)
  // Tipp: Damit der Index auch innerhalb der Grenzen des Arrays bleibt also [0, zahlen.length[ benötigt man den Modulo-Operator (%)
  // Schritt 3: Zurückgeben des Arrays
}
```

Du bist am Zug.


----------



## kneitzel (16. Feb 2016)

Wenn ich dich richtig verstehe, dann bist du nur durch die Rückgabe eines Arrays verwirrt?
Eine Funktion ist vom Prinzip her immer gleich aufgebaut (Jetzt vereinfacht! Es ist noch nicht umfassend!):
<Sichtbarkeit> <Type> <Name> (<Parameter> {, <Parameter>})
Mit <Parameter> := <Type> <Name>

<Type> kann dabei sehr viel sein:
- einer der Basistypen
- ein Array
- eine Klasse

Bei dem Rückgabetyp ist auch noch void zugelassen, das für keine Rückgabe steht.

Ein Array kann selbst auch wieder beliebige Typen haben. Also z.B. int[] oder MeineKlasse[].

Wenn die Funktion einen Rückgabetyp definiert, der nicht void ist, dann muss immer genau so ein Wert zurück gegeben werden. Das könnte man evtl. durch so einen Code zeigen:


```
<Type> someFunction()
{
    <Type> result;
    // result muss hier irgend einen Wert bekommen.
    return result;
}
```

Konkret könnte da also jetzt <Type> ein int[] sein:

```
int[] someFunction()
{
    int[] result;
    // result muss hier irgend einen Wert bekommen.
    return result;
}
```

Wie Du das gewünschte Ergebnis erstellst musst Du natürlich statt des Kommentars schreiben. Dabei hast Du dann zur Verfügung:
- ggf die Parameter, die übergeben wurden.
- die Instanz der Klasse (this) mit allen Inhalten, so die Funktion nicht statisch ist.
- Klassen, die bekannt sind.

Daraus musst Du dann deinen Code bauen.

Hat dies evtl. schon geholfen?


----------



## Jardcore (16. Feb 2016)

Ein Array ist nur eine Liste.
Du kennst ja schon double und float Arrays, beide Arrays sind einfach Listen vom primitiven Datentypen (double, float). Eine Liste kann jedoch von jedem Datentyp bzw. Objekt gebildet werden.

Hier mal zum Verständnis, schau dir die Deklarierung an und die Gemeinsamkeiten.

```
int size = 10;
double[] doubleArray = new double[size];
float[] floatArray = new float[size];
int[] intArray = new int[size];
Auto[] autoArray = new Auto[size];

for(int index = 0; index < size; index++) {
    System.out.println(beliebigesArray[index]);
}
```
Alle Listen haben die selbe Größe und werden ähnlich deklariert.
Ein Array kann man mithilfe einer Schleife durchlaufen werden.
In diesem Fall ist es nur eine einfache Ausgabe.

Zuweisungen eines Arrays geschehen, am Beispiel eines intArrays, wie folgt:

```
intArray[index] = 10;
```
Wenn du nun zwei Arrays hast und die Werte von dem einen ins andere übertragen willst musst du auf das Element des einen zugreifen und es dem anderem zuweisen. (eine Kombination aus dem gezeigten).


----------



## JStein52 (16. Feb 2016)

Nächster Schritt: 


```
public static int[] verschiebe(int[] zahlen, int schrittweite) {
  // Schritt 1: Erstellen eines neuen Arrays mit der gleichen Länge
  int[] verschobeneZahlen = new int[zahlen.length];


  // Schritt 2: Füllen des Arrays mit einem Offset (Schrittweite) - Schleife/System.arraycopy(falls schon behandelt?)
  // Tipp: Damit der Index auch innerhalb der Grenzen des Arrays bleibt also [0, zahlen.length[ benötigt man den Modulo-Operator (%)

  // Schritt 3: Zurückgeben des Arrays
  return verschobeneZahlen;
}
```


----------



## JStein52 (16. Feb 2016)

Und jetzt noch der fehlende Teil, die ominöse Schleife:


```
public static int[] verschiebe(int[] zahlen, int schrittweite) {
  // Schritt 1: Erstellen eines neuen Arrays mit der gleichen Länge
  int[] verschobeneZahlen = new int[zahlen.length];


  // Schritt 2: Füllen des Arrays mit einem Offset (Schrittweite) - Schleife/System.arraycopy(falls schon behandelt?)

  for (int i=0; i<zahlen.length; i++) {
     if (i < zahlen.length-schrittweite) {
        verschobeneZahlen[i+schrittweite] = zahlen[i];
     } else {
        verschobeneZahlen[i+schrittweite-zahlen.length] = zahlen[i];
     }
   }
   return verschobeneZahlen;
}
```


----------



## Jardcore (16. Feb 2016)

Und schon haben wir die ganze Arbeit gemacht...


----------



## JStein52 (16. Feb 2016)

Jardcore hat gesagt.:


> Und schon haben wir die ganze Arbeit gemacht...


Nö, nur Aufgabe 2 von oben.


----------



## VfL_Freak (16. Feb 2016)

JStein52 hat gesagt.:


> Nö, nur Aufgabe 2 von oben


dann mal frisch ans Werk mit (3), nicht das  der TO nachher noch meckert


----------



## JStein52 (16. Feb 2016)

Ok, wieder schrittweise. Erster Schritt: die Idee.

Um das ganze für Anfänger anschaulich zu machen würde ich die Zahl zunächst mal in einen String umwandeln und dann mit contains gucken ob eine gerade Zahl drinnen ist Und das Ergebnis von contains gleich returnen negiert natürlich). Damit ist die Vorgabe dass kein if drin sein darf erfüllt.


----------



## java.asker123 (16. Feb 2016)

Erstmal vielen dank für die Hilfreichen Posts ihr seid genial! Nur uns wurde manches garnicht beigebracht was ihr hier so geschrieben habt, sprich:  Schritt 2: Füllen des Arrays mit einem Offset (Schrittweite) - Schleife/System.arraycopy(falls schon behandelt?) - offset und arraycopy kenne ich leider nicht. bei nr 3 würde ich das ganze mit einer schleife machen aber da steht dass man es ohne machen soll..


----------



## JStein52 (16. Feb 2016)

Das mit offset ujnd arraycopy hatte Joose mal als Kommentar reingeschrieben. Siehst du das in meiner Umsetzung ?  Ich denke mal da werden nur Dinge benutzt die du kennst (kennen musst !)


----------



## JStein52 (16. Feb 2016)

@java.asker123 : Hast du meine Lösungsidee zu 3.) gelesen ? Da steht nichts von einer Schleife. Kennst du das hier:

String myZiffern = Integer.toString(zahl);


----------



## java.asker123 (16. Feb 2016)

nein kenne ich leider nicht


----------



## java.asker123 (16. Feb 2016)

ich habe mich hier erst gestern registriert, weil ich Schwierigkeiten habe im Fach programmieren. Könnt ihr es iwie ausgiebig erklären sodass ich alles verstehe ? Wie ich bereits gesagt habe bin ich ein Anfänger deswegen fällt mir so einiges schwwer also was das Thema verstehen angeht und ich würde gerne mit eurer Hilfe dazulernen. Ich habe meinen Skript gelesen mir sehr viele JAVA tutorials reingezogen. 
Was ich bereits kann ist: 
variablen deklarieren, IF und FOR Schleifen, switch und case, methoden aufrufen, Arrays deklarieren, Werte Ausgeben und modulo..


----------



## JStein52 (16. Feb 2016)

Schritt 2 zur Aufgabe 3.


```
public static boolean hatUngeradeZiffern(int zahl) {

String myZiffern = Integer.toString(zahl);

return // hier kommt dann Schritt 3 hin
}
```


----------



## JStein52 (16. Feb 2016)

Aber die Klasse String kennst du ?


----------



## JStein52 (16. Feb 2016)

java.asker123 hat gesagt.:


> variablen deklarieren, IF und FOR Schleifen, switch und case, methoden aufrufen, Arrays deklarieren, Werte Ausgeben und modulo..


Die Lösung zu Aufgabe 2 müsstest du dann ja verstehen. Da wird genau das benutzt


----------



## java.asker123 (16. Feb 2016)

klasse string nicht aber den datentyp string kenne ich .. ich weiss nicht wo der unterschied ist


----------



## java.asker123 (16. Feb 2016)

ja ich habe es zum grössten teils verstanden ausser diese offset sache das kenne ich nicht ehrlich gesagt


----------



## JStein52 (16. Feb 2016)

java.asker123 hat gesagt.:


> klasse string nicht aber den datentyp string kenne ich .. ich weiss nicht wo der unterschied ist


Also die Klasse String müsstest du aber kennen, das kommt ja schliesslich schon in der Aufgabenstellung vor und es wird ja auch mindestens eine Methode dieser Klasse in der Aufgabenstellung benutzt. (substr()).
Falls nicht würde ich mir diese Klasse mal angucken. z.B. hier: http://openbook.rheinwerk-verlag.de...04_001.htm#mj71fbc84ad33a281b9352b0b19fae2fb2
Dort steht dann auch wie du primitive Datentypen wie int in einen String umwandelst.


----------



## JStein52 (16. Feb 2016)

Und vergiss einfach mal dieses blöde Wort offset. Lösche den Kommentar raus. dann gibt es keinen Offset mehr.


----------



## kneitzel (16. Feb 2016)

Also da kann man sich auch überlegen, was für Alternativen es gibt. Erst einmal macht diese Aufgabe so in meinen Augen sehr wenig Sinn. Daher frage ich mich, was da denn getestet oder geprüft werden soll.

Also Schleifen lassen sich oft ersetzen durch Rekursion.
If Anweisungen lassen sich nicht so ohne weiteres ersetzen - außer eben der ? : Operation.

Dann würde eine Lösung wie folgt aussehen:

```
public static boolean onlyOddDigits(int number) {
    return (number < 10 && number > -10) ? (number % 2) != 0 : onlyOddDigits(number / 10) && (number % 2) != 0;
}
```


----------



## JStein52 (16. Feb 2016)

jetzt wirds spannend


----------



## JStein52 (16. Feb 2016)

Dann mal Schritt 3 :


```
public static boolean hatUngeradeZiffern(int zahl) {

    String myZiffern = Integer.toString(zahl);

    return !(myZiffern.contains("2") || myZiffern.contains("4")||
                 myZiffern.contains("6") ||myZiffern.contains("8") ||
                 myZiffern.contains("0"));  // soll 0 eine gerade Ziffer sein ?
    }
```

Keine Schleife, keine Rekursion, kein if, kein verstecktes if  mit ? :


----------



## Jardcore (16. Feb 2016)

JStein52 hat gesagt.:


> // soll 0 eine gerade Ziffer sein ?



Null ist laut Definition gerade^^ da muss man nicht fragen 
Finde den Ansatz aber mau... feste Werte in einer dynamischen Methode.
Glaube ein rekursiver Ansatz, bzw. der Lösungssatz: "Lieber Professor, stellen sie doch mal bitte ein paar realitätsnahe Aufgaben". wäre deutlich besser.

"Ohne Schleifen" in der Schule oder Uni weißt in Aufgaben meist auf Rekursion hin.
Die Frage ist nur... zählt ein return BOOLSCHER AUSDRUCK als nicht If-Anweisung... wenn ja... Professor mal wieder einen Tritt geben...

EDIT:
Man könnte einfach alle Werte des Arrays zusammenzählen und dann gucken ob es durch 2 Teilbar ist. Und das mit der Rekursion.


----------



## VfL_Freak (16. Feb 2016)

Jardcore hat gesagt.:


> Die Frage ist nur... zählt ein return BOOLSCHER AUSDRUCK als nicht If-Anweisung


IMHO nicht, allenfalls als sehr enge Spezialisierung einer if-Anweisung ... ist dann aber wohl mehr eine Spitzfindigkeit, da die Wirkungsweise ähnlich ist !
Aber rein "rechtlich" gesehen sicher nicht ...

Gruß Klaus


----------



## JStein52 (16. Feb 2016)

Jardcore hat gesagt.:


> Man könnte einfach alle Werte des Arrays zusammenzählen und dann gucken ob es durch 2 Teilbar ist


Wie meinst du das ?  Beispiele   39  und 331


----------



## Jardcore (16. Feb 2016)

Habs auch gerade gesehen, soll nur true liefern wenn ALLE zahlen ungerade sind.

```
public static boolean hatUngeradeZiffern(int zahl) {
        return hatUngeradeZiffern(true, zahl);
    }
  
    public static boolean hatUngeradeZiffern(boolean flag, int index) {
        try {
            return hatUngeradeZiffern(flag & intArray[index] % 2 != 0, ++index);          
        } catch(ArrayIndexOutOfBoundsException e) {
            return flag;
        }
    }
```

bzw. ohne Exception... aber dafür noch unleserlicher...

```
public static boolean hatUngeradeZiffern(boolean flag, int index) {
        return index >= intArray.length ? flag : hatUngeradeZiffern(flag & intArray[index] % 2 != 0, ++index);           
    }
```

Find die Aufgabenstellung immer noch komisch.


----------



## JStein52 (16. Feb 2016)

Jardcore hat gesagt.:


> intArray


Hmmm und was ist das intArray


----------



## kneitzel (16. Feb 2016)

@Jardcore: was stört Dich an meiner Lösung? Die löst das Problem und da ist kein flag oder so einzuführen.


----------



## Jardcore (16. Feb 2016)

Okay nochmal zum Verständnis... gehen wir jetzt davon aus das eine Ziffernfolge kommt und die soll analysiert werden? also z.B.: 123 und in der sind 2 ungerade Zahlen? Oder soll geprüft werden ob ein Array nur ungerade Elemente enthält?


----------



## Jardcore (16. Feb 2016)

@kneitzel hab deine Lösung wohl überlesen^^

Edit:
okay eins stört mich doch... wieso (number < 10 && number > -10)?
Edit2:
habs ^^


----------



## JStein52 (16. Feb 2016)

Hallo ??  Es gibt als Input eine int-Zahl. Und für die soll überprüft werden ob sie nur ungerade Ziffern enthält !!


----------



## kneitzel (16. Feb 2016)

Die Aufgabe ist eindeutig:
Aufgabe 3) 12 Punkte 
Schreiben Sie eine Methode public static boolean hatUngeradeZiffern(int zahl) die nur
dann true liefert wenn alle Ziffern ungerade sind. Ohne Schleifen und if-Anweisungen.

Und da steht nichts von positiven oder negativen zahlen.
(number < 10 && number > -10) ist die Abbruchbedingung der Rekursion. Wenn das wahr ist, dann haben wir nur noch eine Ziffer und die wird geprüft. number%2 != 0 ist true, wenn die Zahl ungerade ist.

Und wenn die Zahl mehr wie eine Ziffer hat, dann muss ich die Zahl/10 testen (das sind die übrigen Ziffern) und die letzte Ziffer. Die letzte Ziffer wäre (Zahl%10) was ich %2 prüfen müsste. Aber x %10 %2 ist das Gleiche wie x % 2, daher habe ich das %10 weglassen können.


----------



## Jardcore (16. Feb 2016)

Hallo JStein52, wie gehts? Alles okay bei dir?
Da wir jetzt alle auf dem gleichen Wissensstand sind.

Ich würde kneizels Lösung präferieren.


----------



## JStein52 (16. Feb 2016)

Jardcore hat gesagt.:


> Hallo JStein52, wie gehts


Danke mir gings die ganze Zeit schon gut. Du warst ja nicht so ganz auf der Höhe


----------



## kneitzel (16. Feb 2016)

Naja, er hat die Aufgabenstellung aus den Augen verloren. Bei so langen Threads ja kein Wunder und auch kein Problem. Ist ja einfach zu lösen und dann kann man wieder an einem Strang ziehen.


----------



## JStein52 (16. Feb 2016)

Ich habe die ganze Zeit schon an deinem Strang gezogen. Ich wollte ja nur wissen was dieses intArray sein soll weil seine Lösung ja nicht kompiliert hat und ich sie ausprobieren wollte. Und die rekursive Lösung gefällt mir ja auch gut obwohl ich mir nicht sicher bin ob die hier gemeint war. Das müsste der TE entscheiden.


----------

