• 5819阅读
  • 1回复

[提问]qt计算器的isdigit函数和vc里面的区别 [复制链接]

上一主题 下一主题
 
只看楼主 倒序阅读 楼主  发表于: 2013-03-05
关键词: 求助
  1. //头文件
  2. #ifndef PARSER_H
  3. #define PARSER_H
  4. enum types { DELIMITER = 1, VARIABLE, NUMBER};//定义枚举类型把DELIMITER初试化为1后面的相应的是前面值+1
  5. class parser
  6. {
  7.     char *exp_ptr;  // 定义一个指向表达式的指针
  8.       char token[80]; // 存储表达式中的字符变量
  9.       char tok_type;  // 存储具体是什么类型
  10.       void eval_exp2(double &result);
  11.       void eval_exp3(double &result);
  12.       void eval_exp4(double &result);
  13.       void eval_exp5(double &result);
  14.       void eval_exp6(double &result);
  15.       void atom(double &result);
  16.       void get_token();
  17.       void serror(int error);
  18.       int isdelim(char c);
  19. public:
  20.     parser();
  21.     double eval_exp(char *exp);
  22. };
  23. #endif // PARSER_H
  24. //源文件
  25. #include "parser.h"
  26. #include "iostream"
  27. #include <cstdlib>
  28. #include <cctype>
  29. #include <cstring>
  30. #include <qmessagebox.h>
  31. #include <form.h>
  32. parser::parser()
  33. {
  34.     exp_ptr = NULL;//把exp_ptr的指针初始化为空
  35. }
  36. // 方法eval_exp的具体实现过程
  37. double parser::eval_exp(char *exp)
  38. {
  39.   double result;
  40.   exp_ptr = exp;//把传递过来的参数exp负给exp_ptr
  41.   get_token();
  42.   if(!*token) {
  43.     serror(2); //输出没有任何表达式的错误信息
  44.     return 0.0;
  45.   }
  46.   eval_exp2(result);
  47.   if(*token) serror(0); // last token must be null
  48.   return result;
  49. }
  50. // 两个变量字符是加或者减操作
  51. void parser::eval_exp2(double &result)
  52. {
  53.   register char op;
  54.   double temp;
  55.   eval_exp3(result);
  56.   while((op = *token) == '+' || op == '-') {
  57.     get_token();
  58.     eval_exp3(temp);
  59.     switch(op) {
  60.       case '-':
  61.         result = result - temp;
  62.         break;
  63.       case '+':
  64.         result = result + temp;
  65.         break;
  66.     }
  67.   }
  68. }
  69. // 两个变量是乘或者除操作 或者是取余
  70. void parser::eval_exp3(double &result)
  71. {
  72.   register char op;
  73.   double temp;
  74.   eval_exp4(result);
  75.   while((op = *token) == '*' || op == '/' || op == '%') {
  76.     get_token();
  77.     eval_exp4(temp);
  78.     switch(op) {
  79.       case '*':
  80.         result = result * temp;
  81.         break;
  82.       case '/':
  83.         result = result / temp;
  84.         break;
  85.       case '%':
  86.         result = (int) result % (int) temp;
  87.         break;
  88.     }
  89.   }
  90. }
  91. // 进行^运算
  92. void parser::eval_exp4(double &result)
  93. {
  94.   double temp, ex;
  95.   register int t;
  96.   eval_exp5(result);
  97.   if(*token== '^') {
  98.     get_token();
  99.     eval_exp4(temp);
  100.     ex = result;
  101.     if(temp==0.0) {
  102.       result = 1.0;
  103.       return;
  104.     }
  105.     for(t=(int)temp-1; t>0; --t) result = result * (double)ex;
  106.   }
  107. }
  108. void parser::eval_exp5(double &result)
  109. {
  110.   register char  op;
  111.   op = 0;
  112.   if((tok_type == DELIMITER) && *token=='+' || *token == '-') {
  113.     op = *token;
  114.     get_token();
  115.   }
  116.   eval_exp6(result);
  117.   if(op=='-') result = -result;
  118. }
  119. // 进行有括号的算法
  120. void parser::eval_exp6(double &result)
  121. {
  122.   if((*token == '(')) {
  123.     get_token();
  124.     eval_exp2(result);
  125.     if(*token != ')')
  126.       serror(1);
  127.     get_token();
  128.   }
  129.   else atom(result);
  130. }
  131. // 取得数值
  132. void parser::atom(double &result)
  133. {
  134.   switch(tok_type) {
  135.     case NUMBER:
  136.       result = atof(token);
  137.       get_token();
  138.       return;
  139.     default:
  140.       serror(0);
  141.   }
  142. }
  143. // 输出出错信息.
  144. void parser::serror(int error)
  145. {
  146.   static char *e[]= {
  147.       "语法错误!",
  148.       "算法错误!",
  149.       "算数!"
  150.   };
  151.   QMessageBox::about(NULL, "About",QObject::tr(e[error]));
  152. }
  153. // 取得下一个token值
  154. void parser::get_token()
  155. {
  156.     register char *temp;
  157.   tok_type = 0;
  158.    temp=token;
  159.   *temp = '\0';
  160.   if(!*exp_ptr) return; // 如果到表达式末尾则返回
  161.   while(isspace(*exp_ptr)) ++exp_ptr; //
  162.   if(strchr("+-*/%^=()", *exp_ptr)){  //用strchr函数在字符串"+-*/%^=()"中查找*exp_ptr指向的字符所在位置,判断返回值(非0为真就执行)以便是否执行以下语句
  163.     tok_type = DELIMITER;//把tok_type置为DELIMITER
  164.     // advance to next char
  165.     *temp++ = *exp_ptr++;
  166.   }
  167.   else if(isalpha(*exp_ptr)) {
  168.     while(!isdelim(*exp_ptr)) *temp++ = *exp_ptr++; //isdelim判断是否是分隔符,当*exp_ptr指向的字符不为分隔符时把值负给*temp
  169.     tok_type = VARIABLE;//把tok_type置为VARIABLE
  170.   }
  171.   else if(isdigit(*exp_ptr)) { // isdigit判断*exp_ptr指向的字符是否为数字
  172.     while(!isdelim(*exp_ptr)) *temp++ = *exp_ptr++;
  173.     tok_type = NUMBER;
  174.   }
  175.   *temp = '\0';
  176. }
  177. // isdelim函数的具体实现,如果参数是一个分割符则返回真
  178. int parser::isdelim(char c)
  179. {
  180.   if(strchr(" +-/*%^=()", c) || c==9 || c=='\r' || c==0)//把"+-/*%^=()09\r定义非分隔符
  181.     return 1;
  182.   return 0;
  183. }


//获取编辑框中的公式
   char *show1;
    char show[80];
    QString Answer;
    QString Math;
    Math=ui->lineEdit->text();
    parser ob;
    show1=ui->lineEdit->text().toAscii().data();
    strcpy(show,show1);
菜鸟而已
只看该作者 1楼 发表于: 2013-03-05
这个类是vc的环境下编的,在Qt里面获取exp_ptr是出了问题,总是空值
菜鸟而已
快速回复
限100 字节
 
上一个 下一个