You are not logged in.

  • Login

1

Thursday, November 9th 2006, 11:35am

Lottozufallszahlen

hi soll ein Programm schreiben, welches zufällige Lottozahlen ausgibt. Und zwar in der Form:

Source code

1
2
3
4
5
6
7
8
z.B. gewürfelt: 14 34 16 20 43 2
Ausgabe: 1 X 3 4 5 6 7
8 9 10 11 12 13 X
15 X 17 18 19 X 21
22 23 24 25 26 27 28
29 30 31 32 33 X 35
36 37 38 39 40 41 42
X 44 45 46 47 48 49


Mein Quelltext bisher:

C Quellcode

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
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main ()
{
	char eingabe;
	int durchlauf=0;
	int zufall;
    srand(1);
Schleife:
	while (durchlauf<7 && durchlauf>=0)
	{
    zufall = rand();
 
	if ((zufall<50) && (zufall>0))
	{
 
 
		cout << "Zufallszahl: " << zufall << endl;
		durchlauf=durchlauf+1;
 
	}
 
    else  goto Schleife;
 
	}
system("pause");
return 0;


Warum gibt das Programm bei jedem Durchlauf die gleichen "Zufallszahlen" aus? So zufällig scheinen die ja nicht zu sein... mit der Formatierung habe ich noch Probleme, und ich weiß nicht genau, wie ich es ausschließen kann, dass nicht 2 mal die selbe Zahl unter den 6 gewürfelten ist. Ich könnte natürlich mit case versuchen die Zahlen zu vergleichen, hmmm...

2

Thursday, November 9th 2006, 5:42pm

hab mal noch ne Ecke weitergedacht:


C Quellcode

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
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main ()
{
        int eingabe;
		int Zahlen[6];
        int durchlauf=0;
        int zufall;
		int i=0;
		char Wert='0';
		cout << "Zahl eingeben" << endl;
		cin >> eingabe;
    srand(eingabe);
Schleife:
        while (durchlauf<7 && durchlauf>=0)
        {
    zufall = rand();
       for (int k=0; k<6; k++)
	   {
		   if (Wert='0')
		   {
		   if (Zahlen[k]==zufall)
		    {
			   Wert='1';
		    }
 
		   }
	   }
        if ((zufall<50) && (zufall>0))
        {
			Zahlen[i]=zufall;
 
 
                cout << "Zufallszahl: " << zufall << endl;
                durchlauf=durchlauf+1;
				i++;
 
        }
 
    else  goto Schleife;
 
        }
system("pause");
return 0;
}



Ja wir sollen das so machen, dass der Nutzer ne Zahl eingibt! Das Problem bleibt wie es ist, wennd er Nutzer ne 1 eingibt, ist die 28 zwei mal vertreten unter den 6 Zahlen... :?

EDIT: wegend er Formatierung mache ich das dann mit den Arrays (hoffe ich)

3

Thursday, November 9th 2006, 8:58pm

C Quellcode

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
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main (int argc, char** argv)
{
  unsigned int eingabe;
  int Zahlen[6] = {0,0,0,0,0,0};
  int zufall;
  int i=0;
  cout << "Zahl eingeben" << endl;
  cin >> eingabe;
  srand(eingabe);
  while (i<6)
  {
    zufall = rand () % 50;
    for (int k = 0; k < 6; k++)
      if (Zahlen[k] == zufall)
      {
        zufall = 0;
        break;
      }
    if ((zufall<50) && (zufall>0))
    {
      Zahlen[i] = zufall;
      cout << "Zufallszahl: " << zufall << endl;
      ++i;
    }
  }
  system ("pause");
  return 0;
}

4

Thursday, November 9th 2006, 9:02pm

was bedeuten char** und das % nach dem rand() ?

Ich bin erstaunt, es funktioniert... Das ist gemein, warum klappt das bei mir immer nicht, ich geb mir solche Mühe! :(

5

Thursday, November 9th 2006, 9:05pm

char** deklariert ein Zeiger auf einen Zeiger auf ein char was soviel heißt wie ein Array von Strings.
So wird per Konvention "main" deklariert - dass kannst du dir gleich angewöhnen :)

% ist der Modulo-Operator und sagt das alle Zahlen zwischen 0-49 liegen müssen.

6

Thursday, November 9th 2006, 9:08pm

Quoted from ""phax""

char** deklariert ein Zeiger auf einen Zeiger auf ein char was soviel heißt wie ein Array von Strings.
So wird per Konvention "main" deklariert - dass kannst du dir gleich angewöhnen :)

