d2jsp
Log InRegister
d2jsp Forums > Off-Topic > Computers & IT > Programming & Development > While(cin.fail)) > Help?
12Next
Add Reply New Topic New Poll
Member
Posts: 6,441
Joined: Jul 12 2008
Gold: 220.83
Mar 1 2014 02:52pm
#include <iostream>
#include <cmath>

using namespace std;

int main()
{

double answer; // given movement range
double damage_range = 254.34; // range of grenade
double grenade_explode = 3; // speed of master chief
double speed = 1.5; // movement speed of master chief
double canbackoff; // backed off amount
double can_damage; // variable denoting if commander chief is within blast range or not

cout << "Input how far from Commander Chief a grenade falls (yards): ";
cin >> answer;

while(cin.fail())
{
cout << "Error, invalid variable. Please input a number: " << endl;
cin.clear();
cin >> answer;
}

cout << "The damage radius of the grenade is " << damage_range << " yards.\n";

canbackoff = grenade_explode * speed;

cout << "The Commander Chief can back off " << canbackoff << " yards.\n";

can_damage = (grenade_explode * speed) + answer;

if (can_damage > damage_range)
{
cout << "Commander Chief will not get hurt." << endl;
}
else
{
cout << "Commander Chief will get hurt." << endl;
}

system("pause");
return 0;
}



So I'm working on a project with a loop in case of the wrong variable detected, eg. word instead of number, gets detected it should go back to cin >> answer
But I can't seem to get it to work. It's just stuck in a spam of wrong variable.
Any advice?
Member
Posts: 13,425
Joined: Sep 29 2007
Gold: 0.00
Warn: 20%
Mar 1 2014 02:56pm
The proper way to check if you have the right data would be to use the following:

Code
if (cin >> choice) {
// read succeeded
} else if (cin.bad()) {
// IO error
} else if (cin.eof()) {
// EOF reached (perhaps combined with a format problem)
} else {
// format problem
}


Although simply doing

Code
while(!(cin >> answer)) {
//wrong input
}


would suffice I would imagine.
Member
Posts: 6,441
Joined: Jul 12 2008
Gold: 220.83
Mar 1 2014 03:42pm
I'm disregarded if/else for cin atm because I need to set an error loop. If they enter apple and I need a number, I want it to reset back to cin >> answer; so they can input a number. But all I get atm is constant spamming of cout << "error blah blah" endl; cin.clear()) doesn't seem to be resetting it back for cin >> answer; or am I just not understanding you right abduct.
Member
Posts: 1,995
Joined: Jun 28 2006
Gold: 7.41
Mar 1 2014 04:57pm
Didn't we just have someone post about this last week?

