Floating point exception

Status
Niet open voor verdere reacties.

nicocarraggi

Nieuwe gebruiker
Lid geworden
15 nov 2010
Berichten
2
Hallo,

Ik ben aan het werken voor een taak van c++. Ik moet dobbelstenen implementeren in c++ en dat lukt wel als ik een klein programma'tje had gemaakt om te testen met 2 dobbelstenen van 6 zijden:

Code:
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <vector>
using namespace std;

vector<int> tabel (11, 0);
vector<int>::iterator it;
int aantaldob(2);
	int zijden(6);
	int mogelijkheden(36);

	int throwdice()
	{
		int result(random() % zijden + 1);
		// cout << result << endl;
		return result;
	}

	int throwdices()
	{
		int result(0);
		for (int i = 0; (i < aantaldob); ++i)
		result += throwdice();
		// cout << "---- +" << endl;
		// cout << result << endl;
		return result;
	}
	
	int addtox(int x)
	{
		tabel.at((x-2))+= 1;
	}

	int fillvector()
	{
		for (int ctr(0);ctr<36000;ctr++)
			addtox(throwdices());	
	}


int drawstars(int x)
{
	cout << "|";
	for (int ctr(0);ctr<x;ctr++)
	cout << "*";
}

int main()
{

	//cout.precision(2);
	
	//for (int ctr=0; ctr<11; ctr++)
	//	tabel.at(ctr)=(ctr+2);

	cout << "my vector contains: " << endl;

	int ctr(2);

	// for (it=tabel.begin(); it<tabel.end(); it++)
	//{
	//cout << ctr << ": " << *it << endl;
	//ctr++;
	//}	
		
	fillvector();

	cout << endl;	

	for (it=tabel.begin(); it<tabel.end(); it++)
	{
	int res = (*it / 360);
	cout.width(2);
	cout << ctr;
	cout << ": ( ";
	cout.width(2);
	cout << res;
	cout << "% ) " ;
	cout.width(2);
	drawstars(res);
	cout << endl;	
	ctr++;
	}
		
	return 0;
}

output :
----------------------------------------------------------------
Nicolas-Carraggis-MacBook-Pro:test nicolascarraggi$ ls
Makefile test.cc
Nicolas-Carraggis-MacBook-Pro:test nicolascarraggi$ make
g++ -c -o test.o test.cc
g++ -o program test.o
Nicolas-Carraggis-MacBook-Pro:test nicolascarraggi$ ./program
my vector contains:

2: ( 2% ) |**
3: ( 5% ) |*****
4: ( 8% ) |********
5: ( 11% ) |***********
6: ( 13% ) |*************
7: ( 16% ) |****************
8: ( 13% ) |*************
9: ( 11% ) |***********
10: ( 8% ) |********
11: ( 5% ) |*****
12: ( 2% ) |**
---------------------------------------------------------

Nu wil ik dit veralgemenen voor x aantal dobbelstenen en y aantal zijden :

dice.cc:

Code:
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <iostream>

using namespace std;

int aantaldob;
int zijden;
int mogelijkheden;

vector<int> tabel (100, 0);
vector<int>::iterator it;


int throwdice()
{
	int result(random() % zijden + 1);
	return result;
}

int throwdices()
{
	int result(0);
	for (int i = 0; (i < aantaldob); ++i)
	result += throwdice();
	return result;
}

int teltotaal(int ctr)
{	
	if (ctr > 1)
	{
		mogelijkheden *= zijden;
		return teltotaal((ctr - 1));
	}
	else mogelijkheden *= zijden;
}

int addtox(int x)
{
	tabel.at((x-2))+= 1;
}


int vultabel()
{
	for (int ctr(0);ctr<(mogelijkheden*1000);ctr++)
	addtox(throwdices());
}

int drawstars(int x)
{
	cout << "|";
	for (int ctr(0);ctr<x;ctr++)
	cout << "*";
}

int toonresultaat()
{
	int ctr(2);

	for (it=tabel.begin(); it<tabel.end(); it++)
	{
	int res = (*it / (mogelijkheden*10));
	cout.width(2);
	cout << ctr;
	cout << ": ( ";
	cout.width(2);
	cout << res;
	cout << "% ) " ;
	cout.width(2);
	drawstars(res);
	cout << endl;	
	ctr++;
	}

	return 0;
}

