Verständnis Frage zu der Aufgabe

Bobi

Bekanntes Mitglied
Hallo,
ich habe Probleme, was in dieser Aufgabe gefordert wird, zu verstehen.
Was muss ich bei der Aufgabe Teil a) mit der Methode
Java:
evaluate(int x, int y)
berechnen? Muss ich erste zwei Zahlen von der Array holen und auf diese Zahlen eine xor Funktion anwenden und von so erhaltene Zahl wieder in der Array schreiben?
also wenn ich Array lenge 10 habe dann bekomme ich Array mit der Länge 5. Ist das so richtig?

Bie der Aufgabe Teil b) was machen diese Methode z.B Addition addiert einfach zwei benachbarte Array Zahl oder was macht?

upload_2018-11-27_16-12-25.png
 
Muss ich erste zwei Zahlen von der Array holen und auf diese Zahlen eine xor Funktion anwenden und von so erhaltene Zahl wieder in der Array schreiben?
Lese dir bitte mehrere Male gaaanz ganz genau die Aufgabenstellung durch. Das Symbol ⊕ steht im Kontext der Aufgabe nicht für XOR, sondern für entweder die Addition, Multiplikation oder das Maximum zweier Zahlen.

also wenn ich Array lenge 10 habe dann bekomme ich Array mit der Länge 5. Ist das so richtig?
Nein. Die Antwort liefert auch hier die Aufgabenstellung, die du bitte nochmal sehr aufmerksam durchlesen solltest. Die Methode soll ein Array der Länge 'n' (genauso wie das Eingabearray) zurückliefern.

Wenn man den Operator ⊕ als Addition betrachtet, implementiert dieser Algorithmus die Präfixsumme: https://de.wikipedia.org/wiki/Präfixsumme
 
Danke ich habe Verstanden, was Prefixsummen Berechnung ist und ist auch sehr leichter, aber ich verstehe nicht was meine vorgegebene Methoden berechnen soll.
z.B so sieht aus zur Verfügung gestellte Code.
Java:
public class Scan implements IntOperation{
  
public static final int[] a = {42,17,56,98,76,33,24,15,15,29};
  
    public static int[] scan(int[] a, IntOperation op){
 
    }

    public static int[] scanAdd(int[] a) {
        return scan(a, ...); // TODO: implement (Aufgabe 15b (i))
    }
  
    public static int[] scanMul(int[] a) {
        return scan(a, ...); // TODO: implement (Aufgabe 15b (ii))
    }
  
    public static int[] scanMax(int[] a) {
        return scan(a, ...); // TODO: implement (Aufgabe 15b (iii))
        // hier darf Math.max(...) verwendet werden!
    }

  
    public static void main(String[] args) {
        int[] aAdd = scanAdd(a);
        int[] aMul = scanMul(a);
        int[] aMax = scanMax(a);
      
        final String s = "\t(%s) Scan mit %s auf: %s = %s\n";
        System.out.printf(String.format(s, "i",   "Addition", Arrays.toString(a), Arrays.toString(aAdd)));
        System.out.printf(String.format(s, "ii",  "Multiplikation", Arrays.toString(a), Arrays.toString(aMul)));
        System.out.printf(String.format(s, "iii", "Maximum", Arrays.toString(a), Arrays.toString(aMax)));
    }

    @Override
    public int evaluate(int x, int y) {
  
        return y;  
    }
}

Was muss ich mit diese zwei Methoden machen.
Java:
public static int[] scan(int[] a, IntOperation op){
}
Java:
public int evaluate(int x, int y) {
  
        return y;  
    }
Sind hier x und y Array Index?[/code]
 
Zuletzt bearbeitet:
Du sollst die drei möglichen Ausprägungen des ⊕ Operators als jeweils eigene Implementierung/Klasse des IntOperation Interfaces realisieren. In dessen eval-Methode sollst du dann das tun, was die drei Implementierungen des Operators machen sollen.
Es sollte also nur eine einzige `public static int[] scan(int[] a, IntOperation op)` Methode geben, die eben eine Instanz einer IntOperation-Klasse bekommt, und dann das Ergebnisarray mit den Berechnungen befüllt.
 
