# Probeklausur Wintersemester 2024/25

Quelle: https://inf.zone/extras/altklausuren/ws-2425-probe/

**Probeklausur Wintersemester 2024/25.** Drei Aufgaben, 50 Punkte.

**Altklausur**

Die Aufgaben einer früheren E-Prüfung, ohne Lösungen. Geprüft wurde am Laptop: Wo hier ein leerer Kasten steht, war in der Prüfung ein Eingabefeld. Zu jeder Teilaufgabe gab es außerdem das Kästchen [„Weiß ich nicht“](https://inf.zone/extras/exam-hints/#weiß-ich-nicht-kästchen).

Den Code, der in der Prüfung im Ordner `/exam/pyramid` lag, gibt es als [ws-2425-probe.zip](https://inf.zone/download/extras/altklausuren/ws-2425-probe.zip). Im Codespace laden und entpacken Sie ihn so:

```bash
wget https://inf.zone/download/extras/altklausuren/ws-2425-probe.zip
unzip ws-2425-probe.zip
```

Die Tests aus der Prüfung liegen bei. Wo die Aufgabe `check50 checks/...` nennt, geben Sie `check50 --dev checks/...` ein.

## Aufgabe 1: Löchrige Pyramide (19 Punkte)

*In der Probeklausur steht Ihnen nur eine Kurzfassung des CS50-Manuals zur Verfügung. Diese erreichen Sie über den Ordner exam-files. Dieser Ordner ist über den File-Manager Dolphin erreichbar.*

In dieser Aufgabe erstellen Sie ein Programm, das eine Pyramide mit einer bestimmten Höhe zeichnet. Die Höhe erhält Ihr Programm als *Kommandozeilenparameter*. Vor der Ausgabe der Pyramide soll Ihr Programm überprüfen, ob der übergebene Parameter eine Zahl ist und ob diese Zahl groß genug ist, um eine Pyramide auszugeben (Mindesthöhe: 2). Die Pyramiden sollen aus Sternen und Leeerzeichen bestehen, die so angeordnet sind, wie in der folgenden Abbildung. Leere Felder innerhalb der Pyramide sind Leerzeichen.

![Löchrige Pyramiden der Höhen 2, 3 und 4 in Kästchen: in jeder Zeile Sterne mit je einem leeren Kästchen dazwischen, die Spitze in der Mitte der obersten Zeile](https://inf.zone/extras/altklausuren/ws-2425-probe/bild-1.png)

**Befolgen Sie die hier erklärten Schritte zum Öffnen von VS Code:**

1. **Kopieren Sie** zunächst den Ordner `/exam/pryamid` in Ihr Home-Verzeichnis. Dazu verwenden Sie zum Beispiel den Befehl `cp -r` auf der Kommandozeile. Die Kommandozeile öffnen Sie, indem Sie im Start-Menü im Suchfeld nach `Konsole` suchen. Sie können den Ordner aber auch mit dem File-Manager (*Dolphin*) in Ihr Home-Verzeichnis kopieren (`/exam` ist dort über *exam-files* erreichbar).
2. Starten Sie anschließend **VS Code**, etwa indem Sie im Start-Menü im Suchfeld `Code` eingeben.
3. In VS Code **öffnen Sie den Ordner** (“Open Folder”), den Sie gerade in Ihr Home-Verzeichnis kopiert haben (also nicht `/exam/pyramid`, sondern `pyramid` in Ihrem Home-Verzeichnis).
4. Anders als Sie es gewohnt sind, speichert VS Code Änderungen *nicht* automatisch. Das **automatische Speichern** aktivieren Sie, indem Sie im File-Menü von VS Code am unteren Ende den Menüpunkt `Auto Save` anklicken.
5. Prüfen Sie, ob in VS Code die Kommandozeile korrekt konfiguriert ist. Falls der Prompt mit **student@pc** beginnt, sind die CS50-Werkzeuge nicht verfügbar. Um die CS50-Werkzeuge verfügbar zu machen, müssen Sie ein neues Terminal öffnen (Terminal-Menü von VS Code: `New Terminal`)

Wenn Sie diese Schritte befolgt haben, können Sie in der Kommandozeile von VS Code den Befehl `check50 checks/pyramid` eingeben, um zu überprüfen, ob Ihr Programm alle Anforderungen korrekt umsetzt.

### 1a (4 Punkte)

Passen Sie zunächst die main-Funktion so an, dass sie Befehlszeilenargumente akzeptiert, und fügen Sie Code hinzu der prüft, ob der Benutzer ein Befehlszeilenargument angibt. Wenn der Benutzer kein Kommandozeilenargument angibt, soll die Meldung "`Usage: ./pyramid <number>`" ausgegeben werden.

*Bitte fügen Sie den gesamten Quellcode der Datei in das folgende Feld ein.*

*[Antwortfeld, mehrzeilig]*

### 1b (6 Punkte)

Vervollständigen Sie die Funktion `isNumber(string arg)` um zu prüfen, ob das Kommandozeilenargument eine Zahl ist. Rufen Sie diese Funktion von der main-Funktion aus auf und ändern Sie den Code so, dass "`Usage: ./pyramid <number>`" ausgegeben wird, wenn keine gültige Zahl übergeben wird. Prüfen Sie außerdem, ob die angegebene Zahl groß genug ist, um eine Pyramide auszugeben. Sollte dies nicht der Fall sein, geben Sie die Meldung "`Error: number not large enough.`" aus und beenden das Programm.

*Bitte fügen Sie den gesamten Quellcode der Aufgabe in dieses Feld ein.*

*[Antwortfeld, mehrzeilig]*

### 1c (9 Punkte)

Abschließend implementieren Sie die Funktion `drawPyramid(int height)`, die eine Pyramide ausgibt, die dem in dieser aufgabe gezeigten Schema entspricht. Rufen Sie die Funktion in der main-Funktion auf, um die Pyramide auf der Kommandozeile auszugeben.

*Bitte fügen Sie den gesamten Quellcode der Aufgabe in dieses Feld ein.*

*[Antwortfeld, mehrzeilig]*

## Aufgabe 2: Python, Theorie und Grundlagen (18 Punkte)

### 2a (6 Punkte)

Konvertieren Sie den folgenden C-Code in ein äquivalentes Python-Programm.

```c
int numbers[] = {1, 2, 3, 4, 5};
int sum = 0;
int length = 5;

for (int i = 0; i < length; i++) {
    if (numbers[i] % 2 == 0) {
        sum += numbers[i];
    }
}
printf("%d\n", sum);
```

Fügen Sie hier Ihren Python-Code ein.

*[Antwortfeld, mehrzeilig]*

### 2b (6 Punkte)

Beantworten Sie die folgenden Fragen zu Datenstrukturen und Laufzeiteffizienz.

Bei welcher dieser Datenstrukturen wird das LIFO-Prinzip angewendet?<br>a) Queue<br>b) Stack<br>c) Hashtable<br>d) Array

