❓ Fragen & Antworten

Wichtige Prüfungsfragen mit ausführlichen Antworten zu Java und OOP

📦

Datentypen

Frage 1

Was ist der Unterschied zwischen einfachen (primitiven) Datentypen und komplexen (Referenz-) Datentypen?

💡 Antwort anzeigen

✅ Antwort:

Einfache (primitive) Datentypen:

  • Speichern den Wert direkt im Speicher
  • Haben eine feste Größe im Speicher
  • Werden klein geschrieben: int, double, boolean, char, etc.
  • Sind keine Objekte und haben keine Methoden
  • Es gibt 8 primitive Datentypen in Java

Komplexe (Referenz-) Datentypen:

  • Speichern eine Referenz (Adresse) auf ein Objekt im Heap-Speicher
  • Können beliebig groß sein
  • Werden groß geschrieben: String, Integer, ArrayList, eigene Klassen
  • Sind Objekte und haben Methoden und Attribute
  • Können null sein (keine Referenz)
Eigenschaft Primitiv Referenz
Speicherort Stack (direkt) Heap (Referenz auf Stack)
Standardwert 0, false, '\u0000' null
Beispiel int x = 5; String s = "Hallo";

Frage 2

Nennen Sie alle 8 primitiven Datentypen in Java mit ihrem Verwendungszweck.

💡 Antwort anzeigen

✅ Antwort:

Datentyp Größe Verwendung
byte 8 Bit Kleine Ganzzahlen (-128 bis 127)
short 16 Bit Kleine Ganzzahlen (-32.768 bis 32.767)
int 32 Bit Ganzzahlen (Standard)
long 64 Bit Große Ganzzahlen
float 32 Bit Gleitkommazahlen (einfache Präzision)
double 64 Bit Gleitkommazahlen (Standard)
boolean 1 Bit Wahrheitswerte (true/false)
char 16 Bit Einzelne Zeichen (Unicode)
🔨

Konstruktor

Frage 3

Ist der Konstruktor statisch? Warum oder warum nicht?

💡 Antwort anzeigen

✅ Antwort:

⚠️ Achtung: Der Konstruktor ist NICHT statisch!

Begründung:

  • Der Konstruktor wird aufgerufen, um ein neues Objekt zu erstellen und seine Instanzvariablen zu initialisieren
  • Er arbeitet mit dem this-Schlüsselwort, das auf die aktuelle Instanz verweist
  • Statische Methoden können nicht auf Instanzvariablen zugreifen - der Konstruktor muss das aber tun
  • Er hat keinen Rückgabetyp (auch nicht void) und trägt den gleichen Namen wie die Klasse

Warum könnte man denken, er sei statisch?

  • Man ruft ihn mit new Klassenname() auf, ohne vorher ein Objekt zu haben
  • Das new-Schlüsselwort reserviert aber erst den Speicher, dann wird der Konstruktor auf diesem neuen Objekt ausgeführt

Beispiel:

public class Auto {
    private String marke;
    
    // Konstruktor - NICHT statisch!
    public Auto(String marke) {
        this.marke = marke; // Zugriff auf Instanzvariable
    }
}

Frage 4

Was ist der Unterschied zwischen einem Konstruktor und einer normalen Methode?

💡 Antwort anzeigen

✅ Antwort:

Eigenschaft Konstruktor Methode
Name Gleich wie Klassenname Frei wählbar
Rückgabetyp Keiner (auch nicht void) Muss angegeben werden
Aufruf Mit new Über Objekt oder Klasse
Zweck Objekt initialisieren Verhalten definieren
Automatisch vorhanden Default-Konstruktor ja Nein
👨‍👩‍👧

Vererbung & Mehrfachvererbung

Frage 5

In Java ist Mehrfachvererbung verboten. Beschreiben Sie in einem kurzen zusammenhängenden Text die Probleme, welche bei der Mehrfachvererbung auftreten können.

💡 Antwort anzeigen