So steht in der Aufgabe: "Schreiben Sie ein Funktionales Interface IntOperation in Java, welches eine Methode mit dem Namen evaluate hat, die zwei Ganzzahlen vom Typ int entgegennimmt und eine Ganzzahl vom Typ int zurückgibt."
Ich habe nur eine Methode im Interface uns das sieht so aus
Java:
public interface IntOperation {
    int evaluate(int x, int y);
}
Meine Methode bekommt nur zwei Werte x und y nicht dritter Wert op diese op kann Adition Multiplikation oder Max sein. Wie der Name von der Funktion sagt die Funktion muss etwas auswerten, aber wie wenn ich nicht dritte Parameter habe. Ich kann nur z.B nur addieren oder multiplizieren aber kann doch nicht schreiben drei Funktion mit den gleiche Signatur für Addition Multiplikation und Max.

Ich verstehe diese Teil auch nicht
Java:
(int[] a, IntOperation op)
"IntOperation op" ist eine Interface welches eine Methode mit zwei int Parameter hat, wie kann ich da vorstellen?
 
Die Implementierungsklasse des IntOperation Interfaces, die du - wie gesagt - noch für die drei Operationen schreiben musst, gibt an, welche konkrete Operation im evaluate() durchgeführt wird. Du benötigst also noch drei Klassen, etwa AddOperation, MultiplyOperation und MaxOperation, die als Klassen jeweils das IntOperation Interface implementieren.
In diesen Klassen kannst du dann die jeweilige Operation implementieren.
 
Ich habe so was geschrieben die nicht ganz korrekt ist, aber ich glaube die Richtung ist korrekt.
Java:
public static int[]z;
    public static int[] scan(int[] a, IntOperation op) {
        z = new int[a.length];
        z[0] = a[0]; 
        for(int i = 1; i < a.length; i++){
            z[i] = evaluate(z[i-1], a[i]); //Diese Zeile macht bisschen Probleme aber werde ich was ausdenken. 
        }
        return z;
    }
und Die drei Klassen für die Addition Multiplikation und Max
Java:
public class MultOperation implements IntOperation{
    @Override
    public int evaluate(int x, int y) {
       
        return (x * y);
    }
}
Java:
public class AddOperation implements IntOperation{

    @Override
    public int evaluate(int x, int y) {
       
        return (x + y);
    }
}
Java:
public class MaxOperation implements IntOperation{

    @Override
    public int evaluate(int x, int y) {
       
        return Math.max(x, y);
    }
   
}
und Meine Interface Klasse
Java:
public interface IntOperation {
    int evaluate(int x, int y);
}
So meine Fragen gehe ich jetzt richtige Richtung?
Wie kann ich Operation übergeben?
 
Na, das sieht doch schon ganz gut aus. Der Aufruf von evaluate() soll natürlich von dem übergebenen `op` kommen.
Du übergibst jetzt die Operation, indem du eine neue Instanz der Operationsklasse (per Java `new` Operator) beim Aufruf von scan() als zweites Argument übergibst.
Und erzeuge das `z` Array bitte als lokale Variable innerhalb der scan() Methode und nicht als globale static Variable.
 
Der Aufruf von evaluate() soll natürlich von dem übergebenen `op` kommen
Das bedeutet, dass ich in der scan Methode entweder if else oder switch case Anweisung haben soll um zu identifizieren welche Methode man aufrufen soll?

indem du eine neue Instanz der Operationsklasse (per Java `new` Operator) beim Aufruf von scan() als zweites Argument übergibst.
Das verstehe ich nicht. Ich kann so was nicht schreiben
Java:
IntOperation operation = new IntOperation();
, weil IntOperation eine Interface ist. Meintest du was anderes?

Ich verstehe auch nicht genau, wieso in der Aufgabe eine Interface IntOperation Klasse gefordert ist.
 
Das bedeutet, dass ich in der scan Methode entweder if else oder switch case Anweisung haben soll um zu identifizieren welche Methode man aufrufen soll?
Nein. Du sollst einfach die evaluate() Methode der als `op` Parameter übergebenen IntOperator Instanz aufrufen.

Das verstehe ich nicht. Ich kann so was nicht schreiben ...snip...
Das sollst du ja auch nicht. Du sollst natürlich die konkrete Klasse der Operation instanziieren.

Bist du sicher, dass du soetwas wie "Polymorphismus" und "Vererbung" schon gelernt hast?
 
Ok, letzte frage für heute 🙁
du meinst so ja?
Java:
public static int[] scanAdd(int[] a) {
        AddOperation addOp = new AddOperation();
        return scan(a, addOp); 
       
    }
 
Das kannst Du so machen. Um deutlich zu machen, dass es Dir eigentlich egal ist, dass es sich hier um eine AddOperation-Instanz handelt, kannst Du auch
Code:
IntOperation addOp = new AddOperation();
schreiben.

