Files
programming-concepts-universal/docs/quiz-fragen.md
2026-04-15 00:10:54 +02:00

15 KiB
Raw Blame History

📝 Quizfragen: Programmierkonzepte universell

Interaktive Selbsttests fĂŒr jedes Modul


Modul 1: Memory-Modell

Frage 1.1

Was passiert mit dieser Variable nach Ende der Funktion?

void test() {
    int x = 42;
    int *p = &x;
}
  • A) x bleibt im Speicher, p zeigt auf ungĂŒltigen Bereich
  • B) x wird automatisch freigegeben (Stack), p ist danach ungĂŒltig
  • C) x muss mit free() freigegeben werden
  • D) p enthĂ€lt weiterhin die gĂŒltige Adresse von x
Antwort

B) x liegt auf dem Stack und wird beim Verlassen der Funktion automatisch freigegeben. p enthĂ€lt dann eine ungĂŒltige Adresse (Dangling Pointer).

Konzept: Stack-Variablen haben automatische Lebensdauer (Scope-basiert).

Frage 1.2

Welche Zuordnung ist korrekt?

Speicherbereich Eigenschaft
Stack A) Manuell verwaltet, persistent
Heap B) Automatisch verwaltet, kurzlebig
  • A) Stack=A, Heap=B
  • B) Stack=B, Heap=A
Antwort

B) Stack = Automatisch verwaltet (B), Heap = Manuell verwaltet (A)

Konzept: Stack (automatisch, schnell, begrenzt) vs Heap (manuell/verwaltet, flexibel, langsam).

Frage 1.3

Code-Analyse:

void foo() {
    int *a = malloc(sizeof(int) * 100);
    // ... Nutzung von a ...
    free(a);
    *a = 42;  // ⚠ Was ist das Problem?
}
  • A) Speicherleck (Memory Leak)
  • B) Use-after-free
  • C) Stack Overflow
  • D) Buffer Overflow
Antwort

B) Use-after-free: Nach free(a) ist der Speicher ungĂŒltig. Der Zugriff *a = 42 ist undefiniertes Verhalten.

Konzept: Pointer bleibt bestehen, aber der Speicher dahinter ist freigegeben.


Modul 2: Datentypen

Frage 2.1

Welcher C-Datentyp hat typischerweise die grĂ¶ĂŸte Reichweite?

  • A) int (32-bit)
  • B) short (16-bit)
  • C) long long (64-bit)
  • D) float (32-bit)
Antwort

C) long long ist 64-bit und kann daher den grĂ¶ĂŸten ganzzahligen Bereich darstellen (~±9×10Âč⁞).

Konzept: TypgrĂ¶ĂŸe = Wertebereich. Float hat zwar auch 32-bit, aber fĂŒr Fließkommazahlen.

Frage 2.2

Was ist der Unterschied zwischen char und int8_t?

  • A) int8_t ist grĂ¶ĂŸer
  • B) char ist garantiert 8-bit, int8_t variiert
  • C) int8_t ist garantiert 8-bit, char kann variieren
  • D) Kein Unterschied, beide sind identisch
Antwort

C) int8_t (aus <stdint.h>) garantiert exakt 8-bit. char ist laut C-Standard mindestens 8-bit, kann aber auch 16-bit sein (selten).

Konzept: Feste Breite (fixed-width) vs. minimale Breite Typen.

Frage 2.3

Welches Konzept beschreibt diese Python-Äquivalenz?

// C
char name[50] = "Ada";
# Python
name = "Ada"  # Unbegrenzte LĂ€nge!
  • A) Statische vs. dynamische Typisierung
  • B) Statische vs. dynamische Speicherallokation
  • C) Kompiliert vs. interpretiert
  • D) Pass-by-value vs. pass-by-reference
Antwort

B) C hat statische Allokation (feste GrĂ¶ĂŸe 50), Python dynamische (wĂ€chst mit Inhalt).

Konzept: Arrays in C haben feste GrĂ¶ĂŸe, Strings in modernen Sprachen sind dynamisch.


Modul 3: Flusskontrolle

Frage 3.1

Welche Struktur ist hier dargestellt?

