POJ-1539

解析C++代码中特殊运算符的应用
#include <stdio.h>
#include <string.h>

// 有个灰常坑爹的地方, a++ +b 和 a+ ++b答案都 a++ +b , 坑人啊 
int main()
{
    char expression[200], expressionTemp[200], *where, grapheme[26];
    short int pluesFirst[26], pluesLast[26];
    int i,j, sum;
    char c;
    while (gets(expressionTemp) != NULL) {        
          printf("Expression: %s\n", expressionTemp);
          // 初始化 
          memset(grapheme, 0, sizeof(grapheme));
          for (i = 0; i < 26; i++) {
              pluesFirst[i] = i+1;
              pluesLast[i] = 0;
          }
          for (i = j =0; expressionTemp[i]; i++) {
              if (expressionTemp[i] != ' ')
                 expression[j++] = expressionTemp[i];
          }
          // 找出所有的"++"运算符 
          where = expression;
          while ((where = strstr(where, "++"))) {
                if (*(where+2) >='a' && *(where+2) <= 'z') {
                   pluesFirst[*(where+2)-'a']++;
                }
                else if (*(where-1) >='a' && *(where-1) <= 'z')
                     pluesLast[*(where-1)-'a']++;
                *where = ' ';
                *(where+1) = ' ';
          }
          // 找出所有的"--"运算符 
          where = expression;
          while ((where = strstr(where, "--"))) {
                if (*(where+2) >='a' && *(where+2) <= 'z') {
                   pluesFirst[*(where+2)-'a']--;
                }
                else if (*(where-1) >='a' && *(where-1) <= 'z')
                     pluesLast[*(where-1)-'a']--;
                *where = ' ';
                *(where+1) = ' ';
          }
          // 计算结果 
          for (sum=i=0, c='+'; expression[i]; i++) {
              if (expression[i] >='a' && expression[i]<= 'z') {
                 grapheme[expression[i]-'a'] = expression[i];
                 switch (c) {
                        case '+' : sum += pluesFirst[expression[i]-'a']; c=0; break;
                        case '-' : sum -= pluesFirst[expression[i]-'a']; c=0; break;
                 }
              }else if (expression[i] == '+')
                       c = '+';
              else if (expression[i] == '-')
                      c = '-';
          }
          printf("    value = %d\n", sum);
          for (i = 0; i < 26; i++) {
              if (grapheme[i])
                 printf("    %c = %d\n", grapheme[i], pluesFirst[grapheme[i]-'a']+pluesLast[grapheme[i]-'a']);              
          } 
    }
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值