Code
int d;
while(!(cin>>d))
{
std::cout<<"You did not enter an integer" << endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Member
Posts: 6,441
Joined: Jul 12 2008
Gold: 220.83
Mar 1 2014 10:39pm
Now I have this,

http://pastebin.com/06Fr7uNN

It works if the input isn't a number, but if the input is a number than it glitches for a few inputs.

This post was edited by Weird0ne on Mar 1 2014 10:41pm
Member
Posts: 1,995
Joined: Jun 28 2006
Gold: 7.41
Mar 1 2014 10:46pm
you dont need multiple cin >> answer statements. The single cin >> answer in the while loops condition is enough.
you could aslo do

Code
int d;
std::cin >> d;
while(std::cin.fail())
{
std::cout<<"You did not enter an integer" << endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin >> d;
}




edit: do you see why asking for code does not increase your understanding of the problem? You should have asked what cin.fail, cin.clear, and cin.ignore does. Maybe then you would have been able to avoid all of this.

This post was edited by Minkomonster on Mar 1 2014 10:53pm
Member
Posts: 6,441
Joined: Jul 12 2008
Gold: 220.83
Mar 1 2014 10:52pm
Quote (Minkomonster @ Mar 2 2014 12:46am)
you dont need multiple cin >> answer statements. The single cin >> answer in the while loops condition is enough.
you could aslo do

Code
int d;
std::cin >> d;
  while(std::cin.fail())
  {
        std::cout<<"You did not enter an integer" << endl;
          std::cin.clear();
          std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
          std::cin >> d;
    }


Code
#include <iostream>
#include <cmath>

using namespace std;

int main()
{

double answer; // given movement range
double damage_range = 254.34; // range of grenade
double grenade_explode = 3; // speed of master chief
double speed = 1.5; // movement speed of master chief
double canbackoff; // backed off amount
double can_damage; // variable denoting if commander chief is within blast range or not

cout << "Input how far from Commander Chief a grenade falls (yards): ";

while(!(cin >> answer)); // FUCKING FIGURE OUT WHY THIS SHIT IS BUGGING OUT FUCKING MANG -Tony
{
cout << "Error, invalid variable. Please input a number: ";
cin.clear();
cin.ignore(10000,'\n');
cin >> answer;
}

cout << "The damage radius of the grenade is " << damage_range << " yards.\n";

canbackoff = grenade_explode * speed;

cout << "The Commander Chief can back off " << canbackoff << " yards.\n";

can_damage = (grenade_explode * speed) + answer;

if (can_damage > damage_range)
{
cout << "Commander Chief will not get hurt." << endl;
}
else
{
cout << "Commander Chief will get hurt." << endl;
}

system("pause");
return 0;
}


If I enter a number in, that's wrong apparently now. A world/letter freezes it.
Member
Posts: 1,995
Joined: Jun 28 2006
Gold: 7.41
Mar 1 2014 10:54pm
You still have an extra cin >> answer inside the while loop block. Kid, are you even trying? Do you want me to write it for you? Stop just putting code blindly into your IDE. THINK about what you are doing, or else you are never going to learn.
Member
Posts: 6,441
Joined: Jul 12 2008
Gold: 220.83
Mar 1 2014 10:56pm
Quote (Minkomonster @ Mar 2 2014 12:54am)
You still have an extra cin >> answer inside the while loop block. Kid, are you even trying? Do you want me to write it for you? Stop just putting code blindly into your IDE. THINK about what you are doing, or else you are never going to learn.


I don't appreciate being called "Kid" but I am trying to learn.
I'm throwing the cin >> answer back into it because it won't work for me after compile + run for me if I don't.
Member
Posts: 1,995
Joined: Jun 28 2006
Gold: 7.41
Mar 1 2014 11:00pm
Code
#include <iostream>
#include <cmath>

using namespace std;

int main()
{

double answer; // given movement range
double damage_range = 254.34; // range of grenade
double grenade_explode = 3; // speed of master chief
double speed = 1.5; // movement speed of master chief
double canbackoff; // backed off amount
double can_damage; // variable denoting if commander chief is within blast range or not

cout << "Input how far from Commander Chief a grenade falls (yards): ";

while(!(cin >> answer)) // FUCKING FIGURE OUT WHY THIS SHIT IS BUGGING OUT FUCKING MANG -Tony
{
cout << "Error, invalid variable. Please input a number: ";
cin.clear();
cin.ignore(10000,'\n');

}

cout << "The damage radius of the grenade is " << damage_range << " yards.\n";

canbackoff = grenade_explode * speed;

cout << "The Commander Chief can back off " << canbackoff << " yards.\n";

can_damage = (grenade_explode * speed) + answer;

if (can_damage > damage_range)
{
cout << "Commander Chief will not get hurt." << endl;
}
else
{
cout << "Commander Chief will get hurt." << endl;
}

system("pause");
return 0;
}


or

Code
#include <iostream>
#include <cmath>

using namespace std;

int main()
{

double answer; // given movement range
double damage_range = 254.34; // range of grenade
double grenade_explode = 3; // speed of master chief
double speed = 1.5; // movement speed of master chief
double canbackoff; // backed off amount
double can_damage; // variable denoting if commander chief is within blast range or not

cout << "Input how far from Commander Chief a grenade falls (yards): ";
cin >> answer;
while(cin.fail()) // FUCKING FIGURE OUT WHY THIS SHIT IS BUGGING OUT FUCKING MANG -Tony
{
cout << "Error, invalid variable. Please input a number: ";
cin.clear();
cin.ignore(10000,'\n');
cin >> answer;

}

cout << "The damage radius of the grenade is " << damage_range << " yards.\n";

canbackoff = grenade_explode * speed;

cout << "The Commander Chief can back off " << canbackoff << " yards.\n";

can_damage = (grenade_explode * speed) + answer;

if (can_damage > damage_range)
{
cout << "Commander Chief will not get hurt." << endl;
}
else
{
cout << "Commander Chief will get hurt." << endl;
}

system("pause");
return 0;
}


You had a semicolon after your while statement.

This post was edited by Minkomonster on Mar 1 2014 11:01pm
Go Back To Programming & Development Topic List
12Next
Add Reply New Topic New Poll