TU Wien:Einführung in die Programmierung 2 VU (Puntigam)/Test 2 2018S
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;
}
}