Vertauschen zweier Werte in C



  • Hilfe!!!
    Ich soll zu folgendem Algorithmus ein Programm schreiben:
    1. Falls a == 0, wird b ausgegeben,das Verfahren endet.
    2. Falls a < b, vertausche a und b.
    3. Setze c <- b, b <- a-b,a <-c und gehe nach 1.

    Wie kann ich die Werte vertauschen, falls a<b eingegeben wird, oder sich dieses beim Durchlaufen des Algorithmus ergibt ?

    MfG, Jana 😕



  • hm, meinst du sowas ?

    void swap(int& a, int& b)
    {
        int c = a;
        a = b;
        b = c;
    }
    
    //...
    
    if (a < b) {
        swap(a, b);
    }
    


  • so:

    temp = a
    a = b
    b = temp



  • so: std::swap(a, b)



  • Mis2com schrieb:

    so: std::swap(a, b)

    das sollte man aber erst verwenden, wenn man verstanden hat wie die tauscherei funktioniert



  • Jana schrieb:

    Ich soll zu folgendem Algorithmus ein Programm schreiben:
    1. Falls a == 0, wird b ausgegeben,das Verfahren endet.
    2. Falls a < b, vertausche a und b.
    3. Setze c <- b, b <- a-b,a <-c und gehe nach 1.

    a) Hausaufgaben sollst du selber machen. Ein normaler Lehrer stellt keine unlösbaren Aufgaben.
    b) Bist du sicher, dass der Algorithmus so stimmt?
    Das wäre in C++ nämlich folgendes:

    void algo(int a, int b)
    {
      while(a != 0)
      {
        if(a < b)
          tausche(a, b);
        int c = b;
        b = a;
        a = c;
      }
      cout << b;
    }
    

    Ich erkenne darin wenig Sinn. 😕



  • hmmmmmm schrieb:

    Mis2com schrieb:

    so: std::swap(a, b)

    das sollte man aber erst verwenden, wenn man verstanden hat wie die tauscherei funktioniert

    Warum? Kennst du die Interna einer jeden Klasse/Funktion, welche du nutzt?

    mfg
    v R



  • Nicht jede. Aber doch ne Menge.
    Weckt so manche Klasse/Funktion keine Neugier bei dir ?



  • streamer schrieb:

    Nicht jede. Aber doch ne Menge.
    Weckt so manche Klasse/Funktion keine Neugier bei dir ?

    Schon und ich schau mir auch den ein oder anderen STL-Code an, aber du musst nicht
    wissen wie eine solche Funktion intern funktioniert, um sie anwenden zu koennen.

    Und genau das sollte u. a. das Ziel einer Sprache sein, dass ich eben nicht wissen
    muss, wie genau eine Funktion funktioniert.

    Fuer das Verstaendnis ist es vielleicht hilfreich, aber nicht zwingend
    erforderlich. Und wer sich fuer die interna einer Funktion/Klasse interessiert,
    der schaut sich halt den Code an ;).

    mfg
    v R



  • So wie die Frage hier aber gestellt ist, sieht es für mich aus das die Fragenstellerin lernen soll wie ein Tausch funktioniert und nicht wie man die Tauschfunktion aufruft.



  • Wenn er es selbst machen wollte, hätte er hier ja auch die Lösung gefunden.



  • ich hätte da auch noch ne variante die ohne hilfsvariable auskommt

    void swap(int& a, int& b){a-=b;b+=a;a=b-a;}
    


  • Erstaunlich... wird aber kaum verwendet, wieso, ist es langsamer?



  • Erstaunlich... wird aber kaum verwendet, wieso, ist es langsamer
    zur geschwindigkeit kann ich nicht viel sagen, weiss ich jetzt nicht

    aber es hat auf jeden fall folgende nachteile
    1)man kann einen unerwünschten überlauf bekommen
    2)es ist schlechter intuitiv zu verstehen. wenn man schon aus ner trivialen sache komplizierten code macht, wie solls dann aussehen wenn man erstmal von der trivialität weg ist.

    Insofern ist das mit der zwischenvariable eigentlich die bessere alternative aber die andere hat halt irgendwie auch was find ich.

    das einzige was die andere alternative rechtfertigen könnte wäre fehlender speicher (mmh vielleicht auf nem microcontroler) ziemlich an den haaren herbeigezogen. oder ggf halt ein performancegewinn den ich stark bezweifel



  • ne hardcore variante wär z.b. die vertauschung mittels bitverknüpfung durchzuführen um sich die tmp variable zu sparen

    void swp(int &a, int &b)
    {
    a=b=a^=b;
    }

    P.S. funkt nur mit int, da z.b. float im rechner anders abgebildet wird.


Anmelden zum Antworten