webForumDet fria alternativet

svårt problem!

11 svar · 337 visningar · startad av Frexuz

FrexuzMedlem sedan maj 2003138 inlägg
#1
void kontroll(char bokstav, char korrektOrd[], char spelarOrd[], int& antalGissningar, int& antalFel, bool gissning, char felGissningar[])
{
	system("cls");
	bool finnsBokstav = false;
	
	for (int i = 0; spelarOrd[i] != tecken; i++)
	{
		if (bokstav == spelarOrd[i])
		{
			finnsBokstav = true;
			gissning = true;
		}
		else
		{
			finnsBokstav = false;
			gissning = false;
			break;
		}
	}

	if (finnsBokstav == false)
	{
		for (int i = 0; i < len; i++)
		{
			if (bokstav == korrektOrd[i])
			{
				spelarOrd[i] = bokstav;
				gissning = true;
				antalGissningar = antalGissningar + 1;
				break;
			}
		}	
	}
				
	if(gissning == false)
	{		
		bool finnsBokstav = false;

		for (int i = 0; felGissningar[i] != '\0'; i++)
		{
			
			if (felGissningar[i] == bokstav)
			{
				finnsBokstav = true;
				break;
			}
		}

		if (finnsBokstav == false)
		{
			felGissningar[i] = bokstav;
			antalFel = antalFel + 1;
			antalGissningar = antalGissningar + 1;
			skrivGubbe(antalFel);
			cout << "FEL!\n\n";
		}
		else
		{
			skrivGubbe(antalFel);
			cout << "FEL!\n\n";
		}
	}
	else
	{
		skrivGubbe(antalFel);
		cout << "R\x8ETT!\n\n";
	}

	skrivFelGissningar(felGissningar);
	skrivGissningar(antalGissningar, antalFel);
}

först vill jag kolla om bokstav finns i spelarOrd, finns inte bokstav där redan så vill jag att antalGissningar +1

samma sak sen, kolla om bokstav finns i felGissningar, finns den inte där ska antalGissningar +1

men det fungerar inte direkt, utan den plussar varje gång.

HELA KODEN HÄR: http://rafb.net/paste/results/Zu375262.html

PS: Programmet är en uppgift i programmering kurs-A, så inga avanderade koder osv. Bara försök göra om min så lite som möjligt bara så det blir rätt och funkar.

PeWMedlem sedan juni 200010 432 inlägg
#2

Eftersom det är en skoluppgift tänker jag inte servera lösningen. Men tänk igenom vad du egentligen gör med din kod. Kör funktionen på 'pappret' och se vad som händer* med dina flaggor när du gått ur den första loopen och backa sen till vad som fått tillståndet att se ut som det gör så har du där lösningen mitt framför ögonen :)

* Utgå från att varje bokstav är fel och att undantaget är om det blir rätt bokstav så ser du att det finns ett logiskt fel med din kod

FrexuzMedlem sedan maj 2003138 inlägg
#3

uppgiften har inte ngt med skolan att göra. menar bara att jag har A-kurs boken, och därför inte vill ha en svårare kod som jag inte förstår mig på

PeWMedlem sedan juni 200010 432 inlägg
#4

Okej. Men i all programmering gäller det att avlusa mot alla upptänkliga fel. Logiska lustigheter finns det ingen annan råd till än att gå igenom flödet / händelseförloppet och i såna här fall räcker det gott med papper och penna.

I ditt fall är det enkelt och det handlar om att byta plats på ett nyckelord... och jag tror att du är mer hjälpt av att hitta felet själv än att jag skriver det i klarttext ;)

FrexuzMedlem sedan maj 2003138 inlägg
#5

seriöst , jag hittar verkligen inte det :D
satt 2 timmar igår natt

säg bara :D sen e programmet klart och jag kan med nöje börja på kurs-B boken

PeWMedlem sedan juni 200010 432 inlägg
#6