int ask_dice()
{
	cout << "Aantal zijden dobbelsteen:" << endl;                  
	cin >> zijden;
	cout << endl;
	cout << "Aantal dobbelstenen:" << endl;
	cin >> aantaldob;
	srandom(time(0));
	teltotaal(aantaldob);
	vultabel();
	toonresultaat();
	cout << endl;
	return 0;
}

main.cc :

Code:
#include <iostream>
#include "dobkans.h"
#include "dice.h"

using namespace std;

int main()
{
	cout << "Teeeeest main" << endl;
	cout << endl;
	// return ask_dob();
	return ask_dice();
}

output :
----------------------------------------------------------------
Nicolas-Carraggis-MacBook-Pro:taak2-ncarragg nicolascarraggi$ ls
Makefile dice.h dobkans.h test
dice.cc dobkans.cc main.cc
Nicolas-Carraggis-MacBook-Pro:taak2-ncarragg nicolascarraggi$ make
g++ -c -o main.o main.cc
g++ -c -o dice.o dice.cc
g++ -o program main.o dice.o
Nicolas-Carraggis-MacBook-Pro:taak2-ncarragg nicolascarraggi$ ./program
Teeeeest main

Aantal zijden dobbelsteen:
6

Aantal dobbelstenen:
2
Floating point exception
---------------------------------------------------------

Ik weet dat dit misschien niet de beste manier is om dit te implementeren maar ik ben c++ aan het leren. Kan iemand mij zeggen waar de fout vandaan komt?

Alvast bedankt,
Nicolas
 
Het implementeren van een dobbelsteen kan veel eenvoudiger hoor (maar dat leer je nog wel):

[cpp]
#include <ctime>
#include <windows.h>

class Dobbelsteen {
int aantal_zijden;
public:
Dobbelsteen(const int _aantal_zijden) : aantal_zijden(_aantal_zijden) { std::srand(GetTickCount()); }
int Werp() const { return std::rand()%aantal_zijden+1; }
};
// ...
Dobbelsteen dobbelsteen(6);
int waarde = dobbelsteen.Werp();
[/cpp]

(ik heb nog niet gekeken wat de fout in je huidige code is, dat doe ik straks na het sporten wel even)
 
Laatst bewerkt:
Danku CoD_NL voor je reactie, ik heb ondertussen de les van classes gehad. Ik zal proberen het op jouw manier te implementeren maar ik moet in feite enkel een dobbelsteen gooien dus enkel een random functie gebruiken.

Voor mijn probleem omtrent de Floating point exception, zoals alle fouten, het was iets zeer dom. Ik had namelijk 3 variabelen gedefiniëerd:

int aantaldob;
int zijden;
int mogelijkheden;

Aantaldob en zijden krijgen een waarde via cin en mogelijkheden krijgt een waarde via een functie die dus het aantal combinaties van dobbelstenen berekent en hier was de fout.

Die functie bestaat simpelweg uit een for lus die bij elke stap mogelijkheden *= zijden doet.

Omdat ik int mogelijkheden zonder waarde heb gedefinieerd heeft hij geen waarde om te vermenigvuldigen en dus vandaar de fout.

Dus simpelweg:

int mogelijkheden(1);

OPGELOST !!!
 
Danku CoD_NL voor je reactie, ik heb ondertussen de les van classes gehad. Ik zal proberen het op jouw manier te implementeren maar ik moet in feite enkel een dobbelsteen gooien dus enkel een random functie gebruiken.

Ja, en je gooit een dobbelsteen door het aanroepen van de method Werp, welke de waarde retour geeft. Op deze manier is het ook makkelijker om meerdere dobbelstenen te gebruiken:

[cpp]
Dobbelsteen d1(6), d2(6), d3(6);
// ...
[/cpp]

Al zou je uiteraard ook gewoon een functie kunnen schrijven:

[cpp]
int Werp(const int aantal_zijden) { return std::rand()%aantal_zijden+1; }
[/cpp]

edit:

[cpp]
int teltotaal(int ctr)
{
if (ctr > 1)
{
mogelijkheden *= zijden;
return teltotaal((ctr - 1));
}
else mogelijkheden *= zijden;
}
[/cpp]

Je hebt alle functies (zoals de bovenstaande) van het type int gemaakt, terwijl ze niet allemaal een waarde returnen of horen te returnen. Indien je een functie alleen nodig hebt voor zijn actie dan maak je er een void van.
 
Laatst bewerkt:
Is het nodig om een aantal op te geven in de Dobbelsteen constructor? Een dobbelsteen heeft toch altijd 6 zijden?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan