TU Wien:Einführung in die Programmierung 2 VU (Puntigam)/Test 2 2018S

Aus VoWi
Zur Navigation springen Zur Suche springen

Interval[Bearbeiten | Quelltext bearbeiten]

Media:TU Wien-Einführung in die Programmierung 2 VU (Puntigam) - Test 2 2018S a.pdf

package interval;
import java.util.*;
/**
 * A1
 * Schreiben bzw. vervollständigen Sie bitte gekennzeichnete Programmteile wie in den Kommentaren beschrieben.
 * Verändern Sie aber nicht vorgegebene Methodenköpfe oder andere vorgegebene Programmteile.
 * Neben den Testfällen in 'main' müssen auch alle Zusicherungen in den Kommentaren und Bedingungen
 * auf dem Aufgabenblatt gelten.
 */

public class PraxisAufgabe {

    /*
    Aufgabe: siehe Angabeblatt

        Ergänzen Sie bitte fehlende Teile der Klassen
        an den mit TODO gekennzeichneten Stellen.
        Auch für teilweise korrekte Lösungen werden Punkte vergeben.

    */

    // 'main' enthält vorgefertigte Testfälle jeweils mit Sollausgabe als Kommentar.
    // Ergänzen weiterer Testfälle ist hier erlaubt.
    // Das Testen wird nicht beurteilt.
    public static void main(String[] args) {
        Interval i1 = new NonEmpty(-1, 10);
        Interval i2 = new NonEmpty(5, 20);
        Interval i3 = new NonEmpty(20, 25);

        try {
            i3 = new NonEmpty(20, -25);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage()); // lower (20) must not be greater than upper (-25)!
        }

        System.out.println(i1.intersect(i2)); //[5, 10]
        System.out.println(i2.intersect(i3)); //[20, 20]
        System.out.println(i1.intersect(i3)); //[]

        System.out.println(i1.containsAll(i1.intersect(i2))); // true

        Iterator iter = Empty.EMPTY.iterator();
        try {
            iter.next();
        } catch (NoSuchElementException e) {
            System.out.println(e.getMessage()); // EMPTY has no elements!
        }

        Interval i4 = new NonEmpty(-5, 20);

        System.out.println();
        System.out.println("My tests");
        System.out.println(i1.intersect(i4));
        System.out.println(i4.intersect(i1));
        System.out.println(i1);
        for (int i : i1) {
            System.out.print(i + " ");
        }
        System.out.println();
        System.out.println(i1 + " " + i2);
        System.out.println(i1.containsAll(i2));

        System.out.println(Empty.EMPTY.equals(Empty.EMPTY));
        System.out.println(Empty.EMPTY.hashCode());

        Interval i5 = new NonEmpty(-5, 20);
        Interval i6 = new NonEmpty(-5, 20);

        System.out.println(i5.equals(Empty.EMPTY));
        System.out.println(i5.equals(i6));
        System.out.println(i5.hashCode());
    }
}

// Ein 'Interval' ist eine aufsteigend iterierbare Menge
// von aufeinander folgenden ganzen Zahlen und stellt einfache
// Mengenoperationen zur Verfügung.
interface Interval extends Iterable {

    // liefert 'true' genau dann, wenn 'n' in der Menge enthalten ist
    boolean contains(Integer n);

    // liefert 'true' genau dann, wenn alle Zahlen aus 'iv' enthalten sind.
    boolean containsAll(Interval iv);

    // liefert ein Objekt von 'Interval', das der Schnittmenge mit 'iv' entspricht.
    Interval intersect(Interval iv);

    // liefert 'true' genau dann, wenn das Objekt die leere Menge repräsentiert.
    boolean isEmpty();

    // liefert 'true' genau dann, wenn die Menge genau die gleichen Zahlen
    // enthält wie 'o' (und 'o' auch ein 'Interval'-Objekt ist).
    boolean equals(Object o);

    // liefert den hashcode
    int hashCode();
}

// Iterierbare Objekte mit ganzzahligen Elementen
interface Iterable extends java.lang.Iterable<Integer> {
    Iterator iterator();
}

// Ein Iterator über ganze Zahlen.
interface Iterator extends java.util.Iterator<Integer> {
    boolean hasNext();

    Integer next();
}

// 'Empty' repräsentiert die leere Menge.
class Empty implements Interval {

    // Öffentliches Objekt zur Repräsentation der leeren Menge.
    public static final Empty EMPTY = new Empty();

    // Konstruktor (wird nur von 'Empty' genutzt)
    private Empty() {
    }

    @Override
    public boolean contains(Integer n) {
        return false;
    }

    @Override
    public boolean containsAll(Interval iv) {
        return false;
    }

