15 KiB
đ 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)
xbleibt im Speicher,pzeigt auf ungĂŒltigen Bereich - B)
xwird automatisch freigegeben (Stack),pist danach ungĂŒltig - C)
xmuss mitfree()freigegeben werden - D)
penthĂ€lt weiterhin die gĂŒltige Adresse vonx
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_tist gröĂer - B)
charist garantiert 8-bit,int8_tvariiert - C)
int8_tist garantiert 8-bit,charkann 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)oderfor...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
ppist Pointer zu Pointer*pp=p= Adresse vona**pp=*p= Wert vona= 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]undp + 2 - D)
sizeof(arr)undsizeof(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)
virtualin Basisklasse,overridein abgeleiteter Klasse - B)
virtualfĂŒr Variablen,overridefĂŒr Funktionen - C) Beide sind identisch
- D)
overrideist C-only
Antwort
A)
virtualin Basisklasse markiert ĂŒberschreibbare Methodeoverridein 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)
mallocundfree - B) Stack und Heap
- C)
classundstruct - D)
intundfloat
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
pzeigt aufarr[0]p++verschiebt um sizeof(int) â zeigt aufarr[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!