checken voor nummers.

Status
Niet open voor verdere reacties.

Biirra

Gebruiker
Lid geworden
25 dec 2009
Berichten
26
[CPP]// overloaded functions

#include <iostream>
#include <string>

using namespace std;

int numb;

int askNumber(int highNumb, int lowNumb=1);

int main()
{

if(numb == int) // hoe check ik hier of wat er in is gevuld een nummer is
askNumber(10);
else
cout << "you didnt press a number";

cin.ignore(cin.rdbuf()->in_avail()+2);
return 0;
}

int askNumber(int highNumb, int lowNumb)
{

do
{
cout << "enter your number between (" << lowNumb << "-" << highNumb << ")\n";
cin >> numb;
cout << "you entered the number " << numb << endl;
}while((numb < lowNumb)||(numb > highNumb));
}[/CPP]

ik probeer dit programmatje te laten werken, maar krijg dat kleine if statementje maar nie aant werk, ik moet het volges mij met iets linken maar kan maar niks bedenken waarmee.

de bedoeling is dat als de input geen cijfer is dat de persoon dan de tekst van foute input krijgt

als het kan zou ik er ook graag uitleg bij wille zodat ik ervan kan leren.
 
Voor zover ik weet bestaat zoiets niet. Sowieso heeft "numb" als type "integer", dus is zo'n controle zinloos. Bovendien klopt de volgorde in je programma niet.
Eerst controleer je of "numb" (wat nog niet ingevuld is) een integer is.
Dan vraag je om invoer. In die functie ga je ervan uit dat de invoer een getal is.

Wat is zou doen is het volgende:
haal "int numb;" weg (probeer om geen globale variabelen te gebruiken, bij kleine programma's is het nog te overzien maar bij grote programma's verlies je al snel het overzicht en ga je globale en lokale variabelen door elkaar halen).
Maak een nieuwe functie:
[cpp]bool isNumber(string str)
{
bool is_number = true;
for (int i=0;i<str.length();i++)
{
if (str < '0' || str > '9')
{
is_number = false;
break;
}
}
return is_number;
}[/cpp]
Maak in "askNumber" een tijdelijke string variabele aan en laat de invoer daar naartoe schrijven. Controleer met isNumber of het een getal is.
[cpp]while((numb < lowNumb)||(numb > highNumb));[/cpp]
kan je vervangen door
[cpp]while((atoi(numb.c_str()) < lowNumb)||(atoi(numb.c_str()) > highNumb));[/cpp]
Dat zet de string "numb" om in een integer (het kan overigens zijn dat je "cstdlib" moet "includen" om over "atoi" te kunnen beschikken) (uitleg over deze functies kan je vinden op c_str en atoi).
Ook moet "askNumber" integer opleveren, dus zet aan het einde van die functie:
[cpp]return atoi(numb.c_str());[/cpp]
Vervang vervolgens de aanroep [cpp]askNumber(10);[/cpp] door [cpp]int numb = askNumber(10);[/cpp]
 
Laatst bewerkt:
De functie isdigit() is wat je zoekt. Het enige probleem is dat deze voor slechts 1 karakter geschikt is in plaats van voor een complete string. Dus hier moet je doorheen lopen:

[cpp]
#include <cctype>
#include <string>
#include <iostream>

using namespace std;

bool isNumber(string in) {
for (size_t i = 0; i < in.size(); ++i)
if (!isdigit(in)) // per karakter bekijken of het een nummer is
return false;
return true;
}

int main() {
string input = "";
getline (cin, input); // haal input op en bewaar in "input"
if (!isNumber(input)) //roep functie aan
cout << "Dat was geen nummer!";
else
cout << "Dat was wel een nummer!";
}[/cpp]

Nu werkt dit op zich al wel aardig, maar je wilt natuurlijk ook graag weer van een string naar een integer zodat je er verekeningen op los kunt laten :)
Ziehier een complete functie die checkt of het een integer is en hem dan direct omzet. Waarschijnlijk is dit nog wel boven je niveau, maar ik wou hem er voor de compleetheid toch even bijzetten. Vraag gerust wat je niet snapt! :

[cpp]
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

bool toNumber(std::string input, int * output) {
*output = 0;
stringstream sstr(input); // input ineens in de stream laden
if ((sstr >> *output).fail()) // probeer om te zetten en controleer of dit lukt
return false;

return true;
}


int main() {
string input = "";
int nummer = 0;
getline(cin, input); // haal input op en bewaar in "input"
if (!toNumber(input, &nummer)) //roep functie aan met referentie naar output
cout << "Dat was geen nummer!";
else
cout << "Nummer omgezet : " << nummer;
}[/cpp]

[edit]
Ps: de woorden die onderlijnt zijn in de code kun je aanklikken voor uitgebreide info!
 
Laatst bewerkt:
bedank supersnail, dat komt wel ongeveer neer op wat ik zoek, alleen snap ik dat atoi en c_str nog niet, miss word het later in me tut nog uitgelegd, ik snap de c++ reference in iedergeval totaal niet :P weet nie waar het nuttig voor kan zijn en waar het precies voor gebruikt word dus moeilijk een voorstelling bij te hebbe.



niek_e jij ook bedankt voor de hulp maar das egt super hocus pocus voor mij, ik vroeg me trouwes af of dat wel rigting game development is of gewoon puur programeer taal ? want ik doe het eerste,

heel erg bedankt, sluit deze vraag nog nie af als beantwoord, omdat ik tog heel benieuwd ben of ik uitleg kan krijgen over de aitoi en c_str.
 
Het is niet zo ingewikkeld. "c_str" "maakt" van een string een C-string (char array). "atoi" krijgt een C-string binnen met alleen getallen en maakt daar een int van met het zelfde getal.

[cpp]char blaat[] = "123";
int blaat2 = atoi(blaat);[/cpp]
"blaat" is een C-string en je kan hier dus niet mee rekenen. "blaat2" is een int en je kan hier dus wel mee rekenen.
 
Je zou ook gewoon kunnen controleren of het invoeren van de waardes gelukt is.

[cpp]
int askNumber(const int lowNumb, const int highNumb)
{
int retValue = 0;
for (;;)
{
std::cout << "Enter your number between (" << lowNumb << " - " << highNumb << ")\n";
if (std::cin >> retValue)
{
if (retValue >= lowNumb && retValue <= highNumb)
break;
}
else
{
std::cin.clear();
std::cin.ignore(INT_MAX, '\n');
std::cerr << "You didn't press a number!\n";
}
}
return retValue;
}[/cpp]

En voor de methode die niek_e liet zien hoef je niet per se een functie te gebruiken, je zou het ook korter kunnen schrijven in een if-statement. (al is de functie wel wat leesbaarder)

[cpp]
if (!(stringstream(input) >> nummer).fail())
std::cout << "Nummer omgezet: " << nummer;
[/cpp]
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan