3 svar
104 visningar
Schwartz 42
Postad: 29 jan 15:15

Programmering 1 förhindra felinmatning

Hej. Håller på med en uppgift i kursen programmering 1 och har löst själva uppgiften, men skulle också vilja se till att programmet inte buggar om man matar in en bokstav istället för en siffra. Lägger upp koden jag gjort, och programmet funkar som sagt, om man fyller i tal men fyller man i en bokstav eller liknande buggar hela programmet ur o kör en oändlig loop. Försökt få till det med if satser o så, men får det inte att fungera. Jag ska skapa ett spel där jag får gissa på ett tal mellan 1 till 100 som datorn slumpat fram. Är relativt ny på det här med programmering, så enkla lösningar uppskattas, eller hur jag ska få fram lösningen om ni inte vill skriva ut den. 

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
	srand(time(0));
	int antalGgr = 1;
	int gissatTal;
	int talet = rand() % 100 + 1;
	cout << "Välkommen till gissa talet! Du får gissa på ett tal mellan 1 till 100.\n";

	while (true)
	{

		cout << "Gissa talet: ";
		cin >> gissatTal;

		if (gissatTal == talet)		
		{
			cout << "Grattis, du gissade rätt!\n";
			cout << "Det tog " << antalGgr << " gissningar. \n";
			break;
		}

		while (gissatTal != talet)
		{
			if (gissatTal > talet)
			{
				cout << "Du gissade fel, talet är mindre. \n";
				antalGgr++;
				break;
			}
			else if (gissatTal < talet)
			{
				cout << "Du gissade fel, talet är större. \n";
				antalGgr++;
				break;
			}

		}
	}
	
}
mekatronik 625
Postad: 29 jan 20:48

Hej,

 

Känner du till cin.fail() i C++? Man kan göra en if sats som kollar varje inmatning, C++ är väldigt öppet språk så jag skriver hur jag själv hade lagt upp funktionen (men du kan såklart göra som du själv vill):

        if (cin.fail())
        {
            cin.clear(); // Rensar inmatningsbufferten
            cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Ignorerar felaktig inmatning till nästa nylinje
            cout << "Felaktig inmatning. Vänligen mata in ett tal.\n";
            continue; // Fortsätter till nästa iteration av loopen
        }
Laguna Online 30712
Postad: 30 jan 16:54

Ett alternativ som gör att man har mycket bättre kontroll över inmatningsprocessen är att läsa in en hel rad och sedan plocka det man vill ha från den raden. Då blir det inte saker liggande kvar i inmatningsbufferten.

Schwartz 42
Postad: 30 jan 18:02

Tack för hjälpen! Valde ditt sätt mekatronik o fick det att fungera. Tack snälla! 😃

Svara
Close