题意
1.有t组数据,输入时每组数据之间空格隔开,输出时也要求空格隔开。
2.每组都是一行begin开始,一行end结束。
3.class ClassName[:Super] 表示声明一个类型,Super值存在时,说明它继承Super类型。
4.def ClassName.Method 表示声明ClassName类型的一个方法。
5.undef ClassName.Method 表示删除该类型下该方法。
6.call ClassName.Method 表示调用该方法,如果该类型本身没有该方法,就去看它祖先是否有。
可以用字符串string的函数处理,也可以用char处理(我写的姿势不是很好看,手动捂脸)。
说几个容易错的地方:。。其实姿势不同,会错的地方也不同。最口怕的是我WA在了把“oops"拼写成"opps"了QAQ。还有比如”.“不要写成”:“了!
1 #include<cstdio>
2 #include<cstring>
3
4 struct cla
5 {
6 char name[50];
7 int mnum;//num of method
8 char md[50][50];//method
9 int super;
10 } a[10050];
11 void read(char c,int &flag,char name[][50])
12 {
13 int k=0;
14 int len=0;
15 int cnt=0;
16 flag=1;
17 if (c=='b' ||c=='e') flag=0;//begin/end
18 while((c=getchar())&&c!='\n')
19 {
20 cnt++;
21 if (cnt==1 && flag)
22 {
23 if (c=='e') flag=2;
24 else if (c=='a') flag=3;
25 else if (c=='n') flag=4;
26 }
27 if (flag==1 && cnt>5 ||//class ClassName
28 flag==2 && cnt>3 ||//def ClassName.Method
29 flag==3 && cnt>4 ||//undef ClassName.Method
30 flag==4 && cnt>5 ||//call ClassName.Method
31 flag==5 )//class Sub:Super
32 {
33 name[k][len]=c;
34 if (c==':')
35 {
36 name[k][len]='\0';
37 len=-1;
38 k=1;
39 flag=5;
40 }
41 if (c=='.')
42 {
43 name[k][len]='\0';
44 len=-1;
45 k=1;
46 }
47 len++;
48 }
49 }
50 }
51
52 int check(int flag,int &mp,int &fp,char name[][50],int cnum)
53 {
54 int defined1=0,defined2=0;
55 int i,j;
56
57 for(i=1; i<=cnum; i++)
58 if (strcmp(a[i].name,name[0])==0)
59 defined1= i;
60 if (flag==1)
61 {
62 if(defined1) return -1;
63 return 0;
64 }
65 if (flag==5)
66 {
67 if(defined1) return -1;
68 else
69 {
70 for(i=1; i<=cnum; i++)
71 if(strcmp(a[i].name,name[1])==0)
72 defined1= i;
73 if (defined1==0) return -1;
74 return defined1;
75 }
76 }
77 if (!defined1) return -1;
78
79 int f=defined1,ok=0;
80 while(f!=0&&!ok)
81 {
82 for(j=1; j<=a[f].mnum; j++)
83 {
84 if (strcmp(a[f].md[j],name[1])==0)
85 {
86 defined2=j;
87 ok=1;
88 }
89 }
90 mp=defined2;
91 fp=f;
92 if(flag==3)f=a[f].super;
93 else f=0;
94 }
95
96 if (flag==2)
97 {
98 if (defined2) return -2;
99 }
100 else if (!defined2) return -1;
101 return defined1;
102 }
103
104 void work(int flag,int p,int mp,int fp,char name[][50],int &cnum)
105 {
106 if(flag==1)
107 {
108 cnum++;
109 strcpy(a[cnum].name,name[0]);
110 a[cnum].super=0;
111 printf("class %s\n",name[0]);
112 }
113 else if(flag==2)
114 {
115 if(p==-2)
116 {
117 printf("redef %s.%s\n",name[0],name[1]);
118 }
119 else
120 {
121 strcpy(a[p].md[++a[p].mnum],name[1]);
122 printf("def %s.%s\n",a[p].name,name[1]);
123 }
124 }
125 else if(flag==3)
126 {
127 printf("invoke %s.%s\n",a[fp].name,name[1]);
128 }
129 else if(flag==4)
130 {
131 memset(a[fp].md[mp],0,sizeof(a[fp].md[mp]));
132 printf("undef %s.%s\n",name[0],name[1]);
133 }
134 else if(flag==5)
135 {
136 cnum++;
137 strcpy(a[cnum].name,name[0]);
138 a[cnum].super=p;
139 printf("class %s:%s\n",name[0],name[1]);
140 }
141 }
142 int main()
143 {
144 int t;
145 scanf("%d ",&t);
146 while(t--)
147 {
148 int cnum=0;
149 int flag;
150
151 //mp 是该方法在该类型的方法里是第几个
152 //fp 是该方法的所属的类型是第几个
153 int mp,fp;
154 char c;
155 memset(a,0,sizeof(a));
156 while(~(c=getchar())&&c!='\n')
157 {
158 char name[2][50]= {"",""};
159 read(c,flag,name);
160 if(flag)
161 {
162 int p=check(flag,mp,fp,name,cnum);
163 if(p==-1)
164 printf("oops!\n");
165 else
166 work(flag,p,mp,fp,name,cnum);
167 }
168 }
169 printf("\n");
170 }
171 return 0;
172 }
1 #include <iostream>
2 #include <cstdio>
3 #include <map>
4 #include <string>
5
6 using namespace std;
7
8 int main()
9 {
10 map<string,string>fa;
11 map<string,int>cla;
12 map<string,int>me;
13 string s,first,cName,m,cm,super;
14 int t;
15 cin>>t;
16 while (t)
17 {
18 cin>>s;
19 if (s=="begin")
20 {
21 cla.clear();
22 fa.clear();
23 me.clear();
24 }
25 else if (s=="end")
26 {
27 t--;
28 cout<<"\n";
29 }
30 else if (s=="class")
31 {
32 cin>>first;
33 int i=first.find(':');
34 if (i==string::npos)
35 {
36 if (cla[first])
37 cout<<"oops!\n";
38 else
39 {
40 cla[first]=1;
41 cout<<s<<" "<<first<<"\n";
42 }
43 }
44 else
45 {
46 super=first.substr(i+1);
47 first=first.erase(i);
48 if (cla[super]==1 && cla[first]==0)
49 {
50 cla[first]=1;
51 fa[first]=super;
52 cout<<s<<" "<<first<<":"<<super<<"\n";
53 }
54 else
55 cout<<"oops!\n";
56 }
57 }
58 else if (s=="def")
59 {
60 cin>>first;
61 cName=first.substr(0,first.find('.'));//sub str before .
62 if (cla[cName]==0)
63 cout<<"oops!\n";
64 else
65 {
66 if (me[first]==1)
67 cout<<"redef "<<first<<"\n";
68 else
69 {
70 me[first]=1;
71 cout<<s<<" "<<first<<"\n";
72 }
73 }
74 }
75 else if (s=="undef")
76 {
77 cin>>first;
78 if (me[first]==0)
79 cout<<"oops!\n";
80 else
81 {
82 me[first]=0;
83 cout<<s<<" "<<first<<"\n";
84 }
85 }
86 else if (s=="call")
87 {
88 cin>>first;
89 m=first.substr(first.find('.'));
90 cName=first.substr(0,first.find('.'));
91 cm=first;
92 while(me[cm]==0 && (!cName.empty()))
93 {
94 cm=fa[cName]+m;
95 cName=fa[cName];
96 }
97 if (cName.empty())
98 cout<<"oops!\n";
99 else
100 cout<<"invoke "<<cm<<"\n";
101 }
102 }
103 return 0;
104 }