WordCount lernen

Schnelle objektorientierte, kompilierende Programmiersprache.
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 » Sa Mär 19, 2011 12:42 pm

lolliger hat geschrieben:
Xin hat geschrieben:Gut, eine Lösung hätten wir.
Dann programmiere die mal und dann gucken wir, ob sie auch zum Problem passt.
Also ich habe bis jetzt dieses Programm geschrieben:
...
Die Schleife läuft so lange, bis der Satz zuende ist (sie ein Punkt entdeckt).
Gehört das zur Aufgabe?
Wörter zählen, ob es einen deutschen Satz gibt, der mit einem ',' endet, weiß ich nicht.
lolliger hat geschrieben:Dann kommt eine If-Anweisung,
Nein, die if-Abfrage in Deinem Programm kommt bei jedem Zeichen, dass kein '.' ist.
lolliger hat geschrieben:aber ich weis nicht, wie ich es hinkriege, dass sie, wenn sie ein Leerzeichen entdeckt der Funktion "wordCount" einen Wert übergibt bzw. ihn jeweils um 1 erhöht, damit dieser dann in der main-Funktion angezeigt werden kann. :(
Er soll zählen, nicht anzeigen. Es reicht vollkommen, wenn am Schluss die Anzahl zurückgegeben wird.
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 » Sa Mär 19, 2011 5:26 pm

Jetzt hab ichs: :D

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]==' ')
                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;
}
Was sagst du dazu???

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 » Sa Mär 19, 2011 10:59 pm

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;
}
lolliger hat geschrieben:Was sagst du dazu???
Die Frage gebe ich zurück.

Edit: Ich erhielt eine weitere Lösung per E-Mail. Derjenige möge ebenfalls den String wie hier beschrieben ändern. Auch er gehört zu den Drei-Vierteln. :-)
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 » Sa Mär 19, 2011 11:10 pm

Xin hat geschrieben: Edit: Ich erhielt eine weitere Lösung per E-Mail. Derjenige möge ebenfalls den String wie hier beschrieben ändern. Auch er gehört zu den Drei-Vierteln. :-)
oO mich kann er nicht meinen... zähl ich doch nicht die leeren Stellen...

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

Re: WordCount lernen

Beitrag von canlot » Sa Mär 19, 2011 11:48 pm

Ich probiers auch mal!!
Eig habe ich schon eine elegante Lösung im Kopf :D
Unwissenheit ist ein Segen

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 » So Mär 20, 2011 11:36 am

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:

Code: Alles auswählen

-rw-r--r--  1 xin xin 1,2G 20. Mär 12:19 text.txt
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.

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

Re: WordCount lernen

Beitrag von nouseforname » So Mär 20, 2011 3:33 pm

Xin hat geschrieben: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. ^^
ich glaube ich verstehe was Du meinst. Aber ich denke Du solltest den Satz nochmal überdenken. Ist nicht so einfach zu lesen... :)
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.
netter Test. Zeigt mir dass ich im Vergleich zu Dir noch etwas komplett anders/falsch mache. Der Unterschied ist doch nicht allein durch die Abfrage des merkers bei jeder Position zu erklären?!
Hab dir ein Update geschickt, interessiert mich mal was das nun ausmacht.

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 » So Mär 20, 2011 5:26 pm

Ich beteilige mich auch ein mal, mit der Bitte, meinen Code mal den gleichen Test laufen zu lassen :)
Code bekommst du per PN.
Sind zwei Methoden, wordCount benutzt Zeiger-Arithmetric (und ist in meinen Tests daher immer schneller), wordCount2 benutzt Arrays.
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.

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:01 pm

Ich möchte auch Zeiger-Arithmetric lernen, kann mir einer helfen bitte?
Unwissenheit ist ein Segen

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 » So Mär 20, 2011 7:27 pm

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.

Antworten