Funktion "Tausch" gesucht



  • was zum henker ist std::swap??? so weit sind wir garnet XD

    wir lösen das meiste eher mit while schleifen, if, etc.



  • std::swap tausch den Inhalt von 2 Variablen.

    Und auf der Seite siehst du auch, wie du das am einfachsten implementieren kannst.



  • puh.. ganz ehrlich das ist mir zu hoch.

    du musst wissen, dass wir erst an den anfängen der programmierung sind..

    nunja. wenn ihr mir die funktion nicht geben wollt bleibt mir wohl nix anderes übrig nach "trial and error" die funktion zu basteln 🙂

    danke dennoch^^



  • Hallo? Wir haben dir die Funktion bereits gegeben!!! Schau dir bitte mal das Beispiel an.

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int arr[2] = {1,2};
    	for (int i = 0; i < 2; ++i)
    		cout << arr[i] << "  "; //nicht getauscht
    
    	cout << endl;
    	swap(arr[0],arr[1]);
    
    	for (int i = 0; i < 2; ++i)
    		cout << arr[i] << "  "; //getauscht
    
    	cout << endl;
    
    	return 0;
    }
    

    Was willst du mehr? 😕
    lg, freakC++



  • WOW!!

    Ihr seid die Besten.. ich danke euch vielmals!!!

    Jetzt mach ich mich mal drum es noch zu verschönern =))

    Vielen dank!!!!



  • Siehste! geht doch 😉

    Jetzt kannst Du dir ja mal überlegen, wie dieser Tauschvorgang funktioniert. Dazu solltest Du am besten wissen, was eine Referenz ist!

    lg, freakC++



  • Die Frage ist noch, wie ich das mit zehn zahlen mache und die reihenfolge immernoch stimmt...

    also swap tauscht ja eigentlich nur zwei zahlen.. aber ich muss ja zyklisch tauschen sodass dann alles nach rechts verschiebt.



  • Die Frage ist wohl eher wie du das mit n zahlen machst. Das geht genauso. Du musst nur einen gescheiten Schleifenkopf erstellen und innerhalb von wenigen Zeilen hast Du dein Ergebnis. Dann hast Du deinen kleinen Algorithmus.

    lg, freakC++



  • Ich würd da wahrscheinlich einfach mal die letzte zahl mit der zweitletzten tauschen, dann die zweitletzte mit der drittletzten usw. Für mehrere Stellen machst du das halt ein paar mal hintereinandern. Ist wahrscheinlich nicht das effizienteste, aber man hat das in wenigen Zeilen.



  • Naja, ich weiß zwar nicht, ob das realsitisch ist, doch wenn Du etwas effizientes haben möchtest, dann schau dir mal Sortieralgorithmen an (von BubbleSot, InserSort...) und Du kannst ja versuchen, ob Du den Algorithmus einfach an deine Bedürfnisse angleichen kannst.

    Ist nur so eine Idee. Ob die funktioniert, weiß ich nicht 🙄

    lg, freakC++



  • Warum das Rad neu erfinden ?

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <iterator>
    using namespace std;
    
    void tausche(vector<int> &vec,int a)
    {
       rotate(vec.begin(),vec.begin()+(vec.size()-a),vec.end());
    }
    
    int main ()
    {
       vector<int> myvec;
       for (int i=1; i<=10; ++i) myvec.push_back(i);
       for(int j=0;j<3;j++)
       {
          tausche(myvec,1);
          copy (myvec.begin(),myvec.end(),ostream_iterator <int> (cout," "));
          cout << endl;
       }
       return 0;
    }
    


  • na deine funktion ist etwas zu komplex.. da wird der prof schon nachfragen woher ich DAS weiß 🙂 ich muss schon nach meinen Wissensstand diese Funktion machen...

    ich hab das so gemacht:

    while (n<10)
    {
    swap(arr[0+1],arr[1+n]);
    n++;
    }

    aber dann kommt immer das doppelte raus XDD

    ich glaub ich überseh da etwas



  • Schau dir doch einfach die STL Implementierung an:

    http://www.cplusplus.com/reference/algorithm/rotate/



  • Shuyin schrieb:

    da wird der prof schon nachfragen woher ich DAS weiß =)...

    Das wird dein Prof unter Garantie auch schon für std::swap nachfragen. Ich gehe eher davon aus das du es händisch machen musst.

    Ansatz um 2 Arraywerte (Position 0 und 1) händisch zu tauschen, ich liefere absichtlich keine vollständige Lösung:

    int zwischenspeicher = array[0];
    array[0] = array[1];
    array[1] = zwischenspeicher;
    


  • Ja genau, und Du dafür brauchst Du Referenzen. Dann ist deine Funktion genau drei Zeilen lang.

    weil heute der 3.1 ist:

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

    Es gibt sicherlich noch ganz viele andere Lösungen, aber das wäre eine ;9

    lg, freakC++



  • Ok...

    also ich bin jetzt soweit gekommen:

    #include <iostream>
    using namespace std;

    int main(void)
    {
    int i=0, n=0;
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    cout << "Herzlich Willkommen!";
    cout << endl;
    for (int i = 0; i < 10; i++)
    cout << a[i] << " ";
    i=0;
    cout << endl;cout << endl;
    cout << "Bitte geben Sie die Haeufigkeit der Verschiebung ein:"; cin>> n;

    int s,p;
    while(i!=n)
    {
    a[9]=s;
    for(p=10;p>0;p--)
    a[p]=a[p-1];
    a[0]=s;
    i++;

    for (int i = 0; i < 10; i++)
    cout << a[i] << " ";
    cout << endl;
    }

    }

    nur da ist ein fehler den ich nicht erkenne.

    wenn ich jetzt z.b. 3 eingebe kommt:

    10 10 10 1 2 3 4 5 6 7

    also die vorherigen zahlen übernimmt es irgendwie nicht.. wo ist mein fehler???



  • #include <iostream>
    using namespace std;
    
    int main(void)
    {
    int i=0, n=0;
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    cout << "Herzlich Willkommen!";
    cout << endl;
    for (int i = 0; i < 10; i++)
    	cout << a[i] << " ";
    	i=0;
    cout << endl;cout << endl;
    cout << "Bitte geben Sie die Haeufigkeit der Verschiebung ein:"; cin>> n;
    
    int s,p;
    while(i!=n)
    	{
    	a[9]=s;
    	for(p=10;p>0;p--)
    	   a[p]=a[p-1];
    	   a[10]=s;
    	i++;
    
    	for (int i = 0; i < 10; i++)
    	cout << a[i] << " ";
    	cout << endl;
    	}
    
    }
    

    nochmal hingeschrieben... wegen der übersichtlichkeit 🙂



  • Für mich sieht das eher aus wie eine Endlosschleife. Wodurch wird den deine while Schleife abgebrochen?

    Ich weiß zwar nicht, ob Du das willst, aber nach deinen Einrückungen zufolge, müsstest Du die for Schleifen mit Klammern versehen. Ob das stimmt, weiß ich nicht. Sonst hast Du eine schlechte Lesbarkeit! Ich schau mir den Code jetzt mal an, aber das sind so die ersten Dinge, die mir auffallen.

    Außerdem:

    cout << endl; cout << endl;
    // ==
    cout << endl << endl;
    

    lg, freakC++



  • Es gibt ein paar sinnlose Stellen und Fehler im Code.

    Hier mal kommentiert und richtig eingerückt:

    #include <iostream>
    using namespace std;
    
    int main(void)
    {
      int i=0, n=0;
      int a[10]={1,2,3,4,5,6,7,8,9,10};
      cout << "Herzlich Willkommen!";
      cout << endl;
      for (int i = 0; i < 10; i++)
        cout << a[i] << " ";
      i=0; // Unnötig, da das i in der for-Schleife das i außerhalb überdeckt
      cout << endl;cout << endl; // ? Unnötig
      cout << "Bitte geben Sie die Haeufigkeit der Verschiebung ein:"; 
      cin >> n;
    
      int s,p; // Initialisierung von s und p
      while(i!=n)
      {
        a[9]=s; // Was ist jetzt a[9] ?
        for(p=10;p>0;p--)
          a[p]=a[p-1];  // a[10] existiert nicht
          a[10]=s;      // " "
        i++;
    
        for (int i = 0; i < 10; i++)
          cout << a[i] << " ";
        cout << endl;
      }
    }
    

    MfG,
    ScRaT



  • life schrieb:

    Schau dir doch einfach die STL Implementierung an:

    http://www.cplusplus.com/reference/algorithm/rotate/

    Deine Version sieht aber nicht danach aus.

    #include <iostream>
    using namespace std;
    
    int main(void)
    {
       int a[10]={1,2,3,4,5,6,7,8,9,10};
       int n;
       cout << "Herzlich Willkommen!" << endl;
       for (int i = 0; i < 10; i++)  cout << a[i] << " ";
       cout << endl << endl;
       cout << "Bitte geben Sie die Haeufigkeit der Verschiebung ein:";
       cin >> n;
       int middle=10-n;
       int first=0;
       int next=middle;
       int last=10;
       while (first!=next)
       {
          swap (a[first++],a[next++]);
          if (next==last) next=middle;
          else if (first==middle) middle=next;
       }
       for(int i=0;i<10;i++) cout << a[i] << " ";
    }
    

Anmelden zum Antworten