Besser Programmieren? In Arrays suchen und Arrays vergleichen

betzi1985

Grünschnabel
Hallo, ich lerne seit zwei Tagen Programmieren und habe mich für C++ entschieden. Ich habe aktuell die Themen. Variablen, Ein-/ Ausgabe, Arrays, Funktionen, Bedingungen und Schleifen durch genommen. Um mein gelerntes anwenden zu können, habe ich mich dafür entschieden ein "Lottospiel" zu programmieren. In diesem SPiel habe ich alles verwendet, was ich bisher gelernt habe, ich weiß es ist noch nicht viel, trotzdem bin ich stolz drauf. Das SPiel geht so.

Der Spieler gibt zuerst seinen Namen ein. Dann Tippt der Spieler seine 6 Gewinnzahlen ein. Es ist für den Spieler nur möglich Zahlen von 1-49 einzugeben. Er kann keine doppelten Zahlen eingeben. Hat er die Zahlen eingeben, werden per Zufallsmechanismus 6 Zahlen aus der "Lostrommel" gezogen. Hier wird auch dafür gesorgt, dass jede Zahl nur einmal gezogen werden kann. Anschließend wird untersucht, wie Viele Übereinstimmungen vorliegen und diese angezeigt. Wie gesagt, habe ich alles was ich bisher in zwei Tagen gelernt habe zu verwenden. Schleifen Arrays und und und. Jetzt meine Frage.

Wir würde ein "PROFI" dieses Programmieren? Ich gehe mit mehreren Forschleifen die Arrays durch, um z.B. zu schauen, dass ich keine doppelten Zahlen ziehe, bzw. ob Übereinstimmungen vorhanden sind. Gibt es da für "Fortgeschrittene" bessere Möglichkeiten?

Ist es möglich, dass man in einem Array suchen kann? Ist es möglich 2 Arrays miteinander zu vergleichen und die Gemeinsamkeiten in ein weiteres Array auszugeben? Dies würde meinen Code natürlich sehr verschlanken. Obwohl ich durch meine Programmierung natürlich das in den letzen 2 Tagen gelernte verinnerlichen und anwenden konnte.

Vielen Dank für Eure Antworten, bezüglich meiner Fragen, Suchen in Arrays und Arrays vergleichen.

Anbei mein aktueller Quelltext, bitte nicht gleich komplett zerreißen, ich bin wie gesagt absoluter Anfänger und ich weiß, dass es wahrscheinlich viel besser geht, aber ich bin trotzdem sehr stolz drauf und wollte, dass es funktioniert.

Falls es noch relevant ist, ich Programmiere unter Linux

Viele Grüße

Betzi

C++:
#include <iostream>
#include<cstdlib>
#include <unistd.h>
#include<ctype.h>
#include<string>
#include <sstream>

using namespace std;


int generiereZufallszahl(int bis){
    int zufallszahl = rand() % bis +1;
    return(zufallszahl);


}

void fuelleLottotrommel(int lottoTrommel[]){

    for(int i=0;i<49;i++){
        lottoTrommel[i]=i+1;
    }
}

bool istZahlDoppelt(int gezogeneZahl, int gezogeneZahlen[]){
    bool istDoppelt = false;
    for(int i=0;i<6;i++){
        if(gezogeneZahl == gezogeneZahlen[i]){
            istDoppelt = true;
        }
    }
    return istDoppelt;

}

void zieheZahlen(int gezogeneZahlen[]){
    int gezogeneZahl =0;
    for(int i = 0; i<6; i++){

       do{
            gezogeneZahl = generiereZufallszahl(49);
        }while(istZahlDoppelt(gezogeneZahl, gezogeneZahlen));


        gezogeneZahlen[i] = gezogeneZahl;
    }

}

