Seite 1 von 3

Wuerfeln

Verfasst: Di Jan 05, 2010 6:32 pm
von naums
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?

Re: Wuerfeln

Verfasst: Di Jan 05, 2010 6:48 pm
von nufan
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.

Re: Wuerfeln

Verfasst: Di Jan 05, 2010 7:38 pm
von naums
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;

Re: Wuerfeln

Verfasst: Di Jan 05, 2010 7:56 pm
von +Fuss+
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.

Re: Wuerfeln

Verfasst: Di Jan 05, 2010 8:16 pm
von naums
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.)

Re: Wuerfeln

Verfasst: Di Jan 05, 2010 8:28 pm
von cloidnerux
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.

Re: Wuerfeln

Verfasst: Di Jan 05, 2010 8:29 pm
von hofian
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.

Re: Wuerfeln

Verfasst: Di Jan 05, 2010 8:32 pm
von naums
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.

Re: Wuerfeln

Verfasst: Di Jan 05, 2010 8:34 pm
von nufan
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.

Re: Wuerfeln

Verfasst: Di Jan 05, 2010 8:37 pm
von naums
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. ^^