✅ Antwort:

Bei der Mehrfachvererbung, bei der eine Klasse von mehreren Oberklassen erbt, können verschiedene schwerwiegende Probleme auftreten. Das bekannteste ist das sogenannte "Diamond-Problem" (Diamant-Problem): Wenn eine Klasse D von zwei Klassen B und C erbt, die beide von einer gemeinsamen Klasse A erben, entsteht eine rautenförmige Vererbungsstruktur. Wenn nun A eine Methode definiert, die sowohl B als auch C unterschiedlich überschreiben, weiß die Klasse D nicht, welche Version der Methode sie verwenden soll.

Zusätzlich können Namenskonflikte bei Attributen entstehen: Wenn beide Oberklassen ein Attribut mit gleichem Namen aber unterschiedlichem Typ oder Bedeutung haben, ist unklar, welches Attribut die Unterklasse erben soll. Dies führt zu Mehrdeutigkeiten und macht den Code schwer verständlich und wartbar.

Die Komplexität des Codes steigt enorm, da der Compiler entscheiden muss, in welcher Reihenfolge die Konstruktoren der Oberklassen aufgerufen werden und wie Methodenaufrufe aufgelöst werden. Dies kann zu unerwartetem Verhalten und schwer zu findenden Fehlern führen.

📌 Merke: Java löst dieses Problem, indem es nur Einfachvererbung bei Klassen erlaubt, aber die Implementierung mehrerer Interfaces ermöglicht.

Frage 6

Was ist das Diamond-Problem und wie sieht es grafisch aus?

💡 Antwort anzeigen

✅ Antwort:

Das Diamond-Problem entsteht bei Mehrfachvererbung, wenn die Vererbungsstruktur eine Rautenform (Diamant) bildet:

classDiagram direction TB class A { +foo() } class B { +foo() überschrieben } class C { +foo() überschrieben } class D { Welches foo? } A <|-- B : erbt A <|-- C : erbt B <|-- D : erbt C <|-- D : erbt

Das Problem:

  • A definiert eine Methode foo()
  • B überschreibt foo() mit eigenem Verhalten
  • C überschreibt foo() ebenfalls anders
  • D erbt von B und C - welche Version von foo() soll D haben?
🔌

Interfaces

Frage 7

Was bedeutet das Interface-Konzept in Java? Erklären Sie Zweck und Anwendung.

💡 Antwort anzeigen

✅ Antwort:

Ein Interface in Java ist ein Vertrag oder eine Schnittstelle, die festlegt, welche Methoden eine Klasse implementieren muss, ohne zu definieren, wie diese implementiert werden. Es ist wie ein Bauplan, der vorschreibt, was eine Klasse können muss.

Hauptmerkmale eines Interfaces:

  • Enthält nur abstrakte Methoden (Methodensignaturen ohne Implementierung)
  • Alle Methoden sind automatisch public abstract
  • Alle Attribute sind automatisch public static final (Konstanten)
  • Eine Klasse kann mehrere Interfaces implementieren
  • Wird mit dem Schlüsselwort interface deklariert

Warum Interfaces?

  • Mehrfachvererbung umgehen: Eine Klasse kann mehrere Interfaces implementieren
  • Lose Kopplung: Code ist flexibler und austauschbar
  • Polymorphismus: Verschiedene Klassen können gleich behandelt werden
  • Vertrag: Garantiert, dass bestimmte Methoden vorhanden sind

Beispiel:

// Interface definieren
public interface Fahrbar {
    void fahren();
    void bremsen();
}

// Interface implementieren
public class Auto implements Fahrbar {
    public void fahren() {
        System.out.println("Auto fährt");
    }
    
    public void bremsen() {
        System.out.println("Auto bremst");
    }
}

Frage 8

Was ist der Unterschied zwischen einer abstrakten Klasse und einem Interface?

💡 Antwort anzeigen

✅ Antwort:

