WordCount lernen

Schnelle objektorientierte, kompilierende Programmiersprache.
canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: WordCount lernen

Beitrag von canlot » So Mär 20, 2011 7:44 pm

Ich wollte eigentlich ein kurzes Tut. wie man Zeiger statt Arrays verwenden kann.
Unwissenheit ist ein Segen

nouseforname
Beiträge: 236
Registriert: Do Feb 10, 2011 6:31 pm

Re: WordCount lernen

Beitrag von nouseforname » So Mär 20, 2011 7:57 pm

canlot hat geschrieben:Ich wollte eigentlich ein kurzes Tut. wie man Zeiger statt Arrays verwenden kann.
genau das isses doch.... ausserdem brauchst du trotzdem ein array. Ein String ist ja eigentlich nichts anderes als ein Array aus einzelnen Chars.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: WordCount lernen

Beitrag von canlot » So Mär 20, 2011 9:05 pm

verwendet nouse aber Pointer statt Array-Zugriffe.
Dein Code ist schneller als meins und du verwendest pointer statt Arrys, kannst du mir erklären wo? :D
Hier mein Code, naja nich ganz meins :D :

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

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: WordCount lernen

Beitrag von cloidnerux » So Mär 20, 2011 9:10 pm

Dein Code ist schneller als meins und du verwendest pointer statt Arrys, kannst du mir erklären wo?
Hast du dir die Artikel in unserem Wiki darüber durchgelesen?
Mit dem Wissen daraus, könntest du dir die Frage schnell selbst beantworten.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: WordCount lernen

Beitrag von Xin » Mo Mär 21, 2011 2:24 am

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:

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
Wenn ich bei cloidnerux die Abfrage auf die NewLines rauswerfe sieht das ganze so aus:

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
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.

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 fürchte, das Rennen wird so nicht mehr entschieden. ^^
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.

lolliger
Beiträge: 36
Registriert: Sa Mär 05, 2011 1:01 pm

Re: WordCount lernen

Beitrag von lolliger » Mo Mär 21, 2011 6:17 am

Xin hat geschrieben:
lolliger hat geschrieben:Jetzt hab ichs: :D
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.

Ä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;
}
Erledigt:

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;
}
Es können beliebig viele Leerzeichen zwischen den Wörtern sein! :D

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: WordCount lernen

Beitrag von Dirty Oerti » Mo Mär 21, 2011 1:15 pm

Xin 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.
Ja, das würde meine Abfrage DEUTLICH vereinfachen :D
Xin hat geschrieben:Er trennt auch bei New-Lines. ^^
Me too ;)

Jetzt interessiert mich nur noch, was DU anders machst :D

Mir ist noch eine Idee zur Optimierung gekommen ... die basiert aber eher auf technischen Aspekten, mal gucken, was ich da noch rausholen kann...
Es können beliebig viele Leerzeichen zwischen den Wörtern sein! :D
Ändere deinen String zu diesem (kopier ihn einfach von hier) :

" 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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: WordCount lernen

Beitrag von Xin » Mo Mär 21, 2011 1:33 pm

Dirty Oerti hat geschrieben:
Xin hat geschrieben:Er trennt auch bei New-Lines. ^^
Me too ;)
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:Jetzt interessiert mich nur noch, was DU anders machst :D
Ich mache genau das - ich zähle Blöcke von Nicht-Leerzeichen zwischen den Leerzeichen.
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...
Klingt spannend. Ich könnte mir da auch nochmal was böses einfallen lassen. ^^

Ich denke, dass eine Halbierung der Laufzeit noch drin ist.
Dirty Oerti hat geschrieben:Außerdem:
Warum brauchst du einen 2. Parameter für die Funktion?!
Weil NoUseForName seine Funktion in den Thread kopiert hat und lollinger damit weniger eigenen Hirnschmalz verwendet hat, sondern das geguttenbergt hat.

(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.

nouseforname
Beiträge: 236
Registriert: Do Feb 10, 2011 6:31 pm

Re: WordCount lernen

Beitrag von nouseforname » Mo Mär 21, 2011 3:35 pm

Xin hat geschrieben: Weil NoUseForName seine Funktion in den Thread kopiert hat und lollinger damit weniger eigenen Hirnschmalz verwendet hat, sondern das geguttenbergt hat.
Ich verbitte mir diese unhaltbaren Anschuldigungen... ich habe doch bisher alles nur per PM versendet DAMIT lolliger alleine arbeiten kann. :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: WordCount lernen

Beitrag von Xin » Mo Mär 21, 2011 3:48 pm

nouseforname hat geschrieben:
Xin hat geschrieben: Weil NoUseForName seine Funktion in den Thread kopiert hat und lollinger damit weniger eigenen Hirnschmalz verwendet hat, sondern das geguttenbergt hat.
Ich verbitte mir diese unhaltbaren Anschuldigungen... ich habe doch bisher alles nur per PM versendet DAMIT lolliger alleine arbeiten kann. :)
Sorry, war canlot.
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.

Antworten