Du kannst aber die ganze Geschichte auch verkürzen, indem Du die Variable einfach ganz weg lässt:
Code:
return scan(a, new AddOperation());
 
Hallo, ich bin es wieder, wie kann ich die Methode, die von der Interace erbe und überschreibe implementieren?
Meine Interface Klasse
Java:
public interface IntOperation {
    int evaluate(int x, int y);
}
Und diese Methode in Andere klasse überschrieben welches von der Interface erbt.
Java:
@Override
    public int evaluate(int x, int y) {
                         // x + y; ich kann so was nicht schreiben, weil ja es könnte auch Multiplikation oder Max    //Operation sei
        return ?;
    }
 
Zuletzt bearbeitet:
Durcheinander vielleicht bin ich gekommen, aber ich verstehe Grundkonzept von dieser Aufgabe.
Java:
public static int[] scan(int[] a, IntOperation op) {}
Wie kann ich diese op benutzen und wie implementiere meine evaluate Methode verstehe ich nicht.
 
Durcheinander vielleicht bin ich gekommen, aber ich verstehe Grundkonzept von dieser Aufgabe.
Java:
public static int[] scan(int[] a, IntOperation op) {}
Wie kann ich diese op benutzen und wie implementiere meine evaluate Methode verstehe ich nicht.

Du warst doch schon zu 99.99% fertig... in deinem anderen Beitrag:
Java:
public static int[]z;
    public static int[] scan(int[] a, IntOperation op) {
        z = new int[a.length];
        z[0] = a[0];
        for(int i = 1; i < a.length; i++){
            z[i] = evaluate(z[i-1], a[i]); //Diese Zeile macht bisschen Probleme aber werde ich was ausdenken.
        }
        return z;
    }

Verstehe doch bitte, dass der Operator der scan() Methode hier als `IntOperation op` Parameter übergeben wird und du einfach nur die evaluate() Methode auf dem IntOperation-Objekt aufrufen musst...
 
Ok ich glaube ich habe es hingekriegt. Die Ergebnisse kommen auch richtig raus, glaube ich zumindest.
Eine Frage habe ich trotzdem.
In diesem Methode
Code:
@Override
    public int evaluate(int x, int y) {  
        return (x + y);  // egal was ich hier schreibe + - oder * das Ergebnis ist immer gleich. Wieso? 
 // und was soll ich hier genau schreiben ein + - oder * ?
    }
Noch eine Frage so was wurde ich niemals in der Klausur lösen können. Wo kann ich ähnliche Übungen finden?
Ich meine
Java:
 (int[] a, IntOperation op)
IntOperation op diese Variable von der Klasse IntOperation war sehr schwer zu verstehen wie man das anwenden sollte.

Und letztens eine riesen Dankeschön für eure Geduld und Hilfe.
 
Noch eine Frage so was wurde ich niemals in der Klausur lösen können.
Doch. Du hast entweder nur das Prinzip noch nicht verstanden oder denkst einfach zu kompliziert.

Mal eine Aufgabe: implementiere eine Methode mit einem String als Parameter und einem int als Rückgabewert. Die Methode soll die Anzahl der im übergebenen String enthaltenen Ziffern liefern.
 
Mal eine Aufgabe: implementiere eine Methode mit einem String als Parameter und einem int als Rückgabewert. Die Methode soll die Anzahl der im übergebenen String enthaltenen Ziffern liefern.
Ich würde so lösen und das War sehr leicht.
Java:
public static int anzahlVonCharachters(String str) {
        int zaeler = 0;
        for(int i = 0; i < str.length(); i++) {
            if(Character.isDigit(str.charAt(i))){   
                zaeler++;
            }
        }
        return zaeler; 
    }
Meine Frage war noch in diesem Methode
Java:
@Override
    public int evaluate(int x, int y) {
        return (x + y);
    }
wenn ich Plus Zeichen oder Minus Zeichen oder Mal Zaichen schreibe das Ergebnis ist immer gleich wie kommt das? was muss ich genau in diesem Methode schreiben?
 
Ich würde so lösen und das War sehr leicht.
Schön. Du hast in der Methode die Methoden eines übergebenen Objekts benutzt, hier die Methoden eines Objekts vom Typ String: str.charAt() und str.length(). Du weißt nicht, wie String implementiert ist. Du weißt nur, was die Methoden liefern.