Eigenschaft Abstrakte Klasse Interface
Schlüsselwort abstract class interface
Vererbung extends (nur eine) implements (mehrere)
Methoden Abstrakt und konkret möglich Nur abstrakt (seit Java 8: default)
Attribute Alle Arten möglich Nur Konstanten (public static final)
Konstruktor Ja, möglich Nein
Sichtbarkeit Alle Modifier möglich Nur public
Verwendung "Ist-ein" Beziehung "Kann" / Fähigkeit
📌 Faustregel: Verwende eine abstrakte Klasse, wenn Klassen eng verwandt sind und gemeinsamen Code teilen. Verwende ein Interface, wenn verschiedene Klassen die gleiche Fähigkeit haben sollen.
🎯

OOP-Konzepte

Frage 9

Was ist der Unterschied zwischen Überladen (Overloading) und Überschreiben (Overriding)?

💡 Antwort anzeigen

✅ Antwort:

Überladen (Overloading):

  • Mehrere Methoden mit gleichem Namen aber unterschiedlichen Parametern
  • Findet in derselben Klasse statt
  • Wird zur Compile-Zeit aufgelöst (statische Bindung)
  • Rückgabetyp kann unterschiedlich sein
// Überladen - gleiche Klasse, verschiedene Parameter
public int addiere(int a, int b) { ... }
public double addiere(double a, double b) { ... }
public int addiere(int a, int b, int c) { ... }

Überschreiben (Overriding):

  • Methode der Oberklasse wird in Unterklasse neu definiert
  • Findet in einer Vererbungsbeziehung statt
  • Wird zur Laufzeit aufgelöst (dynamische Bindung)
  • Signatur muss exakt gleich sein
// Überschreiben - Unterklasse definiert Methode neu
class Tier {
    public void sprechen() { 
        System.out.println("..."); 
    }
}

class Hund extends Tier {
    @Override
    public void sprechen() { 
        System.out.println("Wuff!"); 
    }
}

Frage 10

Was bedeutet Kapselung (Encapsulation) und warum ist sie wichtig?

💡 Antwort anzeigen

✅ Antwort:

Definition: Kapselung bedeutet, die Attribute einer Klasse zu verbergen (private) und den Zugriff nur über öffentliche Methoden (Getter/Setter) zu erlauben.

Vorteile der Kapselung:

  • Datenschutz: Interne Daten sind vor direktem Zugriff geschützt
  • Validierung: In Settern kann geprüft werden, ob Werte gültig sind
  • Flexibilität: Interne Implementierung kann geändert werden, ohne externen Code zu brechen
  • Wartbarkeit: Fehler sind leichter zu finden und zu beheben
public class Bankkonto {
    private double kontostand; // versteckt
    
    // Getter - kontrollierter Lesezugriff
    public double getKontostand() {
        return kontostand;
    }
    
    // Setter mit Validierung
    public void einzahlen(double betrag) {
        if (betrag > 0) {
            kontostand += betrag;
        }
    }
}

Frage 11

Was ist Polymorphismus und welche Arten gibt es?

💡 Antwort anzeigen

✅ Antwort:

Definition: Polymorphismus (griech. "Vielgestaltigkeit") bedeutet, dass Objekte verschiedener Klassen über dieselbe Schnittstelle angesprochen werden können, aber unterschiedlich reagieren.

Arten von Polymorphismus:

1. Statischer Polymorphismus (Compile-Zeit):

  • Durch Methodenüberladung (Overloading)
  • Compiler entscheidet anhand der Parameter, welche Methode aufgerufen wird

2. Dynamischer Polymorphismus (Laufzeit):

  • Durch Methodenüberschreiben (Overriding)
  • Zur Laufzeit wird entschieden, welche Methode aufgerufen wird
Tier[] tiere = new Tier[3];
tiere[0] = new Hund();
tiere[1] = new Katze();
tiere[2] = new Vogel();

