2014-02-15 138 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; 
} 
相關問題