int zeigeAnzahlUebereinstimmungen(int gezogeneZahlen[], int getippteZahlen[],int trefferZahlen[]){
int treffer = 0;
for(int i = 0; i<6; i++){
    for(int j=0; j<6; j++){
        if(gezogeneZahlen[i]==getippteZahlen[j]){
            treffer++;
            trefferZahlen[i]=gezogeneZahlen[i];
        }
    }
}

return treffer;

}


int main()
{
    srand((unsigned)time(NULL));
    int lottoTrommel[49];
    int meineGluecksZahlen[6] = {0,0,0,0,0,0};
    int gezogeneZahlen[6] = {0,0,0,0,0,0};
    int trefferZahlen[] = {0,0,0,0,0,0};
    string name;

    cout << "Herzlich willkommmen zur Lottoziehung." << endl;

    cout << "Bitte gib Deinen Namen ein: ";
    getline(cin,name);
    cout << endl << name << " freut mich Dich kennenzulernen, schön das Du dein Geld hier lässt ;)" << endl;


    cout << name << " bitte geb Deine 6 Lottozahlen ein!" << endl;

    for(int i = 0; i < 6; i++){
        int meineZahl;
        string mystr;

        do{

            cout << name << ", bitte " << i+1 << ". Zahl eingeben:";

            getline (cin,mystr);
            stringstream(mystr) >> meineZahl;
            if(istZahlDoppelt(meineZahl,meineGluecksZahlen) || meineZahl <1 || meineZahl>49){
                cout << endl << "Nein " << name << " bitte eine Zahl zwischen 1 und 49 eingeben und jede Zahl nur einmal eingeben!!!!!" << endl;
            }

        }while (istZahlDoppelt(meineZahl,meineGluecksZahlen)||meineZahl <1 || meineZahl>49);
        meineGluecksZahlen[i] = meineZahl;
    }



    fuelleLottotrommel(lottoTrommel);
    cout << name << " gleich geht es los, die Lottotrommel wird gefüllt" << endl << endl;
    for(int i=0;i<49;i++){
        cout << lottoTrommel[i] << ",";
    }



    cout << endl << endl << endl << name << " Deine Glückszahlen:" << endl << "{";


    for(int i = 0 ; i<6 ; i++){
        cout <<meineGluecksZahlen[i] << ",";
    }
    cout << "}" << endl;

    cout << "Starte die Lostrommel";
    getchar();
    zieheZahlen(gezogeneZahlen);
    cout << name << " bitte warte, es geht los, die Ziehung beginnt" << endl;
    usleep(3000000);
    for(int i = 0 ; i<6 ; i++){
        cout  << name << " hier kommt Zahl " << i+1 << ":";
        cout <<"";
        usleep(3000000);
        cout << gezogeneZahlen[i] << endl;
    }
    int treffer = zeigeAnzahlUebereinstimmungen(gezogeneZahlen, meineGluecksZahlen,trefferZahlen);
    if(treffer > 0){
        cout << endl << "Glückwunsch " << name << " Du hast " << treffer << " Treffer :)";
        cout << endl << "Folgende Zahlen stimmen überein: ";
        for(int i =0; i<6;i++){
            if(trefferZahlen[i]!=0){
                cout << " " << trefferZahlen[i] << endl;
            }
        }
    }else{
        cout << endl << "Schade " << name << " versuche es ein andermal" << endl;
    }


    return 0;
}
 

Jennesta

Erfahrenes Mitglied
Hallo,
ich finde für gerade einmal 2 Tage ist dein Code wirklich ausgezeichnet.
Es gibt hier auch nicht wirklich eine Profi und eine Anfänger Variante, denn in erster Linie zählt es, dass der Code funktioniert.
Du lagerst Code in Funktionen aus, initialisierst durchgehend Variablen und es sieht weitestgehend ordentlich formatiert aus. Das sieht man auch bei Amateuren oder Profis nicht regelmäßig.

