WordCount lernen
Re: WordCount lernen
Ich wollte eigentlich ein kurzes Tut. wie man Zeiger statt Arrays verwenden kann.
Unwissenheit ist ein Segen
-
- Beiträge: 236
- Registriert: Do Feb 10, 2011 6:31 pm
Re: WordCount lernen
genau das isses doch.... ausserdem brauchst du trotzdem ein array. Ein String ist ja eigentlich nichts anderes als ein Array aus einzelnen Chars.canlot hat geschrieben:Ich wollte eigentlich ein kurzes Tut. wie man Zeiger statt Arrays verwenden kann.
Re: WordCount lernen
Dein Code ist schneller als meins und du verwendest pointer statt Arrys, kannst du mir erklären wo?verwendet nouse aber Pointer statt Array-Zugriffe.

Hier mein Code, naja nich ganz meins

Code: Alles auswählen
#include <stdio.h>
#include <string.h>
int wordCount(const char *str, int word_counter)
{
int temp = 0;
int i;
for ( i=0; str[i]!='\0'; i++ )
{
if (str[i]!=' ' && temp == 0)
{
word_counter++;
temp = 1;
}
else if(str[i]==' ')
temp = 0;
}
return word_counter;
}
int main( void )
{
char const * str = " Dies ist ein String ";
int word_counter = 0;
word_counter = wordCount(str, word_counter);
printf( "Der String enth\x84lt %d W\x94rter\n", word_counter);
return 0;
}
Unwissenheit ist ein Segen
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: WordCount lernen
Hast du dir die Artikel in unserem Wiki darüber durchgelesen?Dein Code ist schneller als meins und du verwendest pointer statt Arrys, kannst du mir erklären wo?
Mit dem Wissen daraus, könntest du dir die Frage schnell selbst beantworten.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: WordCount lernen
Also, wir haben neue Kandidaten im Rennen: cloidnerux und Dirty Oerty.
NoUseForName schickt eine neue Routine ins Rennen.
DirtyOerti kommt zwar nicht in die Puschen, was vorrangig an der unklaren Aufgabe liegt. Als Wort definiere ich alles, was zwischen zwei Leerzeichen liegt. Das kann auch ein einzelnes Satzzeichen sein. Die Abfragen von a-z oder A-Z kannst Du Dir sparen. Deswegen hat Dirty Oerti auch eine andere Anzahl von Wörtern. Weiterhin war da eine nette Idee für den Algorithmus bei, die in meinen Augen das Potential hat, noch ein wenig Zeit zu sparen. Daraus entstand die Routine, die mit xin++ getestet wird. Ob sie schneller oder langsamer ist... das wird uns clock() wohl nicht mehr verraten.
cloidnerux stellt zum Teil dumme Fragen in seinem Algorithmus, aber für den Text über 1,2GB auch eine sehr klevere, weswegen seine Anzahl von Wörtern vermutlich richtiger ist als alle anderen. Er trennt auch bei New-Lines. ^^
Hier die Ergebnisse:
Wenn ich bei cloidnerux die Abfrage auf die NewLines rauswerfe sieht das ganze so aus:
Hier sieht man, dass cloidnerux meines Erachtens nicht ganz verdient in der vorderen Liga mitspielt, da er in seinem Algorithmus mehr Fragen als ich stellt. Entweder werden die vom Compiler als zu offensichtlich wegoptimiert oder ich weiß auch nicht weshalb seine Routine konsequent so schnell ist oder ob clock() hier einfach schon viel zu ungenau ist.
Der Aufbau von cloidnerux entspricht NoUseForName, bevor er heute seine neue Version eingereicht hat. NoUseForName neue Version kommt eher an meine heran. So oder so macht NoUseForName zuviel.
Die einfachste Möglichkeit, die Tests zu verfeinern ist die Textgröße anzupassen (jetzt 3,6GB) Ich habe hier nur cloidnerux und mich stehen, weil erstens dauert der Spaß jetzt erstmal eine Weile und teilweise steigen Kandidaten mit Speicherzugriffsfehlern aus.
Ich fürchte, das Rennen wird so nicht mehr entschieden. ^^
Ich brauche wohl eine exaktere Zeitmessung...
NoUseForName schickt eine neue Routine ins Rennen.
DirtyOerti kommt zwar nicht in die Puschen, was vorrangig an der unklaren Aufgabe liegt. Als Wort definiere ich alles, was zwischen zwei Leerzeichen liegt. Das kann auch ein einzelnes Satzzeichen sein. Die Abfragen von a-z oder A-Z kannst Du Dir sparen. Deswegen hat Dirty Oerti auch eine andere Anzahl von Wörtern. Weiterhin war da eine nette Idee für den Algorithmus bei, die in meinen Augen das Potential hat, noch ein wenig Zeit zu sparen. Daraus entstand die Routine, die mit xin++ getestet wird. Ob sie schneller oder langsamer ist... das wird uns clock() wohl nicht mehr verraten.
cloidnerux stellt zum Teil dumme Fragen in seinem Algorithmus, aber für den Text über 1,2GB auch eine sehr klevere, weswegen seine Anzahl von Wörtern vermutlich richtiger ist als alle anderen. Er trennt auch bei New-Lines. ^^
Hier die Ergebnisse:
Code: Alles auswählen
xin@trinity:/data/home/xin/Personen/xin$ time ./a.out
File geöffnet
Size: 1253554740
xin : 199584030 Wörter - Zeit: 5700000
xin++ : 199584030 Wörter - Zeit: 5520000
canlot: 199584030 Wörter - Zeit: 7660000
nouse : 199584030 Wörter - Zeit: 7200000
mail : 199584030 Wörter - Zeit: 7090000
cloid : 202487040 Wörter - Zeit: 7720000
dirty : 202124160 Wörter - Zeit: 6880000
dirty2: 202124160 Wörter - Zeit: 7700000
real 0m56.065s
user 0m54.539s
sys 0m1.444s
Code: Alles auswählen
xin@trinity:/data/home/xin/Personen/xin$ time ./a.out
File geöffnet
Size: 1253554740
xin : 199584030 Wörter - Zeit: 5620000
xin++ : 199584030 Wörter - Zeit: 5910000
canlot: 199584030 Wörter - Zeit: 7700000
nouse : 199584030 Wörter - Zeit: 7180000
mail : 199584030 Wörter - Zeit: 7110000
cloid : 199584030 Wörter - Zeit: 5550000
dirty : 202124160 Wörter - Zeit: 6820000
dirty2: 202124160 Wörter - Zeit: 7490000
real 0m53.983s
user 0m52.843s
sys 0m1.060s
Der Aufbau von cloidnerux entspricht NoUseForName, bevor er heute seine neue Version eingereicht hat. NoUseForName neue Version kommt eher an meine heran. So oder so macht NoUseForName zuviel.
Die einfachste Möglichkeit, die Tests zu verfeinern ist die Textgröße anzupassen (jetzt 3,6GB) Ich habe hier nur cloidnerux und mich stehen, weil erstens dauert der Spaß jetzt erstmal eine Weile und teilweise steigen Kandidaten mit Speicherzugriffsfehlern aus.
Code: Alles auswählen
xin@trinity:/data/home/xin/Personen/xin$ time ./a.out
File geöffnet
Size: -534303076
xin : 598752090 Wörter - Zeit: 16800000
cloid : 598752090 Wörter - Zeit: 16670000
Ich brauche wohl eine exaktere Zeitmessung...
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: WordCount lernen
Erledigt:Xin hat geschrieben:Joah, die Aufgabe stelle ich vielen Anfängern. Die Aufgabe stelle ich nicht, weil es eine nette Übung am Anfang ist, sondern weil etwa drei Viertel der Anfänger sie vergleichbar zu Deiner Lösung zurückgibt.lolliger hat geschrieben:Jetzt hab ichs:
Ändere str wie folgt:Code: Alles auswählen
int main( void ) { char const * str = "Dies ist ein String."; unsigned int words; words = wordCount( str, words); printf( "Der String enth\x84lt %d W\x94rter\n", words ); return 0; }
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int i;
unsigned int wordCount( const char *str, unsigned int words )
{
words=1;
for ( i=0; str[i]!='.' ;i++ )
{
if ( (str[i]==' ') && (str[i+1]!=' ') )
words++;
}
return words;
}
int main( void )
{
char const * str = "Dies ist ein String.";
unsigned int words;
words = wordCount( str, words);
printf( "Der String enth\x84lt %d W\x94rter\n", words );
return 0;
}

- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: WordCount lernen
Ja, das würde meine Abfrage DEUTLICH vereinfachenXin hat geschrieben:DirtyOerti kommt zwar nicht in die Puschen, was vorrangig an der unklaren Aufgabe liegt. Als Wort definiere ich alles, was zwischen zwei Leerzeichen liegt.

Me tooXin hat geschrieben:Er trennt auch bei New-Lines. ^^

Jetzt interessiert mich nur noch, was DU anders machst

Mir ist noch eine Idee zur Optimierung gekommen ... die basiert aber eher auf technischen Aspekten, mal gucken, was ich da noch rausholen kann...
Ändere deinen String zu diesem (kopier ihn einfach von hier) :Es können beliebig viele Leerzeichen zwischen den Wörtern sein!
" Ich bin."
Und teste, wie viele Wörter gezählt werden.
Außerdem:
Warum brauchst du einen 2. Parameter für die Funktion?!
"words" wird der Funktion übergeben und dann auf 1 gesetzt, wohl gemerkt aber nur das "words" innerhalb der Funktion wordCount! Das "words" in main wird dadurch NICHT verändert!
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
Ich helfe gerne!

----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: WordCount lernen
Nachdem ich das ganze Chaos gesehen habe, war das ganze eh nicht mehr vergleichbar und ich dachte, ich warte einfach mal auf die nächste Version. ^^Dirty Oerti hat geschrieben:Me tooXin hat geschrieben:Er trennt auch bei New-Lines. ^^
Ich mache genau das - ich zähle Blöcke von Nicht-Leerzeichen zwischen den Leerzeichen.Dirty Oerti hat geschrieben:Jetzt interessiert mich nur noch, was DU anders machst
Klingt spannend. Ich könnte mir da auch nochmal was böses einfallen lassen. ^^Dirty Oerti hat geschrieben:Mir ist noch eine Idee zur Optimierung gekommen ... die basiert aber eher auf technischen Aspekten, mal gucken, was ich da noch rausholen kann...
Ich denke, dass eine Halbierung der Laufzeit noch drin ist.
Weil NoUseForName seine Funktion in den Thread kopiert hat und lollinger damit weniger eigenen Hirnschmalz verwendet hat, sondern das geguttenbergt hat.Dirty Oerti hat geschrieben:Außerdem:
Warum brauchst du einen 2. Parameter für die Funktion?!
(Ich bin gespannt ob "guttenbergen" es in den Duden schafft, es passt ja sogar - man birgt fremdes Wissen und wenn man es als eigenes verkaufen kann, dann ist das ja auch nicht schlecht... und die Infinitivform heißt dann analog zum Englischen "to guttenbergen" im deutschen "zu guttenbergen". )
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
-
- Beiträge: 236
- Registriert: Do Feb 10, 2011 6:31 pm
Re: WordCount lernen
Ich verbitte mir diese unhaltbaren Anschuldigungen... ich habe doch bisher alles nur per PM versendet DAMIT lolliger alleine arbeiten kann.Xin hat geschrieben: Weil NoUseForName seine Funktion in den Thread kopiert hat und lollinger damit weniger eigenen Hirnschmalz verwendet hat, sondern das geguttenbergt hat.

- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: WordCount lernen
Sorry, war canlot.nouseforname hat geschrieben:Ich verbitte mir diese unhaltbaren Anschuldigungen... ich habe doch bisher alles nur per PM versendet DAMIT lolliger alleine arbeiten kann.Xin hat geschrieben: Weil NoUseForName seine Funktion in den Thread kopiert hat und lollinger damit weniger eigenen Hirnschmalz verwendet hat, sondern das geguttenbergt hat.
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.