┌────────────┐
│Bedingung?  │
└────────────┘
    │Ja
    ▌
┌────────────┐    ┌────────────┐
│Aktion A    │───→│Bedingung?  │
└────────────┘    └────────────┘
                      │Nein
                      ▌
                  ┌────────────┐
                  │Aktion B    │
                  └────────────┘
  • A) If-Else
  • B) For-Loop
  • C) Nested If (verschachtelt)
  • D) Switch-Case
Antwort

C) Nested If: Eine Aktion enthÀlt eine weitere Bedingung.

Konzept: Verschachtelte Kontrollstrukturen (Nested Control Structures).

Frage 3.2

Was ist die Ausgabe?

for (int i = 0; i < 5; i++) {
    if (i == 2) continue;
    if (i == 4) break;
    printf("%d ", i);
}
  • A) 0 1 2 3
  • B) 0 1 3 4
  • C) 0 1 3
  • D) 0 1 2 3 4
Antwort

C) 0 1 3

  • i=0: print 0
  • i=1: print 1
  • i=2: continue (ĂŒberspringt print)
  • i=3: print 3
  • i=4: break (Schleife beendet)

Konzept: continue springt zum nÀchsten Iteration, break verlÀsst die Schleife.

Frage 3.3

Universelles Konzept: Welche Sprache hat KEINE "for"-Schleife?

  • A) Python
  • B) C++
  • C) JavaScript
  • D) Alle haben for-Schleifen
Antwort

D) Alle haben for-Schleifen (Syntax variiert):

  • C/C++: for (init; cond; step)
  • Python: for item in iterable
  • JavaScript: for (init; cond; step) oder for...of

Konzept: Die Idee der Wiederholung ist universell.


Modul 4: Funktionen

Frage 4.1

Was ist der Unterschied zwischen Call-by-Value und Call-by-Reference?

  • A) Value ist schneller, Reference langsamer
  • B) Value kopiert Daten, Reference teilt Daten
  • C) Value funktioniert nur mit primitiven Typen
  • D) Kein Unterschied in C
Antwort

B) Call-by-Value kopiert den Wert (Änderungen beeinflussen Original nicht). Call-by-Reference teilt die Adresse (Änderungen beeinflussen Original).

Konzept: ParameterĂŒbergabe-Semantik.

Frage 4.2

Analyse:

void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 5, y = 10;
    swap(x, y);
    printf("%d %d", x, y);
}

Ausgabe?

  • A) 10 5
  • B) 5 10
  • C) 5 5
  • D) Undefiniert
Antwort

B) 5 10 – Die Werte werden nicht getauscht!

C nutzt Call-by-Value. swap Ă€ndert nur Kopien von x und y. FĂŒr echtes Swapping brĂ€uchte man Pointer: void swap(int* a, int* b).

Konzept: C ist immer Call-by-Value (auch Pointer werden by value ĂŒbergeben – die Adresse wird kopiert).

Frage 4.3

Rekursion: Was berechnet diese Funktion?

int mystery(int n) {
    if (n <= 1) return 1;
    return n * mystery(n - 1);
}
  • A) Summe 1 bis n
  • B) FakultĂ€t (n!)
  • C) Fibonacci
  • D) 2^n
Antwort

B) FakultĂ€t: n! = n × (n-1) × ... × 1

Beispiel: mystery(5) = 5 × 4 × 3 × 2 × 1 = 120

Konzept: Rekursion = Funktion ruft sich selbst mit einfacherem Problem.


Modul 5: Datenstrukturen

Frage 5.1

Welche Datenstruktur ist fĂŒr "Wer war zuletzt hier?" am besten?

  • A) Queue (FIFO)
  • B) Stack (LIFO)
  • C) Linked List
  • D) Hash Map
Antwort

B) Stack (LIFO = Last In, First Out). Das letzte Element, das hinzugefĂŒgt wurde, wird als erstes zurĂŒckgegeben.

Konzept: LIFO fĂŒr "Undo", "Back-Button", "Call Stack".

Frage 5.2

ZeitkomplexitĂ€t: Wie lange dauert das Suchen in einem Array der GrĂ¶ĂŸe N?

  • A) O(1) – konstant
  • B) O(log N) – logarithmisch
  • C) O(N) – linear
  • D) O(NÂČ) – quadratisch