// Alle als "Tier" behandelt, aber jedes spricht anders
for (Tier t : tiere) {
    t.sprechen(); // Wuff! Miau! Piep!
}

Static & Instanz

Frage 12

Was ist der Unterschied zwischen statischen und nicht-statischen Attributen/Methoden?

💡 Antwort anzeigen

✅ Antwort:

Eigenschaft static (Klassen-) Nicht-static (Instanz-)
Gehört zu Der Klasse Dem Objekt
Anzahl Einmal pro Klasse Einmal pro Objekt
Aufruf Klasse.methode() objekt.methode()
this möglich Nein Ja
Speicher Beim Laden der Klasse Bei new
public class Auto {
    static int anzahlAutos = 0;  // Für alle gleich
    String farbe;                // Jedes Auto hat eigene
    
    public Auto(String farbe) {
        this.farbe = farbe;
        anzahlAutos++;           // Zählt alle Autos
    }
    
    static int getAnzahl() {      // Ohne Objekt aufrufbar
        return anzahlAutos;
    }
}
👁️

Sichtbarkeitsmodifizierer

Frage 13

Erklären Sie die vier Sichtbarkeitsmodifizierer in Java.

💡 Antwort anzeigen

✅ Antwort:

Modifier Klasse Package Unterklasse Überall
public
protected
(default/package)
private

Kurzbeschreibung:

  • public: Von überall sichtbar
  • protected: Im Package und in Unterklassen sichtbar
  • default (kein Modifier): Nur im gleichen Package sichtbar
  • private: Nur in der eigenen Klasse sichtbar
📝

Java-Code fachsprachlich beschreiben

Aufgabe 14

Beschreiben Sie den folgenden Java-Code fachsprachlich in vollständigen Sätzen:

public class Fahrzeug {
    private String marke;
    private int baujahr;
    
    public Fahrzeug(String marke, int baujahr) {
        this.marke = marke;
        this.baujahr = baujahr;
    }
}
💡 Musterlösung anzeigen

✅ Fachsprachliche Beschreibung:

Es wird eine öffentliche Klasse namens Fahrzeug definiert. Die Klasse besitzt zwei private Instanzvariablen (Attribute): marke vom Datentyp String und baujahr vom primitiven Datentyp int.

Die Klasse verfügt über einen parametrisierten Konstruktor, der zwei Parameter entgegennimmt: einen String marke und einen Integer baujahr. Im Konstruktor werden die übergebenen Parameterwerte den Instanzvariablen zugewiesen. Das Schlüsselwort this wird verwendet, um die Instanzvariablen von den gleichnamigen Parametern zu unterscheiden.

Durch die Kapselung (private Attribute) sind die Daten von außen nicht direkt zugänglich.

Aufgabe 15

Beschreiben Sie den folgenden Java-Code fachsprachlich in vollständigen Sätzen:

public class Hund extends Tier {
    private String rasse;
    
    public Hund(String name, String rasse) {
        super(name);
        this.rasse = rasse;
    }
    
    @Override
    public void sprechen() {
        System.out.println("Wuff!");
    }
}
💡 Musterlösung anzeigen

✅ Fachsprachliche Beschreibung:

Es wird eine öffentliche Klasse Hund definiert, die von der Klasse Tier erbt (Schlüsselwort extends). Die Klasse Hund ist somit eine Unterklasse (Subklasse) von Tier.

Die Klasse besitzt ein privates Attribut rasse vom Typ String. Der Konstruktor nimmt zwei Parameter entgegen: name und rasse. Mit dem Schlüsselwort super wird der Konstruktor der Oberklasse aufgerufen und der Parameter name an diesen übergeben.

Die Methode sprechen() überschreibt (Override) eine gleichnamige Methode der Oberklasse Tier. Die Annotation @Override macht dies explizit deutlich. Die Methode gibt den Text "Wuff!" auf der Konsole aus. Dies ist ein Beispiel für Polymorphismus.

Aufgabe 16

Beschreiben Sie den folgenden Java-Code fachsprachlich in vollständigen Sätzen:

