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;
}

浙公网安备 33010602011771号