Problem bei Programm....


  • Mod

    cooky451 schrieb:

    SeppJ schrieb:

    Hast du cookies Komplettlösung genommen?

    LOL meine "Komplettlösung" ändert 2 Zeilen oder so in seinem Code.

    Ich habe seinen Code nicht wirklich wahr genommen, da ohne Code-Tags. Da sieht man mal, wozu das fuhrt, wenn man die weglässt.



  • Arg, du denkst mein Stil ist nach ca. 2k Beiträgen immer noch so schrecklich? 😃 (Sorry Racoon)



  • Racoon schrieb:

    xD was ist mit meinem perfekten Programm mit beschreibungen und kommentaren?

    #include <ctype.h>
    #include <stdio.h>
    #include <string.h>
    
    int count(const char* s, char c)
    {
      int i = 0;
      for (; *s; ++s)
      {
        if (tolower(*s) == c)
          ++i;
      }
      return i;
    }
    
    int count_words(const char* s)
    {
      int i = 0;
      for (; *s; ++s)
      {
        while (*s && isspace(*s))
          ++s;
        if (*s)
        {
          ++i;
          while (*s && !isspace(*s))
            ++s;
        }
      }
      return i;
    }
    
    int main()
    {
      int c = 0;
      while (c != 2)
      {
        printf("1. Textanalyse\n");
        printf("2. Beenden\n");
    
        c = 0;
        while (c != 1 && c != 2)
        {
          int t;
          printf("Wahl: ");
          if (scanf("%i", &c) != 1) // gcc hack, :p
            printf("Bitte eine Zahl eingeben!\n");
          while ((t = getchar()) != EOF && t != '\n')
            ;
        }
    
        switch (c)
        {
        case 1:
          {
            char buf[0x100];
            printf("Bitte Text eingeben:\n");
            if (!fgets(buf, sizeof(buf), stdin))
            {
              buf[0] = '\0';
            }
            else if (buf[strlen(buf) - 1] != '\n')
            {
              int t;
              while ((t = getchar()) != EOF && t != '\n')
                ;
            }
    
            if (count(buf, 'a') >= 5)
            {
              printf("Ihre Eingabe enthaelt %i Woerter.\n", count_words(buf));
            }
            else
            {
              printf("Zu wenig a mein Lieber. :)\n");
            }
            break;
          }
        case 2:
          {
            printf("CyA :)\n");
            break;
          }
        }
      }
      return 0;
    }
    

    Haha, ich glaube viel aufwendiger geht's nicht mehr. Oder hat jemand noch eine Idee für ein if()? 🤡



  • Viel aufwändiger als diese nichtfunktionierende Wörterzählvariante gehts wirklich kaum noch.



  • Wutz schrieb:

    Viel aufwändiger als diese nichtfunktionierende Wörterzählvariante gehts wirklich kaum noch.

    Was funktioniert denn nicht?



  • Führende und endende Leerzeichen, durch andere Whitespaces getrennte Wörter, mehrere Leerzeichen/Whitespaces aufeinanderfolgend, leerer String, ...



  • Äh.. fixed.



  • Na das können wir aber besser:

    int zaehleWorte(const char *s)
    {
      int n,i=0;
      while( !sscanf(s,"%*s%n",&n) ) ++i,s+=n;
      return i;
    }
    


  • Erstmal noch vielen Dank für die ganze Hilfe!
    Könnte mir vllt noch jmd sagen ob das nachfolgende Programm tadellos funktionert, da es mir gerade nicht möglich ist in die schule zu gehn um es dort zu starten...

    #include<stdio.h>
    int anzahlwoerter(char *argument)
    {
    int i=0;
    int zaehlerwoerter=1;
    while(argument[i] != '\0')
    {
    if(argument [i] == ' ')
    {
    zaehlerwoerter ++;
    }
    i++;
    }
    return zaehlerwoerter;
    }

    int anzahldera(char *argument)
    {
    int i=0;
    int zaehlera=0;
    while(argument[i] != '\0')
    {
    if(argument[i] == 'a' || argument[i] == 'A')
    // es sollen sowohl kleine als auch große A's erkannt werden
    {
    zaehlera ++;
    }
    i++;
    }
    return zaehlera;
    }

    int main(void)
    {
    int menuepunkt;
    char zeichenkette[80];
    do
    {
    printf("\n");

    printf("1. Textanalyse\n");
    printf("2. Beenden\n\n");
    printf(" Bitte gewünschte Funktion auswählen\n");
    scanf ("%i",&menuepunkt);
    if (menuepunkt == 2)
    break;

    else
    {
    while (getchar() != '\n');
    printf("Bitte geben Sie den Text ein: ");

    //scanf("%s", zeichenkette);
    gets(zeichenkette);

    printf("Eingabe ist: %s /n",zeichenkette);

    if(anzahldera(zeichenkette)< 5)
    {
    printf("Ihre Eingabe enthält weniger als 5 mal a");
    }
    else
    {
    printf("Ihre Eingabe enthaelt %i Woerter",anzahlwoerter(zeichenkette));
    }
    }
    }while( menuepunkt!=2);

    return 0;
    }

    Vllt hat noch jmd ein vorschlag für ein kommentar zur besseren verständnis, oder wo man noch ne leerzeile einfügen könnte oder ähnliches x)



  • Wenn du den Code noch in cpp Tags setzen würdest, schauen sicher ein paar mehr Leute drüber.



  • danke für den tipp, leider weiß ich nicht was das bedeutet 🙂


  • Mod

    Racoon schrieb:

    danke für den tipp, leider weiß ich nicht was das bedeutet 🙂

    So funktioniert das Syntaxcoloring



  • Hast du dich noch nicht gefragt, warum die anderen soschöne Listings hinkriegen?
    Schon mal den rötlichen Kasten auf der Startseite vom C (C89 und C99)-Unterforum durchgelesen?
    Wozu sind diese komischen Kästen unter den Smilies da?

    Schnellkurs:
    Code markieren und auf den C/C++ Kasten unter den 🙂 😃 😉 drücken



  • oke vielen dank für die schnellen und kompetenten antworten

    #include<stdio.h> 
    int anzahlwoerter(char *argument) 
    { 
        int i=0; 
        int zaehlerwoerter=1; 
        while(argument[i] != '\0') 
        { 
        if(argument [i] == ' ') 
        { 
        zaehlerwoerter ++;     
        } 
            i++;    
        } 
        return zaehlerwoerter; 
    } 
    
    int anzahldera(char *argument) 
    { 
        int i=0; 
        int zaehlera=0; 
        while(argument[i] != '\0') 
        { 
        if(argument[i] == 'a' || argument[i] == 'A')
    	    // es sollen sowohl kleine als auch große A's erkannt werden
        { 
        zaehlera ++;     
        } 
            i++;    
        } 
        return zaehlera; 
    } 
    
    int main(void) 
    { 
        int menuepunkt; 
        char zeichenkette[80]; 
        do 
        { 
        printf("\n"); 
    
            printf("1. Textanalyse\n"); 
        printf("2. Beenden\n\n"); 
        printf(" Bitte gewünschte Funktion auswählen\n"); 
         scanf ("%i",&menuepunkt); 
            if (menuepunkt == 2)
              break; 
    
        else 
        { 
               while (getchar() != '\n'); 
            printf("Bitte geben Sie den Text ein: "); 
    
            //scanf("%s", zeichenkette); 
            gets(zeichenkette); 
    
            printf("Eingabe ist: %s /n",zeichenkette); 
    
        if(anzahldera(zeichenkette)< 5) 
        { 
            printf("Ihre Eingabe enthält weniger als 5 mal a");    
            } 
            else 
            { 
                printf("Ihre Eingabe enthaelt %i Woerter",anzahlwoerter(zeichenkette));
             } 
        } 
        }while( menuepunkt!=2);    
    
        return 0; 
    }
    


  • Sieht doch gleich hübscher aus. 🙂

    Nimm statt gets() auf jeden Fall fgets, da musst du die Größe der Zeichenkette mit angeben.

    fgets(zeichenkette, 80, stdin);
    

    Und schau nochmal nach den Einrückungen.
    Man kann ganz schlecht erkennen ob if(anzahldera(zeichenkette)< 5) zu dem else in Zeile 50 gehört oder nicht. Und wo ist das if zu dem else ?

    int anzahlwoerter(char *argument)
    {
        int i=0;
        int zaehlerwoerter=1;
        while(argument[i] != '\0')
        {
          if(argument [i] == ' ')
          {
            zaehlerwoerter ++;    
          }
          i++;    
        }
        return zaehlerwoerter;
    }
    


  • oke vielen Dank für die hilfreichen tipps, hat vllt sonst noch jmd ein verbesserungsvorschlag, unter anderem auch für irgendwelche kommentare zwischen den zeilen?



  • Wutz schrieb:

    Führende und endende Leerzeichen, durch andere Whitespaces getrennte Wörter, mehrere Leerzeichen/Whitespaces aufeinanderfolgend, leerer String, ...


Anmelden zum Antworten