题目大意:输入26个字母(小写)以及++,--,+,-的运算符,求运算的结果,以及按字典次序各字母的值(初值为1~26)题目代码长。。。直接百度,大概看了一下就是运算,杠。
解题思路:先用字符串a,接受运算的式子,因为式子可能有空格,所以用getline,然后用字符串b接受a去空格以后的式子,同时,将式子中有的字母与初值,作为键和值存入map。然后对b字符串遍历,如果字母前有++或--(前增前减),就改变字母的值。由于后增后减是运算后进行,所以暂时不做改变。然后第三个字符串c,存入b字符串去了++,--(无论前增前减还是后增后减)。剩下字母以及+,-,就直接进行运算。最后对b遍历,考虑后增后减,改变字母值,按格式输出就可以了。
ac代码:(不改了,虽然又臭又长)
#include <iostream>
#include <map>
using namespace std;
string a, b, c;
int len, add, inc, sum;
map <char, int>m;
map <char, int>::iterator it;
int add_inc(int i)
{
int judge=0;
if (i>=2){
if (b[i-2] == '-' && b[i-1] == '-')
judge--;
if (b[i-2] == '+' && b[i-1] == '+')
judge++;
}
return judge;
}
void count()
{
int temp = c.size();
for (int i=0; i<temp; i++){
if (isalpha(c[i])){
if (i==0 || c[i-1] == '+')
sum += m[ c[i] ];
else if (c[i-1] == '-')
sum = sum - m[ c[i] ];
}
}
}
int main()
{
while (getline(cin, a)){
len = a.size();
b = c = "";
add = inc = sum = 0;
for (int i=0; i<len; i++)
if (a[i] != ' ')
b += a[i];
len = b.size();
for (int i=0; i<len; i++)
if (isalpha(b[i])){
if (!m.count(b[i]))
m[ b[i] ] = b[i] - 'a' + 1;
m[ b[i] ] += add_inc(i);
}
for (int i=0; i<len; i++){
if (b[i]== b[i+1]){
i ++;
continue;
}
c += b[i];
}
count();
for (int i=0; i<len; i++)
if (isalpha(b[i]) && i<=len-3){
if (b[i+2] == '-' && b[i+1] == '-')
m[ b[i] ]--;
if (b[i+2] == '+' && b[i+1] == '+')
m[ b[i] ]++;
}
cout << "Expression: " << a << endl;
printf(" value = %d\n", sum);
for (it=m.begin(); it!=m.end(); it++)
printf("%5c = %d\n", it->first, it->second);
m.clear();
}
return 0;
}