# beginner c++ prob-check if user input is numeric

Discussion in 'Mac Programming' started by seventeen, Feb 5, 2010.

1. ### seventeen macrumors member

Joined:
Apr 9, 2009
Location:
Denton, Tx
#1
I am creating a simple CLI calculator tool as an exercise. The complete code is included below. I need to make sure n1 and n2 are numeric in order for the functions to work; somewhat consequently, I would like to make the program quit upon coming across a non-numeric value from the user.

Can anyone give me some direction?

Check out the first if statement in the do block. (its commented out)

Thank you!

Code:
```#include <iostream>
#include <new>

using namespace std;

double factorial(double n) { return (n <= 1) ? 1 : n * factorial(n - 1); }
double add(double n1, double n2) { return(n1 + n2); }
double subtract(double n1, double n2) { return(n1 - n2); }
double multiply(double n1, double n2) { return(n1 * n2); }
double divide(double n1, double n2) { return(n1 / n2); }
int modulo(int n1, int n2) { return(n1 % n2); }
double power(double n1, double n2) {
double n = n1;
for(int i = 1 ; i < n2 ; i++) {
n *= n1;
}
return(n);
}

void print_problem(double n1, double n2, char operatr) {
cout<<n1<<operatr<<flush;
if(operatr != '!') {
cout<<n2<<flush;
}
cout<<"="<<flush;
}

int main(void) {

double* n1, * n2, * result = NULL;
char* operatr = NULL;

n1 = new (nothrow) double;
n2 = new (nothrow) double;
result = new (nothrow) double;
operatr = new (nothrow) char;

if(n1 == NULL || n2 == NULL || operatr == NULL || result == NULL) {
cerr<<"\nMemory allocation failure.\n"<<endl;
} else {

do {

cout<<"calculator>> "<<flush;
cin>>*n1;

// if(*n1 is not numeric) {
// 		 break;
// }

cin>>*operatr;

if(*operatr == '!') {
print_problem(*n1, *n2, *operatr);
cout<<factorial(*n1)<<endl;
} else {

cin>>*n2;

switch(*operatr) {
case '+':
print_problem(*n1, *n2, *operatr);
break;
case '-':
print_problem(*n1, *n2, *operatr);
cout<<subtract(*n1, *n2)<<endl;
break;
case '*':
print_problem(*n1, *n2, *operatr);
cout<<multiply(*n1, *n2)<<endl;
break;
case '/':
if(*n2 > 0) {
print_problem(*n1, *n2, *operatr);
cout<<divide(*n1, *n2)<<endl;
} else {
print_problem(*n1, *n2, *operatr);
cout<<" cannot be computed."<<endl;
}
break;
case '%':
if(*n1 >= 0 && *n2 >= 1) {
print_problem(*n1, *n2, *operatr);
cout<<modulo(*n1, *n2)<<endl;
} else {
print_problem(*n1, *n2, *operatr);
cout<<" cannot be computed."<<endl;
}
break;
case '^':
print_problem(*n1, *n2, *operatr);
cout<<power(*n1, *n2)<<endl;
break;
default:
cout<<"Invalid Operator"<<endl;
}
}
} while(true);

delete n1, n2, operatr, result;
}
return(0);
}```

2. ### Sander macrumors 6502

Joined:
Apr 24, 2008
#2
They will always be numeric, since they're doubles. You probably want to check this before assigning the user input to the variables, by reading the user input as a string and then converting it.

Also, please get rid of the news. There is absolutely no need to do this via pointers. Did you perhaps grow up on Java or C#..?