WordCount lernen

Schnelle objektorientierte, kompilierende Programmiersprache.
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 » Do Mär 24, 2011 2:21 am

Eigentlich wollte ich ja noch was arbeiten heute Abend/Nacht.
Aber nach unserem kurzem Skype Chat hat's mich noch mal gepackt.

Eine neue Version.
Ich übernehme erstmal alles von dir, was mir sinnvoll erscheint ;)
Dann hab ich noch 1 kleinen Trick angewandt, der in meinen Tests dazu führte, dass ich mich mit diesem neuen Code etwas vor dich platzieren kann.
Zumindest wenn -O3 an ist ^^
Ansonsten liegen die Zeiten extrem nahe beieinander.

Code: Alles auswählen

unsigned int wordCount2(char const * actChar)
{
    unsigned int words = 0;
    while (*actChar)
    {
        if ((*(actChar++)) ^ ' ')
        {
            ++words;
            while (((*actChar) ^ ' ') && *actChar)
            {
                ++actChar;
            }
        }
    }
    return words;
}
daniel@gosigmus:~/Desktop/countWords$ gcc -o countWords countWords.c
daniel@gosigmus:~/Desktop/countWords$ sudo nice -n -10 ./countWords
Xin: 8094000
Dani: 8191000
daniel@gosigmus:~/Desktop/countWords$ sudo nice -n -20 ./countWords
Xin: 8635000
Dani: 8657000
daniel@gosigmus:~/Desktop/countWords$ gcc -O3 -o countWords countWords.c
daniel@gosigmus:~/Desktop/countWords$ sudo nice -n -10 ./countWords
Xin: 5171000
Dani: 4977000
daniel@gosigmus:~/Desktop/countWords$ sudo nice -n -20 ./countWords
Xin: 5156000
Dani: 4961000
Die Werte werden so gemessen:

Code: Alles auswählen

    //....
    unsigned int words;
    unsigned long long i;
    clock_t start,end;
    unsigned long long const REPEAT = 99999;
    unsigned long long me = 0;
    unsigned long long xin = 0;

    unsigned int j;
    for (j = 0; j < 40; j++) {
        start = clock();
        for (i = 0; i < REPEAT; i++)
        {
            words = wordCount_xin_speed(str);
        }
        end = clock();
        xin = xin + (int) (end - start)/10;
        start = clock();
        for (i = 0; i < REPEAT; i++)
        {
            words = wordCount2(str);
        }
        end = clock();
        me = me + (int) (end - start)/10;
    }
    printf("Xin: %llu\nDani: %llu\n",xin,me);
    //....
Der getestete String ist folgender:

Code: Alles auswählen

    char const * const str = "Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   sfdein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   Strinffg.Dies   ist   ein   String.Dies   ist   ein   String.Dies sadafds  ist   ein   Stri ng.Dies   ist   ein   String.Dies   ist   ein   String.Dies   isti   ein   ng String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   itst   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies  ut ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   Strisfng.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   Stringsf.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Diesfs   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Ddfsies   ist   ein   String.Dies   ist   ein   String.Dieszt   ist   ein   Sdsftring.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   Stridsfng.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Diessf   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies sf  ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies  sdd ist   ein  sdffsf String.Dies   ist   ein   String.Dies   ist   ein   Stridng.Dies   ist   ein d  String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist  ydcy ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   Stringd.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dfies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dikjes   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.Dies   ist   ein   String.";
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.

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

Re: WordCount lernen

Beitrag von lolliger » Fr Mär 25, 2011 3:21 pm

Xin hat geschrieben:@lollinger: Was gibt die Neue Version beim String "Hallo Welt" zurück (kein Satzzeichen!).
Vergiss die Satzzeichen, Wörter im String zählen, nicht im ersten Satz. Der String endet, wenn Du das Nullbyte gefunden hast.
Habe jetzt zwei Lösungen:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned int wordCount( const char *str)
{
    unsigned int words;
    unsigned int i, ascii, ascii2;
    words=0;

    for (i=0; str[i]!=0; i++ )
    {
        ascii=str[i];
        ascii2=str[i+1];

        if ( ((ascii>=65 && ascii<=90) || (ascii>=97 && ascii<=122))  &&   ((ascii2<65 || ascii2>90) && (ascii2<97 || ascii2>122))  )
            words++;
    }

    return words;
}


int main( void )
{
    char const * str = " Ich  bin ! ";
    unsigned int words;

    words = wordCount( str );

    printf( "Der String enth\x84lt %d W\x94rter\n", words );

    return 0;
}
und

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned int wordCount( const char *str)
{
    unsigned int words;
    unsigned int i;
    words=0;

    for (i=0; str[i]!=0; i++ )
    {

        if (  ((str[i]!=' ')&&(str[i]!='.')&&(str[i]!='!')&&(str[i]!='?')&&(str[i]!=',')) && ( (str[i+1]==' ') || (str[i+1]==0) || (str[i+1]=='.') || (str[i+1]==',') || (str[i+1]=='!') || (str[i+1]=='?'))  )
            words++;
    }

    return words;
}


int main( void )
{
    char const * str = " Ich  bin ! ";
    unsigned int words;

    words = wordCount( str );

    printf( "Der String enth\x84lt %d W\x94rter\n", words );

    return 0;
}
Sie sind beide gleich schnell.
Aber ich denke der erste Code ist besser!
Was sagst du?

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 » Fr Mär 25, 2011 3:32 pm

