ZOJ 3480 Duck Typing

传送门: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值