public interface Fahrbar {
    void fahren();
    void bremsen();
    int getGeschwindigkeit();
}
💡 Musterlösung anzeigen

✅ Fachsprachliche Beschreibung:

Es wird ein öffentliches Interface namens Fahrbar definiert. Ein Interface ist eine Schnittstelle, die einen Vertrag für Klassen festlegt, welche Methoden diese implementieren müssen.

Das Interface deklariert drei abstrakte Methoden:

  • fahren() – eine Methode ohne Rückgabewert (void)
  • bremsen() – ebenfalls ohne Rückgabewert
  • getGeschwindigkeit() – eine Methode mit Rückgabetyp int

Alle Methoden in einem Interface sind implizit public abstract. Jede Klasse, die dieses Interface implementiert, muss alle drei Methoden mit konkretem Code versehen.

Aufgabe 17

Beschreiben Sie den folgenden Java-Code fachsprachlich in vollständigen Sätzen:

public class Konto {
    private double kontostand;
    
    public double getKontostand() {
        return kontostand;
    }
    
    public void setKontostand(double betrag) {
        if (betrag >= 0) {
            this.kontostand = betrag;
        }
    }
}
💡 Musterlösung anzeigen

✅ Fachsprachliche Beschreibung:

Es wird eine öffentliche Klasse Konto definiert. Die Klasse besitzt ein privates Attribut kontostand vom Datentyp double für Gleitkommazahlen.

Die Methode getKontostand() ist ein Getter (Zugriffsmethode), der den aktuellen Wert des Attributs kontostand zurückgibt. Der Rückgabetyp ist double.

Die Methode setKontostand() ist ein Setter (Änderungsmethode) mit dem Parameter betrag. Die Methode enthält eine Validierung: Nur wenn der übergebene Betrag größer oder gleich 0 ist, wird der Kontostand aktualisiert. Dies verhindert negative Kontostände.

Dieses Muster demonstriert das OOP-Prinzip der Kapselung (Encapsulation): Die Daten sind geschützt und der Zugriff erfolgt kontrolliert über Getter und Setter.

Aufgabe 18

Beschreiben Sie den folgenden Java-Code fachsprachlich in vollständigen Sätzen:

public abstract class Figur {
    protected String farbe;
    
    public Figur(String farbe) {
        this.farbe = farbe;
    }
    
    public abstract double berechneFlaeche();
}
💡 Musterlösung anzeigen

✅ Fachsprachliche Beschreibung:

Es wird eine abstrakte Klasse namens Figur definiert (Schlüsselwort abstract). Von einer abstrakten Klasse können keine Objekte direkt instanziiert werden.

Die Klasse besitzt ein protected Attribut farbe vom Typ String. Der Sichtbarkeitsmodifizierer protected bedeutet, dass das Attribut in der Klasse selbst, im selben Package und in allen Unterklassen sichtbar ist.

Der Konstruktor initialisiert das Attribut farbe mit dem übergebenen Parameter.

Die Methode berechneFlaeche() ist eine abstrakte Methode: Sie hat nur eine Signatur, aber keine Implementierung (keinen Methodenrumpf). Jede konkrete Unterklasse muss diese Methode implementieren und einen double-Wert zurückgeben.

Aufgabe 19

Beschreiben Sie den folgenden Java-Code fachsprachlich in vollständigen Sätzen:

public class Zaehler {
    private static int anzahl = 0;
    private int id;
    
    public Zaehler() {
        anzahl++;
        this.id = anzahl;
    }
    
    public static int getAnzahl() {
        return anzahl;
    }
}
💡 Musterlösung anzeigen

✅ Fachsprachliche Beschreibung:

Es wird eine öffentliche Klasse Zaehler definiert. Die Klasse besitzt zwei Attribute:

  • anzahl – ein statisches (Klassen-) Attribut vom Typ int, initialisiert mit 0. Statische Attribute existieren nur einmal pro Klasse und werden von allen Objekten geteilt.
  • id – ein Instanzattribut vom Typ int, das für jedes Objekt individuell ist.