Jaja.. i din första loop så vill du tydligen traversera ordet. För varje bokstav så kollar du om bokstaven är lika med en speciell bokstav.

- Om det är lika vad händer då?
- Om det inte är lika vad händer då?

Om du istället för att ha villkoret "spelarOrd != tecken" anger i<strängens längd och nyttjar ditt 'break' på om det är rätt bokstav istället för om det är fel bokstav. Som det är nu kommer du inte långt i loopen... om första är fel avbryts sökningen. Om första är rätt avbryts sökningen men flaggan förblir false.

FrexuzMedlem sedan maj 2003138 inlägg
#7
	for (int i = 0; i < len; i++)
	{
		if (bokstav == spelarOrd[i])
		{
			finnsBokstav = true;
			gissning = true;
		}
	}

så skulle det vara :D
tack så mycket PeW

PeWMedlem sedan juni 200010 432 inlägg
#8

Tjusigt..

För att slippa traversera hela ordet vid tidig träff kan du lägga in ett break, sist i if-satsen. :)

*samt markera svaret som slutgiltig lösning om du anser det :)

FrexuzMedlem sedan maj 2003138 inlägg
#9

men moget.... nu har jag ett annat fel :(

för varje NY bokstav du gissar FEL på, blir Gissningar + 2 ...
sen gissar jag på den bokstaven igen så plussar den med 1

kan du inte bara skriva koden så jag får det överstökat :(
jag blir bara cp av att själv titta på koden, har gjort d hela helgen nu

PeWMedlem sedan juni 200010 432 inlägg
#10

Mjae.. ingen kod, men ett tips:

Lägg inte uppräkningen av antalet gissningar i varje loop, lägg den globalt EN gång i funktionen istället... (för visst är det väl så att varje gång funktionen körs så har det skett en gissning?) som det är nu finns det risk för lustiga sido-effekter..

Och så var det det där med papper och penna (*visslar försynt) ;)

FrexuzMedlem sedan maj 2003138 inlägg
#11

va du är envis :D

PeWMedlem sedan juni 200010 432 inlägg
#12

Jag vet inte vad du gör för fel men följande funkar med antal gissningar o.s.v, ivf när jag testar den <kompilerat med g++> samt resten av koden som fanns på den länken du angav

void kontroll(char bokstav, char korrektOrd[], char spelarOrd[], int& antalGissningar, int& antalFel, bool gissning, char felGissningar[])
{
	system("cls");
	bool finnsBokstav = false;
	int i;
	for (i = 0; i<strlen(spelarOrd); i++)
	{
		if (bokstav == spelarOrd[i])
		{
			finnsBokstav = true;
			gissning = true;
                        break;
		}
	
	}

	if (finnsBokstav == false)
	{
		for (i = 0; i < len; i++)
		{
			if (bokstav == korrektOrd[i])
			{
				spelarOrd[i] = bokstav;
				gissning = true;
				antalGissningar = antalGissningar + 1;
				break;
			}
		}	
	}
				
	if(gissning == false)
	{		
		bool finnsBokstav = false;

		for (i = 0; felGissningar[i] != '\0'; i++)
		{
			
			if (felGissningar[i] == bokstav)
			{
				finnsBokstav = true;
				break;
			}
		}

		if (finnsBokstav == false)
		{
			felGissningar[i] = bokstav;
			antalFel = antalFel + 1;
			antalGissningar = antalGissningar + 1;
			skrivGubbe(antalFel);
			cout << "FEL!\n\n";
		}
		else
		{
			skrivGubbe(antalFel);
			cout << "FEL!\n\n";
		}
	}
	else
	{
		skrivGubbe(antalFel);
		cout << "R\x8ETT!\n\n";
	}

	skrivFelGissningar(felGissningar);
	skrivGissningar(antalGissningar, antalFel);
}

(!) Det där "len" gäller det korrekta ordet, så kör med strlen(ordet) istället för att få aktuell längd. Annars kanske du läser in data som inte har med ordet att göra.

134 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)