% ist der Modulo-Operator und sagt das alle Zahlen zwischen 0-49 liegen müssen.


kann man das auch ohne das % machen? Ich probier mal aus deinem und meinem ne Zwischenlösung zu bauen. Und dann muss ich noch die Zahlen im Lottoscheinformat ausgeben, das wird ein Spaß :shock:

7

Thursday, November 9th 2006, 9:10pm

Ist es wo besser zu verstehen:

C Quellcode

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
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main (int argc, char** argv)
{
  unsigned int eingabe;
  int Zahlen[6];
  int zufall;
  int i=0;
  cout << "Zahl eingeben" << endl;
  cin >> eingabe;
  srand(eingabe);
  while (i<6)
  {
    zufall = rand ();
    for (int k = 0; k < 6; k++)
      if (Zahlen[k] == zufall)
      {
        zufall = 0;
        break;
      }
    if ((zufall<50) && (zufall>0))
    {
      Zahlen[i] = zufall;
      cout << "Zufallszahl: " << zufall << endl;
      i++;
    }
  }
  system ("pause");
  return 0;
}

8

Thursday, November 9th 2006, 9:26pm

ja verstehe ich schon besser. Ich muss da nochmal drüber schlafen :D Muss am WE auch noch ein Programm schreiben, welches eine Registrierkasse simuliert :roll:

9

Thursday, November 9th 2006, 11:59pm

Hi,
in deiner ersten Version hast du ja wieder mit goto´s rumgewerkelt.
Wirklich,das solltest du dir erst garnicht angewöhnen.
Tue einfach so als wenn es goto nicht geben würde!
Naja,hier ist auch noch ne Programmversion von mir.
Ich benutze darin allerdings nen std::set weil es einfach praktischer ist.

C Quellcode

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
#include <iostream>
#include <set>
#include <cstdlib>
#include <time.h>
 
int main() 
{
	std::set<short> zahlen;
	srand(static_cast<int>(time(NULL)));
 
	while(zahlen.size()<6)
		zahlen.insert(rand()%49 + 1);
 
	for(int idx=1;idx<=49;++idx)
	{
		std::cout.width(2);
		if(zahlen.find(idx)!= zahlen.end())
			std::cout<<'X'<<' ';
		else
			std::cout<<idx<<' ';
		if(!(idx%7))
			std::cout<<'\n';
	}	
	return 0;
}


Gruß void

10

Friday, November 10th 2006, 12:41am

hallo void!

ja du hast Recht, wieder Gotos. Ich finde die einfach super praktisch, ich verstehe nicht was alle gegen Sprungmarken haben?

Deinen Quelltext verstehe ich mal wieder nicht so ganz, bei dir ist immer alles so kompakt :roll:
Kannst du mir mal erklären warum die rand() bei der gleichen Zahl in der Klammer also zB rand(1) immer das gleiche ausgibt? Das ist totaler Mist. Ich weiß auch immernoch nicht wie ich das mit der Formatierung dann lösen soll. Naja morgen abwarten ;)

Morgen werde ich mir deinen Quelltext nochmal genauer ansehen, aber ich sehe schon, da sind wieder Sachen drin, die ich nicht kenne :roll:

Achja: Das std::set was soll das? wozu ist das gut? Warum ist das praktisch? Wenn du

C Quellcode

1
using namespace std;
schreiben würdest, könnte man sich doch das std:: vor jedem cout und cin sparen...

Gruß,

cewbie

11

Friday, November 10th 2006, 7:04am

Quoted from ""cewbie""

hallo void!