lolliger hat geschrieben:
Xin hat geschrieben:@lollinger: Was gibt die Neue Version beim String "Hallo Welt" zurück (kein Satzzeichen!).
Vergiss die Satzzeichen, Wörter im String zählen, nicht im ersten Satz. Der String endet, wenn Du das Nullbyte gefunden hast.
...

Sie sind beide gleich schnell.
Ohne es getestet zu haben - wie gesagt, vergiss die Satzzeichen. ^^
Es geht nur um irgendwas, was zwischen Textanfang, Textende und Leerzeichen steht.

Schau Dich mal in der Auswertung um und lies Dir die Quellcodes durch.

Kannst Du mit malloc und free umgehen?
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 » Fr Mär 25, 2011 4:46 pm

Xin hat geschrieben:Ohne es getestet zu haben - wie gesagt, vergiss die Satzzeichen. ^^
Es geht nur um irgendwas, was zwischen Textanfang, Textende und Leerzeichen steht.

Schau Dich mal in der Auswertung um und lies Dir die Quellcodes durch.
so besser?

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned int wordCount( const char *str)
{
    unsigned int words;
    unsigned int i;
    words=0;

    for (i=0; str[i]!=0; i++ )
    {

        if (  (str[i]!=' ') && ( (str[i+1]==' ') || (str[i+1]==0))  )
            words++;
    }

    return words;
}


int main( void )
{
    char const * str = " Ich  bin.  ";
    unsigned int words;

    words = wordCount( str );

    printf( "Der String enth\x84lt %d W\x94rter\n", words );

    return 0;
}
Xin hat geschrieben:Kannst Du mit malloc und free umgehen?
Ein bisschen!

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 » Fr Mär 25, 2011 5:22 pm

lolliger hat geschrieben:

Code: Alles auswählen

    for (i=0; str[i]!=0; i++ )
    {

        if (  (str[i]!=' ') && ( (str[i+1]==' ') || (str[i+1]==0))  )
            words++;
    }
Sieht vom Prinzip her gut aus, es sind im Regelfall allerdings viele Abfragen. Da könnte man noch optimieren. Wie gesagt - schau Dir die Routinen im Wiki dazu an.
lolliger hat geschrieben:
Xin hat geschrieben:Kannst Du mit malloc und free umgehen?
Ein bisschen!
Versuch mal bei einem kurzen String die einzelnen Wörter (also alle Blöcke, die nicht duch Leerzeichen getrennt sind) in ein Array von Strings zu zerlegen.

Heißt: "Dies ist ein Satz" wird zu einem Array von Zeigern. Du zählst die Wörter, besorgst Dir Speicher für ein Array mit entsprechend vielen char *.
Anschließend gehst Du die Worte durch und besorgst Dir Speicher für die Länge des Wortes und kopierst das Wort rein.

Code: Alles auswählen

int main( void )
{
  char const *str =  "Dies ist ein Satz";
  char ** array;

  array = createWordArray( str );

  for( int i = 0; array[i]; i++ )
    printf( "%d. Wort: %s\n", i, array[i] );

  deleteWordArray( str );
}
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 » Fr Mär 25, 2011 7:45 pm

Xin hat geschrieben:Versuch mal bei einem kurzen String die einzelnen Wörter (also alle Blöcke, die nicht duch Leerzeichen getrennt sind) in ein Array von Strings zu zerlegen.

Heißt: "Dies ist ein Satz" wird zu einem Array von Zeigern. Du zählst die Wörter, besorgst Dir Speicher für ein Array mit entsprechend vielen char *.
Anschließend gehst Du die Worte durch und besorgst Dir Speicher für die Länge des Wortes und kopierst das Wort rein.

Code: Alles auswählen

int main( void )
{
  char const *str =  "Dies ist ein Satz";
  char ** array;

  array = createWordArray( str );

  for( int i = 0; array[i]; i++ )
    printf( "%d. Wort: %s\n", i, array[i] );

  deleteWordArray( str );
}
Frage: Darf ich meine Funktion "wordCount()" dafür weiterhin benutzen, oder soll ich ein komplett neues Programm schreiben?; Warum muss ich am Schluss den Array wieder Löschen? Damit ich den Speicher wieder freigeben kann?

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

Re: WordCount lernen

Beitrag von cloidnerux » Fr Mär 25, 2011 7:49 pm

Warum muss ich am Schluss den Array wieder Löschen? Damit ich den Speicher wieder freigeben kann?
Du solltest. Im Moment ist es für dich egt noch nicht wichtig, aber bei wachsender Größe des Programmes kann es mit fehlendem Löschen von Allokierten Speicher dazu kommen, das dein Programm einfach nur saumäßig viel Ram blockiert, obwohl es das gar nicht nutzt, sowas nennt man Speicherleck und das gilt es zu Vermeiden, was man deshalb auch von der Pike auf lernen sollte.
Darf ich meine Funktion "wordCount()" dafür weiterhin benutzen, oder soll ich ein komplett neues Programm schreiben?;
Es steht jedem frei, sein geistiges Eigentum zu verwenden. Wenn du meinst, das deine Funktion wordcount dafür geeignet ist, dann nutze sie, wenn auch nur in Teilen.
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 » Fr Mär 25, 2011 8:33 pm

lolliger hat geschrieben:Frage: Darf ich meine Funktion "wordCount()" dafür weiterhin benutzen, oder soll ich ein komplett neues Programm schreiben?;
Beides.

Ich empfehle Dir immer alles so zu programmieren, dass Du es wiederverwerten kannst.
lolliger hat geschrieben:Warum muss ich am Schluss den Array wieder Löschen? Damit ich den Speicher wieder freigeben kann?
Richtig.
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