C - 小型Basic编译器问题

include<bits/stdc++.h>

using namespace std;
struct node{
string s1;//s1: 指令类型(如LET、PRINT)
string s2;//s2: 指令操作
}p[101];//TinyBasic的程序最多只有100行

int var[555]={0};//// 存放变量值的数组
//例如C=7,则var[2]=7,因为'C'-'A'=2

int f(string s)// 接收表达式字符串,返回计算结果
{
// 情况1:表达式是"X+Y"(两个变量相加,格式固定为3个字符:变量+变量)
if(s[1]'+')
{
int index_1=s[0]-'A';//第一个变量的索引
int index_2=s[2]-'A';//第二个变量的索引
return var[index_1]+var[index_2];// 返回两变量之和
}
// 情况2:表达式是"X>Y"(两个变量比较,格式固定为3个字符:变量>变量)
else if(s[1]
'>')
{
int index_1=s[0]-'A';//第一个变量的索引
int index_2=s[2]-'A';//第二个变量的索引
if(var[index_1]>var[index_2]) return 1;// 若a>b,返回1(真)
else return 0;// 否则返回0(假)
}
//情况3:表达式是常数(如"123"或"-456")
else
{
if(s[0]=='-') //负数
{
s.erase(0,1);
int ans=stoi(s);
return -ans;
}
else //正数
{
int ans=stoi(s);
return ans;
}
}

}

int main()
{
int id;
while(cin>>id)// 读取指令:按行号存储到结构体数组p中,直到输入结束(EOF)
{
string s1;// 读取指令类型(如LET、PRINT)
string s2;// 读取指令操作
cin>>s1;
p[id].s1=s1;

    if(s1!="STOP")//此处注意
    {
        cin>>s2;//若指令不是STOP,读取指令操作
        p[id].s2=s2;
    }
}

for(int i=1;i<=id;i++)//此处id中存储的值为最后一次输入的值
{
    if(p[i].s1=="LET")//LET指令:赋值(格式:LET X=表达式)
    {
        // p[i].s2格式为"X=表达式"(如"X=A+B"或"X=123")
        int z=p[i].s2[0]-'A';// 例如获取变量名C,用表示2('C'-'A'=2)
        //跳过"X=",直接取后面的表达式(如"A+B"或"123")
        string new_s=p[i].s2;
        new_s=new_s.erase(0,2);
        var[z]=f(new_s);// 计算表达式并存储起来
    }

    else if(p[i].s1=="PRINT")
    {
        int z=p[i].s2[0]-'A';
        cout<<p[i].s2[0]<<'='<<var[z]<<endl;
    }

    else if(p[i].s1=="GOTO")
    {
        int z=f(p[i].s2);// 获取目标索引
        i=z-1;// 跳转到z行(因为for循环会i++,所以这里减1)
    }

    else if(p[i].s1=="IF")
    {
        // 若表达式为真(返回非0),继续执行下一行;若为假(返回0),跳过下一行
        if(f(p[i].s2)) continue;// 真:不跳过,直接i++(下一行)
        else i++;// 假:跳过下一行(当前i+1,for循环再i++,相当于跳过一行)
    }

    else
    {
        break; // 处理STOP指令,终止程序
    }
        
}
return 0;

}

posted @ 2025-11-18 08:44  W001hhhFA  阅读(0)  评论(0)    收藏  举报