C-Kurs/StringArraySortieren: Unterschied zwischen den Versionen
(Aufgabe ausführlicher formuliert) |
PaulG (Diskussion | Beiträge) K (verschob „Ckurs/StringArraySortieren“ nach „C-Kurs/StringArraySortieren“) |
||
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | = Ziel = | + | == Ziel == |
− | In dieser Aufgabe sollst du dich mit der Übergabe von Kommandozeilenparametern an C-Programme sowie dem Speicherzugriff mittels Zeigern vertraut machen. Dazu soll ein Programm entwickelt werden, das die übergebenen Kommandozeilenparameter [http://de.wikipedia.org/wiki/Lexikographisch lexikographisch] sortiert ausgibt. | + | In dieser Aufgabe sollst du dich mit der Übergabe von Kommandozeilenparametern an C-Programme sowie dem Speicherzugriff mittels Zeigern vertraut machen. Dazu soll ein Programm entwickelt werden, das die übergebenen Kommandozeilenparameter [http://de.wikipedia.org/wiki/Lexikographisch lexikographisch] sortiert ausgibt. Implementiere die notwendigen Hilfsfunktionen ohne Verwendung der entsprechenden Funktionen aus der stdlib ([http://cplusplus.com/reference/clibrary/cstring/memcpy/ memcpy], [http://cplusplus.com/reference/clibrary/cstring/strcmp/ strcmp] und [http://cplusplus.com/reference/clibrary/cstdlib/qsort/ qsort]). |
− | = Array ausgeben = | + | == Array ausgeben == |
Die <tt>main()</tt>-Funktion eines C-Programms hat zwei Parameter: der erste (<tt>int argc</tt>) gibt die Anzahl der Kommandozeilenparameter an, der zweite (<tt>char *argv[]</tt>) zeigt auf ein Array von Strings (also <tt>char</tt>-Pointer) mit den einzelnen, durch Leerzeichen getrennten Kommandozeilenparametern. | Die <tt>main()</tt>-Funktion eines C-Programms hat zwei Parameter: der erste (<tt>int argc</tt>) gibt die Anzahl der Kommandozeilenparameter an, der zweite (<tt>char *argv[]</tt>) zeigt auf ein Array von Strings (also <tt>char</tt>-Pointer) mit den einzelnen, durch Leerzeichen getrennten Kommandozeilenparametern. | ||
Zeile 9: | Zeile 9: | ||
Schreibe ein Programm, das alle angegebenen Kommandozeilenparameter zeilenweise ausgibt. Warum wird immer ein "Parameter" mehr ausgegeben? | Schreibe ein Programm, das alle angegebenen Kommandozeilenparameter zeilenweise ausgibt. Warum wird immer ein "Parameter" mehr ausgegeben? | ||
− | = Speicher kopieren = | + | == Speicher kopieren == |
Bevor wir das <tt>argv</tt>-Array sortieren können, müssen wir es kopieren, da auf einigen Systemen der Speicher des Arrays geschützt ist. Schreibe dazu eine Funktion | Bevor wir das <tt>argv</tt>-Array sortieren können, müssen wir es kopieren, da auf einigen Systemen der Speicher des Arrays geschützt ist. Schreibe dazu eine Funktion | ||
Zeile 23: | Zeile 23: | ||
Passe nun dein Programm so an, dass via <tt>malloc()</tt> ausreichend Speicher für eine Kopie des <tt>argv</tt>-Arrays angefordert wird, es dann mit <tt>mem_copy()</tt> dorthin kopiert wird und zuletzt diese Kopie ausgegeben wird. | Passe nun dein Programm so an, dass via <tt>malloc()</tt> ausreichend Speicher für eine Kopie des <tt>argv</tt>-Arrays angefordert wird, es dann mit <tt>mem_copy()</tt> dorthin kopiert wird und zuletzt diese Kopie ausgegeben wird. | ||
− | = Strings vergleichen = | + | == Strings vergleichen == |
Bevor wir das ganze Array sortieren können, benötigen wir zuerst eine Funktion zum Vergleich zweier Strings miteinander: | Bevor wir das ganze Array sortieren können, benötigen wir zuerst eine Funktion zum Vergleich zweier Strings miteinander: | ||
Zeile 35: | Zeile 35: | ||
Tipp: Für einzelne Zeichen entspricht der Rückgabewert genau der Differenz dieser Zeichen. | Tipp: Für einzelne Zeichen entspricht der Rückgabewert genau der Differenz dieser Zeichen. | ||
− | = Array sortieren = | + | == Array sortieren == |
Nun kannst du die Funktion zum Sortieren implementieren: | Nun kannst du die Funktion zum Sortieren implementieren: |
Aktuelle Version vom 5. März 2013, 17:37 Uhr
Inhaltsverzeichnis
Ziel
In dieser Aufgabe sollst du dich mit der Übergabe von Kommandozeilenparametern an C-Programme sowie dem Speicherzugriff mittels Zeigern vertraut machen. Dazu soll ein Programm entwickelt werden, das die übergebenen Kommandozeilenparameter lexikographisch sortiert ausgibt. Implementiere die notwendigen Hilfsfunktionen ohne Verwendung der entsprechenden Funktionen aus der stdlib (memcpy, strcmp und qsort).
Array ausgeben
Die main()-Funktion eines C-Programms hat zwei Parameter: der erste (int argc) gibt die Anzahl der Kommandozeilenparameter an, der zweite (char *argv[]) zeigt auf ein Array von Strings (also char-Pointer) mit den einzelnen, durch Leerzeichen getrennten Kommandozeilenparametern.
Schreibe ein Programm, das alle angegebenen Kommandozeilenparameter zeilenweise ausgibt. Warum wird immer ein "Parameter" mehr ausgegeben?
Speicher kopieren
Bevor wir das argv-Array sortieren können, müssen wir es kopieren, da auf einigen Systemen der Speicher des Arrays geschützt ist. Schreibe dazu eine Funktion
void mem_copy(char *destination, char *source, int length) { ... }
welche die angegebene Anzahl von Bytes (=Zeichen) von source nach destination kopiert.
Tipp: Mit dem Ausdruck *ptr++ kannst du auf das Ziel eines Pointers ptr zugreifen und den Pointer gleich danach erhöhen.
Passe nun dein Programm so an, dass via malloc() ausreichend Speicher für eine Kopie des argv-Arrays angefordert wird, es dann mit mem_copy() dorthin kopiert wird und zuletzt diese Kopie ausgegeben wird.
Strings vergleichen
Bevor wir das ganze Array sortieren können, benötigen wir zuerst eine Funktion zum Vergleich zweier Strings miteinander:
int str_compare(char *a, char *b) { ... }
Die Funktion soll den Wert 0 zurückgeben, falls beide Strings gleich sind, einen negativen Wert, wenn a lexikographisch kleiner als b ist oder einen positiven Wert, falls a lexikographisch größer als b ist.
Tipp: Für einzelne Zeichen entspricht der Rückgabewert genau der Differenz dieser Zeichen.
Array sortieren
Nun kannst du die Funktion zum Sortieren implementieren:
void sort(char **list, int length) { ... }
Ein einfacher, für unser Beispiel ausreichender Sortieralgorithmus ist Bubblesort.
Viel Spaß!
Kommentare
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf "bearbeiten" und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)