IT-Übungen

Logik & Informatik-Grundlagen

Boolesche Ausdrücke, Big-O, Bit-Operationen, Regex, SQL. Geprüft per Wahrheitstabelle, Schleifenzählung, OpenJDK 21 und SQLite.

Lesestand

  1. De Morgan ★☆☆ Boolesche Logik

    Ausdruck: !(a && b)

    Welcher Ausdruck ist gleichwertig?

    Lösung anzeigen

    Richtig: !a || !b

    Regel von De Morgan: Die Negation eines UND wird zum ODER der Negationen. „Nicht beide“ heißt „mindestens einer nicht“. Häufiger Fehler beim Umschreiben von if-Bedingungen: !a && !b, das wäre „keiner von beiden“.

  2. Vereinfachen ★★☆ Boolesche Logik

    Ausdruck: (a && b) || (a && !b)

    Worauf lässt sich der Ausdruck vereinfachen?

    Lösung anzeigen

    Richtig: a

    a ausklammern: a && (b || !b). Da b || !b immer wahr ist, bleibt a. In echtem Code findet man so überflüssige Prüfungen, die nur die Lesbarkeit verschlechtern.

  3. Absorption ★★☆ Boolesche Logik

    Ausdruck: a || (a && b)

    Welcher Ausdruck ist gleichwertig?

    Lösung anzeigen

    Richtig: a

    Absorptionsgesetz: Ist a wahr, ist das Ganze wahr. Ist a falsch, ist auch a && b falsch. Das Ergebnis hängt also nur von a ab, b ist bedeutungslos.

  4. Wahrheitstabelle zählen ★★☆ Boolesche Logik

    Ausdruck: (a || b) && !c

    In wie vielen der 8 Zeilen der Wahrheitstabelle ist der Ausdruck wahr?

    Lösung anzeigen

    Richtig: 3

    !c halbiert auf 4 Zeilen (c = falsch). Davon ist a || b in 3 Fällen wahr, nur a = b = falsch fällt weg. Ergebnis 3.

  5. Zwei volle Schleifen ★☆☆ Komplexität · Big-O

    Code:

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            count++;
        }
    }

    Welche Laufzeitkomplexität hat der Code in Abhängigkeit von n?

    Lösung anzeigen

    Richtig: O(n²)

    Die innere Schleife läuft n-mal für jedes der n i. Insgesamt n · n Durchläufe. Doppelt so viele Daten bedeuten viermal so viel Arbeit.

  6. Verdoppeln ★★☆ Komplexität · Big-O

    Code:

    for (int i = 1; i < n; i *= 2) {
        count++;
    }

    Welche Laufzeitkomplexität hat der Code in Abhängigkeit von n?

    Lösung anzeigen

    Richtig: O(log n)

    i verdoppelt sich in jedem Schritt: 1, 2, 4, 8 … Bis n erreicht ist, braucht es etwa log₂(n) Schritte. Bei einer Million sind das nur 20 Durchläufe. Genau so arbeitet die Binärsuche.

  7. Dreieck-Schleife ★★☆ Komplexität · Big-O

    Code:

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i; j++) {
            count++;
        }
    }

    Welche Laufzeitkomplexität hat der Code in Abhängigkeit von n?

    Lösung anzeigen

    Richtig: O(n²)

    Die innere Schleife wird zwar immer länger, insgesamt sind es aber 0 + 1 + 2 + … + (n - 1) = n(n - 1)/2 Durchläufe. Konstante Faktoren wie ½ fallen bei Big-O weg, es bleibt O(n²). Der Code ist doppelt so schnell wie zwei volle Schleifen, wächst aber gleich.

  8. Schleife mal Verdoppeln ★★★ Komplexität · Big-O

    Code:

    for (int i = 0; i < n; i++) {
        for (int j = 1; j < n; j *= 2) {
            count++;
        }
    }

    Welche Laufzeitkomplexität hat der Code in Abhängigkeit von n?

    Lösung anzeigen

    Richtig: O(n log n)

    Außen n Durchläufe, innen jeweils log n. Zusammen n · log n. Das ist die Größenordnung guter Sortierverfahren wie Mergesort.

  9. XOR ★☆☆ Bit-Operationen

    Java-Ausdruck: 5 ^ 3

    Welchen Wert hat der Ausdruck?

    Lösung anzeigen

    Richtig: 6

    ^ ist in Java kein Potenzieren, sondern bitweises XOR. 101 XOR 011 = 110, also 6. Wer 125 erwartet, hat einen klassischen Denkfehler, der auch im echten Code vorkommt. Potenzen gehen mit Math.pow.

  10. Vorzeichenloses Schieben ★★★ Bit-Operationen

    Java-Ausdruck: -1 >>> 28

    Welchen Wert hat der Ausdruck?

    Lösung anzeigen

    Richtig: 15

    -1 besteht aus 32 Einsen. >>> schiebt nach rechts und füllt mit Nullen auf. Nach 28 Stellen bleiben 4 Einsen übrig: 1111 = 15. Mit >> (mit Vorzeichen) bliebe es -1.

  11. Links schieben ★★☆ Bit-Operationen · Überlauf

    Java-Ausdruck: 1 << 31

    Welchen Wert hat der Ausdruck?

    Lösung anzeigen

    Richtig: -2147483648

    Die 1 landet im höchsten Bit, und das ist bei int das Vorzeichenbit. Ergebnis ist Integer.MIN_VALUE. 2147483648 passt nicht in einen int.

  12. Bit-Trick ★★★ Bit-Operationen

    Java-Ausdruck für n > 0: (n & (n - 1)) == 0

    Was prüft dieser Ausdruck?

    Lösung anzeigen

    Richtig: Ob n eine Zweierpotenz ist

    Eine Zweierpotenz hat genau ein gesetztes Bit, z. B. 8 = 1000. n - 1 = 0111 hat genau die anderen Bits. Das UND ergibt 0. Bei allen anderen Zahlen bleibt das höchste Bit stehen. Geprüft für alle n von 1 bis 4999.

  13. Telefon-Muster ★☆☆ Regex

    Regulärer Ausdruck: \d{3}-\d{4} Geprüft wird mit matches(), also die gesamte Zeichenkette.

    Welche Zeichenkette passt?

    Lösung anzeigen

    Richtig: 123-4567

    \d steht für eine Ziffer, {3} für genau drei Wiederholungen. Gefordert sind also exakt drei Ziffern, ein Bindestrich, vier Ziffern. Das Leerzeichen passt nicht auf den Bindestrich.

  14. Großer Anfangsbuchstabe ★★☆ Regex

    Regulärer Ausdruck: [A-Z][a-z]+ Geprüft wird mit matches(), also die gesamte Zeichenkette.

    Welche Zeichenkette passt?

    Lösung anzeigen

    Richtig: Hallo

    Ein Großbuchstabe, danach mindestens ein Kleinbuchstabe (+ heißt einmal oder öfter). „H“ scheitert am +, „HALLO“ an den großen Folgebuchstaben. Achtung: Umlaute wie „Ärger“ würden auch nicht passen, [A-Z] kennt nur A bis Z.

  15. Punkt maskieren ★★☆ Regex

    Regulärer Ausdruck: .*\.java Geprüft wird mit matches(), also die gesamte Zeichenkette.

    Welche Zeichenkette passt?

    Lösung anzeigen

    Richtig: Main.java

    \. ist ein echter Punkt, .* davor beliebige Zeichen. „Mainjava“ hat keinen Punkt, „Main.javax“ hört nicht auf .java auf (matches prüft die ganze Zeichenkette), „Main.JAVA“ scheitert an der Groß-/Kleinschreibung.

  16. Gierige Quantoren ★★★ Regex

    Regulärer Ausdruck: <.+> Text: <b>fett</b>

    Was liefert der erste Treffer von find()?

    Lösung anzeigen

    Richtig: <b>fett</b>

    + ist gierig: Es nimmt so viel wie möglich und gibt nur so weit nach, wie nötig. Vom ersten < bis zum letzten > passt alles. Für den kleinsten Treffer „<b>“ braucht man den genügsamen Quantor +? (also <.+?>).

  17. COUNT und NULL ★☆☆ SQL · NULL
    Tabelle kunde:
    id | name  | email      | status   | bonus
    1  | Anna  | anna@x.de  | aktiv    | 100
    2  | Ben   | NULL       | inaktiv  | NULL
    3  | Clara | clara@x.de | NULL     | 200
    4  | David | NULL       | gesperrt | NULL
    5  | Eva   | eva@x.de   | aktiv    | NULL
    
    Abfrage:
    SELECT COUNT(*), COUNT(email) FROM kunde;

    Was liefert die Abfrage?

    Lösung anzeigen

    Richtig: 5 und 3

    COUNT(*) zählt Zeilen, COUNT(spalte) nur Zeilen, in denen die Spalte nicht NULL ist. Zwei Kunden haben keine E-Mail, also 5 und 3.

  18. Ungleich und NULL ★★★ SQL · NULL
    Tabelle kunde:
    id | name  | email      | status   | bonus
    1  | Anna  | anna@x.de  | aktiv    | 100
    2  | Ben   | NULL       | inaktiv  | NULL
    3  | Clara | clara@x.de | NULL     | 200
    4  | David | NULL       | gesperrt | NULL
    5  | Eva   | eva@x.de   | aktiv    | NULL
    
    Abfrage:
    SELECT * FROM kunde WHERE status <> 'aktiv';

    Wie viele Zeilen liefert die Abfrage?

    Lösung anzeigen

    Richtig: 2

    Ben (inaktiv) und David (gesperrt). Clara fehlt: NULL <> 'aktiv' ist nicht wahr, sondern UNKNOWN, und WHERE lässt nur wahre Zeilen durch. Wer auch Clara will, braucht OR status IS NULL. Einer der häufigsten SQL-Fehler.

  19. Durchschnitt mit NULL ★★☆ SQL · NULL · Aggregation
    Tabelle kunde:
    id | name  | email      | status   | bonus
    1  | Anna  | anna@x.de  | aktiv    | 100
    2  | Ben   | NULL       | inaktiv  | NULL
    3  | Clara | clara@x.de | NULL     | 200
    4  | David | NULL       | gesperrt | NULL
    5  | Eva   | eva@x.de   | aktiv    | NULL
    
    Abfrage:
    SELECT AVG(bonus) FROM kunde;

    Was liefert die Abfrage?

    Lösung anzeigen

    Richtig: 150

    AVG ignoriert NULL-Werte: (100 + 200) / 2 = 150, nicht (100 + 200) / 5 = 60. Sollen fehlende Boni als 0 zählen, braucht man AVG(COALESCE(bonus, 0)). Fachlich muss man klären, was gemeint ist.

  20. LEFT JOIN zählen ★★☆ SQL · JOIN
    Tabelle kunde:
    id | name  | email      | status   | bonus
    1  | Anna  | anna@x.de  | aktiv    | 100
    2  | Ben   | NULL       | inaktiv  | NULL
    3  | Clara | clara@x.de | NULL     | 200
    4  | David | NULL       | gesperrt | NULL
    5  | Eva   | eva@x.de   | aktiv    | NULL
    
    Tabelle bestellung:
    id | kunde_id
    1  | 1
    2  | 1
    3  | 3
    
    Abfrage:
    SELECT k.name, b.id
    FROM kunde k LEFT JOIN bestellung b ON b.kunde_id = k.id;

    Wie viele Zeilen liefert die Abfrage?

    Lösung anzeigen

    Richtig: 6

    LEFT JOIN behält alle Kunden. Anna erscheint zweimal (zwei Bestellungen), Clara einmal, Ben, David und Eva je einmal mit NULL als Bestellung. 2 + 1 + 3 = 6. Ein INNER JOIN lieferte nur 3 Zeilen.