*[Antwortfeld]*

Welche der in der Vorlesung behandelten Datenstukturen wird durch die folgenden zwei `struct`-Typen definiert? Geben Sie ihre Antworten in der Form "name:struktur" (z. B. "S1:Van Emde Boas Tree") an.

```c
typedef struct S1
{
    int value;
    struct node *n;
}
S1;

typedef struct S2
{
    int value;
    struct S2 *a;
    struct S2 *b;
} S2;
```

*[Antwortfeld, mehrzeilig]*

Gegeben ist eine Textdatei, die 1 Million Strings enthält (einen pro Zeile). Die Strings sind in der Textdatei bereits alphabetisch sortiert. Wird ein Sortieralgorithmus auf die Zeilen dieser Datei angewendet, beträgt die Laufzeit 2,5 Sekunden. Nun wird derselbe Algorithmus auf eine andere Textdatei angewendet. Diese enthält 10 Millionen Strings, ebenfalls bereits sortiert, je ein String pro Zeile.

Tragen Sie in die folgenden Felder ein, ob die jeweiligen Aussagen korrekt oder inkorrekt sind. Begründen Sie ihre Aussage.

Wenn es sich bei dem Algorithmus um Selection Sort handelt, ist zu erwarten, dass das Verarbeiten der zweiten Datei etwa 8–12 mal so lang dauert wie das Verarbeiten der ersten Datei.

*[Antwortfeld, mehrzeilig]*

Merge Sort verarbeitet diese Dateien schneller als Bubble Sort.

*[Antwortfeld, mehrzeilig]*

### 2c (6 Punkte)

Sie möchten in einem C-Programm in der Funktion `main` den Exit-Code 2 zurückgeben. Wie lautet die dazu erforderliche Anweisung (inklusive Strichpunkt)?

*[Antwortfeld, mehrzeilig]*

Warum funktioniert folgender Code NICHT zum Löschen des ersten Elements einer Liste?

```c
void remove_first(sllnode* head) {
    head = head->next;
}
```

*[Antwortfeld, mehrzeilig]*

## Aufgabe 3: Grundlagen, Konsole und HTML (13 Punkte)

### 3a (5 Punkte)

Welche drei Arten von Codequalität haben Sie im Kurs kennengelernt?

*[Antwortfeld, mehrzeilig]*

Wie viele verschiedene Werte können mit 32 Bits dargestellt werden?<br>Geben Sie das Ergebnis als Ganzzahl ohne Tausendertrennzeichen an (also nur Ziffern).

*[Antwortfeld]*

### 3b (4 Punkte)

Sie haben verschiedene Stellenwertsysteme kennengelernt, etwa zur Basis 2 und zur Basis 16. In dieser Aufgabe geht es um ein Stellenwertsystem zur Basis 14, das die ersten Buchstaben des lateinischen Alphabets verwendet, um die "Ziffern" darzustellen (Buchstabe A entspricht der 0, B der 1, C der 2 usw.). Gegeben ist die Dezimalzahl **1755**. Rechnen Sie die Zahl in das System der Basis 14 um. Ihre Antwort sollte in der ersten Zeile die Antwort enthalten, also die drei Buchstaben im Stellenwertsystem zur Basis 14, den Platz darunter können Sie für Zwischenrechnungen nutzen. Es ist nicht erforderlich (aber erlaubt) die Lösung durch ein Programm zu ermitteln.

*[Antwortfeld, mehrzeilig]*

### 3c (2 Punkte)

Betrachten Sie folgenden Text. Ermitteln Sie die Farbe (exakter hexadezimaler Farbcode) und geben Sie ihn mit führender Raute (`#`) an.

<p style="color: #aa4242">The quick brown fox jumps over the lazy dog.</p>

*[Antwortfeld]*

### 3d (2 Punkte)

Sie sehen diese Kommandozeilenausgabe:

```text
$ cat daten.csv
Forchheim,36
Bamberg,28
Coburg,36
```

Was gibt in diesem Fall folgende Kommandozeile-Pipeline aus? Geben Sie die Ausgabe an, keine Beschreibung.

`sort daten.csv | cut -f2 -d',' | sort | uniq`

*[Antwortfeld, mehrzeilig]*