Zu deiner Frage mit dem Suchen. Deine Variante ist nicht falsch und erfüllt in jedem Fall den Zweck. Zu Übungszwecken könntest du aber mal versuchen Funktionen aus der Standardbibliothek zu nutzen.
Schau mal hier unter dem Link
Dabei könnte es erforderlich oder hilfreich sein, deine Arrays auf std::vector umzustellen.

Aber nochmal, deine Variante ist so völlig korrekt, wobei man in C++ weniger mit klassischen Arrays als mit Containern arbeitet. Ausnahmen bestätigen die Regel ;)

Bei weiteren Fragen, melde dich gerne.
 

Zvoni

Erfahrenes Mitglied
Zum "Lotto"-Algorithmus hatte ich mal hier ein kleines Tutorial geschrieben (jedoch in VB6).
Das Prinzip des Algorithmus (um die Schleifen-Sucherei zu vermeiden):
Erzeuge das initiale Array a[1]-a[49] mit den Werten 1-49 --> For-Schleife mit a[ i]=i
Erzeuge 6 Zufallszahlen in einer For-Schleife mit folgenden Parametern:
1. Zufallszahl im Bereich 1-49
2. Zufallszahl im Bereich 1-48
usw.
Also immer die nächste Zufallszahl das obere Ende des Arrays um 1 verringern
Warum?
Nachdem die Zufallszahl erzeugt wurde (Bsp. 13) hole den Wert aus dem Element. Ich nutze die Zufallszahl als Array-Index!
Wert[1]=a[Zufall]
Danach wird dieses Element mit dem letzten Element getauscht
a[Zufall]=a[Letztes]
danach die obere Grenze des Array um 1 verringert --> Letztes=Letztes-1
 

ComFreek

Mod | @comfreek
Moderator
Ich bin kein C++-Experte, mir fielen aber folgende Punkte auf:
  • using namespace std, siehe Google
  • Sind die eingebundenen C-Header wirklich notwendig? Kannst du auf bessere C++-Header ausweiche?
  • rand() ist von C und garantiert keine guten uniform zufäligen Zahlen. Google mal "C++ random integer"
  • Du benutzt endl statt "\n". Ersteres erzwingt Flushes, was bei dir meistens unnötig ist.
  • Inkonsistentes Whitespacing, z. B. einmal "a=b", dann "a = b".
  • Inkonsistente Einrückungen.
  • Geschmackssache: statt "int" lieber "unsigned int" oder was anderes benutzen, wenn du nur vorzeichenlose Integer brauchst, z. B. um von 0 bis 6 zu zählen.
  • Nutze lieber Container statt Arrays wie @Jennesta schon sagte. Das ist idiomatischer in C++.
  • cout <<""; ist unnötig.
Lass dich davon aber nicht abschrecken :)
 

betzi1985

Grünschnabel
Hallo,

nein ich möchte lernen und bin für jede "Kritik" dankbar. Ich habe mir auch jetzt erstmal ein neues Buch gekauft, das ich hatte war mist und wurde in vielen FOrum für schlecht empfunden. Ich habe sogar c++ Zufallszahl eingegeben, und da kam das ;). Wusste nicht, dass es ein C Konstrukt ist. Man sollte nich mischen, dass habe ich auch gelernt, nur wenn man im INternet nach einem Befehl für C++ sucht und einem der Befehl dann angezeigt wird, geht man als "Leie" davon aus, dass es schon richtig ist ;). Ich werde mir erstmal mein neues Buch anschauen. Ich wollte nur einfach mal etwas Programmieren, was etwas mehr sind macht als die Sachen, die in den Büchern als Übungsaufgaben stehen. Da man aber natürlich noch nicht alles in 2 Tagen lernen konnte, bzw, noch nicht alles dran kam, sucht man schnel bei GOOGLE und dann kommt so ein "Müll" raus, wie ich oben geschrieben habe ;).

Ich werde auf jeden Fall versuchen mir Eure "Kritik" zum Herzen zu nehmen.

Viele Grüße

Betzi
 

Neue Beiträge