/////// File CalcFace.C /////// #include #include #include #include #include "CalcFace.h" int in_string(char c, char *str) // file scope { int i = 0; while (str[i] != '\0') { if (str[i] == c) return(1); // return true i++; } return(0); // return false } inline int CalcFace::nump(char c) { return( c == '.' || isdigit(c) ); } void CalcFace::extract_number(double& number) { if ( nbuf[0] == '\0' ) number = 0.0; else { istrstream tmp(nbuf, PREC + 1); tmp >> number; } } int CalcFace::input(char& op, double& number) { int c, current_position = 0, num=0; while ( (c = inchar()) != 'q' && c != 'Q' ) // (1) { if ( in_string(c, keys) ) // if c an operator { op = c; if ( num ) { nbuf[current_position] = '\0'; extract_number(number); return(0); } else return(OPONLY); } if ( nump(c) && current_position < PREC ) // (2) { num = 1; build_number(c, current_position); } } // end of while return(OFF); // end of input } void CalcFace::build_number(char c, int& i) { static int point_seen = 0; if ( i == 0 ) point_seen = 0; // reset if ( i == 0 && c == '0') return; // ignore leading zeros if ( c == '.' ) // at most one decimal point { if ( point_seen ) return; else point_seen = 1; } nbuf[i++] = c; // current_position++ } void CalcFace::show_number(double number) { cout << "Calc: " << number << "\n"; }