![]() |
![]() |
|
|
|||||||
| 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) | |
|
|