Wuerfeln

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Wuerfeln

Beitrag von Dirty Oerti » Di Jan 05, 2010 11:33 pm

Entschuldige, aber ich bezweifle, dass das funktioniert :|

Aaalso, um das mal ausführlich zu machen:
#include <time.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>


int main ()
{
int augen=0, anzahl=0;
int augenzahl[6]={0,0,0,0,0,0};
srand ( time(NULL) );
std::cout << "Wie oft soll gewuerfelt werden?" << std::endl;
std::cin >> anzahl;
anzahl++; //(1)

int a = 0;
while (anzahl >= a) //(2)
{
augen = rand () % 6 + 1;

if (a!=0)
{
std::cout << augen << " ";
if (augen < 7)
augenzahl[augen]++;
else
{
std::cout << "Ein Fehler ist aufgetreten, Das Programm wird beendet" << std::endl;
exit(0);
}
}
//(3)
a++;
}
std::cout << std::endl;
std::cout << "eins: " << augenzahl[1] << std::endl;
std::cout << "zwei: " << augenzahl[2] << std::endl;
std::cout << "drei: " << augenzahl[3] << std::endl;
std::cout << "vier: " << augenzahl[4] << std::endl;
std::cout << "fünf: " << augenzahl[5] << std::endl;
std::cout << "sechs: " << augenzahl[6] << std::endl; //(4)

std::cout << "Das Programm wurde erfolgreich ausgeführt.";
return 0;
}
Und nun die jeweilige Erklärung dazu:

(1) :
Du bekommst eine Anzahl vom Benutzer. Die musst du nicht erhöhen. Das kann evtl eine "Lösung" sein, schick oder gar sinnvoll ist das nicht. Meist zeigt die Tatsache, dass du zu so etwas kommst eher, dass wo anders was falsch läuft...

(2):
Das ist zum ersten schlecht zu lesen und zum anderen falsch.
Du willst genau ANZAHL Durchläufe haben.
Nehmen wir an, du hast die Anzahl = 2.
Dann bekommst du hier 3 Durchläufe, und zwar bei a=0, a=1, a=2
Ich würde dir folgendes empfehlen:

Code: Alles auswählen

while ( a < anzahl )
Oder du initialisierst a auf 1, dann sieht es so aus:

Code: Alles auswählen

int a = 1;
while ( a <= anzahl)

(3):
Dein Code wird da sehr verzwickt, obwohl es sich eigentlich um eine einfache Sache handelt.
Überleg dir nochmal, was du möchtest. Und auch, was du bisher programmiert hast.
Du hast eine Schleife, die läuft Anzahl-mal durch.
Jedes mal willst du eine Zahl zwischen 1 und 6 "würfeln", und je nach dem notieren, dass diese Zahl gewürfelt wurde (und wie damit wie oft sie gewürfelt wurde)

Code: Alles auswählen

// Das kommt in die while-Schleife
int wurf = (rand() % 6) + 1;
// Damit ist wurf eine Zahl zwischen 1 und 6
// Das ist damit eigentlich schlecht, denn dein Array zählt ab 0 bis 5
augenzahl[wurf-1]++;
// Jetzt hast du den Zähler für die jeweilige, gewürfelte Zahl erhöht (augenzahl[0] ist der Zähler für die Zahl 1)
a++;
// Damit deine Schleife auch irgendwann fertig wird


(4):
augenzahl[6] geht nicht, da dein Array nur 6 Elemente hat und es bei 0 zu zählen beginnt!
Damit hat das 6te Element den Index (die "Adresse") 5.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Wuerfeln

Beitrag von Kerli » Di Jan 05, 2010 11:41 pm

Code: Alles auswählen

if (augen < 7)
augenzahl[augen]++;
else
{
std::cout << "Ein Fehler ist aufgetreten, Das Programm wird beendet" << std::endl;
exit(0);
}
So etwas ist schlechter Stil. Als Grundsatz hab ich irgendwo einmal gelesen das man bei einem if/else entweder alle Blöcke mit Klammern umschließt oder keinen, da es dadurch leicht zu Fehlern kommen kann. Und solange du nicht ganz genau weiß was der Code tut mach lieber ein paar Klammern zu viel als zu wenig (Überleg dir doch einmal was oben passieren würdest wenn du nach "augenzahl[augen]++;" noch eine Zeile einfügen würdest):

Code: Alles auswählen

if (augen < 7)
{
  augenzahl[augen]++;
}
else
{
  std::cout << "Ein Fehler ist aufgetreten, Das Programm wird beendet" << std::endl;
  exit(0);
}
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Wuerfeln

Beitrag von naums » Mi Jan 06, 2010 4:21 pm

