题目:327 - Evaluating Simple C Expressions
题目大意:就是求给定的表达式的值。
解题思路:首先先去掉空格,不然会出现一些错误。然后用一个数组来存放字母对应的值。再来先做自增自减,把存放字母的那个数组里的值改掉,然后如果是先自增减在用的就还需要把要用来计算的那个算式的值改掉,先用在自增减的就不需要改变,然后再把“++”, “--”去掉。计算的时候原本是两个加完后就在把这个计算结果放回式子里,但是这样会出现错误,因为根据我的代码要是第一个等于‘+’‘-’,就没有任何动作。所以可能计算的结果可能会等于‘+’‘-’,这样就错了。所以后面就改成遇到符号对应加减。(因为式子已经简化了)。
#include<stdio.h>
#include<string.h>
const int N = 120;
const int M = 30;
char str1[N], s[M], str2[N];
char bo[N];
int handle() { //处理去掉空格,并且记录出现的字母
int k = 0, l = 0;
for(int i = 0; str1[i] != '\0'; i++) {
if(str1[i] != ' ') {
str2[k] = str1[i];
if(str1[i] >= 'a' && str1[i] <= 'z') {
str2[k] -= 96;
s[str2[k]] = str2[k];
bo[str2[k]] = 1;
}
k++;
}
}
return k;
}
int dealb(int k) { //处理先用再自增减,然后去掉子增减符号
for(int i = 0; i < k ; i++) {
if(i + 1 >= k || i + 2 >= k)
break;
if(str2[i] != '+' && str2[i] != '-') {
if(str2[i + 1] =='-' && str2[i + 2] == '-') {
s[str2[i]]--;
for(int j = i + 3; j < k; j++) {
str2[j - 2] = str2[j];
}
k -= 2;
}
else if(str2[i + 1] =='+' && str2[i + 2] == '+') {
s[str2[i]]++;
for(int j = i + 3; j < k; j++) {
str2[j - 2] = str2[j];
}
k -= 2;
}
}
}
return k;
}
int deala(int k) { //处理先自增减再用,然后去掉子增减符号
for(int i = 0; i < k ; i++) {
if(i + 1 >= k || i + 2 >= k)
break;
if(str2[i] =='-' && str2[i + 1] == '-') {
if(str2[i + 2] != '+' && str2[i + 2] != '-') {
s[str2[i + 2]]--;
str2[i + 2]--;
for(int j = i + 2; j < k; j++) {
str2[j - 2] = str2[j];
}
k -= 2;
}
}
else if(str2[i] =='+' && str2[i + 1] == '+') {
if(str2[i + 2] != '+' && str2[i + 2] != '-') {
s[str2[i + 2]]++;
str2[i + 2]++;
for(int j = i + 2; j < k; j++) {
str2[j - 2] = str2[j];
}
k -= 2;
}
}
}
return k;
}
int caculate(int k) { //计算
int sum = 0;
sum += str2[0];
for(int i = 1; i < k;) {
if( i + 1 >= k)
break;
if(str2[i] == '-') {
sum -= str2[i + 1];
i += 2;
}
else if(str2[i] == '+') {
sum += str2[i + 1];
i += 2;
}
}
return sum;
}
int main() {
memset(bo, 0, sizeof(bo));
memset(s, 0, sizeof(s));
while(gets(str1) != NULL) {
int k = handle();
k = deala(dealb(k));
printf("Expression: %s\n", str1);
printf(" value = %d\n", caculate(k));
for(int i = 1; i < M; i++) {
if(bo[i] != 0)
printf(" %c = %d\n", i + 96, s[i]);
}
memset(str1, 0, sizeof(str1));
memset(str2, 0, sizeof(str2));
memset(s, 0, sizeof(s));
memset(bo, 0, sizeof(bo));
}
return 0;
}