首页 功能完备C++计算器(1)1

功能完备C++计算器(1)1

举报
开通vip

功能完备C++计算器(1)1#include #include #include #include #include using namespace std; enum types { DELIMITER = 1, VARIABLE, NUMBER}; //定义枚举类型把DELIMITER初试化为后面的相应的是前面值+1 int error_type = -1; class calculator { char *cal_p; // 定义一个指向表达式的指针 char token[80]; // 存储表达式中的字符变量 char t...

功能完备C++计算器(1)1
#include #include #include #include #include using namespace std; enum types { DELIMITER = 1, VARIABLE, NUMBER}; //定义枚举类型把DELIMITER初试化为后面的相应的是前面值+1 int error_type = -1; class calculator { char *cal_p; // 定义一个指向表达式的指针 char token[80]; // 存储表达式中的字符变量 char tok_type; // 存储具体是什么类型 void cal_p2(double &result); void cal_p3(double &result); void cal_p4(double &result); void cal_p5(double &result); void cal_p6(double &result); void atom(double &result); //把字符串转换为浮点数 void get_token(); //取得下一个字符 void error(int err); //显示打印出错信息 int isdelim(char c); //判断是否为分隔符 public: calculator();//类的构造函数 double cal(char *exp); int error_type; // 存储错误信息 }; // 类构照函数的具体实现 calculator::calculator() { cal_p = NULL;//把exp_ptr的指针初始化为空 error_type = -1; } // 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 eval_exp的具体实现过程 double calculator::cal(char *p) { double result; cal_p = p;//把传递过来的参数p赋给cal_p get_token(); if(!*token) { error(2); //输出没有任何表达式的错误信息 return 0.0; } cal_p2(result); if(*token){ error(0); // last token must be null } return result; } // 两个变量字符是加或者减操作 void calculator::cal_p2(double &result) { register char op; double temp; cal_p3(result); while((op = *token) == '+'||op == '-') { get_token(); cal_p3(temp); switch(op) { case '-': result = result - temp; break; case '+': result = result + temp; break; } } } // 两个变量是乘或者除操作或者是取余 void calculator::cal_p3(double &result) { register char op; double temp; cal_p4(result); while((op = *token) == '*' ||op == '/' || op == '%') { get_token(); cal_p4(temp); switch(op) { case '*': result = result * temp; break; case '/': if (temp == 0) error(3); else result = result / temp; //除数为零的情况要考虑进去 break; case '%': result = (int) result % (int) temp; break; } } } // 进行^运算 void calculator::cal_p4(double &result) { double temp, ex; register int t; cal_p5(result); if(*token== '^') { get_token(); cal_p4(temp); ex = result; if(temp==0.0) { result = 1.0; return; } for(t=(int)temp-1; t>0; --t) result = result * (double)ex; } } void calculator::cal_p5(double &result) { register char op; op = 0; if((tok_type == DELIMITER) && *token=='+' || *token == '-') { op = *token; get_token(); } cal_p6(result); if(op=='-') result = -result; } // 进行有括号的算法 void calculator::cal_p6(double &result) { if((*token == '(')) { get_token(); cal_p2(result); if(*token != ')') { error(1); } get_token(); } else atom(result); } // 取得数值 void calculator::atom(double &result) { switch(tok_type) { case NUMBER: result = atof(token); //atof()把字符串转换成浮点数double atof( const char *str ); get_token(); return; default: error(0); } } // 输出出错信息. void calculator::error(int err) { error_type = err; static char *e[]= { "语法错误!请核对后重新输入", "缺少一个括号!请核对后再输入", "您没有输入任何表达式!", "除数不能为!请核对后重新输入" }; cout <若参数c为空格字符,则返回TRUE,否则返回NULL(0) if(strchr("+-*/%^=()", *cal_p)){ //用strchr函数在字符串"+-*/%^=()"中查找*exp_ptr指向的字符所在位置,判断返回值(非为真就执行)以便是否执行以下语句 tok_type = DELIMITER;//把tok_type置为DELIMITER // advance to next char *temp++ = *cal_p++; } else if(isalpha(*cal_p)) { //当参数c为大写英文字母(A-Z)时,返回非零值,否则返回零 while(!isdelim(*cal_p)) *temp++ = *cal_p++; //isdelim判断是否是分隔符,当*exp_ptr指向的字符不为分隔符时把值赋给*temp tok_type = VARIABLE;//把tok_type置为VARIABLE } else if(isdigit(*cal_p)) { // isdigit判断*exp_ptr指向的字符是否为数字 while(!isdelim(*cal_p)) *temp++ = *cal_p++; //isdelim判断是否是分隔符,当*exp_ptr指向的字符不为分隔符时把值赋给*temp tok_type = NUMBER; } *temp = '\0'; //空格 } // isdelim函数的具体实现,如果参数是一个分隔符则返回真 int calculator::isdelim(char c) { if(strchr(" +-/*%^=()", c)) //把"+-/*%^=()09\r定义非分隔符,/r回车 return 1; return 0; } //strchr(const char *s,char c),返回首次出现c的位置的指针,如果s中不存在c则返回NULL。 int main() { char calchar[80]; calculator ob; // 创建一个calculator类型的实例 double result; for(;;) { cout << "请输入你要计算的表达式: "<
本文档为【功能完备C++计算器(1)1】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_632567
暂无简介~
格式:doc
大小:69KB
软件:Word
页数:6
分类:理学
上传时间:2011-06-17
浏览量:22