Genauso funktioniert das mit IntOperation: Du bekommst ein Objekt übergeben, das vom Typ IntOperation ist (genauer: ein Objekt, dessen Typ die IntOperation-Schnittstelle implementiert). Du weißt nicht, wie IntOperation implementiert ist, Du weißt nur, was die Methode evaluate liefern soll, nämlich das Ergebnis einer Berechnung zweier Operanden.

Nächste Aufgabe (damit sollte auch Deine Frage beantwortet sein): Schreibe eine Metode, die als Parameter eine ganzzahlige Operation (Typ ist also IntOperation) erhält, die Operation für die Parameter 5 und 10 durchführt und das Doppelte des Ergebnisses ausgibt (also 2 * operation(5,10)).

Rufe zum Test die Methode einmal mit einer Instanz von AddOperation und einmal mit einer Instanz von MultOperation auf.

Ausgabe müsste für die AddOperation 30, für die MultOperation 100 sein.
 
Ich habe so gemacht,
Java:
public static int berechneA1(IntOperation  op) {
    return    2 * op.evaluate(5, 10);
    }
Und in Mein Klass so geschrieben.
Java:
  IntOperation  op1 = new AddOperation();
  System.out.println("\n" + Scan.berechneA1(op1));
  IntOperation op2 = new MultOperation();
  System.out.println("\n" + Scan.berechneA1(op2));

Und die evaluate Methode so
Java:
@Override
    public int evaluate(int x, int y) {  
        return this.evaluate(x, y);
    }
Ist das alles Richtig?
 
Ich habe mal eine Frage zum ursprünglichen Übungsblatt, da ich dies auch bekommen habe 🙂

Wie kann ich in 15b) die drei Operatoren einbinden, wenn ich nur die vorgegebenen Methoden aus der Scan Datei benutze? Hier wurden jetzt, wenn ich es richtig gelesen habe, drei neue Klassen angelegt und in der Methode wurde dann nur die Klasse aufgerufen. Ich soll aber keine neue Klassen oder Methoden benutzen.
 
Wie dürfen wir keine neue Klassen erstellen?
Ich habe nur drei Klassen erstellt mit eigene Methoden, die Programm Code habe ich auch hier gepostet.

ich habe genau das gleiche Blatt, nur steht noch ein Satz mehr drunter:
"Implementieren Sie die drei Operationen jeweils in den Methoden scanAdd, scanMul und scanMax! Nutzen Sie dazu bitte die in der Klasse Scan bereits vorhandenen Methoden."

Wo soll die denn vorkommen?


Dann zielt der Aufgabensteller vermutlich auf Lambdas ab.
Das ist auch der nächste Punkt im Skript, den habe ich aber noch nicht verstanden :/
 
@Bobi hat ja drei Klassen geschrieben. Damit ließe sich implementieren:
Java:
public static int[] scanMul(int[] a) {
    return scan(a, new MultOperation());
}
Es gibt aber auch die Möglichkeit anonymer Klassen, d. h. die Implementierung von Klassen, ohne diesen einen Namen zu geben. Das sähe dann so aus:
Java:
public static int[] scanMul(int[] a) {
    return scan(a, new IntOperation() {
        public int evaluate(int a, int b) {
            return a*b;
        }
    }));
}
Klassen sind OO-typisch. In der funktionalen Programmierung steht die Funktion im Vordergrund. Auch hier gibt es die Möglichkeit, anonyme Funktionen zu erzeugen. Diese werden als Lambdas bezeichnet. Um die Funktionale Programmierung in Einklang mit dem Java-Typsystem zu bekommen, hat man funktionale Interfaces eingeführt. Das sind Interfaces, die die Implementierung von nur einer Methode verlangen. Zum Beispiel
Java:
public interface IntOperation {
    int evaluate(int a, int b);
}
Mathematisch entspräche dies einer Funktion evaluate:int x int -> int. Das wäre die Deklaration. Die Definition, also das, was hier tatsächlich berechnet wird, fehlt aber noch.

Eine anonyme Funktion (Lambda), die diese Funktion derart implementiert, dass eine Multiplikation berechnet wird, würde in Java so aussehen: (a, b) -> a*b

Tatsächlich kann man also schreiben
Java:
public static int[] scanMul(int[] a) {
    return scan(a, (a,b) -> a*b);
}
EDIT: Oops a ist ja schon Parameter, das funktioniert natürlich nicht:
Java:
public static int[] scanMul(int[] a) {
    return scan(a, (x,y) -> x*y);
}
 
Zuletzt bearbeitet:

Zurück
Oben