UVA 327 - Evaluating Simple C Expressions

题目大意:输入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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值