probleem met setfill

Status
Niet open voor verdere reacties.

Amintah

Nieuwe gebruiker
Lid geworden
20 dec 2008
Berichten
2
Hey !

Ik ben hier net nieuw, maar om het in het kort te zeggen, ik ben een studente 1ste jaar Informatica. Nu hebben wij op school dus c++. En gisteren bij het werkcollege hebben we een oefening gekregen waar ik niet meer aan uit geraak. Toch het einde niet.
Laat ik wel even zeggen, het is de eerste keer dat ik ergens echt niet aan uit geraak.
Dit was de opdracht:
Code:
Oefening 4
Men gooit een muntje omhoog en éénmaal gevallen en in rust geeft de bovenzijde ons
"kop" of "letter" te zien (we sluiten het uitzonderlijke geval uit dat het op de zijkant
kan blijven staan). Er wordt nu gevraagd om deze situatie "kop" of "letter" na te
bootsen.
We stellen daarbij "kop" door de waarde 1 voor en "letter" door de waarde 0. We
simuleren nu 100 worpen door 100 toevalswaarden 0 en 1 te genereren. Bij wijze van
controle laten we ze ook uitschrijven, 10 waarden per lijn.
Laat uw programma uitzoeken (en daarna ook uitschrijven) wat de langste reeks
gelijke worpen was; vermeld erbij of het daarbij om “kop” dan wel “letter” ging; geef
ook de plaats aan vanaf waar dit maximum zich voordeed. Enkel het 1e voorkomen
van dit maximum wordt gevraagd (want er kunnen zich meerdere gelijke maxima
voordoen).
Voorbeelduitvoer: (langste reeks uitgevuld(#) gedrukt)
100 worpen :
1 1 0 1 1 1 0 0###1###1
###1###1 0 0 0 1 0 0 1 0
1 1 0 1 1 0 0 1 1 0
0 1 1 1 1 0 0 0 1 0
1 1 0 0 0 1 0 0 1 0
1 1 0 1 1 0 1 0 1 0
0 1 1 0 1 1 0 1 0 1
1 0 1 0 0 0 1 0 1 1
0 1 0 0 1 0 1 0 1 1
0 0 0 1 0 1 1 0 0 1
Langste reeks gelijke worpen = 4 x kop
en kwam (1e maal) voor vanaf plaats 9
(de layout klopt niet helemaal van de voorbeeld uitvoer, er is dus een setw(3) tussen ieder cijfer.


Nu heb ik dit reeds van code:
Code:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
using namespace std;

int main ()
{
	int worp[100]={0};
	int teller = 1, max = 0, maxPos;
	bool kop = true;
	srand(time(0));
	
	for(int i = 0; i < 100; i++)
	{
		worp[i]=rand()%2;
	}
	
	for (int i = 0; i < 99; i++)
	{
		if (worp[i] == worp[i+1])
		{
			teller++;
		}
		else 
		{
			if (teller > max)
			{
				max = teller;
				maxPos = i - teller + 1;
				kop = worp[i-1];
			}
			teller = 1;
		}
		
	}
	
	
	cout << "100 worpen: " << endl;
	for (int k=0; k<100; k++)
	{
		cout << setw(4) << worp[k];
		if ((k+1)%10 == 0)
			cout << endl;
	}
	cout << endl;
	
	cout << "Langste reeks gelijke worpen = " << max << "x ";
	if (kop)
		cout << "kop" << endl;
	else
		cout << "munt" << endl;
	
	cout << "en kwam 1e maal voor vanaf plaats " << maxPos+1;

	return 0;
}

Maar ik zit echt in de knoop voor die setfill te krijgen van ###..
Ik dacht met 3 forlussen te werken eigenlijk.
iets als:
for (int i = 0 ; i < maxPos ; i++)
{
uitschrijven
}
for (int i = maxPos; i < maxPos+teller-1 ; i++)
{
uitschrijven
}
for (int i = maxPos+teller-1 ; i < 100; i++)
{
uitschrijven
}

maar dat werkte niet ..

Is er iemand die mij kan helpen ?
 
Een tip: Dat kan ook zonder extra for-lussen. Je hebt immers de plaats en lengte van de langste reeks al berekend, die kun je binnen de huidige loop gebruiken. :)
 
ik vermoed dat het nu klopt.. Na heel wat gezoek ..
Bedankt voor je reactie ! Je hebt me goed op weg gezet door te zeggen dat die forlussen niet nodig waren !

Code:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
using namespace std;

int main ()
{
	int worp[100]={0};
	int teller = 1, max = 0, maxPos;
	bool kop = true;
	srand(time(0));
	
	for(int i = 0; i < 100; i++)
	{
		worp[i]=rand()%2;
	}
	
	for (int i = 0; i < 99; i++)
	{
		if (worp[i] == worp[i+1])
		{
			teller++;
		}
		else 
		{
			if (teller > max)
			{
				max = teller;
				maxPos = i - teller + 1;
				kop = worp[i-1];
			}
			teller = 1;
		}
		
	}
	
	
	cout << "100 worpen: " << endl;
	for (int k=0; k<100; k++)
	{
		if (k >= maxPos && k < maxPos+max)
		{
			cout << setfill('#');
		}
		else
		{
			cout << setfill(' ');
		}
		cout << setw(4) << worp[k];
		if ((k+1)%10 == 0)
			cout << endl;
	}
	cout << endl;
	
	cout << "Langste reeks gelijke worpen = " << max << "x ";
	if (kop)
		cout << "kop" << endl;
	else
		cout << "munt" << endl;
	
	cout << "en kwam 1e maal voor vanaf plaats " << maxPos+1;

	return 0;
}
 
Mooi :thumb:

Overigens is het voldoende om setfill eenmaal aan te roepen als je het fill-character wil veranderen. Bij setfill "onthoudt" de stream (cout) namelijk wat je hebt ingesteld. Nu wordt setfill 100 keer aangeroepen namelijk. :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan