Der beste Weg zum Spieleprogrammieren


  • Mod

    Skotchy schrieb:

    rapso schrieb:

    Skotchy schrieb:

    Die Fehler liegen in der for-Schleife bei 'Zahlen[i]' und ich weiß nicht wie ich den Fehler korrigieren könnte.

    du kannst den fehler korrigieren indem du rausfindest was "++i" bedeutet.

    Bedeutet das nicht einfach 'i + 1'?

    wuerde dann diese zeile einen sinn ergeben?

    for (std::vector<int>::iterator i = Zahlen.begin(); i != Zahlen.end(); ++i)

    ?
    schau es nach, es lohnt sich 😉



  • Ok, ich hab es jetzt nochmal nachgeguckt. Das '++' vor dem 'i' erhöht es um eins. Also habe ich das 'i' in der for-Schleife pro Durchlauf drei mal erhöht. Aber ich kann den Fehler weiterhin nicht beheben. Ich bekomme immer die '[' rot unterstrichen. Nur wenn ich eine Zahl für das 'i' eingebe verschwindet die Unterstreichung, aber warum nicht bei 'i'?

    Weiterhin danke für eure Hilfe.

    -Skotchy



  • Guck dir Iteratoren noch mal an. Und denk daran, du sollst eine Funktion schreiben und nicht alles in die main packen. 😉



  • Das Programm funktioniert so halb weil es es meine Zahlen nicht sortiert.

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    void tausch(int x, int y)
    {
    	int ablage;
    	ablage = x;
    	x = y;
    	y = ablage;
    }
    
    void sortieren(std::vector<int>Zahlen)
    {
    	for (std::vector<int>::iterator i = Zahlen.begin(); i != Zahlen.end();i++)
    	{
    		if (*i > *i+1)
    			tausch (*i, *i+1);
    
    	}
    	for (int i = 0; i != Zahlen.size(); i++)
    		std::cout << Zahlen[i] << " ";
    }
    
    int main()
    {
    	int zahlen[] = {4, 71, 74, 24, 97, 3, 388, 622, 2};
    	std::vector<int> Zahlen (zahlen, zahlen + 9);
    
    	sortieren(Zahlen);
    }
    

    Ich haffe das da nicht so viele Fehler drin sind.

    Weiterhin danke für eure Hilfe.

    -Skotchy



  • und du glaubst, ein zeilendurchlauf reicht? stell dir mal vor, du musst das hinterste Element ganz nach vorne packen. Funktioniert das so?



  • Das sieht doch schon mal viel besser aus, als die letzten Versuche. Eine eigene Swap Funktion brauchst du übrigens gar nicht, std::swap kannst du gerne verwenden.

    (In Zeile 13 fehlt übrigens ein Leerzeichen, lustig, dass das so überhaupt kompiliert.)

    Zum Algorithmus: Du kannst den Pseudocode der deutschen Wikipedia eigentlich 1:1 übertragen, guck dir den noch mal an. Und wenn es dann läuft, vergiss nicht, dass du std::sort nachbilden sollst. Der Funktionsprototyp sieht so aus:

    template<class RandomAccessIterator>
    void sort(RandomAccessIterator first, RandomAccessIterator last);
    // Den zweiten Fall mit dem nicht-Standard Vergleich lassen wir mal weg.
    


  • Ich habe nun wieder das Problem wie bei dem Programm davor, es Zeigt mir nur die Unsortierten Zahlen.

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    //void tauschen (int x, int y)
    //{
    //	int temp;
    //
    //	temp = x;
    //	x = y;
    //	y = temp;
    //}
    
    void sortieren(std::vector<int> Zahlen)
    {
    	int n = Zahlen.size();
    	bool vertauscht = false;
    	while (vertauscht && n > 0)
    	{
    		for (int i = 0; i != n - 1; i++)		
    		{
    			if (Zahlen[i] > Zahlen[i + 1])
    			{
    				//tauschen (Zahlen[i], Zahlen[i + 1]);
    				vertauscht = true;
    			}
    		}
    	n -= 1;
    	}
    	for (int i = 0; i != n; i++)
    		std::cout << Zahlen[i] << " ";
    }
    
    int main()
    {
        int zahlen[] = {4, 71, 74, 24, 97, 3, 388, 622, 2};
        std::vector<int> Zahlen (zahlen, zahlen + 9);
    
        sortieren(Zahlen);
    }
    

    Ich habe das Gefühl das ich da etwas mit std::sort falsch mache aber auch mit der gebastelten sort-Funktion funktioniert es nicht.

    Weiterhin danke für eure Hilfe.

    -Skotchy



  • Wo in dem ganzen Ding vertauscht du denn deine Zahlen? Du änderst nie auch nur irgendetwas. Das sollte dir aufgefallen sein. 😉

    Nebenbei: Du solltest Ausgabe und Sortierfunktion trennen.

    Und PPS: Leg dir am besten ein gutes Buch (z.B. C++ Primer) zu und arbeite das mal durch. Geht natürlich auch mit Tutorials etc., ist aber aufwendiger und du musst aufpassen, keinen Quatsch zu lernen. Aber die Fehler die du machst, das ist alles extremer Anfänger Kram. Diese Dinge sollten dir sofort in's Auge springen.



  • cooky451 schrieb:

    Und PPS: Leg dir am besten ein gutes Buch (z.B. C++ Primer) zu und arbeite das mal durch.

    Kannst du mir auch ein deutschsprachiges Buch empfehlen? Ich weiß nemlich nicht ob mein Englisch dazu ausreicht.

    cooky451 schrieb:

    Wo in dem ganzen Ding vertauscht du denn deine Zahlen? Du änderst nie auch nur irgendetwas. Das sollte dir aufgefallen sein. 😉

    Unter

    //tauschen (Zahlen[i], Zahlen[i + 1]);
    

    steht noch ein

    std::sort (Zahlen[i], Zahlen[i + 1]);
    

    Ich hatte es für 'Testzwecke' entfernt und vergessen wieder hinzuschreiben.
    Aber auch mit dem std::sort Funktioniert es nicht, darum habe ich auch geschrieben das ich Meine das ich die std::sort nicht verstehe.

    Weiterhin danke für eure Hilfe.

    -Skotchy



  • Skotchy schrieb:

    Aber auch mit dem std::sort Funktioniert es nicht, darum habe ich auch geschrieben das ich Meine das ich die std::sort nicht verstehe.

    Dazu müsstest du erst einmal Iteratoren verstehen. Von daher lohnt es sich schon, ein gutes Buch durchzuarbeiten. Deutsche kenne ich keine, langfristig wirst du dir eh Englisch beibringen müssen, auch weil viele Bibliotheken, Tutorials und Artikel im Bereich der Spiele-/Grafikprogrammierung (Programmierung generell) englisch sind.



  • Skotchy schrieb:

    Kannst du mir auch ein deutschsprachiges Buch empfehlen? Ich weiß nemlich nicht ob mein Englisch dazu ausreicht.

    Den C++ Primer gibt es auch auf deutsch. Leider gibt es nicht gerade massig gute Literatur zum Thema C++, weshalb mir auf Anhieb auch keine Alternative einfallen würde. Das Buch ist halt so der Standard-Tipp. (Englisch lernen schadet natürlich trotzdem nicht, gerade im Bereich Spieleprogrammierung.)

    Skotchy schrieb:

    Ich hatte es für 'Testzwecke' entfernt und vergessen wieder hinzuschreiben.
    Aber auch mit dem std::sort Funktioniert es nicht, darum habe ich auch geschrieben das ich Meine das ich die std::sort nicht verstehe.

    Ich wiederhole mich: Du sollst nich std::sort benutzen, sondern es nachbauen. Wenn du es allerdings nicht einmal verstehst, kommen wir der Sache natürlich nicht näher. Dann vielleicht erst mal eine einfachere Aufgabe:
    Baue Bubblesort (was du ja schon die ganze Zeit machen sollst) nach, aber mit dieser Funktionssignatur:

    void bubblesort(std::vector<int>& v); // Nach einem Aufruf sind die Elemente des Vektors sortiert.
    

    Dann hätten wir schon mal den Algorithmus und Referenzen, mit std::sort kommen noch templates und Iteratoren hinzu.



  • (War jetzt etwas länger weg darum hat es etwas gedauert)

    Ich glaub, so langsam verstehe ich es. Mein Programm ist zwar noch fehlerhaft aber sieht glaub ich schon gut/besser aus.

    #include <vector>
    
    void bubblesort(std::vector<int>& Zahlen)
    {
    	int n = Zahlen.size();
    	for (int i = n; i >= 0; i--)
    	{
    		for (int j = 0; j < n; j++)		
    		{
    			if (Zahlen[j] > Zahlen[j + 1])
    			{
    				int tmp = Zahlen[j];
    				Zahlen[j] = Zahlen[j + 1];
    				Zahlen[j + 1] = tmp;
    			}
    		}
    	}
    }
    
    int main()
    {
        int zahlen[] = {4, 71, 74, 24, 97, 3, 388, 622, 2};
        std::vector<int> Zahlen (zahlen, zahlen + 9);
    
        bubblesort(Zahlen);
    
    	for (int i = 0; i != Zahlen.size(); i++)
    		std::cout << Zahlen[i] << " ";
    }
    

    Ich glaub das ich da nicht aus der 'void bubblesort()' komme.

    cooky451 schrieb:

    Skotchy schrieb:

    Ich hatte es für 'Testzwecke' entfernt und vergessen wieder hinzuschreiben.
    Aber auch mit dem std::sort Funktioniert es nicht, darum habe ich auch geschrieben das ich Meine das ich die std::sort nicht verstehe.

    Ich wiederhole mich: Du sollst nich std::sort benutzen, sondern es nachbauen. Wenn du es allerdings nicht einmal verstehst, kommen wir der Sache natürlich nicht näher.

    ich meinte std::swap nicht std::sort... mein Fehler.

    Weitehin danke für eure Hilfe.

    -Skotchy



  • So, das sieht doch schon mal viel besser aus. Zumindest ist die Aufgabenstellung verstanden und vom Grundaufbau her auch gelöst worden. Nur der Algorithmus ist halt noch falsch, das solltest du korrigieren.
    In der inneren Schleife z.B. ist beim letzten Durchlauf j == vec.size() - 1, also der höchste Index. Du dereferenzierst aber j + 1. Das kann ja schon nicht gut gehen.
    Der Algorithmus ist auf Wikipedia doch richtig beschrieben, den Pseudo-Code kannst du fast 1 : 1 benutzen.



  • Endlich sortiert das Programm 🙂 :

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    void bubblesort(std::vector<int>& Zahlen)
    {
    	int n = Zahlen.size();
    	for (int i = n; i >= 0; i--)
    	{
    		for (int j = 0; j < n - 1; j++)		
    		{
    			if (Zahlen[j] > Zahlen[j + 1])
    			{
    				int tmp = Zahlen[j];
    				Zahlen[j] = Zahlen[j + 1];
    				Zahlen[j + 1] = tmp;
    			}
    		}
    	}
    }
    
    int main()
    {
        int zahlen[] = {4, 71, 74, 24, 97, 3, 388, 622, 2};
        std::vector<int> Zahlen (zahlen, zahlen + 9);
    
        bubblesort(Zahlen);
    
    	for (int i = 0; i != Zahlen.size(); i++)
    		std::cout << Zahlen[i] << " ";
    
    	getchar();
    }
    

    Es hat nur das '- 1'(das ich in einer früheren Version schon verwendet hab) gefehlt. Ist der Code jetzt in Ordnung?
    Wenn alles in Ordnung ist würde ich mich über noch eine Aufgabe freuen wenn es nicht zu viel wird, ansonsten werde ich versuchen mit einem Buch zu lernen.

    Weiterhin danke für eure Hilfe.

    -Skotchy



  • Na ja, der Pseudocode auf Wikipedia dürfte schneller sein. Du erkennst hier nicht, ob eine Liste schon sortiert ist, sondern hast immer gleich viele Durchläuft, das solltest du vielleicht noch ausbessern. Tipp: do-while Schleifen sind zwar nicht so schön, aber manchmal doch die beste Lösung. 😉

    Um ein Buch kommst du zwar eh nicht herum, aber du kannst gerne noch versuchen die Ursprüngliche Aufgabe zu machen: Baue std::sort nach. Du musst deine Funktion jetzt also nur noch in ein Template stecken:

    template<typename RandomAccessIterator>
    void bubblesort(RandomAccessIterator first, RandomAccessIterator last);
    


  • cooky451 schrieb:

    Du erkennst hier nicht, ob eine Liste schon sortiert ist, sondern hast immer gleich viele Durchläuft, das solltest du vielleicht noch ausbessern. Tipp: do-while Schleifen sind zwar nicht so schön, aber manchmal doch die beste Lösung. 😉

    Schlechter Tip.


Anmelden zum Antworten