Der parameterlose Konstruktor (Default-Konstruktor) erhöht bei jedem Aufruf die statische Variable anzahl um 1 und weist diesen Wert dem Instanzattribut id zu. So erhält jedes neue Objekt eine eindeutige ID.

Die statische Methode getAnzahl() kann ohne Objekt über den Klassennamen aufgerufen werden (Zaehler.getAnzahl()) und gibt die Gesamtanzahl der erzeugten Objekte zurück.

Aufgabe 20

Beschreiben Sie den folgenden Java-Code fachsprachlich in vollständigen Sätzen:

public class Auto implements Fahrbar, Serializable {
    private String marke;
    private int geschwindigkeit;
    
    @Override
    public void fahren() {
        geschwindigkeit = 50;
    }
    
    @Override
    public void bremsen() {
        geschwindigkeit = 0;
    }
}
💡 Musterlösung anzeigen

✅ Fachsprachliche Beschreibung:

Es wird eine öffentliche Klasse Auto definiert, die zwei Interfaces implementiert: Fahrbar und Serializable (Schlüsselwort implements). Dies zeigt, dass Java zwar keine Mehrfachvererbung bei Klassen erlaubt, aber eine Klasse mehrere Interfaces implementieren kann.

Die Klasse hat zwei private Attribute: marke (String) und geschwindigkeit (int).

Die Methoden fahren() und bremsen() sind mit @Override annotiert, was zeigt, dass sie Methoden aus dem Interface Fahrbar implementieren:

  • fahren() setzt die Geschwindigkeit auf 50
  • bremsen() setzt die Geschwindigkeit auf 0

Die Klasse erfüllt damit den Vertrag des Interfaces und stellt die geforderte Funktionalität bereit.

🔢 Logik: Wahrheitstabellen & KV-Diagramme

Aufgabe 21 - Wahrheitstabelle erstellen

Erstellen Sie die Wahrheitstabelle für den folgenden Ausdruck und geben Sie das Ergebnis an:

(D ∧ (A ∧ B)) ∨ (¬C)

💡 Musterlösung anzeigen

✅ Wahrheitstabelle:

A B C D A∧B D∧(A∧B) ¬C (D∧(A∧B))∨(¬C)
00000011
00010011
00100000
00110000
01000011
01010011
01100000
01110000
10000011
10010011
10100000
10110000
11001011
11011111
11101000
11111101

📝 Erklärung:

  • ∧ (UND/AND): Nur wahr wenn BEIDE Operanden wahr sind
  • ∨ (ODER/OR): Wahr wenn MINDESTENS EINER wahr ist
  • ¬ (NICHT/NOT): Negiert den Wert (0→1, 1→0)

Der Ausdruck ist wahr (=1) wenn entweder ¬C = 1 (also C=0) ODER wenn D∧(A∧B) = 1 (also A, B und D alle =1).

Aufgabe 22 - Wahrheitstabelle mit Implikation

Erstellen Sie die Wahrheitstabelle für den folgenden Ausdruck. Sortieren Sie aufsteigend von 0,0,0,0 nach 1,1,1,1. Notieren Sie alle Zwischenergebnisse!

Y = ((¬A ∨ ((B ∧ C) ∧ D)) → ((A ∧ B) ∧ D))

💡 Musterlösung anzeigen

✅ Wahrheitstabelle mit allen Zwischenergebnissen:

Hinweis: Implikation A → B = ¬A ∨ B (nur falsch wenn A=1 und B=0)

A B C D ¬A B∧C (B∧C)∧D ¬A∨((B∧C)∧D) A∧B (A∧B)∧D Y
00001001000
00011001000
00101001000
00111001000
01001001000
01011001000
01101101000
01111111000
10000000001
10010000001
10100000001
10110000001
11000000101
11010000111
11100100101
11110111111

