C++ Primer Aufgabe



  • Wieder eine Aufgabe aus dem C++ Primer:
    Die Aufgabenstellung war, man soll 2 C-Strings miteinander vergleichen. (ich wollte dass ohne strcmp machen, viele werden nun wahrscheinlich von Zeitverschwnedung reden, aber es geht mir nur um die Übung, und ja ich weiß dass strcmp sicher besser und schneller ist, und ja in einem richtigen Programm verwende ich sowieso Strings 🙂 )

    #include <iostream>
    #include <string>
    #include <cstring>
    
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;
    
    int main()
    {
        enum SIZE{nothing, s1_smaller, s2_smaller};
    
        //Zu vergleichende C-Strings
        char s1[] = "Ab";
        char s2[] = "Aaaa";
        SIZE type = nothing;
    
        size_t temp = 0;
        if(strlen(s1) < strlen(s2)) temp = strlen(s1);
        else temp = strlen(s2);
    
        const size_t max_count = temp;
    
        for(size_t i=0; i<max_count; ++i)
        {
            if(s1[i] < s2[i])
            {
                type = s1_smaller;
                break;
            }
            else if(s2[i] < s1[i])
            {
                type = s2_smaller;
                break;
            }
        }
    
        if(type == nothing)
        {
            if(strlen(s1) < strlen(s2)) cout << "s1 KLEINER" << endl;
            else if(strlen(s2) < strlen(s1)) cout << "s2 KLEINER" << endl;
            else cout << "s1 GLEICH s2" << endl;
        }
        else
        {
            if(type == s1_smaller) cout << "s1 KLEINER" << endl;
            if(type == s2_smaller) cout << "s2 KLEINER" << endl;
        }
    
        return 0;
    }
    

    Eure Meinung? Wie ist dass besser umsetzbar? Bekanntlich führen ja mehrere Wege zum Ziel.

    MfG
    Stromberg



  • Stromberg schrieb:

    Wieder eine Aufgabe aus dem C++ Primer:
    Die Aufgabenstellung war, man soll 2 C-Strings miteinander vergleichen. (ich wollte dass ohne strcmp machen

    sachon klar. wirst gleich hören, daß du unbedingt strncmp nehmen sollst. weil das sicherer ist. dafür wird man mir sagen, daß ich verfrüht optimiere.

    ich zeig dir mal die übliche implementierung (evtl ein fehler drin):

    //erstmal laufen, bis einer aufhört oder beide ungleich
    while(s1[i]!='\0' and s1[i]==s2[i])
       i=i+1;
    
    //und jetzt ein abschlußtrick
    int ergebnis=s2[i]-s1[i];
    
    if(ergebnis>0)
      cout<<"s2 war größer";
    else if(ergebnis<0)
      cout<<"s1 war größer";
    else//ergebnis==0
      cout<<"beide gleich";
    


  • volkard schrieb:

    dafür wird man mir sagen, daß ich verfrüht optimiere.

    ich zeig dir mal die übliche implementierung (evtl ein fehler drin):

    //erstmal laufen, bis einer aufhört oder beide ungleich
    while(s1[i]!='\0' and s1[i]==s2[i])
       i=i+1;
    

    also wirklich i=i+1 🙄 , da musst du schon zeiegn, dass du es mindestens so gut wie der compiler kannst, also i++ und falls einer size_t überladen hat, gleich noch ++i. :p


Anmelden zum Antworten