Antwort

C) O(N) – Im ungĂŒnstigsten Fall muss jedes Element geprĂŒft werden (lineare Suche).

Mit sortiertem Array und binÀrer Suche: O(log N).

Konzept: ZeitkomplexitÀt beschreibt Skalierung, nicht absolute Zeit.

Frage 5.3

Was ist der Vorteil einer Linked List gegenĂŒber einem Array?

  • A) Schnellerer Zugriff auf Elemente
  • B) Weniger Speicherverbrauch
  • C) EinfĂŒgen/Löschen ohne Verschieben
  • D) Cache-Effizienz
Antwort

C) EinfĂŒgen/Löschen ist O(1) bei bekannter Position (nur Pointer Ă€ndern). Arrays mĂŒssen Elemente verschieben (O(N)).

Konzept: Trade-offs: Arrays = schneller Zugriff, Lists = flexibles EinfĂŒgen.


Modul 6: Pointer

Frage 6.1

Was ist der Output?

int a = 10;
int *p = &a;
int **pp = &p;

printf("%d", **pp);
  • A) Adresse von a
  • B) Adresse von p
  • C) 10
  • D) Compiler-Fehler
Antwort

C) 10

  • pp ist Pointer zu Pointer
  • *pp = p = Adresse von a
  • **pp = *p = Wert von a = 10

Konzept: Mehrfache Dereferenzierung (Pointer Chains).

Frage 6.2

Was ist ein "Dangling Pointer"?

  • A) Ein Pointer auf NULL
  • B) Ein Pointer auf freigegebenen Speicher
  • C) Ein Pointer auf Stack-Speicher
  • D) Ein uninitialisierter Pointer
Antwort

B) Dangling Pointer zeigt auf Speicher, der bereits free()'d wurde (oder Stack-Variable außerhalb ihres Scopes).

Beispiel:

int* bad() {
    int x = 10;
    return &x;  // Dangling nach return!
}

Konzept: Lebensdauer des Pointers ≠ Lebensdauer des Ziels.

Frage 6.3

Array-Pointer-Äquivalenz:

int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;

Welche Expression ist NICHT Àquivalent?

  • A) arr[2] und *(arr + 2)
  • B) p[2] und *(p + 2)
  • C) &arr[2] und p + 2
  • D) sizeof(arr) und sizeof(p)
Antwort

D) sizeof(arr) = 20 (5 ints × 4 bytes), sizeof(p) = 8 (Pointer-GrĂ¶ĂŸe auf 64-bit System).

Alle anderen sind Pointer-Arithmetik-Äquivalenzen.

Konzept: Arrays und Pointer sind verwandt, aber nicht identisch!


Modul 7: OOP

Frage 7.1

Was beschreibt "Ein Hund IST EIN Tier"?

  • A) Kapselung
  • B) Vererbung
  • C) Polymorphie
  • D) Abstraktion
Antwort

B) Vererbung (Inheritance): class Dog : public Animal

"IS-A"-Beziehung = Vererbung
"HAS-A"-Beziehung = Komposition

Konzept: Vererbung modelliert Taxonomien (Kategorien).

Frage 7.2

Was ist der Unterschied zwischen virtual und override?

  • A) virtual in Basisklasse, override in abgeleiteter Klasse
  • B) virtual fĂŒr Variablen, override fĂŒr Funktionen
  • C) Beide sind identisch
  • D) override ist C-only
Antwort

A)

  • virtual in Basisklasse markiert ĂŒberschreibbare Methode
  • override in abgeleiteter Klasse dokumentiert Überschreibung (Compiler prĂŒft!)
class Animal {
    virtual void speak();  // Kann ĂŒberschrieben werden
};

class Dog : public Animal {
    void speak() override;  // Überschreibt explizit
};

Konzept: override ist optional aber empfohlen (Compiler-Hilfe).

Frage 7.3

In welcher Sprache ist alles ein Objekt?

  • A) C
  • B) C++
  • C) Python
  • D) Keine der genannten
Antwort

C) Python – Alles (Zahlen, Strings, Funktionen, Module) ist ein Objekt mit Methoden und Attributen.

