# Warm-ups (freiwillig)

Quelle: https://dev.inf.zone/exercises/04/warm-ups/

**Wozu das Ganze?**

Die Warm-ups führen die neuen Sprachmittel aus der Vorlesung „2.5 Arrays II“ in kleinen Schritten ein. Sie sind freiwillig, zählen nicht für die Bonuspunkte und sind nicht prüfungsrelevant. Nutzen Sie sie, wenn Sie bei einer Aufgabe nicht wissen, wie Sie anfangen sollen. Wenn Sie direkt loslegen können, fangen Sie mit den Aufgaben an.

Sie müssen nicht alle Warm-ups machen. Suchen Sie sich in der Tabelle das heraus, was Ihnen für eine Aufgabe fehlt:

| | Übt | Hilft bei |
|---|---|---|
| [Warm-up 1](#warm-up-1) | Kommandozeilenargumente zählen | Cäsar |
| [Warm-up 2](#warm-up-2) | Kommandozeilenargumente ausgeben | Cäsar |
| [Warm-up 3](#warm-up-3) | Einen falschen Aufruf abfangen | Cäsar |
| [Warm-up 4](#warm-up-4) | Aus einem Argument eine Zahl machen | Cäsar |

Legen Sie für die Warm-ups eine eigene Datei an, zum Beispiel `warmup_aufgaben_2.c` für Übung 2, im selben Ordner wie Ihre Übungsaufgaben. Die meisten Warm-ups bauen aufeinander auf: Sie ergänzen die Datei Schritt für Schritt. Lösungen gibt es für die Warm-ups nicht. Unter „Wo zu finden?“ steht jeweils, wo das Thema in Vorlesung und Shorts vorkommt. Mehr dazu im [FAQ zu den Warm-ups](https://dev.inf.zone/faq/uebung-warm-up/).

## Warm-up 1: Kommandozeilenargumente zählen

Bisher hat Ihr Programm alle Eingaben während der Ausführung abgefragt, etwa mit `get_string`. Man kann einem Programm aber auch beim Start etwas mitgeben: Kommandozeilenargumente. Dafür bekommt `main` zwei Parameter.

Legen Sie eine Datei `warmup_aufgaben_4.c` mit diesem Gerüst an:

```c
#include <cs50.h>
#include <stdio.h>

int main(int argc, string argv[])
{

}
```

`argc` enthält die Anzahl der Wörter, mit denen das Programm aufgerufen wurde. Geben Sie `argc` mit `printf` aus, kompilieren Sie und rufen Sie das Programm auf verschiedene Arten auf:

```plaintext
$ ./warmup_aufgaben_4
argc: 1
$ ./warmup_aufgaben_4 eins zwei
argc: 3
```

Warum ist `argc` schon ohne weitere Angaben `1`?

**Wo zu finden?**

In den [Notes zur Vorlesung 2](https://dev.inf.zone/lectures/2-arrays/notes2/#kommandozeilenparameter) und im [Short zu Kommandozeilenargumenten](https://dev.inf.zone/lectures/2-arrays/short-2-6-cmdlineargs/).

## Warm-up 2: Kommandozeilenargumente ausgeben

`argv` ist ein Array von Strings: `argv[0]` enthält den Namen des Programms, `argv[1]` das erste Argument danach und so weiter. Geben Sie mit einer Schleife alle Einträge von `argv` aus:

```plaintext
$ ./warmup_aufgaben_4 eins zwei
argv[0]: ./warmup_aufgaben_4
argv[1]: eins
argv[2]: zwei
```

Wie viele Durchläufe braucht die Schleife? Die Antwort steht schon in Ihrem Programm.

**Wo zu finden?**

In den [Notes zur Vorlesung 2](https://dev.inf.zone/lectures/2-arrays/notes2/#kommandozeilenparameter). Wie man über ein Array iteriert, kennen Sie aus den Warm-ups von [Übung 3](https://dev.inf.zone/exercises/03/warm-ups/).

## Warm-up 3: Einen falschen Aufruf abfangen

Kommentieren Sie die Schleife aus Warm-up 2 aus. Ihr Programm soll jetzt genau ein Argument verlangen und die Person dann begrüßen. Wird es mit keinem oder mit mehr als einem Argument aufgerufen, gibt es einen Hinweis aus und beendet sich mit dem Rückgabewert `1`:

```plaintext
$ ./warmup_aufgaben_4 Ada
Hallo, Ada
$ ./warmup_aufgaben_4
Usage: ./warmup_aufgaben_4 name
$ ./warmup_aufgaben_4 Ada Lovelace
Usage: ./warmup_aufgaben_4 name
```

Den Rückgabewert von `main` sehen Sie nicht direkt. Geben Sie gleich nach dem Aufruf `echo $?` im Terminal ein: Dann erscheint `0` nach einem erfolgreichen Lauf und `1` nach dem Hinweis.

**Wo zu finden?**

Im Abschnitt [Exit-Code](https://dev.inf.zone/lectures/2-arrays/notes2/#exit-code) der Notes zur Vorlesung 2.

## Warm-up 4: Aus einem Argument eine Zahl machen

Kommandozeilenargumente sind immer Strings, auch wenn sie wie Zahlen aussehen: `argv[1]` ist bei `./warmup_aufgaben_4 41` der String `"41"`, nicht die Zahl 41. Die Funktion `atoi` aus `stdlib.h` wandelt einen String in einen `int` um.

Ändern Sie Ihr Programm so, dass es sein Argument in eine Zahl umwandelt und die nächstgrößere Zahl ausgibt:

```plaintext
$ ./warmup_aufgaben_4 41
42
```

Rufen Sie das Programm danach mit `abc` auf. Was gibt es aus, und warum ist das für Cäsar ein Problem?

**Wo zu finden?**

Die Funktion ist im [CS50-Handbuch](https://manual.cs50.io/3/atoi) beschrieben.
