Zwei Vektoren vergleichen aber mit unterschiedlichen Datentypen.



  • Gude eine Frage, wie kann man zwei Vektoren mit unterschiedlichen Typen vergleichen?
    Zum Beispiel:

    vector<int>zufallszahlen; 
    vector<lotto>vector_input;
    
      //Vergleicht ob die zufallzahlen gleich mein input ist
                if (vector_zufall[i] == vector_input[j]) {
    
                    cout << vector_zufall[i] << "  ist gleich  " << endl;
                }
    


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

    Gude eine Frage, wie kann man zwei Vektoren mit unterschiedlichen Typen vergleichen?

    Generell kannst du std::equal verwenden, um Ranges zu vergleichen. Wenn die Typen nicht direkt vergleichbar sind, musst du dann halt die Prädikatsfunktion implementieren. Hast du irgendein konkretes Problem beim Vergleichen?


  • Mod

    In Deinem Beispiel vergleichst Du aber keine Vektoren, sondern deren Elemente. Insofern (aber auch sonst) musst Du erst eine Äquivalenzrelation zwischen lotto und int definieren (in dem Fall, dass lotto kein arithmetischer Typ ist). @wob's Vorschlag zielt darauf ab, diese Relation ad hoc beizufuegen.



  • @wob ah du meinst, ich soll einfach die Bibliothek #includen und würde es klappen?
    Oder muss ich noch anderes hinzufügen?



  • @Columbo ich verstehe nicht genau was du mit Realtion ad hoc meinst?



  • @adii950 Du kannst entweder deinen Typen lotto mit int Vergleichbar machen, indem du den entsprechenden Operator definierst (such nach "operator overloading") oder, wenn du std::equal verwendet, den Vergleich "ad hoc" dem Aufruf von std::equal mitgeben, z.B. in Form eines Lambdas.



  • @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?
    Und was meinst du genau mit ad hoch könntest du mir bitte ein Beispiel geben sie ich das umsetzten soll bei mir?



  • Bin ich der Einzige mit der Vermutung, dass das Design oder Klassenbezeichnung suboptimal ist, wenn man einen int mit lotto vergleichen möchte?



  • @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?


Log in to reply