【校赛】面条编程 C++

题目:

描述

面条编程语言仅由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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值