Update vom PN-Kollegen:
Er hat eine Lösung, die funktioniert und für die ich ewig brauchte, um sie zu verstehen, was daran liegt, dass ein kompliziertes Problem gelöst hat, das die zuverlässig die gleiche Lösung liefert.
Das kann man machen, wenn man ein kompliziertes Problem hat und findet eine zu lösendes Problem, das zuverlässig die gleiche Lösung liefert. Das Problem heißt "Wörter zählen". Ich bin mir sicher, niemand findet eine einfacher zu lösendes Problem, das zuverlässig die gleiche Lösung liefert. ^^
Dann bekam ich eine E-Mail von canlot und das sieht gut aus, denn er hat durchblicken lassen, dass er das richtige Problem gelöst hat. Er brauchte 20 Zeilen, aus denen man die Hälfte etwa noch kürzen könnte. Der andere Kandidat mit dem komplexeren Problem hat recht schönen Code, liegt aber bei 31 Zeilen und benutzt weniger überflüssige Klammern bei nur einer Anweisung.
canlot, zwei Fragen:
Code: Alles auswählen
int wordCount(const char *str, int counter)
{
counter = 0;
...
Häh?
Code: Alles auswählen
if (str[i]==' ')
{
}
else if(str[i]!=' ' && bedingung2 )
{
}
Wieso fragst Du in der if-Bedingung im Else-Part nach, ob str
!= ' ' ist? Wäre es ==' ', dann wärst Du nicht im Else-Part!? ^^
Mit der Variable "setzen" drückst Du etwas besonderes aus. Du könntest die Variable entsprechend benennen, denn ich habe keine Ahnung, warum die Variable "setzen" heißt. Wenn Du sie entsprechend benannt hast, könntest Du nochmal überlegen, ob Du mit dieser bewussten Information noch etwas am Code feilen kannst.
Der Code ist korrekt und gut. Aber man merkt, dass da nicht aufgeräumt wurde. Trotzdem ist er besser als der Code von PN-Menschen, dessen Code aufgeräumt, sauber und korrekt ist, aber halt ein anderes Problem gelöst hat.
EDIT: Ich habe auf Canlots Code aufbauend die wordCount() so umgeschrieben, dass sie mir gefällt. Sie sollte jetzt etwas schneller als Canlots Code sein und ist 14 Zeilen lang.
... um "sollte etwas schneller sein" mal zu verifizieren...
Weiterhin habe ich mal einen kleinen Test durchgeführt, der den Mailermenschen nochmal extra Punkte gibt, weil er schneller als canlot ist. Dafür habe ich einen kleinen Text zusammenkopiert:
der groß genug ist, dass man mit clock() wenigstens ein Indiz bekommt, wie nah die Algorithmen aneinander liegen.
Code: Alles auswählen
xin@trinity:~/Personen/xin$ g++ wordcount.c
xin@trinity:~/Personen/xin$ time ./a.out
File geöffnet
Size: 1253554740
xin : 199584030 Wörter - Zeit: 5710000
canlot: 199584030 Wörter - Zeit: 7550000
nouse : 199584030 Wörter - Zeit: 6870000
mail : 199584030 Wörter - Zeit: 6170000
real 0m26.866s
user 0m26.302s
sys 0m0.520s
xin@trinity:~/Personen/xin$ time ./a.out
File geöffnet
Size: 1253554740
xin : 199584030 Wörter - Zeit: 5910000
canlot: 199584030 Wörter - Zeit: 7630000
nouse : 199584030 Wörter - Zeit: 6870000
mail : 199584030 Wörter - Zeit: 6110000
real 0m27.096s
user 0m26.074s
sys 0m0.980s
Interessant ist, dass der "mail" schneller wurde, nachdem ich nouseforname eingefügt habe und deswegen auf C++ wechseln musste, weil er bool, true und false verwendet.
Ich habe das mal nach int, 1 und 0 geändert und das ganze dann über den C-Compiler laufen lassen:
Code: Alles auswählen
xin@trinity:~/Personen/xin$ gcc wordcount.c
xin@trinity:~/Personen/xin$ time ./a.out
File geöffnet
Size: 1253554740
xin : 199584030 Wörter - Zeit: 5690000
canlot: 199584030 Wörter - Zeit: 7690000
nouse : 199584030 Wörter - Zeit: 6950000
mail : 199584030 Wörter - Zeit: 7040000
real 0m27.932s
user 0m26.590s
sys 0m1.300s
xin@trinity:~/Personen/xin$ time ./a.out
File geöffnet
Size: 1253554740
xin : 199584030 Wörter - Zeit: 5640000
canlot: 199584030 Wörter - Zeit: 7550000
nouse : 199584030 Wörter - Zeit: 6870000
mail : 199584030 Wörter - Zeit: 6930000
real 0m27.557s
user 0m26.986s
sys 0m0.528s
Hier kann der C++-Compiler wohl für "mail" noch einiges retten, was beim C-Compiler verloren geht.
nouse und canlot benutzen nahezu den gleichen Code. Während nouse noch mehr überflüssige Fragen als canlot, verwendet nouse aber Pointer statt Array-Zugriffe.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.