Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.05.2016, 17:09

Probleme mit Vektor

Hallo zusammen.
Ich habe einen Vektor erstellt, der eine eingegebene Zahlenfolge der Größe nach mit dem Bubble-Sort-Algorithmus ordnet-
Funktioniert auch soweit und macht was es soll.

Das einzige Problem: Die größte Zahl im Vektor wird völlig falsch dargestellt. Aus ihr wird (glaube ich) der größtmögliche negativ Wert.

Wieso passiert das?


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;


int main()
{
    long Zahlen[10];
    long Zahl = 0;
    int Zaehler = 0;
    bool sortiert = false;

    do
    {
    

        cout << "Bitte Zahl " << Zaehler + 1 << " eingeben: "; 
        if (cin >> Zahl)
        {
            Zahlen[Zaehler] = Zahl;

            Zaehler++;
        }
        else
            break;

    } while (true);

    cout << "Die eingegebenen Zahlen: " << endl;

    for (int i = 0; i < Zaehler; i++)
    {
        cout << Zahlen[i] << " - ";
    }

    cout << endl << endl << "Die Zahlen werden mit dem Bubble-Sort-Algorithmus geordnet!" << endl;




    short Durchgang = 1;


    while (!sortiert)
    {
        sortiert = true;
        
            for (int i = 0; i < Zaehler; i++)
            {
                if (Zahlen[i] > Zahlen[i + 1])
                {
                    sortiert = false;
                    long temp = Zahlen[i];
                    Zahlen[i] = Zahlen[i + 1];
                    Zahlen[i + 1] = temp;
                    
                }
            
            }
        

        cout << "Nach dem " << Durchgang << " Durchlauf des Bubble-Sort-Algorithmus: ";
        
            for (int i = 0; i < Zaehler; i++)
            {
                cout << Zahlen[i] << " - ";
            }

        cout << endl;
        Durchgang++;


    } 

    

    cout << endl << endl;
    return 0;
}



Ich wäre für jede Hilfe dankbar. ;)

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

2

22.05.2016, 17:25

Auf die Schnelle fällt mir auf, dass du gar keinen std::vector verwendest, wie in deiner Beschreibung angegeben. Stattdessen verwendest du ein statisches Array mit immer 10 Elementen, das zusätzlich nicht mit 0 initialisiert wird.

Dein Fehler wird dadurch erzeugt, dass du in deiner Sortierroutine alle Elemente von 0 bis Zaehler - 1 durchläufst und am Ende wenn i das letzte Element in deiner Liste bezeichnet, mit Zahlen[i + 1] auf das Element dahinter zugreifst. Das hat dann natürlich irgendeinen beliebigen Wert (den du als größtmöglichen negativen Wert interpretierst), den du nicht eingegeben hast.

Vielleicht fällt dir ja schnell auf, wie du den Fehler beheben kannst. Du hast nämlich Bubblesort nicht zu 100% richtig programmiert. Schau dir zum Beispiel hier nochmal genau an wie der Algorithmus funktioniert.
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

3

22.05.2016, 17:30

Super, ich habe den Fehler dank deiner Hilfe schon behoben :thumbup:
Vielen Dank.
Das ist dann wohl die im Buch erwähnte "Gefahr" von Arrays/Vektoren, das Probleme erst zur Laufzeit auftreten.

Zum Thema Array/Vektor. Der Unterschied ist mir noch nicht zu 100% klar.

Zum Bubblesort: Funktionieren tut er soweit aber... Ich schau mir den Link von dir trotzdem gleich an.

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

4

22.05.2016, 17:44

Zum Thema Array/Vektor. Der Unterschied ist mir noch nicht zu 100% klar.
Ganz grob: Ein Array hat eine feste Größe. Das bedeutet, wenn du es zur Laufzeit vergrößern willst, musst du selbst ein neues Array anlegen und die alten Elemente in das neue Array kopieren. Ein Vector kann das für dich übernehmen. Du sagst einfach: "Füge ein Element an oder lösch eins" und der Vector reserviert dann neuen Speicher und kümmert sich um das kopieren. Das ist so grob der Unterschied.

PS: Schreib bitte nächstes Mal Vector mit C und nicht mit K - ein Vektor ist was anderes im Deutschen... ;)
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

5

22.05.2016, 17:44

Also sobald pushback im Spiel ist ist es ein Vektor?

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

6

22.05.2016, 17:48

Ein normales Array hat soweit ich weiß keine Methode pushback. Ich würde also Ja sagen. Aber lass die Finger von solchen Verallgemeinerten Schlüssen - ich kann eine beliebige Klasse schreiben, die eine Methode pushback hat und am Ende überhaupt nichts mit Vector zu tun hat! Schau dir lieber den Typ einer Variablen an - das ist wesentlich sicherer!
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

22.05.2016, 17:54

Mit Vektor ist in diesem Falĺ std::vector gemeint. Das benutzt du ja nun mal nicht.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

22.05.2016, 19:08

Zitat

Also sobald pushback im Spiel ist ist es ein Vektor?

push_back heißt die Methode und die gibt es bei vielen Containern.
Zum Beispiel auch bei der std::deque oder der von mir verachteten std::list die wegen ihres verführerischen Namens und der theoretischen Laufzeitkomplexität häufig unnötigerweise verwendet wird.

Ich rate dazu in 99% der Fälle einfach einen std::vector zu verwenden, wenn man eine Liste von Objekten speichern möchte. Das ist im Prinzip wie einfaches dynamisch wachsendes Array.

Zitat

die im Buch erwähnte "Gefahr" von Arrays/Vektoren, das Probleme erst zur Laufzeit auftreten.

Das stimmt aber nicht ganz. Auch beim std::vector treten alle Fehler erst zur Laufzeit auf. Ein Kernproblem ist generell auch der sogenannte Undefined Behaviour. Ohne spezielle Maßnahmen kann dein Programm neben abstürzen auch scheinbar trotzdem funktionieren. Das ist allerdings pures Glück und beim nächsten Start oder mit einem anderen Compiler kracht es...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (22.05.2016, 21:08)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

22.05.2016, 19:44

PS: Schreib bitte nächstes Mal Vector mit C und nicht mit K - ein Vektor ist was anderes im Deutschen...

Das ist nicht richtig. Der Name leitet sich vom mathematischen Vektor ab. Steht so zumindest in "The C++ Programming Language".
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

10

22.05.2016, 20:07

Das ist nicht richtig. Der Name leitet sich vom mathematischen Vektor ab. Steht so zumindest in "The C++ Programming Language".
Das mag sein, ich möchte mich auch nicht mit dir streiten! Dennoch finde ich Vektor missverständlich ausgedrückt. Gerade weil es um einen std:vector geht, bin ich der Meinung, dass man dann auch vector schreiben kann. Ist aber meine Meinung. ;)
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Werbeanzeige