lexikographischer "<"-Vergleich



  • Hey Leute,

    ich muss für die Schule eine Funktion programmieren. Diese lautet:

    int less(char* s1, char* s2);

    berechnet: lexikographischen "<"-Vergleich

    Ich habe keine Ahnung wie ich da rangehen soll. Könnt ihr mir helfen oder eine Art Pseudo-Code schreiben (am besten wäre natürlich direkt den richtigen Code 😋 ).
    Ich bin am verzweifeln 😞

    Danke.

    Grüße Kim


  • Mod

    Vergleich die Zeichen! Ich nehme mal an, dass du davon ausgehen darfst, dass du eine übliche Zeichencodierung (ASCII oder Unicode) hast, in der 'a' < 'b' < 'c' und so weiter gilt. Trickreich ist noch Groß- und Kleinschreibung, da 'Z' < 'a' gilt. Da lasse ich dich aber erst einmal selber nachdenken, wie das gehen könnte. Umlaute machen dieses einfache Schema leider kaputt, aber ich nehme mal an, das ist im Rahmen einer Schulaufgabe nicht verlangt, dies zu beachten. Siehe:

    http://en.wikipedia.org/wiki/Ascii



  • strcmp macht diesen Vergleich bereits und strcoll sogar (bei richtig gesetzter deutscher Sprachumgebung) für deutsche Umlaute.



  • hey,
    danke erstmal. ich hab mal was versucht:

    #include <stdio.h>
    #include <string.h>
    
    int less(char *s1, char *s2)
    {
        if (s1 > s2) return 1;
        else if (s1 == s2) return 0;
        else return -1;
    }
    
    int main()
    {
    
    char s1[] = "aaaa";
    char s2[] = "bbbb";
    less(s1,s2);
    printf("Vergleich: %d ", less(s1,s2));
    
    return 0;
    getchar();
    
    }
    

    wieso kommt nicht -1 raus? s1="aaaa" ist doch kleiner als s2="bbbb"



  • Nun, vertausche mal die Reihenfolge der Arrays. Nun sollte es stimmen.
    Das liegt daran, dass du mit s1 < s2 die Adresse im Speicher vergleichst.
    Du brauchst eine Schleife, die jedes Zeichen anguckt und darauf mit < vergleicht.



  • hey danke für die antwort!

    stimmt es so?

    #include <stdio.h>
    #include <string.h>
    
    int less(char *s1, char *s2)
    {
        int i=0;
        while(s1[i] != '\0' && s2[i] != '\0')
        {
        if (s1[i] > s2[i]) return 1;
        else if (s1[i] == s2[i]) return 0;
        else return -1;
    
        i++;
    }
    }
    
    int main()
    {
    
    char s1[] = "aaaa";
    char s2[] = "bbbb";
    less(s1,s2);
    printf("Vergleich: %d ", less(s1,s2));
    
    return 0;
    getchar();
    
    }
    


  • Abgesehen davon, dass das getchar() vors return sollte, ja.



  • danke 🙂



  • CCCstringcast schrieb:

    int less(char *s1, char *s2)
      {
        int i=0;
        while(s1[i] != '\0' && s2[i] != '\0')
          {
            if (s1[i] > s2[i]) return 1;
            else if (s1[i] == s2[i]) return 0;
            else return -1;
     
            i++;
          }
    }
    

    Hast Du Deinen Code denn auch mal ausprobiert? Möglichst sogar mit den verschiedenen Fällen?



  • Oh, stimmt ja.



  • hey danke. ja habe ich und es hat frunktioniert. also immer -1, 0 bzw 1 bei dem jeweiligen fall ausgegeben.



  • Teste es mal mit "azzz" und "baaa".



  • CCCstringcast schrieb:

    hey danke. ja habe ich und es hat frunktioniert. also immer -1, 0 bzw 1 bei dem jeweiligen fall ausgegeben.

    Dann hast Du Deine Tests nicht ordentlich ausgewählt. Zugegeben, das ist auch eine Kunst für sich, aber bei einfachen Funktionen keine Raketentechnik. 🙂
    Z.B. hab ich hier ein paar Testdurchläufe für Deine Funktion, die nicht alle funktionieren.

    struct test_data{
      const char *a;
      const char *b;
      int result;
    } test_data[]={
      { "a",    "b", -1 },
      { "a",    "a",  0 },
      { "a",     "",  1 },
      {  "",     "",  0 },
      { "aa",  "ab", -1 },
      { "aa",  "aa",  0 },
      { "aaa", "aa",  1 }
    };
    
    void test(const char *a, const char *b, int expected){
      int result = less(a, b);
      if(result == expected)
        printf("less(\"%s\", \"%s\") == %i passed!\n", a, b, result);
      else
        printf("less(\"%s\", \"%s\") == %i failed! (expected: %i)\n", a, b, result, expected);
    }
    
    int main(void){
      const int N = sizeof(test_data) / sizeof(*test_data);
      for(struct test_data *t=test_data; t!=test_data+N; ++t){
        test(t->a, t->b, t->result);
        test(t->b, t->a, -t->result);
      } 
    }
    

    Darüberhinaus: schau noch, ob Du Warnungen bei Deinem Compiler einstellen kannst. Z.B. -Wall -pedantic beim gcc.


Log in to reply