Methoden mit arrays? Könnt ihr helfen Bitte

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

Aktives Mitglied
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.
 
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

Administrator
Mitarbeiter
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.
 
K

kneitzel

Gast
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.
 
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

Administrator
Mitarbeiter
Fangen wir mal von vorne an: Aufgabe 2)
Java:
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.
 
K

kneitzel

Gast
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:

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

Konkret könnte da also jetzt <Type> ein int[] sein:
Code:
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

Top Contributor
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.
Java:
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:
Java:
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

Top Contributor
Nächster Schritt:

Code:
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

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

Code:
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;
}
 

JStein52

Top Contributor
:):)
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.
 
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

Top Contributor
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 !)
 
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

Top Contributor
Schritt 2 zur Aufgabe 3.

Code:
public static boolean hatUngeradeZiffern(int zahl) {

String myZiffern = Integer.toString(zahl);

return // hier kommt dann Schritt 3 hin
}
 

JStein52

Top Contributor
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.
 
K

kneitzel

Gast
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:
Code:
public static boolean onlyOddDigits(int number) {
    return (number < 10 && number > -10) ? (number % 2) != 0 : onlyOddDigits(number / 10) && (number % 2) != 0;
}
 

JStein52

Top Contributor
Dann mal Schritt 3 :):):

Code:
    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

Top Contributor
// 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.
 

Jardcore

Top Contributor
Habs auch gerade gesehen, soll nur true liefern wenn ALLE zahlen ungerade sind.
Java:
    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...
Java:
    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.
 

Jardcore

Top Contributor
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?
 
K

kneitzel

Gast
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

Top Contributor
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. :)
 
K

kneitzel

Gast
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

Top Contributor
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.
 

Neue Themen


Oben