传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3480
大模拟,有如下的操作
class 建立a:b,如果a存在或b不存在,则输出oops!,否则定义类型a,a的父类型为b(如果b被输入的话)并输出class a(:b)
def 建立方法a.b,如果a不存在则输出oops!,否则如果a下有方法b则输出redef,否则建立方法a.b并输出def a.b
undef 删除方法a.b,如果a或b不存在则输出oops!,否则删除方法a.b并输出undef a.b
call 引用方法a.b,找方法的原则,在a下找方法b,如果找不到并a有父类型,则递归找父类型中的方法b,如果找到了输出invoke 类型.b,否则输出opps!
没什么别的细节
map大法好
代码如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
using namespace std;
int T;
int tot;
map<string,string> father;
map<string,int> s;
map<string,int> opr;
void Class()
{
string ch,ch2;
cin >> ch;
int p=ch.find(':');
if (p!=ch.npos)
{
ch2=ch.substr(p+1);
ch.erase(p);
if (s[ch]==0 && s[ch2]==1)
{
s[ch]=1;
father[ch]=ch2;
cout<<"class "<<ch<<':'<<ch2<<endl;
}
else
{
cout<<"oops!"<<endl;
}
}
else
{
if (s[ch])
{
cout<<"oops!"<<endl;
return;
}
else
{
s[ch]=1;
cout<<"class "<<ch<<endl;
}
}
}
void Def()
{
string ch,ch2;
cin>>ch;
int p=ch.find('.');
ch2=ch.substr(0,p);
if (s[ch2])
{
if (opr[ch])
{
cout<<"redef "<<ch<<endl;
}
else
{
opr[ch]=1;
cout<<"def "<<ch<<endl;
}
}
else
{
cout<<"oops!"<<endl;
}
}
void Undef()
{
string ch,ch2;
cin>>ch;
int p=ch.find('.');
ch2=ch.substr(0,p);
if (s[ch2])
{
if (opr[ch])
{
opr[ch]=0;
cout<<"undef "<<ch<<endl;
}
else
{
cout<<"oops!"<<endl;
}
}
else
{
cout<<"oops!"<<endl;
}
}
void Call()
{
string ch,ch2,op,now;
cin>>ch;
now=ch;
int p=ch.find('.');
op=ch.substr(p+1);
ch=ch.substr(0,p);
while ((!opr[now]) && (!ch.empty()))
{
ch=father[ch];
now=ch+'.'+op;
}
if (ch.empty())
{
cout<<"oops!"<<endl;
}
else
{
cout<<"invoke "<<now<<endl;
}
}
void make()
{
string op;
while (1)
{
cin>>op;
if (op=="begin")
{
father.clear();
s.clear();
opr.clear();
continue;
}
if (op=="end")
{
break;
}
if (op=="class")
{
Class();
continue;
}
if (op=="def")
{
Def();
continue;
}
if (op=="undef")
{
Undef();
continue;
}
if (op=="call")
{
Call();
continue;
}
}
}
int main()
{
scanf("%d",&T);
while (T--)
{
tot=0;
getchar();
make();
cout<<endl;
}
return 0;
}