Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/StringArraySortieren: Unterschied zwischen den Versionen

K (hat „Ckurs2009/StringArraySortieren“ nach „Ckurs/StringArraySortieren“ verschoben: Aufgaben sind Kurs übergreifend nutzbar)
 
(2 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=Aufgabe=
+
== Ziel ==
Schreibt ein Programm, was folgenes tut: <br>
 
Es nimmt die Zeichenketten aus der Kommandozeile
 
beim Aufruf des Programms, und gibt sie <br>
 
a) sortiert nach lexikographischer Ordnung und <br>
 
b) sortiert nach Standartordnung aus. <br>
 
  
=Hinweis=
+
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]).
Wer will kann qsort aus stdlib.h benutzen
+
 
 +
== 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

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 ;)