【校赛】面条编程 C++

xiaoxiao2021-02-28  55

题目:

描述

面条编程语言仅由3种语句组成:PRINT、GOTO、END

定义如下:

PRINT [string]   :  程序输出[string],一个不含空格的字符串

GOTO [number]   :  程序跳转到行号为[number]的语句执行

END   :  程序结束

编写一个该面条编程语言的解释器,输入程序,输出程序运行结果,若程序不能正常结束(未执行到END语句),输出ERROR

输入

一段面条编程程序,由上述语句组合而成,行数不多于100000

输出

程序运行结果,即程序执行过程中PRINT语句输出的内容或ERROR

样例输入1 PRINT 1 GOTO 4 GOTO 2 PRINT ? END 样例输出1 1 ? 样例输入2 PRINT 1 GOTO 4 PRINT 3 PRINT 4 样例输出2 ERROR

思路:

看似很简单,只要getline然后判断就行。但是!题目有坑!题目没有给出什么时候结束输入!然后去问了一下学长,学长说是文件结束。就是,,会自动结束的意思。所以我放弃了getline。用while(cin>>)先输入前面的PRINT之类的词,然后如果第一个单词是P就输入一个字符,把字符放在结构体里。如果第一个单词是G,就输入一个数字,也放在结构体里。结构体中包含一个字符串,用于输出;两个整形,用于GOTO另一行以及判断是哪一个面条编程语句;还有一个逻辑型,用于判断有没有GOTO循环(这个我一开始没有想到,于是一直超时,还以为是输入的问题),GOTO循环就是第二句到第四句,第四句又重新到第二句。结束这一步后,用一个n来判断是否需要输出语句。假如已经输出过了ERROR,就不用输出那些字符串了。字符串我放在了一个动态数组里,当然也可以用队列。

代码:

#include<iostream> #include<string> #include<vector> using namespace std; struct ss { int a,to; string out; bool ph=0; }p[100001]; int main() { vector <string>qu; string shuru; int number=0; while(cin>>shuru) { number++; if(shuru[0]=='P') { p[number].a=1; string q; cin>>q; p[number].out=q; } if(shuru[0]=='G') { p[number].a=2; int q; cin>>q; p[number].to=q; } if(shuru[0]=='E') { p[number].a=3; } } int t=1; int n=0; while(t>0) { if(t>number||p[t].ph==1){n=1,cout<<"ERROR"<<endl;break;} p[t].ph=1; if(p[t].a==3)break; if(p[t].a==1)qu.push_back(p[t].out),t++; if(p[t].a==2)t=p[t].to; } if(n==0)//遍历动态数组,并输出。(嘛,想想还是队列简单点) { vector<string>::iterator it; for(it=qu.begin();it!=qu.end();it++) cout<<*it<<endl; } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2621825.html

最新回复(0)