ja du hast Recht, wieder Gotos. Ich finde die einfach super praktisch, ich verstehe nicht was alle gegen Sprungmarken haben?

Unbedingte Sprünge erschweren es in größeren Programmen ungemein den Zustand der Daten im Auge zu behalten.

Quoted from ""cewbie""


Kannst du mir mal erklären warum die rand() bei der gleichen Zahl in der Klammer also zB rand(1) immer das gleiche ausgibt? Das ist totaler Mist.

Naja,letztendlich ist srand/rand auch nur nen Algorithmus.Bei gleicher Eingabe gibt es immer die gleiche Ausgabe.So sonderlich kreativ sind CPU´s numal nicht :wink: .


Quoted from ""cewbie""

Ich weiß auch immernoch nicht wie ich das mit der Formatierung dann lösen soll. Naja morgen abwarten ;)

Die kannst du nahezu 1:1 von mir übernehmen.Was du halt in deiner Version anpassen musst,ist die Überprüfung ob die aktuelle Zahl eine der gewürfelten ist.
Das ist in meinem Code die Stelle mit if(zahlen.find(idx) != zahlen.end())

Quoted from ""cewbie""


Achja: Das std::set was soll das? wozu ist das gut? Warum ist das praktisch?

std::set ist ein STL Container.Stell dir set momentan einfach als Box vor in die du beliebig viele Werte reinpacken kannst.Davon bietet die STL diverse an,die alle ihre Eigenarten,Vor- und Nachteile haben.Der richtige STL Container zur richtigen Zeit erleichtert einem das Leben ungemein :wink:.
In diesem Fall bietet sich set an weil set keine doppelten Werte zulässt.
Durch die bedingte Schleife while(zahlen.size()<6) wird solange versucht,mit rand erzeugte Zufallszahlen in den Container einzufügen bis dieser 6 Elemente enthält.
Diese sind dann garantiert unterschiedlich.
Wenn ich dir nen wirklich gutes C++ Einsteigerbuch empfehlen darf,dann ist das "C++ Einführung und professionelle Programmierung" von Ulrich Breymann.
Darin wird auch recht ausführlich auf die STL eingegangen.Momentan fehlt dir aber noch Grundwissen um dich direkt (ernsthaft) mit der STL auseinanderzusetzen.
Im ersten Thread im C/C++ Bereich hab ich nen Link zu nem speziellen STL Buch von Uli B. gepostet.

Quoted from ""cewbie""


Wenn du

C Quellcode

1
using namespace std;
schreiben würdest, könnte man sich doch das std:: vor jedem cout und cin sparen...


Ja das stimmt.Ist aber Gewohnheitssache.
Im Allgemeinen sollte man es nämlich vermeiden in Headerdateien (von Klassen) Angaben über den zu benutzenden Namensraum zu machen,und somit den Namensraum dem potentiellen Benutzer einer Klasse aufzuzwängen.
Hier ist natürlich von Klassen weit und breit keine Spur,und somit dein Einwand auch berechtigt,aber wenn man sich erstmal angewöhnt hat immer std vor die Standardklamotten zu setzen.....

Gruß void

12

Friday, November 10th 2006, 12:39pm

hm das ist ja interessant, das keine doppelten Zahlen zugelassen werden. Ich muss mal überlegen ob ich das mit dem set benutze, da wir das eigentlich mal wieder noch nicht hatten ;)

13

Monday, November 13th 2006, 1:29pm

