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:
| Übt | Hilft bei | |
|---|---|---|
| Warm-up 1 | Kommandozeilenargumente zählen | Cäsar |
| Warm-up 2 | Kommandozeilenargumente ausgeben | Cäsar |
| Warm-up 3 | Einen falschen Aufruf abfangen | Cäsar |
| 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_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: 3Warum 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]: zweiWie viele Durchläufe braucht die Schleife? Die Antwort steht schon in Ihrem Programm.
Wo zu finden?
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 nameDen 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?
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
42Rufen Sie das Programm danach mit abc auf. Was gibt es aus, und warum ist das für Cäsar ein Problem?
Wo zu finden?
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.