📝 Implikation (→) Wahrheitstabelle:

PQP → Q
001
011
100
111

Merke: P → Q ist nur FALSCH wenn P wahr und Q falsch ist!

Aufgabe 23 - KV-Diagramm zur Minimierung

Minimieren Sie den Ausdruck aus Aufgabe 22 mit einem KV-Diagramm (4 Variablen). Tragen Sie die Ergebnisse der Wahrheitstabelle ein und bilden Sie Gruppen:

Y = ((¬A ∨ ((B ∧ C) ∧ D)) → ((A ∧ B) ∧ D))

💡 Musterlösung anzeigen

✅ KV-Diagramm (4 Variablen A, B, C, D):

CD\AB AB AB AB AB
CD 0 0 1 1
CD 0 0 1 1
CD 0 0 1 1
CD 0 0 1 1

📝 Gruppenbildung:

  • Gruppe (grün): Alle 8 Einsen in den Spalten AB und AB → das bedeutet A=1

Minimiert: Y = A

⚠️ KV-Diagramm Regeln:

  • Gruppen müssen 2ⁿ Zellen haben (1, 2, 4, 8, 16...)
  • Gruppen müssen rechteckig sein
  • Gruppen können an den Rändern "wrappen"
  • Jede 1 muss in mindestens einer Gruppe sein
  • Größtmögliche Gruppen bilden!

Aufgabe 24 - DNF und KNF aus Wahrheitstabelle

Gegeben ist folgende Wahrheitstabelle. Geben Sie sowohl die Disjunktive Normalform (DNF) als auch die Konjunktive Normalform (KNF) an:

ABCY
0000
0011
0100
0111
1000
1011
1101
1111
💡 Musterlösung anzeigen

✅ DNF (Disjunktive Normalform):

DNF = ODER-Verknüpfung der Minterme (Zeilen mit Y=1):

  • Zeile 2 (A=0, B=0, C=1): ¬A ∧ ¬B ∧ C
  • Zeile 4 (A=0, B=1, C=1): ¬A ∧ B ∧ C
  • Zeile 6 (A=1, B=0, C=1): A ∧ ¬B ∧ C
  • Zeile 7 (A=1, B=1, C=0): A ∧ B ∧ ¬C
  • Zeile 8 (A=1, B=1, C=1): A ∧ B ∧ C

DNF: Y = (¬A ∧ ¬B ∧ C) ∨ (¬A ∧ B ∧ C) ∨ (A ∧ ¬B ∧ C) ∨ (A ∧ B ∧ ¬C) ∨ (A ∧ B ∧ C)

✅ KNF (Konjunktive Normalform):

KNF = UND-Verknüpfung der Maxterme (Zeilen mit Y=0, Variablen umgekehrt!):

  • Zeile 1 (A=0, B=0, C=0): 0→A, 0→B, 0→C → A ∨ B ∨ C
  • Zeile 3 (A=0, B=1, C=0): 0→A, 1→¬B, 0→C → A ∨ ¬B ∨ C
  • Zeile 5 (A=1, B=0, C=0): 1→¬A, 0→B, 0→C → ¬A ∨ B ∨ C

KNF: Y = (A ∨ B ∨ C) ∧ (A ∨ ¬B ∨ C) ∧ (¬A ∨ B ∨ C)

📝 Merkhilfe:

  • DNF: Y=1 Zeilen → Variable normal übernehmen (1→A, 0→¬A)
  • KNF: Y=0 Zeilen → Variable umgekehrt übernehmen (1→¬A, 0→A)

Minimiert (mit KV-Diagramm): Y = C ∨ (A ∧ B)

Aufgabe 25 - Logik-Gatter: Wahrheitstabellen

Notieren Sie zu jedem Logik-Gatter die passende Wahrheitstabelle:

