Hilfsmittel: keine — auch kein Compiler. Bearbeite alle zehn Aufgaben und klicke dann auf „Auswerten“; danach werden die Lösungen freigeschaltet.
Wissen und Reproduzieren
16 Punkteprintf("%d\n", 23 / 4); printf("%d\n", 23 % 4); printf("%.1f\n", 23 / 4.0); printf("%d\n", (int) 7.9);
Gib die vier Ausgabezeilen an.
Lösung anzeigen (nach Auswerten freigeschaltet)
Erwartungshorizont:
a) 23 / 4 = 5, Ganzzahldivision (1 P) b) Rest 3, denn 23 = 5 · 4 + 3 (1 P) c) 23 / 4,0 = 5,75, mit einer Nachkommastelle 5.8 (1 P) d) der Cast schneidet ab: 7, nicht 8 (1 P).
Ordne jedem Begriff die passende Beschreibung zu.
Lösung anzeigen (nach Auswerten freigeschaltet)
Erwartungshorizont:
Präprozessor: #-Zeilen; Compiler: Syntax prüfen, Maschinencode; Linker: zusammensetzen; Header-Datei: Prototypen. Die Beschreibung „Zeile für Zeile“ gehört zu einem Interpreter und bleibt übrig. Je richtige Zuordnung 1 P.
Nenne die wahren Aussagen. Es gilt int x = 10; int *p = &x;
Lösung anzeigen (nach Auswerten freigeschaltet)
Erwartungshorizont:
Wahr: *p = 10, p speichert &x, *p = 3 schreibt in x, sizeof misst in Byte. Falsch: p enthält eine Adresse, nicht 10; Adressen ändern sich bei jedem Start. Je richtige Auswahl 1 P, je Fehlklick 1 P Abzug.
void loop() { digitalWrite(13, HIGH); delay(300); digitalWrite(13, LOW); delay(100); }
Die LED an Pin 13 wird von diesem loop() gesteuert. Berechne die gesuchten Größen.
Lösung anzeigen (nach Auswerten freigeschaltet)
Erwartungshorizont:
a) T = 300 ms + 100 ms = 400 ms (1 P) b) f = 1 / 0,4 s = 2,5 Hz (1 P) c) 30 s · 2,5 Hz = 75 bzw. 30 000 ms / 400 ms = 75 (2 P).
Zusammenhänge herstellen
22 Punkteint w[6] = {5, 8, 3, 8, 6, 2}; int s = 0, z = 0; for (int i = 0; i < 6; i++) { if (w[i] > 4) { s += w[i]; z++; } } printf("%d %d %.2f\n", s, z, (double) s / z);
Bestimme die drei ausgegebenen Werte.
Lösung anzeigen (nach Auswerten freigeschaltet)
Erwartungshorizont:
| i | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| w[i] | 5 | 8 | 3 | 8 | 6 | 2 |
| > 4? | ✓ | ✓ | – | ✓ | ✓ | – |
| s | 5 | 13 | 13 | 21 | 27 | 27 |
| z | 1 | 2 | 2 | 3 | 4 | 4 |
a) s = 27 (2 P) b) z = 4 (2 P) c) (double) 27 / 4 = 6,75, Ausgabe 6.75 (2 P; ohne Cast wäre es 6 — dann 0 P).
#include <stdio.h> void f(int *a, int b) { *a = *a * 2; b = b + *a; } int main(void) { int x = 3, y = 4; int *p = &y; f(&x, y); f(p, x); printf("%d %d\n", x, y); return 0; }
Analysiere die beiden Aufrufe von f.
b = b + *a; keine Variable in main? (eine Antwort richtig) 2 PLösung anzeigen (nach Auswerten freigeschaltet)
Erwartungshorizont:
1. Aufruf f(&x, y): x = 3 · 2 = 6; b ist eine Kopie von y. 2. Aufruf f(p, x): p zeigt auf y, also y = 4 · 2 = 8. Ausgabe 6 8.
a) 6 (2 P) b) 8 (2 P) c) b ist ein Wertparameter — Änderungen betreffen nur die Kopie (2 P).
1#include <stdio.h> 2#include <string.h> 3 4int main(void) { 5 char name[20]; 6 int alter; 7 scanf("%d", alter); 8 strcpy(name, "Jonas"); 9 if (name == "Jonas") { 10 printf("Hallo %c, du bist %d\n", name, alter); 11 } 12 return 0; 13}
Das Programm soll ein Alter einlesen und „Hallo Jonas, du bist …“ ausgeben. Es enthält drei Fehler. Überprüfe das Programm.
Lösung anzeigen (nach Auswerten freigeschaltet)
Erwartungshorizont:
Zeile 7: scanf("%d", &alter); — scanf braucht die Adresse. Zeile 9: strcmp(name, "Jonas") == 0 statt ==, das Adressen vergleicht. Zeile 10: %s statt %c für eine Zeichenkette. Zeile 5, 6 und 8 sind korrekt (20 Byte reichen für „Jonas“). Je richtige Zeile 2 P, je Fehlklick 2 P Abzug.
class Zaehler { private: int wert; int grenze; public: Zaehler(int g) { wert = 0; grenze = g; } void plus() { if (wert < grenze) wert++; } void reset() { wert = 0; } int get() { return wert; } }; int main() { Zaehler z(3); for (int i = 0; i < 5; i++) { z.plus(); } cout << z.get() << " "; z.reset(); z.plus(); Zaehler &r = z; r.plus(); cout << z.get() << endl; return 0; }
Ermittle die Ausgabe.
private bei wert? (eine Antwort richtig) 1 PLösung anzeigen (nach Auswerten freigeschaltet)
Erwartungshorizont:
a) plus() erhöht nur bis zur Grenze 3 — die letzten zwei Aufrufe bleiben wirkungslos: 3 (2 P). b) reset → 0, plus → 1; r ist eine Referenz auf z, r.plus() → 2 (1 P). c) Kapselung: Zugriff nur über die öffentlichen Methoden (1 P).
Verallgemeinern und beurteilen
12 PunkteBeurteile die Aussagen.
Lösung anzeigen (nach Auswerten freigeschaltet)
Erwartungshorizont:
Wahr: 0 … 19 + 5 = 5 … 24; 210 = 1024 ≥ 1000; Referenzparameter sind ein zweiter Name der Variablen. Falsch: srand nur einmal (sonst gleiche Zahlen); C prüft keine Grenzen (undefiniertes Verhalten); „Hallo“ braucht 6 Byte mit \0. Je richtige Auswahl 2 P, je Fehlklick 2 P Abzug.
Die Schul-Wetterstation speichert die Mittagstemperaturen einer Woche in int t[7] = {12, 15, 9, 17, 17, 11, 14}; Du sollst zwei Funktionen entwerfen: ersterMaxIndex(t, n) liefert den Index des ersten Tages mit der höchsten Temperatur, tageUeberSchnitt(t, n) die Anzahl der Tage, die wärmer als der Durchschnitt sind.
ersterMaxIndex(t, 7) 2 PtageUeberSchnitt(t, 7) 2 PLösung anzeigen (nach Auswerten freigeschaltet)
Erwartungshorizont:
#include <stdio.h> int ersterMaxIndex(int t[], int n) { int pos = 0; for (int i = 1; i < n; i++) { if (t[i] > t[pos]) pos = i; } return pos; } int tageUeberSchnitt(int t[], int n) { int summe = 0; for (int i = 0; i < n; i++) summe += t[i]; double schnitt = (double) summe / n; int anzahl = 0; for (int i = 0; i < n; i++) { if (t[i] > schnitt) anzahl++; } return anzahl; } int main(void) { int t[7] = {12, 15, 9, 17, 17, 11, 14}; printf("%d\n", ersterMaxIndex(t, 7)); printf("%d\n", tageUeberSchnitt(t, 7)); return 0; }
3 4
a) Indizes 0 … n − 1 (2 P); sizeof(t) wäre 28 Byte, nicht 7 Elemente. b) Maximum 17 zuerst bei Index 3 — mit > bleibt der erste Treffer stehen (2 P). c) Summe 95, Schnitt 95 / 7 ≈ 13,57 (mit Cast!); wärmer sind 15, 17, 17, 14 → 4 Tage (2 P).
Ergebnis
| Aufgabe | Thema | Punkte |
|---|
Notenschema
| Punkte | Note | Beurteilung |
|---|---|---|
| 46 – 50 P | 1 | sehr gut |
| 40 – 45 P | 2 | gut |
| 30 – 39 P | 3 | befriedigend |
| 22 – 29 P | 4 | ausreichend |
| 12 – 21 P | 5 | mangelhaft |
| 0 – 11 P | 6 | ungenügend |