normalerweise rücke ich Code immer ein. Und wenn ich einrücke, dann meist nur wegen IF bzw. WHILE. wenn jetzt also obendrüber kein "{" ist, sondern "if" steht, weiß ich, dass ich wenn ich mehr hinzufügen will, die Klammern setzen muss.
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Wuerfeln

Beitrag von naums » Mi Jan 06, 2010 4:34 pm

und übrigens: das Array Augenzahl[7]... das stimmt so. das erwänte ich eben schon, dass ich das auf 7 erhöre.
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Wuerfeln

Beitrag von Dirty Oerti » Mi Jan 06, 2010 5:19 pm

Wie sieht denn dann dein fertiger (funktionierender?) Code aus?
Wenn du Augenzahl[7] verwendest bedeutet das logischerweise, dass du einen Würfel mit 8 unterschiedlichen Augenzahlen simulieren willst... ist das so?
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Wuerfeln

Beitrag von naums » Mi Jan 06, 2010 6:02 pm

ne die Augenzahl[0] benutze ich einfach garnicht. und die Augenzahl[7] existiert nicht, sondern das geht nur bis augenzahl [6]
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Wuerfeln

Beitrag von cloidnerux » Mi Jan 06, 2010 6:06 pm

ne die Augenzahl[0] benutze ich einfach garnicht. und die Augenzahl[7] existiert nicht, sondern das geht nur bis augenzahl [6]
Auf solche Quick'n'Dirty Lösungen sollte man verzichten.
Wenn dud ir den Code in 1 Jahr anschaust wirst du warscheinlich nicht verstehen, warum du für 6 Zahlen 7 Werte hast.
Und was ist daran so schlimm, statt

Code: Alles auswählen

while( a <= Anzahl)
z.B

Code: Alles auswählen

for(init i = 0; i < Anzahl; i++)
{
    Augenzahl[i];
}
Zu schreiben?
Besser, wie bist du auf "a <= Anzahl" gekommen?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Wuerfeln

Beitrag von naums » Mi Jan 06, 2010 7:24 pm

ehrlich gesagt, ich komme mit der FOR schleife ne klar. da benutze ich lieber while. Im Grunde genommen ist es auch das gleiche. Der endgültige Code:

Code: Alles auswählen

#include <time.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>


int main ()
{
  int augen=0, anzahl=0;
  int augenzahl[7]={0,0,0,0,0,0,0};
  srand ( time(NULL) );
  std::cout << "Wie oft soll gewuerfelt werden?" << std::endl;
  std::cin >> anzahl;

  int a = 0;
  while (anzahl > a)
  {
      augen = rand () % 6 + 1;
      augenzahl[augen]++;
      std::cin.clear();
      a++;
  }
  std::cout << std::endl;
  std::cout << "eins:   " << augenzahl[1] << std::endl;
  std::cout << "zwei:   " << augenzahl[2] << std::endl;
  std::cout << "drei:   " << augenzahl[3] << std::endl;
  std::cout << "vier:   " << augenzahl[4] << std::endl;
  std::cout << "fuenf:  " << augenzahl[5] << std::endl;
  std::cout << "sechs:  " << augenzahl[6] << std::endl;
  std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  std::cout << std::endl << "Das Programm wurde erfolgreich ausgefuehrt.";
  getchar();
}
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Wuerfeln

Beitrag von Dirty Oerti » Mi Jan 06, 2010 8:09 pm

Hmpf :|

Und warum brauchst du nun 7 Speicherplätze, obwohl eigentlich nur 6 notwendig wären? Das ist nicht gerade sinnvoll.
Deswegen schau dir doch bitte meinen Beitrag noch einmal an (der mit den ganzen Erklärungen).

Wenn du deine Schleife nur leicht veränderst, dann hast du kein Problem mehr ?
int augenzahl[6] = {0,0,0,0,0,0};
// ...
while (anzahl > a)
{
// augen = rand () % 6 + 1;
augen = rand() % 6; // Nun bekommst du Zahlen zwischen 0 und 5
augenzahl[augen]++;
std::cin.clear(); // WOZU das?
a++;
}
std::cout << "eins: " << augenzahl[0] << std::endl;
// ...
std::cout << "sechs: " << augenzahl[5] << std::endl;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // WOZU das?
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Wuerfeln

Beitrag von naums » Do Jan 07, 2010 1:51 pm

ich hab auch so kein Problem. Das funktioniert ganz gut. Okay, dass ein ungenutzter Platz ist, ist doch egal. Das merkt der Nutzer überhaupt ne.
.globl truth
truth:
mov r0, #42
mov pc, lr

Antworten