2014-02-15 89 views
-1

我正在研究一个需要计算以字符串形式给出的算术表达式的值的项目。评估以字符串形式给出的算术表达式

所以我选择使用的方式是让我运行字符串,直到符号相乘。在此期间,我保留了乘法字符串之前的数字。如果在这些数字之前有符号,我会重置字符串。最后,当我产生乘法符号时,我检查接下来会发生什么并保存到另一个字符串中。最后,我计算结果。依此类推,直到我解决练习(还有其他函数解决其余的方程)。

我的问题是:乘法符号之前出现的数字未被重置,除了乘法符号没有保存在额外字符串中之后出现的数字之外,还会产生问题。

该函数发现乘号,并计算了他 -

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) { 
    char str[10] = "3+1-4*6-7"; 
    char str1[10]; 
    char str2[10]; 
    int i, p = 0, k = 0; 

    for(i = 0; i < 10; i++) { 
     str1[k] = str[i]; 
     k++; 
     if((str[k] == '-') | '+' | '/') { 
      str1[0] = 0; 
     } 
     else if(str1[k] == '*') { 
      while((str[i] != '-') | '+' | '*' | '/') { 
       str2[p] = str[i]; 
       p++; 
       i++; 
      } 
     } 
    } 
    printf("%s--%s\n", str1, str2); 
} 

由于任何人谁可以帮我解决这个问题 或可以推荐另一种方式来解决这个问题。

+0

'str1 [0] = 0;'为什么?它总是复位? –

+3

'|按位或'。也许你的意思是逻辑“或”,即“||”。 – ajay

+0

即使你使用'||',那也不是你如何比较某些事物与其他多种事物...... –

回答

1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct exp { 
    char op; 
    char *term; 
    struct exp *left; 
    struct exp *right; 
} Exp; 

Exp *make_exp2(char *str){ 
    if(!str || !*str) return NULL;//*str == '\0' is format error. 
    char *mul = strrchr(str, '*'); 
    char *div = strrchr(str, '/'); 
    Exp *node = malloc(sizeof(*node)); 
    if(mul == NULL && div == NULL){ 
     node->op = '\0'; 
     node->term = str; 
     node->left = node->right = NULL; 
     return node; 
    } 
    char *op; 
    op = mul < div ? div : mul; 
    node->op = *op; 
    *op = '\0'; 
    node->left = make_exp2(str); 
    node->right = make_exp2(op+1); 
    return node; 
} 

Exp *make_exp(char *str){ 
    if(!str || !*str) return NULL;//*str == '\0' is format error. 
    char *minus = strrchr(str, '-'); 
    char *plus = strrchr(str, '+'); 
    if(minus == NULL && plus == NULL) 
     return make_exp2(str); 
    char *op; 
    Exp *node = malloc(sizeof(*node)); 
    op = minus < plus ? plus : minus; 
    node->op = *op; 
    *op = '\0'; 
    node->left = make_exp(str); 
    node->right = make_exp(op+1); 
    return node; 
} 

#ifdef DEBUG 

void print(Exp *exp, int level){ 
    int i; 
    if(exp->op){ 
     for(i=0;i<level;++i) 
      printf(" "); 
     printf("%c\n", exp->op); 
     for(i=0;i<level;++i) 
      printf(" "); 
     print(exp->right, level+1); 
     printf("\n"); 
     for(i=0;i<level;++i) 
      printf(" "); 
     print(exp->left, level+1); 
     printf("\n"); 
    } else { 
     for(i=0;i<level;++i) 
      printf(" "); 
     printf("%s\n", exp->term); 
    } 
} 

#endif 

int main(void) { 
    char str[] = "3+1-4*6-7"; 
    Exp *exp = make_exp(str); 

#ifdef DEBUG 
    print(exp, 0); 
#endif 
    //release exp 
    return 0; 
} 
相关问题