Lotto-Programm



  • Sehr geehrte Programmier Experten,

    Nun wie aus dem Betreff schon ersichtlich bräuchte ich dringend eure Hilfe.
    Da ich noch Schüler bin und gerade C++ lerne, gab uns unser Professor ein Übungsbeispiel um uns Vektoren bzw. Felder näher zu bringen.
    Natürlich, Sinn macht dieses Programm keinen ist jedoch wichtiger Bestandteil zur Vorbereitung auf den Test.

    Und zwar sollte ich ein Lotto-Programm schreiben das 6 Zahlen einliest, jede Zahl hat einen (Zahlen)-Bereich von 0 bis 45, also so wie beim richtigen Lotto.
    Sollte bei der Eingabe dieser 6 Zahlen eine Zahl doppelt eingegeben werden, so soll die Eingabe wiederholt werden.
    Falls jedoch keine Zahl doppelt eingegeben wurde, so sollte nichts passieren also keine Fehlermeldung oder sonstiges.
    UND das alles bzw. Großteils mit Vektoren.

    Hoffe ihr versteht meine erläuterung zu diesem Beispiel.
    Natürlich habe ich auch schon ein Progrmm geschrieben nur leider funktioniert es nicht richtig.

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    
    #define vergleich 45
    
    void main ()
    {
       int lottozahl [vergleich],i=1,x,l=0;
    
       do{
    
           for(int z=0;z<=5;z++)
              {
                 gotoxy(2,2+z); printf("%d. Lottozahl",z+1);
    	    gotoxy(17,2+z); scanf("%d",& lottozahl[z]);
    
    	    lottozahl[i]=lottozahl[z];
    
                                // i ist eine Laufvariable ist und somit jede neu eingelesene Zahl gespeichert wird
    
    	    for(int j=1;j<=l;j++)                                     
    	       {  
    
    		 if(lottozahl[z]==lottozahl[j]) 
    
                   //  Abfrage ob die eingegebene Zahl gleich der der gespeicherten Zahl ist wobei j eine Laufvariable 
    							       //  für die gespeicherten Zahlen ist
    
    	                {  gotoxy(2,10); printf("Einige Zahlen wurden doppelt eingegeben.");
                                 printf("%d",lottozahl[4]);
    			 x=5;
    
                            }
    
    	       }
    
    	       l=l+1;
    
    	       i=i+1;
              }
    
         }while(x==5);
    
    }
    

    Problem: Schon nach dem einlesen der zweiten Zahl gibt er aus das einige Zahlen doppelt eingegeben wurden was leider nicht stimmt.

    Ich bedanke mich schon herzlichst im Voraus.

    Mit freundlichen Grüßen, Thorsten



  • du willst aber C programmieren, oder?
    das ist zwar nicht mal gültiges C(void main) und auch ein wenig winapi - wo auch der fehler liegen könnte, aber c++ ist es auf gar keinen fall...
    editier mal die code-tags zu cpp-tags, dann liest sich das vll auch mal jmd durch...

    bb



  • Was ist denn mit dem Code passiert? 😮
    Nochmal in lesbarer Fassung plus Kommentare:

    #include <stdio.h> //gibt es nicht, muss cstdio heißen
    #include <conio.h> //was ist das denn? Gehört nicht zu C++
    #include <stdlib.h> //heißt cstdlib
    #define vergleich 45
    //Konstanten definiert man so: const int vergleich=45;
    //bei #define handelt es sich um Textersetzung - für Konstanten ist das Unfug
    //Der Name vergleich ist extrem unpassend gewählt
    void main() //main muss immer int zurückgeben, das hier ist nicht erlaubt
    {
        int lottozahl [vergleich],i=1,x,l=0;
        //nicht alle Variablen auf einen Schlag deklarieren, sondern erst, wenn du sie brauchst - das hier zerstört jegliche Übersicht
        //wozu eigentlich 45 Lottozahlen?
        do
        {
            for(int z=0;z<=5;z++) //nicht falsch, aber ein Vergleich mit <6 ist üblicher, da leichter erkennbar ist, dass die Schleife sechsmal durchgangen wird
            {
                gotoxy(2,2+z); printf("%d. Lottozahl",z+1);
                gotoxy(17,2+z); scanf("%d",& lottozahl[z]);
                //printf und scanf sind C-Funktionen und werden in C++ selten oder nie verwendet -
                //die Entsprechungen sind die beiden Streamobjekte cout and cin (benötigt den Header iostream):
                //std::cout << (z+1) << '.';
                //std::cin >> lottozahl[z];
                lottozahl[i]=lottozahl[z];
                // i ist eine Laufvariable ist und somit jede neu eingelesene Zahl gespeichert wird
                for(int j=1;j<=l;j++) //warum eine Schleife, wenn sie nur einmal ausgeführt wird?
                {
                    if(lottozahl[z]==lottozahl[j])
                    { 
                        gotoxy(2,10); printf("Einige Zahlen wurden doppelt eingegeben.");
                        printf("%d",lottozahl[4]); //?!?!
                        x=5; //was ist 5 denn für eine magische Zahl?
                    }
                }
                l=l+1; //a.k.a l++
                i=i+1; //s.o.
            }
        }while(x==5);
    }
    

    Was das Programm macht, ist schwer nachzuvollziehen - z.B. mit der zusätzlichen Laufvariablen in unbekannter Funktion wie i, die aus mysteriösen Gründen bei 1 anfängt...
    Wenn ihr das echt so beigebracht bekommt, dann ist das ein echt jämmerliches Zeugnis für den Zustand der deutschen Bildungsinstitute. Aber ich gehe davon aus, dass es keine Option für dich ist, zu wechseln.

    ein Übungsbeispiel um uns Vektoren bzw. Felder näher zu bringen.

    Du verwendest hier nur ein Array (=Feld), in C++ ist meist std::vector gemeint.

    Ach ja, Lottozahlen gehen von 1-49. 😉



  • Athar schrieb:

    Ach ja, Lottozahlen gehen von 1-49. 😉

    Österreich und Schweiz haben 6 aus 45.



  • Hallo zusammen,
    entschuldigt ich habe vergessen zu schreiben das, dass Borland C++ ist bzw. das Programm Borland C.

    Ist das nicht das selbe wie C++ ?
    Da haben sie uns in der Schule aber großen Mist erzählt, von wegen wir werden programmieren in C++ lernen... 😡
    Kennt sich jemand mit Borland C aus?

    Wie schon volkard geschrieben hat --> ich komme aus Österreich, daher wusste ich nicht das ihr in Deutschland 49 habt.

    Danke für eure Antworten!
    Danke auch an Athar der sich die Mühe gemacht hat den Borland C Code in C++ Code umzunennen bzw. Kommentare hinzugefügt hat.
    mfg Thorsten


  • Mod

    C und C++ sind zwei sehr verschiedene Sprachen. Zwar ist (fast) jedes C Programm auch automatisch ein C++ Programm, weil C++ die Sprache C enthält, aber es ist sehr ungewöhnlich in C++ die Mittel der C-Sprache zu verwenden, weil diese ziemlich inkompatibel zu den erweiterten Mitteln sind die C++ bietet. Die Gemeinsamkeit zwischen typischen C und C++ Programmen ist üblicherweise bloß die Syntax (das ist die "Grammatik" einer Programmiersprache, d.h. wo man welche Klammern setzt und was die ganzen Sonderzeichen für eine Bedeutung haben) und die Kontrollstrukturen (if, for, while, do, ...).

    Die Extras die C++ gegenüber C zu bieten hat sind in erster Linie:
    - Alternative Herangehensweisen ans Programmieren die man verwenden kann. Muss man aber nicht. Den meisten Menschen liegen diese alternativen Herangehensweisen aber eher. In C kann man nur imperativ programmieren, das heißt eine Anweisung nach der nächsten und die werden dann alle hintereinander ausgeführt.
    - Eine erweiterte Standardbibliothek. Es gibt zwar auch noch die alte C Standardbibliothek, die C++ Bibliothek bietet aber weit mehr. In C++ wäre dein Lotto-Programm ziemlich trivial zu lösen indem man einfach fertige Sachen aus der Standardbibliothek zusammenbastelt. Einige Teile der C Bibliotheken wurden durch die C++ Bibliothek mehr oder weniger überflüssig, die neuen Teile gelten gemeinhin als einfacher zu benutzen (beispielsweise Verarbeitung von Zeichenketten)

    Das heißt nicht, das C++ in irgendeiner Weise besser oder schlechter wäre, es ist bloß ganz was anderes als C. Es gilt gemeinhin eher als hinderlich, zuviel C zu lernen, wenn man eigentlich C++ lernen will.

    P.S.: Auch noch Borland C? Ihr Armen. Naja, beiß dich durch, versuch eine gute Note abzustauben und die allgemeinen Konzepte zu lernen. Später kannst du dann immer noch eine Sprache deiner Wahl vernünftig lernen, wenn es dich noch interessiert.



  • Borland C++ und Borland C ist ein großer Unterschied - C und C++ sind nämlich zwei verschiedene Sprachen.
    Wenn du C lernst, dann bist du im ANSI C-Forum besser aufgehoben - auch wenn Sachen wie gotoxy nicht sehr ANSI sind.

    Falls du doch C++ lernst (man sollte eher sagen - falls es das Ziel deines Kurses ist), wäre das eine vernünftige Umsetzung:

    #include <iostream>
    #include <vector>
    #include <algorithm> //algorithm wird nur für find benötigt
    using namespace std;
    
    int main()
    {
      vector<int> lottozahlen; //vector kann seine Größe verändern - da hier nicht nötig, wäre ein Array ebenfalls ausreichend
      for (int i=0;i<6;i++)
      {
        int zahl;
        for (;;) //falls dich der "Endlosschleifenlook" irritiert, kannst du auch for (bool zahlOk=false;!zahlOk;) und unten zahlOk=true statt break schreiben
        {
          cout << "Lottozahl " << i+1 << ": ";
          cin >> zahl;
          if (zahl<1 || zahl>45)
          {
            cout << "Die Lottozahl muss zwischen 1 und 45 liegen." << endl;
            continue;
          }
          if (find(lottozahlen.begin(),lottozahlen.end(),zahl)!=lottozahlen.end())
          { //find ist ein bequemer Standardalgorithmus - um das Prinzip zu verstehen, muss man sich über Iteratoren informiert haben
            cout << "Diese Zahl wurde bereits verwendet." << endl;
            continue;
          }
          //und das wäre die Variante ohne find:
          /*
          bool gefunden=false;
          for (int j=0;j<i;j++)
          {
            if (zahl==lottozahlen[j])
            {
              gefunden=true;
              break;
            }
          }
          if (gefunden)
          {
            cout << "Diese Zahl wurde bereits verwendet." << endl;
            continue;
          }
          */
    
          lottozahlen.push_back(zahl);
          break;
        }
      }
    }
    

    Auch wenn du C lernst, kannst du dich davon inspirieren lassen.

    Dass der Lottozahlenbereich in Österreich anders ist, wusste ich gar nicht - wieder was gelernt.



  • Ich hab deinen Quelltext mal durch den Borland, den ich gerade da hab, geschickt - ich bekomme Fehlermeldungen.

    Deshalb die Frage, mit welchem Borland compilierst du den Quelltext?



  • Ich habe das mit g++ kompiliert - aber Borland C++ muss das auch können.
    Wenn ihr wirklich Borland C einsetzt (kannte bisher nur den Borland C++Builder), dann ist klar, dass das nicht kompiliert - ein C-Compiler kann keinen C++-Code übersetzen (umgekehrt geht das dagegen meist schon).

    Edit:

    SeppJ schrieb:

    Das heißt nicht, das C++ in irgendeiner Weise besser oder schlechter wäre, es ist bloß ganz was anderes als C.

    Da kann man aber drüber streiten 😉
    Weil C++ alles bietet, was C hat, aber viele wertvolle und zeitsparende Konzepte einführt, kann man durchaus sagen, dass C++ besser ist.



  • Athar nicht dein Quelltext 😉
    Den frisst sogar der alte free bcc5.5 ohne murren und bringt das gewünschte Ergebnis.

    Thorsten schrieb doch seiner soll laufen - in seinem Fall könnte es unter bestimmten Bedingungen ohne Fehlermeldung möglich sein. Doch bei solchen Fragen lernt die Erfahrung, das die Behauptung "mein Programm läuft" nicht immer zutrifft.

    MfG f.-th.



  • Athar schrieb:

    SeppJ schrieb:

    Das heißt nicht, das C++ in irgendeiner Weise besser oder schlechter wäre, es ist bloß ganz was anderes als C.

    Da kann man aber drüber streiten 😉
    Weil C++ alles bietet, was C hat, aber viele wertvolle und zeitsparende Konzepte einführt, kann man durchaus sagen, dass C++ besser ist.

    Er hat da eher den C Stil gemeint und der hat auch Vorteile gegenüber, wie man in C++ programmiert. C ist auf eine Art denke ich einfacher zu lernen und braucht weniger Wissen, wie gewisse Dinge geregelt werden. Ein C++ Programmierer muss sich Gedanken über exception Sicherheit, Laufzeit oder Kompilierzeit polymorphie, Vererbung usw. machen, was bei einem C Programmierer nicht anfällt. Klar werden da andere Mittel gebraucht, um die Probleme zu lösen, aber das ist dann halt der C-Weg.

    Du hast im dem Sinne recht, dass man in C++ beinahe gleich auch C programmiere kann, aber dann ist es halt C und nicht C++, auch wenn es als C++ kompiliert wurde. 😉 ( ich denke du verstehst jetzt auch, worauf SeppJ raus wollte).



  • Hallo,

    DANKE für eure Antworten, sie helfen mir sehr weiter.
    Zur Frage was für eine Version ich habe:
    BORLAND C++ für Windows
    Version 3.1
    Ich werde mir aus euren sehr informativen und aufschlussreichen Antworten und Beispielprogrammen ein funktionierendes C Programm (Lotto) schreiben.
    Sollte das prog nicht funktionieren muss ich meinen Programmier-Lehrer fragen der mir weiterhelfen kann bzw. sollte.
    Nochmal recht herzlichen Dank für eure Antworten.

    mfg Thorsten



  • Dein Borland sollte zu alt sein für den hier geschriebenen C++ Quellcode.
    Ich weiss es jetzt nicht ganz exakt, der Borland C++ 3.1 ist etwa 1992 auf den Markt gekommen. Er war seiner Zeit, wenn ich mich recht erinnere, der Marktführer, aber es sind doch Weiterentwicklungen bei den Compilern zu erkennen.

    Obwohl, interessant das der schon

    for(int ...)
    

    beherrscht und ein Borland aus dem Jahr 2000 in der Basiseinstellung dies als Fehler betrachtet.

    MfG f.-th.



  • Hallo zusammen, ich habe eine Hausaufgabe in der Uni bekommen einen ähnlichen Code zu erstellen. Wir machen allerdings alles in VisualC++ und ich konnte keinen anderen vergleichebaren Code für Visual finden der auch Lottozahlen in der Art generiert. Gerne wollte ich euch fragen ob es große Unterschiede gibt zwischen den hier dargestellten Code in C und wenn ich diesen z.B. in VisualC ausgeben möchte. Ich muss natürlich die Hausaufgabe bestehen und es wäre wirklich super wenn ihr mir hier helfen könnten.



  • Zeig mal ein wenig Quelltext 😃

    VisualC++ ist ein weites Feld.

    Aber, wenn du uns genug Quelltext zeigst, wissen wir vielleicht welche C(++) Variante für dich am besten passt.

    Wenn du dir ein wenig Mühe gibst, solltest du aber aufgrund der Beiträge eine Lösung in C oder C++ schreiben können.

    MfG f.-th.



  • PcSmarter schrieb:

    ich konnte keinen anderen vergleichebaren Code für Visual finden der auch Lottozahlen in der Art generiert.

    Lottozahlen = Zufallszahlen. Was ist denn daran so schwierig? Ich behaupte jetzt einfach, dass du einfach nur faul bist.
    Du brauchst ja keinen kryptographisch sicheren Zufallszahlengenerator - ein (s)rand() würde völlig ausreichen.

    http://www.c-plusplus.net/forum/172876-full


Anmelden zum Antworten