C Quellcode

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
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main ()
{
  unsigned int eingabe;
  int Zahlen[6];
  int zufall;
  int a=0;
  int lotto[48];
  int L=0;
 
  cout << "Dieses Programm bestimmt Lottozufallszahlen (6 aus 49)" << endl;
  cout << "" << endl;
  cout << "Zahl eingeben: " << endl;
  cin >> eingabe;
  srand(eingabe);
 
  while (a<6)
  {
    zufall = rand ();
    for (int b = 0; b < 6; b++)
      if (Zahlen[b] == zufall)
      {
        zufall = 0;
       break;
      }
    if ((zufall<50) && (zufall>0))
    {
      Zahlen[a] = zufall;
      cout << "Zufallszahl: " << zufall << endl;
      a++;
    }
  }
 
  while (L<49) // 49 Zahlen ausgeben, wenn Zufallszahlen, dann statt der Zahl "0" ausgeben
  {
	  lotto[L]=L+1;
	    if (lotto[L])==(Zahlen[0] || Zahlen[1] || Zahlen[2] || Zahlen[3] || Zahlen[4] || Zahlen[5])
		{
			lotto[L]=0;
		}
      cout << " " << lotto[L] << " ";
      L=L+1;
 
  }
 
 
  system ("pause");
  return 0;
}


Kann mir jemand sagen warum das Programm die letzte Schleife nicht ausführt? Sie soll, wenn die Zufallszahl bestimmt ist, ebendiese als "0" ausgeben. (Mit X geht nicht, da integer Datentyp!)

14

Monday, November 13th 2006, 2:30pm

Du hast in Zeile 40 einen Compilerfehler - falsche Klammernsetzung!
Wahrscheinlich sucht du so was:

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while (L<49) // 49 Zahlen ausgeben, wenn Zufallszahlen, dann statt der Zahl "0" ausgeben
  {
    lotto[L]=L+1;
    for (a = 0; a < 6; a++)
      if (lotto[L] == Zahlen[a])
      {
        lotto[L]=0;
        break;
      }
    if (lotto[L] < 10)
      cout << "  " << lotto[L];
    else
      cout << " " << lotto[L];
    L++;
    if ((L % 7) == 0)  // Neue Zeile nach 7 Zahlen
      cout << endl;
  }

15

Monday, November 13th 2006, 4:23pm

wie kann ich statt der 0 ein X ausgeben? Es gibt leider keinen Datentyp, der mir bekannt ist, welcher Buchstaben UND Zahlen unterstützt (mehr als 1 Zeichen)

16

Monday, November 13th 2006, 5:16pm

gibt ja verschiedene möglichkeiten
a) kannst du einfach in komplexeren bedingungen, bei denen du den wert zwischenspeichern musst, den negativen zahlenbereich nutzen, um ihn dann später wieder durch zeichen zu ersetzen

b) musst du es natürlich nicht speichern, sondern kannst es direkt ausgeben

C Quellcode

1
2
3
4
5
if (lotto[L])==(...)) {
	cout << " X "; 
} else
	cout << " " << lotto[L] << " "; 
}


btw: in ein char passt 0-127 - genug für Lotto

17

Monday, November 13th 2006, 5:40pm

Quoted from ""d0nUt""


b) musst du es natürlich nicht speichern, sondern kannst es direkt ausgeben

C Quellcode

1
2
3
4
5
if (lotto[L])==(...)) {
	cout << " X "; 
} else
	cout << " " << lotto[L] << " "; 
}



dann geht das mit den Zeilenumbrauch nach 7 Zahlen nicht mehr...

18

Monday, November 27th 2006, 5:15pm

Ich versuche gerade überhaupt ein rand() Programm zum laufen zu bekommen. Aber folgender Quelltext

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main()
{
	int feld[64][64];
	for (int i=0; i<8; i++)
	{
		for (int j=0; j<8; j++)
		{
			feld[i][j]= rand();
			cout << "[" << i << "," << j << "] = " << feld[i][j] << endl;
		}
	}
	cout << "RAND_MAX = " << RAND_MAX;
	return 0;
}


gibt mir immer den folgenden Fehler:

Quoted

fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?


Jedoch wozu sollte ich die stdafx.h einbinden? Weiss jemand Rat?

UPDATE: Nach Löschen des Projektes und nochmaligem schreiben hat es dann doch ohne Probleme funktioniert. Irgendwie nervt VC doch gewaltig mit seinen Eigenheiten.

19

Monday, November 27th 2006, 5:52pm

Du scheinst bei den Compiler-Option "-Yu" oder "-YX" drin zu haben - lösch die mal raus.

Social bookmarks