Zwei Vektoren vergleichen aber mit unterschiedlichen Datentypen.



  • @adii950 sagte in Zwei Vektoren vergleichen aber mit unterschiedlichen Datentypen.:

    Und was meinst du genau mit ad hoch könntest du mir bitte ein Beispiel geben sie ich das umsetzten soll bei mir?

    Wie ist denn bei dir der Typ lotto definiert und wie kann man ein Element von lotto mit einem int vergleichen? Was soll das bedeuten? Wann sollen das als "gleich" zählen?


  • Mod

    @adii950 sagte in Zwei Vektoren vergleichen aber mit unterschiedlichen Datentypen.:

    @Schlangenmensch ich habe mich für die zweite Option entschieden, mit dem

    std::equal
    

    Ich habe ja in meinem Programm ja das using namespace std benutzt, also muss ich das nicht verwenden, oder?

    Wie waer's, wenn Du es einfach mal ausprobierst, was womoeglich weniger Zeit in Anspruch nimmt, als hier im Forum zu fragen?

    Und was meinst du genau mit ad hoch könntest du mir bitte ein Beispiel geben sie ich das umsetzten soll bei mir?

    std::equal(begin, end, begin2, [] (int i, lotto l) { return ...; });
    

    Wenn Du das nicht selbststaendig vervollstaendigen kannst, wird's kompliziert.



  • @adii950

    Ich rate mal ins Blaue.

    Kann es sein dass du eine Ziehung und einen Tip hast und nun herausfinden möchtest wieviele Zahlen richtig sind?

    Ein Beispiel:

    Tip = { 1, 13, 23, 32, 37, 40 }
    Ziehung = { 1, 15, 23, 30, 37, 39 }

    -> Anzahl der richtigen Zahlen 2

    Pseudocode:

    CorrectNumber = CountCorrectNumbers(Draw, Tip);
    if (CorrectNumber == 1)
    {
    }
    

    Ist jetzt nur mal so einen Gedankengang.



  • @DocShoe sagte in Zwei Vektoren vergleichen, aber mit unterschiedlichen Datentypen.:

    suboptimal

    Na ja die Sache ist die ich soll ein Programm schreiben welches zufällige zahlen von 0 bis 20 Zufall integrieren und soll das mit meinem Vector<lotto> vergleichen, ob die Eingabe des Users gleich der random Zahl entspricht aber das Vergleichen klappt nicht da ja meine randomzahlen in einem int vector speichere und die Eingabe des Users in einem Vector lotto ist (lotto ist meine Klasse)...



  • Und deine lotto-Klasse wird doch sicherlich einen Member haben, welche die Lottozahl zurückgibt:

    if (vector_zufall[i] == vector_input[j].zahl())
    


  • @Columbo alles klar ich probiere es aus 🙂



  • @Th69 hmm ich versuche es mal damit wie du es gecodet hast 😉
    ich sag dir dann bescheid ob es geklappt hat oder nicht



  • @Quiche-Lorraine hm verstehe, wo du hinaus willst



  • @adii950 Die Frage ist, wie sieht deine Klasse lotto aus?



  • @Schlangenmensch ich poste hier mal meinen ganzen Code:

    //lotto header datei:

    #ifndef AUFGABE_1_LOTTO_LOTTO_H
    #define AUFGABE_1_LOTTO_LOTTO_H
    #include <iostream>
    #include <array>
    #include<vector>
    using namespace std;
    class lotto {
    private:
    
        int anzahl_spielern;
        int N; //ziehende Zahl
        int M; //Anzahl der möglichen Zahlen
    
    public:
    
    
    //standartkonstruktor
    //lotto();
    
    //Allgemeiner Konstruktor(für die Anzahl des Spielers und die groesse des Spielers)
    lotto(int anzahl_spielern, int N, int M);
    
    
    //Methoden
    void set_tippzettel(lotto h);//Spieler hinzufügen
    void zahlen_output();
    void ziehen();
    //Prüft ob die eingegebene Zahlen mit den Random-zahlen und gibt den Gewinner aus
    void ergebniss();
    
    
    //Array erstellt um die zufallszahlen zu speichern
    vector<int>vector_zufall;
    
    //Array erstellt um die eingaben des Users zu speichern
    //int array_input[];
    vector<lotto> vector_input;
    };
    #endif //AUFGABE_1_LOTTO_LOTTO_H
    

    Lotto cpp Datei:

    #include "lotto.h"
    #include <iostream>
    #include <time.h>
    #include <array>
    #include <vector>
    using namespace std;
    
    //Standartkonstruktor
    //lotto ::lotto(){};
    
    
    //Allgemeiner Konstruktor
    lotto ::lotto(int Anzahl_spielern, int n, int m)
    : anzahl_spielern(Anzahl_spielern), N(n), M(m) {
    
    
        cout << "Bitte geben Sie Anzahl der Spieler ein:  " << endl;
        cin >> Anzahl_spielern;
    
        cout << "Mit wie viele Zahlen wollen Sie spielen?: " << endl;
        cin >> N;
    
        cout << "Wie viele Zahlen wollen sie ziehen?: " << endl;
        cin >> M;
    };
    
    
    //methoden:
    
    void lotto ::set_tippzettel(lotto h) {
    
            //speichert den inhalt von den user in array_input[]
           vector_input.push_back(h);
    }
    
    
    //gibt zahlen von 1 bis N auf der Konsole
    void lotto::zahlen_output(){
    
    
            for (int i = 1; i <= N; i++) {
    
                cout << i << "  ";
            }
            cout << endl << endl;
    
        cout << "Bitte geben (kreuzen) Sie Ihre Zahlen auf sie Tippen wollen ein: " << endl;
    }
    
    //ramdom zahlen in array speichern
    void lotto ::ziehen() {
    
        //Random-zahl erzeugen
        srand(time(NULL));
    
        //Random Zahlen in array speichern
        for(int i=0; i<M; i++) {
            vector_zufall[i] = rand() % M;
        }
    
        cout << "Das sind die Zufallzahlen: " << endl;
    
        for(int i=0; i<=M; i++){
            cout << vector_zufall[i] << " ";
        }
    }
    
    //prüft ob die eingebene Zahl mit der Randomzahl gleich ist
    void  lotto :: ergebniss(){
        for (int i = 0; i <= N; ++i) {
    
            for (int j = 0; j <= N; ++j) {
    
                //Vergleicht ob die zufallzahlen gleich mein input ist
                if (vector_zufall[i] == vector_input[j]) {
    
                    cout << vector_zufall[i] << "  ist gleich  " << endl;
                }
            }
        }
    }
    

    //main cpp:

    #include <iostream>
    #include "lotto.h"
    using namespace std;
    
    /*was fehlt:
     * Für jeden Spieler machen
     * DESTRUKTOR
     *
    */
    
    int main() {
    
        //Variablen
        int eingabe;
        int Anzahl_der_spieler;
        int m;
        int n;
    
        //Objekt erstellt mit dem Namen Spieler_1:
       lotto Spieler_1(Anzahl_der_spieler, n, m);
    
    
    
    
    
        //Do while schleife damit das menue immer ausgeben wird nach jedem case
        do {
    
            //Menue:
            cout << "--menue-- " << endl;
            cout << "1 Tippzettel ausfuellen" << endl;
            cout << "2 Glueckzahl ziehen" << endl;
            cout << "3 Gewinner bekannt geben" << endl;
            cout << "0 BEENDEN" << endl;
            cin >> eingabe;
    
    
    
            switch (eingabe) {
    
                case 1: {
    
                    //User die zahlen von 0 bis 20 ausgeben auf der konsole damit er weiß welche zahlen eingeben darf
                    Spieler_1.zahlen_output();
    
                    //User eingaben in array speichern
                    Spieler_1.set_tippzettel(Spieler_1);
                    cout << endl << endl;
                }break;
    
                case 2: {
    
                    //Zufall zahlen:
                    Spieler_1.ziehen();
                    cout << endl << endl;
                }break;
    
    
                case 3:
                {
                    Spieler_1.ergebniss();
                    cout << endl << endl;
                }
    
                case 0: {
    
                    break;
                }
    
            }
    
        }while (eingabe !=0);
    
        return 0;
    }
    

    Nun das ist mein ganzer Code hoffe, dass es verständlich voller ist 🙂



  • Das ist wieder das gleiche Chaos wie bei deinen anderen Aufgaben.
    Auch hier wieder:

    class lotto
    {
       ...
       std::vector<lotto> ...
    };
    

    Wenn du vernünftig programmieren willst musst du deine Programme in Teilbereich mit definierten Aufgaben unterteilen.

    • Mach dir Gedanken, ob deine Datenstrukturen das Anforderungsprofil gut abbilden. Gute Datentypen wären hier vermutlich Spieler mit 1..N Lottoscheinen und eine Lottoziehung. Einfach sinnlos alles in eine Klasse zu kübeln ist Käse.
    • Trenne Datenhaltung von Benutzereingaben. Benutzereingaben im Konstruktor einer Klasse? Brrrrr...

    Hinweise:

    • Funktionen können auch Werte zurückgeben
    • srand() sollte nur ein einziges Mal aufgerufen werden
    • rand() % M kann auch Duplikate erzeugen
    • using namespace ... hat in Headerdateien nichts verloren
    • Variablen müssen vor ihrer Benutzung initialisiert werden


  • @DocShoe ja ich will vernünftig programmieren und ich hab doch alles unterteilt und dazu Kommentare geschrieben, was meinst du genau mit Unterteilung, vielleicht verstehen wir uns hier falsch magst du es mir genauer erklären?



  • Hab ich doch geschrieben. Du packst einfach alles ohne Sinn und Verstand in eine einzige Klasse, das ist keine Aufgabenverteilung. Ich habe doch schon geschrieben, dass mehrere Klassen mit genau definierten Aufgaben sinnvoll sind.



  • @DocShoe hmm verstehe ich werde das nächste darauf achten danke für den Hinweis 😉



  • @adii950 sagte in Zwei Vektoren vergleichen aber mit unterschiedlichen Datentypen.:

    ich hab doch alles unterteilt und dazu Kommentare geschrieben

    Aber, deine Kommentare passen schon nicht zum gezeigten Code. Und nichtmal dein Code passt zu deinem Code...

    //Array erstellt um die eingaben des Users zu speichern
    //int array_input[];
    vector<lotto> vector_input;
    

    Wo kannst du in einem Vector von lotto User Eingaben hinzufügen? ich dachte ein Lotto nimmt schon die Anzahl an Spielern entgegen... irgendwas ist hier ziemlich schief.

    void set_tippzettel(lotto h);//Spieler hinzufügen
    

    auch hier, der Name sagt, dass sei ein Setter für ein Tippzettel. Aber entgegen genommen wird ein Lotto. Und im Kommentar sagst du, dass ein Spieler hinzugefügt wird.
    (Btw. deutsch und englisch mischen, ist hässlich).

    Ich glaube, du musst nochmal 2 Schritte zurück gehen.

    Versuch 1. deine "Lösung" in natürlicher Sprache zu formulieren. Dann kannst du das ganze formalisieren, von mir aus in Pseudocode, oder, wenn du magst als UML Diagramm, what ever. Und dann als 3. Umsetzung in Code.

    Ich habe das Gefühl, dass dir noch ein Blick für Abstraktion fehlt.

    Wenn das ganze irgendwie eine Übungsaufgabe aus der Schule / Uni ist: Gucke, was genau sind die Anforderung aus der Aufgabe und wie löst deine Lösung genau diese Anforderung.



  • Bei meiner Antwort wußte ich nicht, daß lotto eine Klasse für die gesamte Lottoziehung (anstatt für eine Lottozahl) ist.

    Du mußt den Grundgedanken der objektorientierten Programmierung verstehen, d.h. hierarchisch die Klassen aufbauen.

    Ändere zuersteinmal den Code zu:

    vector<int> vector_input;
    

    (so kannst du auch direkt die Zahlen vergleichen.)

    Aber generell paßt schon nicht die Benutzung der lotto-Klasse:

     lotto Spieler_1(Anzahl_der_spieler, n, m);
    

    Zum einen ist der Name Spieler_1 logisch falsch, denn lotto repräsentiert die Lottoziehung, nicht einen einzelnen Spieler und dann übergibst du auch noch 3 uninitialisierte Variablen.

    So wie @DocShoe schon geschrieben hat, erstelle verschiedene Klassen für die unterschiedlichen Daten.



  • @Schlangenmensch hmm verstehe, was du meinst, ich denke auch das mir die Abstraktion fehlt. Ich werde ab sofort genauer achten, wie ich meinen Code kommentiere...

    Vielen Dank für den Tipp 🙂



  • @Th69 hmm ich werde versuchen mein Programm zu teilen, damit es leichter ist zu verstehen Danke dir für deinen Hinweis 😉



  • @DocShoe sagte in [Zwei Vektoren vergleichen aber mit

    • srand() sollte nur ein einziges Mal aufgerufen werden
    • rand() % M kann auch Duplikate erzeugen

    @adii950 Die Ziehung selbst ist zwar gerade nicht das dringendste Problem, ich empfehle dir dennoch mal std::shuffle (und auch das Beispiel dort) anzuschauen. Damit lässt sich sehr einfach (und vor allem korrekt) eine Ziehung simulieren, die von Prinzip her einer realen Lottoziehung sehr nahe kommt.

    Z.B. Kugeln mischen mit std::shuffle(kugeln.begin(), kugeln.end(), g) und Zahl ziehen mit kugeln.back() und kugeln.pop_back().

    Nur so als Anregung.



  • @adii950 sagte in Zwei Vektoren vergleichen aber mit unterschiedlichen Datentypen.:

    @DocShoe hmm verstehe ich werde das nächste darauf achten danke für den Hinweis

    Sorry, aber Ich bin nicht überzeugt dass du das Problem verstanden hast. 😉

    Ich lese mal deinen Code vor. "Lotto besteht aus der Anzahl der Spieler, der ziehenden Zahl, der Anzahl der möglichen Zahlen, einer Menge von Zufallszahlen und einer Menge von weiteren Lotto Instanzen"

    Würdest du so deinem Kind Lotto erklären?

    Warum nicht so? "Das Lotto Spiel besteht aus einer Ziehung und einer Menge von Tips. Jede Ziehung wird an einem gewissen Tag durchgeführt und besteht aus 6 gezogenen Zahlen, welche auf Kugel stehen. Jeder Spieler kann ein oder mehrere Tips abgegeben. Ein Tipp besteht aus 6 Zahlen, dem Datum der Ziehung und dem Namen des Spielers..."

    Diese Beschreibung ist wesentlich verständlicher und vor allen Dingen ergibt sich daraus die Grundlagen für deine Klassen.


Anmelden zum Antworten