1
NOT (Negation)
¬A, !A
&
AND (Und)
A ∧ B
≥1
OR (Oder)
A ∨ B
&
NAND (Und-Nicht)
¬(A ∧ B)
≥1
NOR (Oder-Nicht)
¬(A ∨ B)
=1
XOR (Exklusiv-Oder)
A ⊕ B
=1
XNOR (Äquivalenz)
A ↔ B
💡 Musterlösung anzeigen

✅ Wahrheitstabellen aller Gatter:

NOT (Negation)
A¬A
01
10
AND (Und)
ABA∧B
000
010
100
111
OR (Oder)
ABA∨B
000
011
101
111
NAND (Und-Nicht)
AB¬(A∧B)
001
011
101
110
NOR (Oder-Nicht)
AB¬(A∨B)
001
010
100
110
XOR (Exklusiv-Oder)
ABA⊕B
000
011
101
110
XNOR (Äquivalenz)
ABA↔B
001
010
100
111

📝 Merkhilfen:

  • AND (&): "Beide müssen 1 sein" → nur 1∧1=1
  • OR (≥1): "Mindestens einer muss 1 sein" → nur 0∨0=0
  • XOR (=1): "Genau einer muss 1 sein" → unterschiedlich = 1
  • NAND/NOR/XNOR: Negiertes Ergebnis des Basis-Gatters (○ am Ausgang)

⚡ Wichtig für die Klausur:

  • NAND ist ein "universelles Gatter" - man kann alle anderen Gatter daraus bauen!
  • NOR ist ebenfalls ein universelles Gatter.
  • Der Kreis (○) am Ausgang bedeutet immer Negation.

📊 Struktogramme (Nassi-Shneiderman)

Aufgabe 24 - Struktogramm lesen

Analysieren Sie das folgende Struktogramm und beschreiben Sie, was der Algorithmus berechnet. Schreiben Sie dann den entsprechenden Java-Code:

eingabe: zahl
ergebnis = 1
i = 1
SOLANGE i ≤ zahl
ergebnis = ergebnis * i
i = i + 1
ausgabe: ergebnis
💡 Musterlösung anzeigen

✅ Analyse:

Der Algorithmus berechnet die Fakultät einer Zahl (n! = 1 × 2 × 3 × ... × n).

Java-Code:

int zahl = 5; // Eingabe
int ergebnis = 1;
int i = 1;

while (i <= zahl) {
    ergebnis = ergebnis * i;
    i = i + 1;
}

System.out.println(ergebnis); // Ausgabe: 120

Trace für zahl=5:

iergebnis
11
22
36
424
5120

Aufgabe 25 - Struktogramm mit Verzweigung

Was berechnet dieses Struktogramm? Schreiben Sie den Java-Code:

eingabe: a, b
a > b
JA
max = a
NEIN
max = b
ausgabe: max
💡 Musterlösung anzeigen

✅ Analyse:

Der Algorithmus findet das Maximum von zwei Zahlen.

Java-Code:

int a = 7;
int b = 12;
int max;

if (a > b) {
    max = a;
} else {
    max = b;
}

System.out.println("Maximum: " + max);

Alternative mit Ternär-Operator:

int max = (a > b) ? a : b;

Aufgabe 26 - Code zu Struktogramm

Erstellen Sie das Struktogramm für folgenden Java-Code (zeichnen Sie es auf Papier oder beschreiben Sie die Struktur):

public int summe(int[] zahlen) {
    int sum = 0;
    for (int i = 0; i < zahlen.length; i++) {
        if (zahlen[i] > 0) {
            sum = sum + zahlen[i];
        }
    }
    return sum;
}
💡 Musterlösung anzeigen

✅ Struktogramm:

eingabe: zahlen[]
sum = 0
FÜR i = 0 BIS zahlen.length - 1
zahlen[i] > 0
JA
sum = sum + zahlen[i]
NEIN
return sum

📝 Beschreibung:

Der Algorithmus berechnet die Summe aller positiven Zahlen in einem Array. Negative Zahlen und Null werden ignoriert.