/////// File CalcFace.C /////// #include #include #include #include "CalcFace.h" CalcFace::CalcFace(const int d, const char* k) : prec(d), keys(k), nbuf (new char[d+2]) // includes . and '\0' { } 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::err_input(char& op) { int c; while ( (c = inchar()) != 'q' && c != 'Q' ) { if ( strchr("AaCc", c) ) { op = c; return (OPONLY); } } return(OFF); } int CalcFace::input(char& op, double& number, int err) { if ( err ) return(err_input(op)); int c, current_position = 0, num=0; while ( (c = inchar()) != 'q' && c != 'Q' ) { if ( strchr(keys, c) ) { op = c; if ( num ) { nbuf[current_position] = '\0'; extract_number(number); return(0); } else return(OPONLY); } if ( nump(c) && current_position < prec ) { 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.precision(prec); cout.setf(ios::fixed); cout << "Calc: " << number << "\n"; }