C-Kurs/StringArraySortieren: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „=Aufgabe= Schreibt ein Programm, was folgenes tut: <br> Es nimmt die Zeichenketten aus der Kommandozeile beim Aufruf des Programms, und gibt sie <br> a) sortiert ...“) |
PaulG (Diskussion | Beiträge) K (verschob „Ckurs/StringArraySortieren“ nach „C-Kurs/StringArraySortieren“) |
||
(3 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | = | + | == 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. 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 == | ||
+ | |||
+ | 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. | ||
+ | |||
+ | Schreibe ein Programm, das alle angegebenen Kommandozeilenparameter zeilenweise ausgibt. Warum wird immer ein "Parameter" mehr ausgegeben? | ||
+ | |||
+ | == 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 | ||
+ | |||
+ | void mem_copy(char *destination, char *source, int length) { | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | welche die angegebene Anzahl von Bytes (=Zeichen) von <tt>source</tt> nach <tt>destination</tt> kopiert. | ||
+ | |||
+ | Tipp: Mit dem Ausdruck <tt>*ptr++</tt> kannst du auf das Ziel eines Pointers <tt>ptr</tt> zugreifen und den Pointer gleich danach erhöhen. | ||
+ | |||
+ | 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 == | ||
+ | |||
+ | 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 <tt>a</tt> lexikographisch kleiner als <tt>b</tt> ist oder einen positiven Wert, falls <tt>a</tt> lexikographisch größer als <tt>b</tt> 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 [http://de.wikipedia.org/wiki/Bubblesort 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 ;) | ||
+ | |||
+ | <!-- | ||
+ | Als kleine Starthilfe folgt ein Beispiel, wie so ein Kommentar formatiert sein könnte. Mit "Vorschau zeigen" kannst du dir ansehen, was deine Änderung bewirken würde, ohne wirklich etwas zu ändern. | ||
+ | Du musst übrigens außerhalb dieses auskommentieren Bereichs schreiben ;) | ||
+ | |||
+ | ==== Robert ==== | ||
+ | Na mal schauen, ob irgendjemand diese Funktion wirklich benutzt. Ich fände es jedenfalls toll. | ||
+ | --> | ||
+ | |||
+ | [[Kategorie:CKurs]] | ||
+ | [[Kategorie:CKurs_Aufgaben]] |
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 ;)