TU Wien:Programmierparadigmen VU (Puntigam)/PP Test 1 2025WS
Test 1 in Programmierparadigmen am 24.11.2025[Bearbeiten | Quelltext bearbeiten]
Aufgabe 1 (10 Punkte)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie jedes Auswahlfeld, bei dem die links stehende Aussage eine Eigenschaft der darüber stehenden Abstraktionsart ist. Es können keines, eines oder mehrere Felder pro Zeile auszuwählen sein.
| strukturell | nominal | λ-Abstraktion | |
|---|---|---|---|
| Kommentare haben dafür keine Bedeutung, sie werden ignoriert | |||
| eine Variable, die eine Funktion enthält, kann von dieser Art sein | |||
| Änderung des Namens einer Methode ändert die Abstraktion | |||
| Änderung der Signatur einer Methode ändert die Abstraktion | |||
| eine abstrakte Methode ohne Kommentar ist von dieser Art | |||
| diese Art ist in der objektorientierten Programmierung essenziell | |||
| durch Kommentare beschriebene Methode ist von dieser Art | |||
| Basisabstraktionen beruhen auf (oder ähneln) dieser Art | |||
| inhaltliche Änderung eines Kommentars ändert die Abtraktion | |||
| inhaltliche Änderung der Programmcodes ändert die Abstraktion |
Aufgabe 2 (10 Punkte)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie jedes Auswahlfeld, bei dem die links stehende Aussage eine Eigenschaft der darüber stehenden Regel des λ-Kalkül ist. Es können keines, eines oder mehrere Felder pro Zeile auszuwählen sein.
| α-Konversion | β-Reduktion | η-Reduktion | |
|---|---|---|---|
| ist von der Form: | |||
| ist von der Form: | |||
| ist mit von der Form: | |||
| ist mit von der Form: | |||
| ist von der Form: | |||
| wendet eine λ-Abstraktion auf ein Argument an | |||
| kann eine λ-Abstraktion auch ohne Argument vereinfachen | |||
| wird zur Umbenennung von Parametern verwendet | |||
| ist auf eine Normalform nicht anwendbar | |||
| ist nur von links nach rechts anwendbar |
Aufgabe 3 (10 Punkte)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie jedes Auswahlfeld, bei dem die links stehende Aussage eine Eigenschaft der darüber stehende Modularisierungseinheit zutrifft. Es können keines, eines oder mehrere Felder pro Zeile auszuwählen sein.
| Modul | Komponente | Klasse | Objekt | |
|---|---|---|---|---|
| definiert sich über Identität, Zustand und Verhalten | ||||
| wird durch "Deployment" eingebunden | ||||
| erlaubt zyklische Abhängigkeiten | ||||
| dient als Vorlage für die Objekterzeugung | ||||
| Inhalte davon sind in Java durch gekennzeichnet | ||||
| ist per Definition eine Übersetzungseinheit | ||||
| kann zur Laufzeit erzeugt werden | ||||
| ist bereits dem Compiler bekannt | ||||
| lässt offen, von wo Inhalte importiert werden | ||||
| bildet einen Namensraum |
Aufgabe 4 (10 Punkte)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie in jeder Zeile das eine Auswahlfeld, bei dem die links stehende Aussage für das darüber stehende Paradigma am besten zutrifft.
| objektorientiert | prozedural | funktional | |
|---|---|---|---|
| hoher Abstraktionsgrad bei struktureller und λ-Abstraktion | |||
| referentielle Transparenz ist gewährleistet | |||
| Aliase sind möglichst zu vermeiden | |||
| offensiver Umgang mit Aliasen (sind sichtbar und häufig) | |||
| relativ einfache Beweisführung bei λ-Abstraktion | |||
| keine Unterscheidung zwischen Original und Kopie (Daten) | |||
| Kommunikation über gemeinsame Variablen wird verhindert | |||
| Kommunikation über Variablen wird örtlich eingegrenzt | |||
| Kontrollfluss muss stets nachvollziehbar sein | |||
| gemeinsame Variablen sind nur sparsam einzusetzen |
Aufgabe 5 (10 Punkte)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie in jeder Zeile das eine Auswahlfeld, bei dem die links stehende Aussage für das darüber stehende Paradigma am besten zutrifft.
| objektorientiert | prozedural | funktional | nebenläufig | parallel | |
|---|---|---|---|---|---|
| Rekursion statt Schleifen | |||||
| verlangt hohen Hardwareeinsatz | |||||
| effiziente Reaktion auf Ereignisse | |||||
| für hardwarenahe Programme geeignet | |||||
| Gleichheit / Identität unterschieden | |||||
| Datenbereiche unabhängig bearbeitbar | |||||
| meist stark, nicht statisch typisiert | |||||
| verschiedenartige Daten als Einheit | |||||
| viele Möglichkeiten zur Faktorisierung | |||||
| bewältigt viele Handlungsstränge |
Aufgabe 6 (10 Punkte)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie in jeder Zeile das eine Auswahlfeld, bei dem die links stehende Aussage für das darüber stehende Paradigma am besten zutrifft.
| objektorientiert | prozedural | funktional | nebenläufig | parallel | |
|---|---|---|---|---|---|
| gut für große, langlebige Projekte | |||||
| gut für komplexe Algorithmen | |||||
| am häufigsten eingesetztes Paradigma | |||||
| der Speedup ist entscheidend | |||||
| Interprozesskommunikation oft nötig | |||||
| Synchronisation (z. B. Monitor) nötig | |||||
| Programmablauf ist gut kontrollierbar | |||||
| es wird häufig auf Ergebnisse gewartet | |||||
| unterstützt algebraische Datentypen | |||||
| gut für Programmierung im Groben |
Aufgabe 7 (10 Punkte)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie in jeder Zeile das eine Auswahlfeld, bei dem der links stehende Begriff am ehesten mit dem darüber stehenden Begriff zusammenhängt ("ist" oder "ist Variante von" oder "ist von Bedeutung für").
| Liveness | Ersetzbarkeit | Parametrisierung | kovariant | kontravariant | invariant | |
|---|---|---|---|---|---|---|
| Deadlock | ||||||
| Variablentyp | ||||||
| Design-by-Contract | ||||||
| Aspekt | ||||||
| Ergebnistyp | ||||||
| Generizität | ||||||
| Starvation | ||||||
| Eingangsparametertyp | ||||||
| Annotation | ||||||
| Untertyp |
Aufgabe 8 (10 Punkte)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie jedes Auswahlfeld, bei dem die links stehende Aussage eine Eigenschaft der darüber stehende Art von Zusicherung ist. Es können keines, eines oder mehrere Felder pro Zeile auszuwählen sein.
| Vorbed. | Nachbed. | Invariante | Client-kontroll. History-Constr. | Server-kontroll. History-Constr. | |
|---|---|---|---|---|---|
| zuständig ist ausnahmslos der Server | |||||
| Server und Client (in Sonderfällen) sind zuständig | |||||
| zuständig ist ausnahmslos der Client | |||||
| schränkt die Aufrufreihenfolge von Methoden ein | |||||
| im Untertyp stärker oder gleich als im Obertyp | |||||
| im Untertyp schwächer oder gleich als im Obertyp | |||||
| gilt zu Beginn einer Methodenausführung | |||||
| gilt am Ende einer Methodenausführung | |||||
| bezieht sich auf einzelne Methoden | |||||
| bezieht sich immer auf Objektzuständen von |
Aufgabe 9 (10 Punkte)[Bearbeiten | Quelltext bearbeiten]
Folgende Klasse ist gegeben:
public class RangeChecker {
private int min = Integer.MIN_VALUE, max = Integer.MAX_VALUE;
public void set(int a, int b) { this.min = a, this.max = b; }
public int in(int i) { return i > min ? (i < max ? i : max) : min; }
}
Bitte markieren Sie in jeder Zeile ein Auswahlfeld, bei dem die links stehende Aussage am ehesten eine auf die Klasse bezogene Zusicherung der über dem Auswahlfeld stehenden Art sein kann.
| Vorbed. | Nachbed. | Invariante | Client-kontroll. History-Constr. | Server-kontroll. History-Constr. | |
|---|---|---|---|---|---|
| und | |||||
| und | |||||
| wenn zwischen und liegt | |||||
| ist nur aufrufbar wenn | |||||
| wenn | |||||
| nach gilt und | |||||
| kann nur größer und kleiner werden | |||||
| ist vor erstem Aufruf von aufzurufen |
Aufgabe 10 (10 Punkte)[Bearbeiten | Quelltext bearbeiten]
Folgende Klasse ist gegeben:
public class Buffer {
private int b[8], i, o;
public boolean set(int v) { if(b[i] != 0) return false; b[i] = v; i = (i + 1) % 8; return true; }
public int get() { if (b[o] == 0) return 0; int r = b[o]; o = (o + 1) % 8; return r; }
}
Bitte markieren Sie in jeder Zeile ein Auswahlfeld, bei dem die links stehende Aussage am ehesten eine auf die Klasse bezogene Zusicherung der über dem Auswahlfeld stehenden Art sein kann.
| Vorbed. | Nachbed. | Invariante | Client-kontroll. History-Constr. | Server-kontroll. History-Constr. | |
|---|---|---|---|---|---|
| nur aufrufbar wenn davor aufgerufen | |||||
| erhöht um 1 mod. 8 oder retourniert | |||||
| und liegen im erlaubten Indexbereich von | |||||
| liefert Werte in Reihenfolge des Einfügens | |||||
| , und Arrayeinträge sind mit 0 initialisiert | |||||
| und nur so änderbar: modulo 8 um 1 erhöht | |||||
| fügt in Buffer ein oder retourniert false | |||||
| retourniert 0 wenn der Buffer leer ist | |||||
| Werte ungleich 0 in sind gültige Buffereinträge | |||||
| darf nicht 0 sein |
Lösungen[Bearbeiten | Quelltext bearbeiten]
Die Lösungen sollten korrekt sein. Der Großteil meiner Antworten wurden als korrekt gewertet*, für die restlichen Antworten wurde in der Einsicht nachgefragt oder mit den Lehrveranstaltungsunterlagen korrigiert.
*(Anmerkung: Die Korrektur des PP-Teams ist jedoch inkonsistent und es könnte sein, dass bei meinem Test etwas als korrekt gewertet wurde, obwohl es das eigentlich nicht ist.)
Aufgabe 1 (Lösung)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie jedes Auswahlfeld, bei dem die links stehende Aussage eine Eigenschaft der darüber stehenden Abstraktionsart ist. Es können keines, eines oder mehrere Felder pro Zeile auszuwählen sein.
| strukturell | nominal | λ-Abstraktion | |
|---|---|---|---|
| Kommentare haben dafür keine Bedeutung, sie werden ignoriert | x | x | |
| eine Variable, die eine Funktion enthält, kann von dieser Art sein | x | x | |
| Änderung des Namens einer Methode ändert die Abstraktion | x | x | |
| Änderung der Signatur einer Methode ändert die Abstraktion | x | x | x |
| eine abstrakte Methode ohne Kommentar ist von dieser Art | x | ||
| diese Art ist in der objektorientierten Programmierung essenziell | x | ||
| durch Kommentare beschriebene Methode ist von dieser Art | x | ||
| Basisabstraktionen beruhen auf (oder ähneln) dieser Art | x | ||
| inhaltliche Änderung eines Kommentars ändert die Abtraktion | x | ||
| inhaltliche Änderung der Programmcodes ändert die Abstraktion | x |
Aufgabe 2 (Lösung)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie jedes Auswahlfeld, bei dem die links stehende Aussage eine Eigenschaft der darüber stehenden Regel des λ-Kalkül ist. Es können keines, eines oder mehrere Felder pro Zeile auszuwählen sein.
| α-Konversion | β-Reduktion | η-Reduktion | |
|---|---|---|---|
| ist von der Form: | |||
| ist von der Form: | x | ||
| ist mit von der Form: | x | ||
| ist mit von der Form: | x | ||
| ist von der Form: | |||
| wendet eine λ-Abstraktion auf ein Argument an | x | ||
| kann eine λ-Abstraktion auch ohne Argument vereinfachen | x | ||
| wird zur Umbenennung von Parametern verwendet | x | ||
| ist auf eine Normalform nicht anwendbar | x | x | |
| ist nur von links nach rechts anwendbar | x | x |
Aufgabe 3 (Lösung)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie jedes Auswahlfeld, bei dem die links stehende Aussage eine Eigenschaft der darüber stehende Modularisierungseinheit zutrifft. Es können keines, eines oder mehrere Felder pro Zeile auszuwählen sein.
| Modul | Komponente | Klasse | Objekt | |
|---|---|---|---|---|
| definiert sich über Identität, Zustand und Verhalten | x | |||
| wird durch "Deployment" eingebunden | x | |||
| erlaubt zyklische Abhängigkeiten | x | x | x | |
| dient als Vorlage für die Objekterzeugung | x | |||
| Inhalte davon sind in Java durch gekennzeichnet | x | |||
| ist per Definition eine Übersetzungseinheit | x | x | ||
| kann zur Laufzeit erzeugt werden | x | |||
| ist bereits dem Compiler bekannt | x | x | x | |
| lässt offen, von wo Inhalte importiert werden | x | |||
| bildet einen Namensraum | x | x | x | x |
Aufgabe 4 (Lösung)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie in jeder Zeile das eine Auswahlfeld, bei dem die links stehende Aussage für das darüber stehende Paradigma am besten zutrifft.
| objektorientiert | prozedural | funktional | |
|---|---|---|---|
| hoher Abstraktionsgrad bei struktureller und λ-Abstraktion | x | ||
| referentielle Transparenz ist gewährleistet | x | ||
| Aliase sind möglichst zu vermeiden | x | ||
| offensiver Umgang mit Aliasen (sind sichtbar und häufig) | x | ||
| relativ einfache Beweisführung bei λ-Abstraktion | x | ||
| keine Unterscheidung zwischen Original und Kopie (Daten) | x | ||
| Kommunikation über gemeinsame Variablen wird verhindert | x | ||
| Kommunikation über Variablen wird örtlich eingegrenzt | x | ||
| Kontrollfluss muss stets nachvollziehbar sein | x | ||
| gemeinsame Variablen sind nur sparsam einzusetzen | x |
Aufgabe 5 (Lösung)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie in jeder Zeile das eine Auswahlfeld, bei dem die links stehende Aussage für das darüber stehende Paradigma am besten zutrifft.
| objektorientiert | prozedural | funktional | nebenläufig | parallel | |
|---|---|---|---|---|---|
| Rekursion statt Schleifen | x | ||||
| verlangt hohen Hardwareeinsatz | x | ||||
| effiziente Reaktion auf Ereignisse | x | ||||
| für hardwarenahe Programme geeignet | x | ||||
| Gleichheit / Identität unterschieden | x | ||||
| Datenbereiche unabhängig bearbeitbar | x | ||||
| meist stark, nicht statisch typisiert | x | ||||
| verschiedenartige Daten als Einheit | x | ||||
| viele Möglichkeiten zur Faktorisierung | x | ||||
| bewältigt viele Handlungsstränge | x |
Aufgabe 6 (Lösung)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie in jeder Zeile das eine Auswahlfeld, bei dem die links stehende Aussage für das darüber stehende Paradigma am besten zutrifft.
| objektorientiert | prozedural | funktional | nebenläufig | parallel | |
|---|---|---|---|---|---|
| gut für große, langlebige Projekte | x | ||||
| gut für komplexe Algorithmen | x | ||||
| am häufigsten eingesetztes Paradigma | x | ||||
| der Speedup ist entscheidend | x | ||||
| Interprozesskommunikation oft nötig | x | ||||
| Synchronisation (z. B. Monitor) nötig | x | ||||
| Programmablauf ist gut kontrollierbar | x | ||||
| es wird häufig auf Ergebnisse gewartet | x | ||||
| unterstützt algebraische Datentypen | x | ||||
| gut für Programmierung im Groben | x |
Aufgabe 7 (Lösung)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie in jeder Zeile das eine Auswahlfeld, bei dem der links stehende Begriff am ehesten mit dem darüber stehenden Begriff zusammenhängt ("ist" oder "ist Variante von" oder "ist von Bedeutung für").
| Liveness | Ersetzbarkeit | Parametrisierung | kovariant | kontravariant | invariant | |
|---|---|---|---|---|---|---|
| Deadlock | x | |||||
| Variablentyp | x | |||||
| Design-by-Contract | x | |||||
| Aspekt | x | |||||
| Ergebnistyp | x | |||||
| Generizität | x | |||||
| Starvation | x | |||||
| Eingangsparametertyp | x | |||||
| Annotation | x | |||||
| Untertyp | x |
Aufgabe 8 (Lösung)[Bearbeiten | Quelltext bearbeiten]
Bitte markieren Sie jedes Auswahlfeld, bei dem die links stehende Aussage eine Eigenschaft der darüber stehende Art von Zusicherung ist. Es können keines, eines oder mehrere Felder pro Zeile auszuwählen sein.
| Vorbed. | Nachbed. | Invariante | Client-kontroll. History-Constr. | Server-kontroll. History-Constr. | |
|---|---|---|---|---|---|
| zuständig ist ausnahmslos der Server | x | ||||
| Server und Client (in Sonderfällen) sind zuständig | x | x | |||
| zuständig ist ausnahmslos der Client | x | x | |||
| schränkt die Aufrufreihenfolge von Methoden ein | x | ||||
| im Untertyp stärker oder gleich als im Obertyp | x | x | x | ||
| im Untertyp schwächer oder gleich als im Obertyp | x | x | |||
| gilt zu Beginn einer Methodenausführung | x | x | x | ||
| gilt am Ende einer Methodenausführung | x | x | x | ||
| bezieht sich auf einzelne Methoden | x | x | |||
| bezieht sich immer auf Objektzuständen von | x | x |
Aufgabe 9 (Lösung)[Bearbeiten | Quelltext bearbeiten]
Folgende Klasse ist gegeben:
public class RangeChecker {
private int min = Integer.MIN_VALUE, max = Integer.MAX_VALUE;
public void set(int a, int b) { this.min = a, this.max = b; }
public int in(int i) { return i > min ? (i < max ? i : max) : min; }
}
Bitte markieren Sie in jeder Zeile ein Auswahlfeld, bei dem die links stehende Aussage am ehesten eine auf die Klasse bezogene Zusicherung der über dem Auswahlfeld stehenden Art sein kann.
| Vorbed. | Nachbed. | Invariante | Client-kontroll. History-Constr. | Server-kontroll. History-Constr. | |
|---|---|---|---|---|---|
| x | |||||
| und | x | ||||
| und | x | ||||
| x | |||||
| wenn zwischen und liegt | x | ||||
| ist nur aufrufbar wenn | x | ||||
| wenn | x | ||||
| nach gilt und | x | ||||
| kann nur größer und kleiner werden | x | ||||
| ist vor erstem Aufruf von aufzurufen | x |
Aufgabe 10 (Lösung)[Bearbeiten | Quelltext bearbeiten]
Folgende Klasse ist gegeben:
public class Buffer {
private int b[8], i, o;
public boolean set(int v) { if(b[i] != 0) return false; b[i] = v; i = (i + 1) % 8; return true; }
public int get() { if (b[o] == 0) return 0; int r = b[o]; o = (o + 1) % 8; return r; }
}
Bitte markieren Sie in jeder Zeile ein Auswahlfeld, bei dem die links stehende Aussage am ehesten eine auf die Klasse bezogene Zusicherung der über dem Auswahlfeld stehenden Art sein kann.
| Vorbed. | Nachbed. | Invariante | Client-kontroll. History-Constr. | Server-kontroll. History-Constr. | |
|---|---|---|---|---|---|
| nur aufrufbar wenn davor aufgerufen | x | ||||
| erhöht um 1 mod. 8 oder retourniert | x | ||||
| und liegen im erlaubten Indexbereich von | x | ||||
| liefert Werte in Reihenfolge des Einfügens | x | ||||
| , und Arrayeinträge sind mit 0 initialisiert | x* | x* | |||
| und nur so änderbar: modulo 8 um 1 erhöht | x | ||||
| fügt in Buffer ein oder retourniert false | x | ||||
| retourniert 0 wenn der Buffer leer ist | x | ||||
| Werte ungleich 0 in sind gültige Buffereinträge | x | ||||
| darf nicht 0 sein | x |
*laut Puntigam wäre hier Nachbedingung richtig, da die Zusicherung eine Nachbedingung eines Konstruktors sein sollte. Es wurde jedoch auch Vorbedingung als korrekt gewertet, da man es als Vorbedingungen der Methoden sehen kann.