这题只是一道很恶心的字符串处理。放轻松,没有什么深奥的算法。也考察了对于结构体的理解。
先建立一个结构体。结构体的第一个成员是函数的名称,第二个成员是函数的参数类型列表。用 vector 存储。
首先输入
xxxxxxxxxxcin.get();把换行符吃掉。
特别注意,以下三个部分的调用,都用可读取空格的 getline 函数。
具体写法:
xxxxxxxxxxgetline(cin, 字符串名称);先 getline 一个字符串,称之为
先去除字符串最前面的空格。
再用 erase 函数去掉函数类型 void。
再次去除最前面的空格。
在读到表示参数的左括号前,先将函数名保存下来。 还是注意,要忽略空格。
将当前函数的 name 先保存进函数的结构体数组。
接下来,对于每个字符,只要其不是 空格,逗号,右括号, 就将其加入当前函数的参数列表中。
遇到逗号,就说明马上要开始有一个新参数了。
遇到右括号,那么当前函数的处理就大功告成了!
还是相同的方法,读入
xxxxxxxxxxcin>>s1>>s2;就可以读进变量类型和变量名称。用一个哈希表 map,就可以存储变量的相关信息。
按照 Part 1 的类似办法,读入每一个处理调用信息。 读取函数名和实参列表。
先令
在函数库中寻找该函数名所对应的函数,遇到函数名相同的,判断参数数量和类型是否相同。我的程序中用了重载 == 运算符来判断。
对于百搭的 T 类型,可以直接 continue 掉。我的另外一篇题解有这种思路的详细解释。
只要匹配上的函数库中的函数,
这样,你就可以写出程序了!
千万不要抄,小心棕名!
xxxxxxxxxx// 200D Programming Languageusing 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