Vorschau auf das nächste Semester, noch nicht veröffentlicht.
Zur aktuellen Seite

Warm-ups (freiwillig)

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

ÜbtHilft bei
Warm-up 1Kommandozeilenargumente zählenCäsar
Warm-up 2Kommandozeilenargumente ausgebenCäsar
Warm-up 3Einen falschen Aufruf abfangenCäsar
Warm-up 4Aus einem Argument eine Zahl machenCäsar

Legen Sie für die Warm-ups eine eigene Datei an, zum Beispiel warmup_aufgaben_1.c für Übung 1, 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.

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: KommandozeilenargumenteAngabe, die Sie beim Start eines Programms hinter dessen Namen schreiben. Bei ./caesar 13 ist 13 das Argument; in C kommt es über argc und argv im Programm an. Glossar →. Dafür bekommt main zwei Parameter.

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

#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:

$ ./warmup_aufgaben_2_2
argc: 1
$ ./warmup_aufgaben_2_2 eins zwei
argc: 3

Warum ist argc schon ohne weitere Angaben 1?

Wo zu finden?

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:

$ ./warmup_aufgaben_2_2 eins zwei
argv[0]: ./warmup_aufgaben_2_2
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. Wie man über ein Array iteriert, kennen Sie aus den Warm-ups von Übung 2.1.

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:

$ ./warmup_aufgaben_2_2 Ada
Hallo, Ada
$ ./warmup_aufgaben_2_2
Usage: ./warmup_aufgaben_2_2 name
$ ./warmup_aufgaben_2_2 Ada Lovelace
Usage: ./warmup_aufgaben_2_2 name

Den Rückgabewert von main sehen Sie nicht direkt. Geben Sie direkt 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 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_2_2 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:

$ ./warmup_aufgaben_2_2 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 beschrieben. atoi gibt 0 zurück, wenn der String nicht mit einer Zahl beginnt. Deshalb verlangt Cäsar, dass Sie das Argument vorher Zeichen für Zeichen prüfen.