![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.107
|
![]() Könnt mir jemand in verständlichen Worten Erklären was ich beim 11. Beispiel genau tun soll?
![]() "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? |
![]() |
![]() |
![]() |
#2 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() 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[]) { long i,start,len= strlen(string); int nochmal; char swap_char; if(len<2) return; for(start=0,nochmal=0;nochmal;start++) { for(i=start+1;i<len;i++) { if(string[start]>string[i]) { nochmal= 1; swap_char= string[start]; string[start]= string[i]; string[i]= swap_char; } } } } ![]() mfg Kikakater |
![]() |
![]() |
![]() |
#3 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.107
|
![]() Achsoo also in alphabetischer Reihenfolge ausgeben, können die das nicht dazuschreiben?!
![]() Übrigens danke für dein Code, aber versteh ich ihn wieder nicht... ![]() Was ist strlen? |
![]() |
![]() |
![]() |
#4 | |
bitte Mailadresse prüfen!
Registriert seit: 03.04.2001
Beiträge: 2.387
|
![]() Zitat:
|
|
![]() |
![]() |
![]() |
#5 |
Hero
![]() |
![]() für lange Zeichenketten gibt es eine schnellere Variante:
Code:
#include <string.h> void sort (char string[]); int main() { char string1[] = "abeejkieecccABEFE21342"; sort(string1); } // sort bei längeren Strings void sort (char string[]) { static int tabelle[255], akt_char; // static, weil schneller long i, j, pos, len= strlen(string); // Initialisierung wegen static notwendig for(i=0;i<255;i++) { tabelle[i] = 0; } // sequentiell die Zeichen zählen for(i=0;i<len;i++) { tabelle [string[i]] ++; } for(i=0, pos=0;i<255;i++) { for (j = 0; j < tabelle[i]; ++j) { string[pos++] = (char) i; } } }
____________________________________
Bibel |
![]() |
![]() |
![]() |
#6 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() 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 |
![]() |
![]() |
![]() |
#7 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() 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. |
![]() |
![]() |
![]() |
#8 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() 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. |
![]() |
![]() |
![]() |
#9 | |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.107
|
![]() 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? |
|
![]() |
![]() |
![]() |
#10 |
Inventar
![]() Registriert seit: 13.06.2001
Beiträge: 1.830
|
![]() 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
____________________________________
Join the DNRC | Godwin\'s Law (thx@stona) Documentation is like sex: If it\'s good, it\'s very, very good. If it\'s bad, it\'s better than nothing. \"In theory, theory and practice are the same. In practice, they are not\" (Lawrence Berra) |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|