[ Für Anfänger ] Returnwert von 2 Zahlen



  • Eine Funktion erhält 2 (Ganz-)Zahlige werte.
    Sie soll den grösseren der beiden zurückgeben.

    alles MUSS in EINER Zeile - In der Return Anweisung geschehen (ohne if bzw ? operator)



  • max(a, b) = (a + b + |a - b|) / 2



  • Gegenfrage: Warum kannst du den ?:operator nicht benutzen? Ohne den ist das einfach nur ineffizient, wenn es sich nicht um ints handelt.
    Ok, bei dir sind es ints, mit denen geht das gerade noch.



  • Wie lauten die anderen Hausaufgaben Bitte Buch mit Seitenzahl angeben



  • return std::max(a, b);
    

    Oder ist die verwendung der Standard-Bilbiothek auch untersagt?



  • Nehme ich doch stark an. Zumal diese Implementation wenn ich mich recht erinnere auch den ? Operator benutzt 🙄 ...



  • MaSTaH schrieb:

    Nehme ich doch stark an. Zumal diese Implementation wenn ich mich recht erinnere auch den ? Operator benutzt 🙄 ...

    Wenn man so argumentiert, weiß ich nicht, ob das Problem lösbar ist.

    return (a + b + abs(a - b)) / 2;
    

    abs enthält in der Implementierung auch den ? op.
    Man kann natürlich abs(a - b) ersetzten gegen -sqrt((a-b)*(b-a)), aber
    ich würd drauf wetten, dass die Implementierung von sqrt auch if's oder
    ? enthält 🙂



  • Ernsti schrieb:

    alles MUSS in EINER Zeile - In der Return Anweisung geschehen (ohne if bzw ? operator)

    Ich versuchs mal (MSVC++7):

    int max(int a, int b)
    {
      __asm mov eax, dword ptr[a]; __asm cmp eax, dword ptr[b]; __asm jge reta; __asm mov eax, b; __asm jmp retb; reta: __asm mov eax, a; retb:
    }
    

    Aufgabe gemäß Aufgabenstellung erfüllt und trotzdem performant :p . Allerdings ist __asm nicht Standard.



  • Taurin schrieb:

    ..aber ich würd drauf wetten, dass die Implementierung von sqrt auch if's oder ? enthält 🙂

    Nicht wenn der fsqrt Befehl unterstützt wird :p .



  • int max(int a, int b) 
    { 
      __asm mov eax, dword ptr[a]; __asm cmp eax, dword ptr[b]; __asm jge reta; __asm mov eax, b; __asm jmp retb; reta: __asm mov eax, a; retb: 
    }
    

    Aufgabe gemäß Aufgabenstellung erfüllt und trotzdem performant . Allerdings ist __asm nicht Standard.

    heftig 😮

    und ich dachte ich würde C++ verstehen (wenn das überhaupt C++ ist) 😕

    mfg
    sOcKy



  • Ist Assemblercode der in C++-Code eingebettet ist. Also der Code hat nichts mit C++ zu tun.

    MfG SideWinder



  • Ist Assemblercode

    soviel zur Überschrift

    [ Für Anfänger ]

    😃

    mfg
    sOcKy



  • Hi@all

    Wie wäre es damit?

    #include <iostream>
    using namespace std;
    
    int max(int, int);
    
    int main()
    {
        int a,b;
        cout << "Eingabe 1: ";
        cin >> a; 
        cout <<"Eingabe 2: ";
        cin >> b;
        cout << max(a, b) << endl;
    
        return 0;
    }
    
    int max(int i, int j)
    {
        return (i > j) ? i : j;
    }
    

    Cu
    André



  • @Berufspenner: ?: is verboten

    wie wärs damit?

    int max(int a, int b)
    return (a + b + ( (a - b) & (~0U >> 1) ) ) / 2
    }
    


  • Mr. N schrieb:

    int max(int a, int b)
    return (a + b + ( (a - b) & (~0U >> 1) ) ) / 2
    }
    

    Ist auf jeder Plattform das höchstwertige Bit von signed int das Vorzeichenbit?



  • also man darf kein if benutzen... while in dem fall aber schon...
    und auf einer zeile bedeutet nicht in einer anweisung oder 😃
    also:

    int max(int a, int b){ while(a>=b) return a; return b; }
    

    edit:

    In der Return Anweisung geschehen

    mist! überlesen



  • socky schrieb:

    und ich dachte ich würde C++ verstehen (wenn das überhaupt C++ ist) 😕

    Braucht man nicht wirklich zu verstehen wenn man nur C++ programmieren will. Kaum jemand bettet ASM in seine C++ Sourcen ein.



  • Mr. N schrieb:

    @Berufspenner: ?: is verboten

    Echt? Wuste ich nicht. Bin ja noch am lernen 😉 Kannst du mir aber bitte noch veraten, warum es verboten ist?

    Cu
    André



  • Berufspenner schrieb:

    Mr. N schrieb:

    @Berufspenner: ?: is verboten

    Echt? Wuste ich nicht. Bin ja noch am lernen 😉 Kannst du mir aber bitte noch veraten, warum es verboten ist?

    Cu
    André

    Hast du falsch verstanden. So ist das natürlich eine sehr schöne Möglichkeit. Bloß lautet die Aufgabenstellung "ohne if und op?:" und da du diesen Operator benützt ist die Lösung falsch ;).

    MfG SideWinder



  • Da die Standard-Bibliothek scheinbar nicht benutzt werden darf ist die einfachste Lösung wohl:

    return (b > a) * (b - a) + a;

    Man nimmt an, das a der größere Wert ist. Falls das nicht so ist addiert man eben das hinzu, was zu b fehlt.



  • Helium schrieb:

    Da die Standard-Bibliothek scheinbar nicht benutzt werden darf ist die einfachste Lösung wohl:

    return (b > a) * (b - a) + a;

    Man nimmt an, das a der größere Wert ist. Falls das nicht so ist addiert man eben das hinzu, was zu b fehlt.

    ist true denn standardmäßig als 1 und false als 0 definiert?


Anmelden zum Antworten