这题只是一道很恶心的字符串处理。放轻松,没有什么深奥的算法。也考察了对于结构体的理解。
先建立一个结构体。结构体的第一个成员是函数的名称,第二个成员是函数的参数类型列表。用 vector 存储。
首先输入
xxxxxxxxxx
cin.get();
把换行符吃掉。
特别注意,以下三个部分的调用,都用可读取空格的 getline 函数。
具体写法:
xxxxxxxxxx
getline(cin, 字符串名称);
先 getline 一个字符串,称之为
先去除字符串最前面的空格。
再用 erase 函数去掉函数类型 void。
再次去除最前面的空格。
在读到表示参数的左括号前,先将函数名保存下来。 还是注意,要忽略空格。
将当前函数的 name 先保存进函数的结构体数组。
接下来,对于每个字符,只要其不是 空格,逗号,右括号, 就将其加入当前函数的参数列表中。
遇到逗号,就说明马上要开始有一个新参数了。
遇到右括号,那么当前函数的处理就大功告成了!
还是相同的方法,读入
xxxxxxxxxx
cin>>s1>>s2;
就可以读进变量类型和变量名称。用一个哈希表 map,就可以存储变量的相关信息。
按照 Part 1 的类似办法,读入每一个处理调用信息。 读取函数名和实参列表。
先令
在函数库中寻找该函数名所对应的函数,遇到函数名相同的,判断参数数量和类型是否相同。我的程序中用了重载 == 运算符来判断。
对于百搭的 T 类型,可以直接 continue 掉。我的另外一篇题解有这种思路的详细解释。
只要匹配上的函数库中的函数,
这样,你就可以写出程序了!
千万不要抄,小心棕名!
xxxxxxxxxx
// 200D Programming Language
using namespace std;
struct functions
{
string name; // 名称
vector<string> ps; // 参数
};
bool operator ==(functions a, functions b)
{
if(a.name!=b.name)
return false;
if(a.ps.size()!=b.ps.size())
return false;
for(int i=0; i<a.ps.size(); i++)
{
if(a.ps[i]=="T")
continue;
else if(a.ps[i]!=b.ps[i])
return false;
}
return true;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n1; cin>>n1;
functions f[n1];
cin.get();
string s;
for(int k=0; k<n1; k++)
{
getline(cin, s);
int i=0;
while(s[i++]==' ') ; // 去除前面的空格
s.erase(0, i-1);
s.erase(0, 4); // 去除前面的void
i=0;
while(s[i++]==' ') ; // 去除前面的空格
s.erase(0, i-1);
//cout<<s<<endl;
string name;
for(i=0; i<s.find("("); i++)
if(s[i]!=' ')
name+=s[i];
i++;
f[k].name=name;
string type;
for(; i<s.size(); i++)
if(s[i]!=' ' && s[i]!=',' && s[i]!=')')
type+=s[i];
else if(s[i]==',' || s[i]==')')
{
f[k].ps.push_back(type);
type.clear();
}
}
/*
for(int i=0; i<n1; i++)
{
cout<<f[i].name<<endl;
for(int j=0; j<f[i].ps.size(); j++)
cout<<f[i].ps[j]<<",";
cout<<endl;
}
*/
int n2; cin>>n2;
map<string, string> v;
cin.get();
for(int i=0; i<n2; i++)
{
string s1, s2;
cin>>s1>>s2;
v[s2]=s1;
}
/*
for(int i=0; i<n2; i++)
cout<<v[i].type<<","<<v[i].name<<",\n";
*/
int n3; cin>>n3;
cin.get();
while(n3--)
{
getline(cin, s);
functions t;
int i=0;
while(s[i++]==' ') ; // 去除前面的空格
s.erase(0, i-1);
string name;
for(i=0; i<s.find("("); i++)
if(s[i]!=' ')
name+=s[i];
t.name=name;
//cout<<name<<endl;
i++;
string psn;
for(; i<s.size(); i++)
if(s[i]!=' ' && s[i]!=',' && s[i]!=')')
psn+=s[i];
else if(s[i]==',' || s[i]==')')
{
t.ps.push_back(v[psn]);
psn.clear();
}
int cnt=0;
for(int k=0; k<n1; k++)
if(f[k]==t)
cnt++;
cout<<cnt<<endl;
}
return 0;
}
All Rights Reserved 2022 Wang Zhanrui