Oder-Bedingung in einer if-Anweisung klappt nicht.



  • Hall Leute,

    ich schreibe zur Übung gerade ein Skript das Wörter zählt und deren Länge in einem Array speichert. Mit einer if-Anweisung klappt es so einigermaßen,

    if ( cc > 0 && ct == 0) { ...und so weiter

    Allerdings braucht es noch eine weitere Bedingung um auch das letzte Wort einzulesen.

    if (( cc > 0 && ct == 0 ) || ct == cc ) { ...und so weiter

    Jetzt wird der if-Zweig in seiner Ausführung eher seltsam, es wird zwar immer noch in ein Array geschrieben aber ohne Werte. Hier mal das Skript, nach dem Aufruf einfach Buchstaben tippen getrennt von Leerzeichen dann STRG-D.

    Es geht mir um die Zeilen 29 und 30.

    1 /* gb_word_count.c */
        2
        3 #include <stdio.h>
        4
        5 #define STELLEN 100
        6
        7 /* count words in input */
        8
    >>  9 main() {
       10     int c, cc, cw, ct, i, k, ih, gl; /* c: char, cc: countchar, cw: countword, ct: counttest, ih: inhalte
       11                                   * gl: größte länge
       12                                   */
       13     int wortarray[STELLEN];
       14
       15     gl = ih = k = i = cw = cc = 0;
       16
       17    for (i = 0; i < STELLEN; ++i)
       18            wortarray[i] = 0;
       19
       20     while ((c = getchar()) != EOF) {
       21         if (c != '\n' || c != '\t' || c!= ' ' ) {
       22                 ++cc;
       23                 ++ct;
       24         }
       25         if (c == ' '){
       26                 ++cw;
       27                 ct = 0;
       28         }
       29         if ((cc > 0 && ct == 0) || ct == cc  )  {
       30         // if ( cc > 0 && ct == 0) {
       31                 wortarray[cw] = cc;
       32                 cc = 0;
       33         }
       34     }
       35
       36     for (i = 0; i <= STELLEN; ++i)
       37         if (wortarray[i] > 0)
       38                 ++ih;
       39     ih = ih + 1;
       40
       41     printf("\nZellen belegt im Array: %d\n", ih);
       42     printf("\n");
       43     printf("Wort Nr|Wort Länge\n");
       44     for (i = 1; i <= ih; ++i)
       45             printf("Wort %d:  %d\n", i, wortarray[i] - 1);
       46
       47     for (i = 1; i <= ih; ++i)
       48             if (wortarray[i] > gl)
       49                     gl = wortarray[i];
       50     printf("\n");
       51
       52     printf("Das längste Wort hat %d Buchstaben.\n", gl);
       53
       54
       55 }
       56
    

    Schon mal danke für die Hilfe!

    Gruss,

    Michae



  • also wenn ich das richtig sehe ist die bedingung ct==cc fast immer erfüllt.



  • gutschy schrieb:

    es wird zwar immer noch in ein Array geschrieben aber ohne Werte.

    "ohne werte" sind nullen, oder?



  • probier doch mal:

    if ((ct == cc || ct == 0) && cc > 0) ...
    


  • ich hab visual studio doch noch zum laufen bekommen.

    also: ct nicht initialisiert, keine abbruchbedingung, ct == cc immer am wortanfang erfüllt und daher wird der (um 1 verringerte) wert im array immer mit 1 überschrieben.

    lösung: machs nochmal!



  • Hi Fricky667,

    nope, dein Ansatz hat es leider nicht gebracht.

    Wade1234,

    hmm, du hast recht. Aber es sollte doch eine Möglichkeit geben.



  • also die eingabe ist beendet, wenn c == '\n', das einzelne wort ist zu ende, wenn c == ' ' oder c == '\t'.

    wenn die eingabe zu ende ist, brichst du die while-schleife ab; wenn das wort zu ende ist, erhöhst du die anzahl der wörter, speicherst die anzahl der buchstaben im array und setzt den buchstabenzähler zurück; und ansonsten zählst du die buchstaben hoch.

    außerdem ist es schlechter stil, so viele if hintereinander zu verwenden und statt dessen verwendet man da switch.

    flussdiagramme helfen bei solchen aufgaben ungemein und machen eigentlich den "löwenanteil" des programmierens aus.



  • weise Worte, das mit den Flussdiagrammen werd ich mir auch mal irgendwann geben. Ansonsten ist der schlechte Stil ja gewollt. Ziehe mir gerade Kernigham und Ritchie rein. Die wollen das so. 😃 Aber danke für den Versuch mir zu helfen.



  • meinst du nicht, dass du dir mal was neueres holen solltest? statt "main" schreibt man heutzutage auch "int main".

    also ein ansatz wäre sowas:

    #define MAXWORDS 100
    
    #include <stdio.h>
    
    int main()
    {
    int numwords;
    int numletters[MAXWORDS];
    int finished;
    char c;
    
    printf("Bitte geben Sie einen Satz ein\n");
    
    finished = 0;
    
    while(!finished) // "not finished"
    {
    c = getchar();
    
    switch(c)
    {
    case ' ':
    case '\t':
    //hier wortende erreicht
    break;
    case '\n'
    //hier satzende erreicht
    break;
    default:
    //hier buchstaben zählen
    break;
    }
    }
    
    //hier anzahl der wörter ausgeben
    
    //hier array durchlaufen und anzahl der buchstaben ausgeben
    
    getchar();
    return 0;
    }
    


  • Wir reden da ein wenig aneinander vorbei. Die Aufgabenstellung ist es, es ohne switch zu machen. Was die Aktualität angeht. Ich habe jetzt 22 Kapitel von C: A-Z durch und stelle fest das ich noch immer unfähig bin kleinere Programmanpassungen zu machen. C Code lesen, zumindest von den Beispiel-Skripten fällt mir nicht so schwer.

    Also jetzt mal das Standard-Werk, wird auf jeden Fall immer noch sehr viel gelobt. Und danach wieder die neueren Bücher. Es ist mir im Moment wichtig das ich tüftle, also das gelernte Anwende. Eleganten Code werde ich so Gott will irgendwann mal schreiben, nachdem ich viel schlechten Code geschrieben habe. 🙂

    Hier sind übrigens noch andere Lösungsansätze.
    http://clc-wiki.net/wiki/K%26R2_solutions:Chapter_1:Exercise_13



  • gutschy schrieb:

    Wir reden da ein wenig aneinander vorbei. Die Aufgabenstellung ist es, es ohne switch zu machen.

    dann lass dir von mir sagen, dass die aufgabenstellung schlecht im sinne von potentiell fehleranfällig und unübersichtlich ist.

    Was die Aktualität angeht. Ich habe jetzt 22 Kapitel von C: A-Z durch und stelle fest das ich noch immer unfähig bin kleinere Programmanpassungen zu machen.

    also ich kenne das buch nicht. ich habe hier aber öfter gelesen, dass es schlecht ist. aber wie kann es sein, dass du nach 22 kapiteln immer noch nicht programmieren kannst? gibt es in dem buch keine übungsaufgaben?

    C Code lesen, zumindest von den Beispiel-Skripten fällt mir nicht so schwer.

    lesen reicht nicht, außer man ist informatiklehrer in der 7. klasse oder so. 🙄

    Also jetzt mal das Standard-Werk, wird auf jeden Fall immer noch sehr viel gelobt.

    an büchern, die dir beibringen "main" zu schreiben, gibt es nichts zu loben.

    Und danach wieder die neueren Bücher. Es ist mir im Moment wichtig das ich tüftle, also das gelernte Anwende.

    dann nimm den von mir geschriebenen code mal als übungsaufgabe!

    Eleganten Code werde ich so Gott will irgendwann mal schreiben, nachdem ich viel schlechten Code geschrieben habe. 🙂

    warum vernünftig sein und von anfang an beim pissen die klobrille hochklappen, wenn man sie aus bequemlichkeit auch erstmal vollpissen und dann irgendwann mühevoll sauber machen kann?

    Hier sind übrigens noch andere Lösungsansätze.
    http://clc-wiki.net/wiki/K%26R2_solutions:Chapter_1:Exercise_13

    wie gesagt: du musst schreiben, nicht lesen.



  • Also jetzt mal ohne Scheiß. Leider fehlt mir echt die Zeit mir dir eine Grundsatzdiskussion zu führen, aber zu deiner Meinung kenne ich genug Gegenbeispiele. Wenn ich jetzt unhöflich rüber komme, möchte ich mich dafür entschuldigen, vielleicht kannst mir noch ein paar konkrete Tipps geben, Bücher oder Links. Wie gesagt, ich habe wirklich ein Zeit Problem.



  • hmmm der einzige tipp, den ich dir noch geben könnte, wäre der, einfach mal "übungsaufgaben c" in die suchmaschine einzugeben, die dinger selbständig, d.h. ohne musterlösung, durchzuarbeiten, und die ergebnisse hier einzustellen und dir die meinungen und verbesserungsvorschläge der leute hier zu herzen zu nehmen.

    wenn du einfach keine zeit hast, weiß ich aber auch nicht weiter, weil ohne zeit gehts einfach nicht. dann eventuell lieber mit gesellschaftswissenschaften beschäftigen. das kostet kaum zeit und man kann den geistigen dünnschiss einfach so heraus sprudeln lassen und bekommt trotzdem gute noten dafür. 😃 aber du wirst kaum einen programmierer finden, der nicht mal tagelang grübeln oder die arbeit von wochen wegschmeißen musste.



  • Wade1234 schrieb:

    dann eventuell lieber mit gesellschaftswissenschaften beschäftigen. das kostet kaum zeit und man kann den geistigen dünnschiss einfach so heraus sprudeln lassen und bekommt trotzdem gute noten dafür. 😃

    Apropos "geistiger dünnschiss"(sic!).


  • Mod

    Man kann auch sachlich Kritik üben. Bitte den Tonfall hier im Thread überdenken.

    Bezüglich "C von A bis Z": Das ist die Wurzel allen Übels. Siehe:
    https://www.c-plusplus.net/forum/272350

    @gutschy: Du bist leider ein weiteres Opfer des Wolfs. Tut mir leid, aber die beste Lösung ist, alles aus dem Buch zu vergessen, und noch einmal frisch mit C anzufangen.



  • SeppJ schrieb:

    @gutschy: Du bist leider ein weiteres Opfer des Wolfs. Tut mir leid, aber die beste Lösung ist, alles aus dem Buch zu vergessen, und noch einmal frisch mit C anzufangen.

    Das ist richtig. ich war schon vor etwa 10 Jahren in diesem Forum aktiv und schon damals wurde das Machwerk des Wolfs gnadenlos zerrissen.

    Ich frage mich echt, wieso dieser Dreck heute noch als C-Lehrbuch anerkannt wird. Das ist einfach skandalös.


  • Mod

    Fricky667 schrieb:

    Ich frage mich echt, wieso dieser Dreck heute noch als C-Lehrbuch anerkannt wird. Das ist einfach skandalös.

    Weil es keine offizielle Stelle zum Anerkennen von Lehrbüchern gibt. In den Fachforen mag das Buch zerrissen werden, aber auf Amazon hat es viele Sterne, weil die Reviews dort von den Opfern geschrieben werden, die nicht wissen, dass sie Opfer sind. Und die Leseproben präsentieren die schöne Form und den lockeren Schreibstil des Herrn Wolf, der zugegebenermaßen wirklich sehr gut ist.
    https://xkcd.com/937/



  • Also mal kurz an alle, danke für die Anteilnahme. Da ich völlig autodidaktisch vor mich hinwurstle werden auf jeden Fall noch einige Bücher von mir gelesen werden, wie zum Beispiel jetzt hier der Klassiker von Kernigham und Ritchie. Und natürlich werde ich den Wolf noch eben zu ende machen. Sind ja nur noch 4 Kapitel oder so.

    Ich habe es mit meinen fortkommen nicht so furchtbar eilig, aber sollte natürlich schon was gehen.

    Ich hänge da übrigens einer einfachen These an, man muss nur 10 Bücher zu einem bestimmten Thema lesen (durcharbeiten) schon ist man Experte. Und ja, auf Programmieren trifft diese These nur bedingt zu.

    Und noch mal danke für die Diskussion.

    Gruss,

    Micha



  • gutschy schrieb:

    Ich hänge da übrigens einer einfachen These an, man muss nur 10 Bücher zu einem bestimmten Thema lesen (durcharbeiten) schon ist man Experte. Und ja, auf Programmieren trifft diese These nur bedingt zu.

    Nicht ganz. Es gehört auch viel Praxis dazu. Nur dann prägen sich die Dinge wirklich ein. Nicht nur beim Programmieren.


Anmelden zum Antworten