    @Override
    public Interval intersect(Interval iv) {
        return null;
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

    @Override
    public Iterator iterator() {
        return null;
    }

    @Override
    public String toString() {
        return "";
    }
}

// 'NonEmpty' repräsentiert eine aufsteigend iterierbare Menge von aufeinander folgenden ganzen Zahlen,
// die mindestens eine Zahl enthält. 'NonEmpty' wird durch Untergrenze 'lower' und Obergenze 'upper'
// des Intervalls bestimmt.
class NonEmpty implements Interval {

    //TODO: Klasse implementieren
    private int lower;
    private int upper;

    public NonEmpty(int lower, int upper) {
    }

    @Override
    public boolean contains(Integer n) {
        return false;
    }

    @Override
    public boolean containsAll(Interval iv) {
        return false;
    }

    @Override
    public Interval intersect(Interval iv) {
        return null;
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

    @Override
    public Iterator iterator() {
        return null;
    }

    @Override
    public String toString() {
        return "";
    }

    @Override
    public boolean equals(Object o) {
        return false;
    }

    @Override
    public int hashCode() {
        return 0;
    }
}

Expression[Bearbeiten | Quelltext bearbeiten]

package expression;
import java.util.*;

/**
 * B3
 * Schreiben bzw. vervollständigen Sie bitte gekennzeichnete Programmteile wie in den Kommentaren beschrieben.
 * Verändern Sie aber nicht vorgegebene Methodenköpfe oder andere vorgegebene Programmteile.
 * Neben den Testfällen in 'main' müssen auch alle Zusicherungen in den Kommentaren und Bedingungen
 * auf dem Aufgabenblatt gelten.
 */

public class PraxisAufgabe {

    /*
    Aufgabe: siehe Angabeblatt

        Ergänzen Sie bitte fehlende Teile der Klassen
        an den mit TODO gekennzeichneten Stellen.
        Auch für teilweise korrekte Lösungen werden Punkte vergeben.

    */

    // 'main' enthält vorgefertigte Testfälle jeweils mit Sollausgabe als Kommentar.
    // Ergänzen weiterer Testfälle ist hier erlaubt.
    // Das Testen wird nicht beurteilt.
    public static void main(String[] args) {

        Expression a = new Sum(new Sum(new Number(5),new Number(-3)),new Number(7));
        System.out.println(a); // 5-3+7

        a = a.add(new Number(-10));
        System.out.println(a); // 5-3+7-10
        
        for (Integer i: a) {
            System.out.print(i+" ");
        }
        System.out.println();
        // 5 -3 7 -10

        Expression n = new Number(13);
        Iterator iter = n.iterator();
        System.out.println(iter.hasNext()); // true
        System.out.println(iter.next()); // 13

        try {
            System.out.println(iter.next());
        } catch(NoSuchElementException e) {
            System.out.println(e.getMessage()); // No more numbers!
        }

        a = a.add(a);
        System.out.println(a); // 5-3+7-10+5-3+7-10

        System.out.println(a.eval()); // -2
    }
}

// Iterierbare Objekte mit ganzzahligen Elementen
interface Iterable extends java.lang.Iterable<java.lang.Integer> {
    Iterator iterator();
}

// Ein Iterator über ganze Zahlen.
interface Iterator extends java.util.Iterator<java.lang.Integer> {
    boolean hasNext();
    java.lang.Integer next();
}

// Repräsentiert einen konstanten arithmetischen Summenausdruck
// (Ausdruck in dem Zahlen durch Addition verknüpft werden).
interface Expression extends Iterable {
    // Liefert den Wert des Ausdrucks.
    int eval();

    // Liefert eine lesbare Darstellung des Ausdrucks ohne Klammern.
    String toString();

    // Liefert einen neuen Ausdruck, in dem 'exp' als rechter Summand hinzugefügt wurde.
    Expression add(Expression exp);
}

// Diese Klasse repräsentiert eine ganze Zahl. Ihr Iterator liefert nur eine Zahl und ist danach verbraucht.
class Number implements Expression {

    public Number(int num) {}

    public int eval() { return 0; }

    public Sum add(Expression exp) { return null; }

    public String toString() {
        return "";
    }

    public Iterator iterator() { return null; }
}

// Eine Summe mit linkem und rechtem Summanden. Der Iterator iteriert über alle Zahlen des Ausdrucks von links nach rechts.
class Sum implements Expression {

    // Konstruktor
    public Sum(Expression left, Expression right) {
    }

    public Sum add(Expression exp) { return null; }

    public int eval() {
        return 0;
    }

    public Iterator iterator() { return null; }

