![]() |
c++ Beispielfrage...
Könnt mir jemand in verständlichen Worten Erklären was ich beim 11. Beispiel genau tun soll? :rolleyes:
"Schreiben Sie eine Funktion sort(char string[]), das die Zeichen in der als Parameter übergebenen Zeichenkette sortiert." http://www.pri.univie.ac.at/~itep/ws0304/hue/hue06.html Wie sollen also die eingegebenen Zeichen sortiert werden? Könnte das jemand anhand eines Beispiels erklären? |
Du sollst das Zeichen 'a' vor das Zeichen 'b' reihen, wenn diese beiden Zeichen in der übergebenen Zeichenkette vorkommen usw.
Ein Beispiel: Übergabe -> samba Ergebnis -> aabms Alles klar ?! Code:
void sort (char string[]) mfg Kikakater |
Achsoo also in alphabetischer Reihenfolge ausgeben, können die das nicht dazuschreiben?! :rolleyes:
Übrigens danke für dein Code, aber versteh ich ihn wieder nicht... :rolleyes: Was ist strlen? |
Zitat:
|
für lange Zeichenketten gibt es eine schnellere Variante:
Code:
#include <string.h> |
2 Fehler:
Falsch: for(i=0;i<255;i++) Richtig: for(i=0;i<=255;i++) - Falsch: for(i=0, pos=0;i<255;i++) Richtig: for(i=1, pos=0;i<=255;i++) ~ mfg Kikakater |
Außerdem muß folgende Zeile geändert werden:
Falsch: tabelle [string[i]] ++; Richtig: tabelle [ (unsigned char)string[i] ] ++; Es ist ein CASTen (ein Umtypisieren) notwendig, da für Zeichencodes > 127 - z.B. Umlaut A - ein negativer Index für das Array tabelle in der Funktion (besser Prozedur genannt da sort keinen Rückgabewert hat --> eben "void" sort (char string[])) herauskommt ! Der Wertebereich von char geht von -128 bis 127. Für tabelle[i], also das i (den Index) braucht man aber die Werte 1-255. Null zählt ja nicht, weil es (das Zeichen NUL (=binäre Null)) den Abschluß eines ASCII C Strings bildet. Deswegen braucht man das Element tabelle[0] nicht. Oder: tabelle [ ((unsigned char)string[i])-1 ] ++; schreiben. Dann stimmen die sogenannten beiden fehlerhaften Zeilen wieder. |
Ich würde es aber nach Variante 1 machen, weil man sich die dauernde Subtraktion von 1 in der Zeile
tabelle [ ((unsigned char)string[i])-1 ] ++; erspart. Die Anzahl der Elemente von tabelle muß von 255 auf 256 erweitert werden - mit Element 0 als quasi nutzlosem Element. static int tabelle[256], akt_char; // static, weil schneller außerdem würde ich nicht static verwenden, weil das Feld tabelle sonst am Heap und nicht am Stack abgelegt wird (=Speicherplatzverschwendung). akt_char wird nicht verwendet und ist demnach obsolet. |
Zitat:
Was macht die ganzzahlige Variable "nochmal"? Sie wird unten mit 1 initialisiert, was hat das für einen Zweck? Sorry, ich check diesen Algorithmus nicht ganz... Achja und noch eine Frage: Wieso hat die Funktion void (if(len<2) return; ) einen Rückgabewert? |
Hat sie doch eh nicht.
In diesem Fall bedeutet return einfach nur, daß die Funktion verlassen wird. Denk dir dort halt ein stop, break oder sonst was. Jak |
Kann mir jemand erklären wieso dieser Code nix ausgibt?:
Code:
|
Zitat:
Guter Hinweis zum Heap. |
Zitat:
Der Kopf der for schleife besteht immer aus Code:
for ( Vorbereitung[,Vorbereitung[,...]]; Dann zieht die Bedingung der äussersten for Schleife ... ---> somit wird diese - also die äusserste for Schleife - nocheinmal durchlaufen. Ein Fehler ist auch im Code: Nach for(start=0,nochmal=0;nochmal;start++) { müsste es nochmal= 0; heißen. Sonst wird eine Endlosschleife produziert, falls auch nur ein Zeichen umsortiert worden ist (beim ersten Durchlaufen der gesamten Zeichenkette). cin>>string[i]; ist außerdem falsch ! Du musst die ganze Zeichenkette einlesen und nicht nur ein Char Zeichen an der Indexstelle i des Char Arrays string[]. |
Das bzw. die Vorbereitungsstatements werden NUR EINMAL (nämlich am Anfang) der for Schleife ausgeführt, die Bedingung wird IMMER VOR DER AUSFÜHRUNG des Schleifenkörpers abgefragt, die Inkrement(bzw. Increment) usw. Statements werden IMMER NACH DER AUSFÜHRUNG des Schleifenkörpers durchgeführt. Ein vorzeitiger Abbruch der Schleife erfolgt mit break; bzw. in der Praxis mit if(irgendeine_abbruch_bedingung_erfuellt) break;
|
Noch zu Deiner Frage:
if(len<2) return; ohne Rückgabewert wird kein Rückgabewert zurückgegeben :D D.h. return; /* ohne return 0; oder return 1; oder return ret_variable; */ ist keine Rückgabe eines Wertes. Es ist lediglich so, daß die PROZEDUR - oder void Funktion "sort" - (void bedeutet "kein Wert" bzw. "undefiniert" bzw. "nichts vorhanden") VORZEITIG verlassen wird. Es passiert nichts anderes, als daß die Rücksprungadresse (vom Stack) geladen wird und zur aufrufenden Funktion zurückverzweigt wird. Jedoch wird KEIN Rückgabewert bereitgestellt - es handelt sich eben um eine void Funktion (semantisch = bedeutungsmäßig eine Prozedur). |
Vielen Dank für deine Beiträge.
Ich bekomm aber immer noch nichts raus..., bin halt zu unfähig :heul: Also es weden ganze Zeichenketten eingelesen, hast du es so gemeint? Code:
#include <iostream.h> |
Code:
#include <iostream> nochmal muss am Anfang mit 1 initialisiert werden, hast recht und war mein Fehler. Im if Block jedenfalls auf 1 setzen und am Anfang des Schleifenblocks auf 0. 0 steht für die Annahme, daß alles bereits sortiert ist. |
Vielen Dank für deine Hilfe.
Auf den Zeiger wär ich aber nicht gekommen, weil wir stoffmäßig noch nicht so weit sind. hmm, funktioniert zwar unter Windows aber mit dem g++ Kompiler gehts nicht...eigenartig. |
Poste die Fehlermeldung des g++ Compilers. Ich weiß nicht, was es da hat. Du musst mich aufklären.
Außerdem ist der einzige Zeiger in meinem Beispiel ein Feld (Array) aus mehreren char * Zeigern namens argv. |
Die Schnittstelle der Forward Deklaration stimmt mit der der Implementierung nicht überein:
Code:
void sort(char[]) |
Streng genommen ja, wird wahrscheinlich der Fehler, respektive lediglich eine Warnung, sein.
Du kannst recht haben. Normalerweise mach ich so etwas eh nicht, war ein Zugeständnis an die Schlacksichkeit hier im Forum :o *peinlich mir das eben geschriebene ist* |
Alle Zeitangaben in WEZ +2. Es ist jetzt 04:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag