UVA327 - Evaluating Simple C Expressions

题目很简单,不过需要考虑全面才可、

个人觉得题目表达的不是很准确,其中没有考虑到a与--之间有空格的情况就是我第一次RTE的原因所在】

因此,我先进行空格剔除,在进行其他操作。

代码如下:

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int ch[30], sum, length;
string s;
int cacultor(int a, char c, int b)//计算函数
{
    switch (c)
    {
    case '+':
        return a+b;
    case '-':
        return a-b;
    }
    return 0;
}
int ZIJIAJIAN(int i, int j)//判断是否符合自增自减条件
{
    if(i<=length-2&&s[i] == s[i+1])
    {
        ch[s[j]-'a'] = (ch[s[j]-'a']>=0?ch[s[j]-'a']:s[j]-'a'+1);
        switch(s[i+1])
        {
        case '+':
        {
            ch[s[j]-'a']++;
            break;
        }
        case '-':
        {
            ch[s[j]-'a']--;
            break;
        }
        }
        return 1;
    }
    return 0;
}
int move(int i)//剔除空格
{
    for(int j = i; j < length-1; j++)
    s[j] = s[j+1];
    length--;
    return 0;
}
int main ()
{
    while(getline(cin, s))
    {
        cout<<"Expression: "<<s<<endl;
        memset(ch,-1,sizeof(ch));
        sum = 0;
        length = s.length();
        for(int i = 0; i < length; i++)
        if(s[i]==' '){move(i); i = -1;}
        for(int i = 0, count = 0; i < length; i++)
        {
                count++;
                if(count == 1||(s[i]>='a'&&s[i]<='z'))
                {
                    int temp = 2;
                    temp = (ZIJIAJIAN(i,i+temp)?2:(ch[s[i]-'a'] = (ch[s[i]-'a']>=0?ch[s[i]-'a']:s[i]-'a'+1),0));
                    sum+=ch[s[i+temp]-'a'];
                    i+=temp;
                    i+=(ZIJIAJIAN(i+1,i)?2:0);
                }
                else
                {
                    int temp = 1, temp2 = 2;
                    temp2 = (ZIJIAJIAN(i+temp, i+temp+temp2)?2:( ch[s[i+temp]-'a'] = (ch[s[i+temp]-'a']>=0?ch[s[i+temp]-'a']:s[i+temp]-'a'+1), 0));
                    sum = cacultor(sum, s[i], ch[s[i+temp+temp2]-'a']);
                    i+=(temp+temp2);
                    i+=(ZIJIAJIAN(i+1,i)?2:0);
                }
        }
        cout<<"    value = "<<sum<<endl;
        for(int i = 0; i < 26;i++)
        if(ch[i]>=0)cout<<"    "<<char('a'+i)<<" = "<<ch[i]<<endl;
    }
    return 0;
}


posted on 2012-11-08 00:13  Primo...  阅读(191)  评论(0)    收藏  举报