Problem Description
You may find it’s easy to calculate the expression such as:
a = 3
b = 4
c = 5
a + b + c = ?
Isn’t it?
Input
The first line contains an integer stands for the number of test cases.
Each test case start with an integer n stands for n expressions will follow for this case.
Then n – 1 expressions in the format: [variable name][space][=][space][integer] will follow.
You may suppose the variable name will only contain lowercase letters and the length will not exceed 20, and the integer will between -65536 and 65536.
The last line will contain the expression you need to work out.
In the format: [variable name| integer][space][+|-][space][variable name| integer] …= ?
You may suppose the variable name must have been defined in the n – 1 expression and the integer is also between -65536 and 65536.
You can get more information from the sample.
Output
For each case, output the result of the last expression.
Sample Input
3
4
aa = 1
bb = -1
aa = 2
aa + bb + 11 = ?
1
1 + 1 = ?
1
1 + -1 = ?
Sample Output
12
2
0
题意:输出一行算式的结果,可能有数字可能有字母,你要把字母代表的值存起来后来才能运算。
想法:我还没清楚什么是模拟,题解都说是模拟(心累)
看起来很简单(好像也没有……),写起来不容易。
这份代码转自他人(找不到渊博了 qaq),很简短但是很难理解,啃了很久,因为里面用到了一些不常用的函数。
//代码重点:string的各种应用!
#include <iostream>
#include <sstream>
#include <map>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cctype>
using namespace std;
map<string, int> mm;
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
string a, b;
int c;
mm.clear();
for(int i = 1; i < n; i ++)
{
cin >> a >> b >> c; //x=3(a,b,c)
mm[a] = c;
}
string str; //就是最后的那一行!
int flag = 1;
getchar(); // 接受回车符
getline(cin, str);
stringstream ss(str); // 定义输入流
string str1; //str1就是上面输入流读取的单字!(我猜)
int sum = 0;
while( ss >> str1)
{
if(str1 == "-")
{
flag = -1;
}
if(str1 == "+")
{
flag = 1;
}
if(str1 == "=")
{
break;
}
if(isalpha(str1[0])) // 判断是否是字母
{
if(mm.find(str1) != mm.end())
{
sum += mm[str1] * flag;
}//把这里实践一下啊!实践完就知道if(str1 == "+")为什么不能去掉了
}
else
{//因为还是string类型的数字啊摔!要转化成int才能运算!
int temp;
temp = atoi(str1.c_str());// 转换成char 在转化成int
sum += temp * flag;
}
}
cout << sum << endl;
}
}
恩,下面是壮神的代码,一个酷爱用switch的boy↓
他用struct代替了map,其实应该他的更详细会更好理解一点,但是我已经懂了楼上就不想再用这么麻烦的~(≧▽≦)/~啦啦啦
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
struct S
{
char name[25];
int num;
};
int main()
{
int N;
while(scanf("%d",&N)!=EOF)
{
for(int j=0; j<N; ++j)
{
S s[1005];
memset(s,0,sizeof(s));
int n,x=0;
scanf("%d",&n);
for(int i=1; i<n; ++i)
{
char a1[25]="0";
int a2,j;
scanf("%s = %d",a1,&a2);
a1[strlen(a1)]=0;
for(j=0; j<x; ++j)
{
if(strcmp(a1,s[j].name)==0)
{
s[j].num=a2;
break;
}
}
if(j==x)
{
strcpy(s[x].name,a1);
s[x].num=a2;
x++;
}
}
getchar();
char a[1005],b[100];
gets(a);
int len=strlen(a);
int x1=0,flag=0,ans=0;
for(int i=0; i<len; ++i)
{
if(a[i]=='=')
{
cout<<ans<<endl;
break;
}
else if(a[i]!=' ')
{
b[x1++]=a[i];
}
else if(a[i]==' ')
{
b[x1]=0;
if(b[0]=='+'&&strlen(b)==1) flag=0;
else if(b[0]=='-'&&strlen(b)==1) flag=1;
else if(b[0]>='a'&&b[0]<='z')
{
for(int j=0; j<x; ++j)
{
if(strcmp(b,s[j].name)==0)
{
switch(flag)
{
case 0:ans+=s[j].num;break;
case 1:ans-=s[j].num;break;
}
break;
}
}
}
else
{
int a1=atoi(b);
switch(flag)
{
case 0:ans+=a1;break;
case 1:ans-=a1;break;
}
}
x1=0;
}
}
}
}
return 0;
}
ps:啃到最后忍不住去问了小姐姐,小姐姐真好啊(*  ̄3)(ε ̄ *)