Wuerfeln

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Wuerfeln

Beitrag von naums » Di Jan 05, 2010 6:32 pm

Fehlerhafte Ausgabe von Integer Werten. Also um es genau zu machen: folgender Code: [Auszug]

Code: Alles auswählen

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


int main ()
{
  double augen, anzahl;
  int augenzahl[6]={0,0,0,0,0,0};
  srand ( time(NULL) );
  std::cin >> anzahl;
  std::cout << std::endl;

  int a;
  while (anzahl > a)
  {
    augen = rand();
    a+=1;
    std::cout << augen;
    getchar();
  }
}

//...
Der Code müsste ausführbar sein. Theorie ist, dass erst ein Wert mithilfe von rand genereriert wird, und dann der Wert ausgeben wird. die Ausgabe ist tatsächlich sowas wie: 1.08572e+09

Auch wenn ich als ANZAHL 12 eingebe werden deutlich mehr als nur 12 Werte ausgeben. Was ist hier falsch?
.globl truth
truth:
mov r0, #42
mov pc, lr

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Wuerfeln

Beitrag von nufan » Di Jan 05, 2010 6:48 pm

naums hat geschrieben:

Code: Alles auswählen

#include <time.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
Wenn du in C++ programmierst, sollten die C-Includes ein 'c' am Anfang und kein '.h' am Ende haben, also:

Code: Alles auswählen

#include <ctime>
#include <iostream>
#include <cstdlib>
#include <cstdio>
naums hat geschrieben:

Code: Alles auswählen

double augen, anzahl;
Wozu gleich double? rand () liefert sowieso nur ein int zurück. Und ich glaube kaum, dass du ein double für die Anzahl brauchst.
naums hat geschrieben:

Code: Alles auswählen

  int a;
  while (anzahl > a)
Wenn zwei solche Zeilen hintereinander stehen kann nichts gutes raus kommen... 'a' hat nämlich keinen Wert zugewiesen bekommen. D.h. du weißt nicht wie oft die Schleife durchlaufen wird.
naums hat geschrieben:

Code: Alles auswählen

    augen = rand();
Weiß nicht ob das so gewollt ist, jedenfalls kannst du den Wertebereich mit dem Modulo-Operator (%) einschränken. Z.B. für Werte von 1 bis 6:

Code: Alles auswählen

augen = rand () % 6 + 1;
Sonst fällt mir nichts wirklich falsches auf.

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

Re: Wuerfeln

Beitrag von naums » Di Jan 05, 2010 7:38 pm

naums hat geschrieben:

Code: Alles auswählen
int a;
while (anzahl > a)


Wenn zwei solche Zeilen hintereinander stehen kann nichts gutes raus kommen... 'a' hat nämlich keinen Wert zugewiesen bekommen. D.h. du weißt nicht wie oft die Schleife durchlaufen wird.
Wenn du mal danach schaust. in der Schleife steht a+=1;
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: Wuerfeln

Beitrag von +Fuss+ » Di Jan 05, 2010 7:56 pm

naums hat geschrieben: Wenn du mal danach schaust. in der Schleife steht a+=1;
+

Da wird nur der Wert von a erhöht, a hat aber keinen bestimmten Wert zugewiesen bekommen. Es würde eventuell helfen "int a = 0;" anstatt "int a;" zu schreiben, dann weißt du das a am Anfang 0 ist und dann pro Durchgang um eins erhöht wird.

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

Re: Wuerfeln

Beitrag von naums » Di Jan 05, 2010 8:16 pm

okay. es geht. Aber warum tanzt der erste Wert aus der Reihe? Der erste Wert ist (zum Beispiel 51) zu hoch. Damit löst er einen Fehler im Programm aus (also das Programm wird beendet, weil ich das so einprogrammiert hab.)
.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 » Di Jan 05, 2010 8:28 pm

Aber warum tanzt der erste Wert aus der Reihe? Der erste Wert ist (zum Beispiel 51) zu hoch. Damit löst er einen Fehler im Programm aus (also das Programm wird beendet, weil ich das so einprogrammiert hab.)
Eventuell liegt es daran, das du rand() nicht gesagt hast, in welchem Wertebereich die Zahlen liegen sollen.
Dazu solltest du die Methode von dani93 nehmen:

Code: Alles auswählen

augen = rand () % 6 + 1;
Damit werden nur Zahlen im Bereich von 1-6 ausgegeben.
Redundanz macht wiederholen unnötig.
quod erat expectandum

hofian
Beiträge: 62
Registriert: Do Sep 24, 2009 6:59 pm

Re: Wuerfeln

Beitrag von hofian » Di Jan 05, 2010 8:29 pm

naums hat geschrieben:Der erste Wert ist (zum Beispiel 51) zu hoch.
Das sind zwei Zahlen (5 und 1), jedoch funktioniert getchar() beim ersten Durchlauf der Schleife nicht.
Du musst vorher noch den Eingabepuffer leeren, dazu gibt es einen Eintrag im FAQ.

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

Re: Wuerfeln

Beitrag von naums » Di Jan 05, 2010 8:32 pm

okay oder ich lass den ersten Druchlauf aus, und füge einen Hinzu... So umgehe ich den Fehler und bin trotzdem bei eine akuraten Anzahl an druchläufen.

Jetzt gibt es aber ein anderes Problem, das ist der fertige Source 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[6]={0,0,0,0,0,0};
  srand ( time(NULL) );
  std::cout << "Wie oft soll gewuerfelt werden?" << std::endl;
  std::cin >> anzahl;
  anzahl++;

  int a = 0;
  while (anzahl >= a)
  {
    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);
        }
    }
    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;

  std::cout << "Das Programm wurde erfolgreich ausgeführt.";
  return 0;
}
Alle Zahlen werden korrekt angegeben, außer die sechs! Beispiel: bei Anzahl=100 wurde mit angezeigt: "sechs: 102" - das kann ja nicht sein. ich bin ratlos.
.globl truth
truth:
mov r0, #42
mov pc, lr

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Wuerfeln

Beitrag von nufan » Di Jan 05, 2010 8:34 pm

Das liegt daran, dass ein Array bei 0 zu zählen beginnt. Entsprechend ist dein erstes Element augenzahl[0] und das letzte augenzahl[5].
Ich kann mir trotzdem nicht vorstellen, dass das funktioniert, da du eine Zufallszahl als Index verwendest.
Zuletzt geändert von nufan am Di Jan 05, 2010 8:38 pm, insgesamt 1-mal geändert.

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

Re: Wuerfeln

Beitrag von naums » Di Jan 05, 2010 8:37 pm

okay. Augenzahl [7]. jetzt gehts. Wenn ich meine HP fertig hab, lade ich das Projekt samt Sourcecode hoch. Für diejenigen die was lernen wollen. ^^
.globl truth
truth:
mov r0, #42
mov pc, lr

Antworten