    public String toString() {
        return "";
    }
}

Generator[Bearbeiten | Quelltext bearbeiten]

package generator;
import java.util.*;

/**
 * D1
 * Schreiben bzw. vervollständigen Sie bitte gekennzeichnete Programmteile wie in den Kommentaren beschrieben.
 * Verändern Sie aber nicht vorgegebene Methodenköpfe oder andere vorgegebene Programmteile.
 * Neben den Testfällen in 'main' müssen auch alle Zusicherungen in den Kommentaren und Bedingungen
 * auf dem Aufgabenblatt gelten.
 */

public class PraxisAufgabe {

    /*
    Aufgabe: siehe Angabeblatt

        Ergänzen Sie bitte fehlende Teile der Klassen
        an den mit TODO gekennzeichneten Stellen.
        Auch für teilweise korrekte Lösungen werden Punkte vergeben.

    */

    // 'main' enthält vorgefertigte Testfälle jeweils mit Sollausgabe als Kommentar.
    // Ergänzen weiterer Testfälle ist hier erlaubt.
    // Das Testen wird nicht beurteilt.
    public static void main(String[] args) {

        Generator s = new Range(-5, 5);
        while (s.hasNext()) {
            System.out.print(s.next() + " ");
        }
        System.out.println();
        // -5 -4 -3 -2 -1 0 1 2 3 4 5

        s = new Range(-10, 5);
        FilteredGenerator f = new FilterMultiples(s, 2);

        System.out.println(f.next());
        // -9

        System.out.println(s.next());
        // -8

        FilteredGenerator g = f.copy();
        while (g.hasNext()) {
            System.out.print(g.next() + " ");
        }
        System.out.println();
        // -7 -5 -3 -1 1 3 5

        System.out.println(s.next());
        // -7
        System.out.println(f.next());
        // -5

        try {
            System.out.println(g.next());
        } catch (NoSuchElementException e) {
            System.out.println(e.getMessage());
            // FilterMultiples has no more numbers!
        }

        // Folgende Schleife gibt nur Primzahlen aus (Sieb des Eratosthenes):
        Generator primes = new Range(2, 50);
        while (primes.hasNext()) {
            int prime = primes.next();
            System.out.print(prime + " ");
            primes = new FilterMultiples(primes, prime);
        }
        // 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
    }
}

// Ein Generator liefert ganze Zahlen. Liefert 'hasNext()' den Wert 'false', ist der Generator verbraucht.
interface Generator {
    // liefert 'true' genau dann, wenn der Generator noch mindestens eine weitere Zahl liefert kann.
    boolean hasNext();

    // liefert die nächste ganze Zahl unter der Vorbedingung, dass 'hasNext()' den Wert 'true' liefert.
    Integer next();

    // liefert eine unabhängige Kopie (tiefe Kopie) des Generators in seinem aktuellen Zustand.
    Generator copy();
}

// Ein Generator, der nur bestimmte Zahlen liefern kann.
// Alle Zahlen 'i', für die 'pass(i)' den Wert 'false' liefert,
// können nicht Element der gelieferten Zahlenfolge sein.
interface FilteredGenerator extends Generator {
    // liefert 'true', wenn 'i' vom Filter durchgelassen wird.
    boolean pass(int i);

    // liefert eine unabhängige Kopie des Generators in seinem aktuellen Zustand.
    FilteredGenerator copy();
}

// 'Range' ist ein Generator der aufsteigenden Folge von aufeinander folgenden ganzen Zahlen im
// bestimmten Intervall von 'first' bis 'last' (inklusive).
// Der Generator liefert nur dann mindestens eine Zahl, wenn gilt first <= last,
// sonst liefert er keine Zahl.
class Range implements Generator {
    public Range(int first, int last){
    }

    @Override
    public boolean hasNext() {
        return false;
    }

    public Integer next(){
        return null;
    }

    @Override
    public Generator copy() {
       return null;
    }
}

// Ein 'FilterMultiples'-Objekt erzeugt aus einer Datenquelle 'source' eine gefilterte Zahlenfolge.
// Alle Zahlen, die durch 'div' teilbar sind, sind nicht Teil der gefilterten Folge.
// Alle übrigen Zahlen von 'source' sind Teil der gefilterten Folge.
// hasNext() und next() beziehen sich auf die gefilterte Folge.
class FilterMultiples implements FilteredGenerator {
    //TODO: Fehlende Teile der Klasse implementieren

    public FilterMultiples(Generator source, int div) {
    }

    @Override
    public boolean pass(int i) {
        return false;
    }

    @Override
    public FilteredGenerator copy() {
        return null;
    }

    @Override
    public boolean hasNext() {
        return false;
    }

    @Override
    public Integer next() {
        return null;
    }
}