C hat keine Objekte, C++ hat primitive Typen (int, float) ohne Methoden.

Konzept: "Alles ist ein Objekt" = Uniforme Behandlung aller Daten.


Modul 8: Modularisierung

Frage 8.1

Was beschreibt das Singleton Pattern?

  • A) Viele Instanzen einer Klasse
  • B) Genau eine Instanz einer Klasse
  • C) Keine Instanzen erlaubt
  • D) Automatische Instanzerstellung
Antwort

B) Singleton = Genau eine Instanz (z.B. Datenbank-Verbindung, Logger).

Konzept: Globale Zustandskontrolle mit gekapseltem Zugriff.

Frage 8.2

Was ist "Separation of Concerns"?

  • A) Alle Code in einer Datei
  • B) Verschiedene Aspekte in verschiedene Module
  • C] Keine AbhĂ€ngigkeiten zwischen Modulen
  • D) Ein Modul pro Funktion
Antwort

B) Separation of Concerns = UI, Logik, Daten getrennt halten.

Beispiel: MVC Pattern (Model-View-Controller)

Konzept: Änderungen in einem Bereich beeinflussen andere nicht.

Frage 8.3

Welches Design Pattern passt?

Problem: Verschiedene Zahlungsmethoden (Kreditkarte, PayPal, Crypto) sollen austauschbar sein.

  • A) Singleton
  • B) Factory
  • C) Strategy
  • D) Observer
Antwort

C) Strategy Pattern = Austauschbare Algorithmen/Strategien.

class PaymentStrategy {
    virtual void pay(amount) = 0;
};

class CreditCard : public PaymentStrategy { ... };
class PayPal : public PaymentStrategy { ... };

Konzept: Strategy = Familie von Algorithmen, austauschbar zur Laufzeit.


🎯 Final-Quiz: Mixed

F1. Welche Konzepte sind sprachunabhÀngig?

  • A) malloc und free
  • B) Stack und Heap
  • C) class und struct
  • D) int und float
Antwort

B) Stack und Heap sind Speicherkonzepte, die in jeder Sprache existieren (auch wenn sie unterschiedlich verwaltet werden).

A) Nur C/C++
C) Nicht in C
D) Konzept existiert, aber Namen variieren

F2. Was ist der Output?

int arr[] = {1, 2, 3};
int *p = arr;
p++;
printf("%d", *p);
  • A) 1
  • B) 2
  • C) 3
  • D) Adresse von arr[1]
Antwort

B) 2

  • p zeigt auf arr[0]
  • p++ verschiebt um sizeof(int) → zeigt auf arr[1]
  • *p = 2

F3. Was ist ein "Memory Leak"?

  • A) Zugriff auf ungĂŒltigen Speicher
  • B) Nicht freigegebener Heap-Speicher
  • C) Stack Overflow
  • D) Zu große Variable
Antwort

B) Memory Leak = malloc() ohne free() → Speicher bleibt belegt bis Programmende.

while (1) {
    malloc(1000);  // Leak! Nie freigegeben.
}

F4. Welche OOP-Sprache hat kein multiple inheritance?

  • A) C++
  • B) Python
  • C) Java
  • D) Ruby
Antwort

C) Java erlaubt nur single inheritance fĂŒr Klassen (Interfaces können mehrfach implementiert werden).

C++ und Python erlauben multiple inheritance: class X : public A, public B.

Konzept: Multiple Inheritance kann zu Diamant-Problem fĂŒhren.


✅ Ergebnis-Tabelle

Modul Fragen Bestanden?
1: Memory 3/3 ⬜
2: Datentypen 3/3 ⬜
3: Flusskontrolle 3/3 ⬜
4: Funktionen 3/3 ⬜
5: Datenstrukturen 3/3 ⬜
6: Pointer 3/3 ⬜
7: OOP 3/3 ⬜
8: Modularisierung 3/3 ⬜
Final 4/4 ⬜

Score: ___ / 28

Bewertung Score
🏆 Meister 26-28
⭐ Experte 22-25
✅ Gut 18-21
📚 Nacharbeiten < 18

Viel Erfolg beim Test!