P2830 写程序

题目背景

zrz在写程序,他叫你帮他看看他的程序有没有问题。

题目描述

有一个若干行的程序,每一行只有一个命令,可能出现的命令有一下几种

int a[maxn] 声明一个数组,开头一定是int,不会是别的什么longlong之类的,a是指一个数组的名称(不一定是a,也有可能是别的字母或者多个字母,总之长度不超过10),后面是一个中括号和一个数字或一个变量,表示数组大小(从0到maxn-1,maxn<=100),数组声明之后里面的数均为0。

a[i] h 把h赋给a[i](也就是a[i]=h),同样h可能是一个数字或者是一个变量,i代表一个数字或者是一个变量。

cout h 输出h,h一定是个变量。

输入格式

若干行:每行一个命令

输出格式

对于每一个输出的命令(即cout),输出一行。如果在某一行发现有数组下标越界(切记,只可能出现这种错误,不会出现别的比如重定义之类的问题),不管是哪个命令,都要立即停止,无论下面有多少行命令都忽略,并输出-1。

输入输出样例

输入 #1

int a[10]
a[a[0]] 2
cout a[0]

输出 #1

2

输入#1

int a[10]
a[0] 10
cout a[0]
a[a[0]] 1
cout a[0]

输出 #2

10
-1

AC代码展示

如果觉得有用 就点赞+收藏 鼓励一下吧

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

string s1,s2; //一行中两部分字符串读取 用于后续解析 
int num,pos1,pos2;   //记录[]中解析式代表的真正的数字意义
//pos则分别表示 跟踪s1 s2字符产的解析位置 
unordered_map<string,unordered_map<int,int> > mp;
//每个数组的各个下标  -1下标代表数组的长度

string GetArrName(string &str,int &pos){  //取出数组的名字
	string s="";
	while(str[pos]!='[') s+=str[pos++];
	return s;
} 
int GetArrNum(string &str,int &pos){  //得到数组中表达式或数字中代表的具体值
	if(isdigit(str[pos])){   //直接为数字
		int res=0;
		while(isdigit(str[pos])) res=res*10+str[pos]-'0';
		pos++;
		return res;
	}
	string arr=GetArrName(str,pos); //若为数组嵌套 则递归取其中数字
	pos++;
	int res=GetArrNum(str,pos);
	pos++;
	if(res<0||res>mp[arr][-1]) return -1; //检查越界
	return mp[arr][res];
}

int main(){
	int flag=0;
	string arr;
	while(cin>>s1>>s2){
		if(flag) continue;
		num=pos1=pos2=0;
		if(s1=="int"){
			arr=GetArrName(s2,pos2);
			pos2++;
			num=GetArrNum(s2,pos2);
			//检查下标越界 
			if(num<0){
				flag=1;
				cout<<"-1"<<endl;
				continue;
			}
			mp[arr][-1]=num;
		}
		else if(s1=="cout"){
			num=GetArrNum(s2,pos2);
			if(num==-1){
				flag=1;
				cout<<"-1"<<endl;
				return 0;
			}
			cout<<num<<endl;
		}
		else{
			arr=GetArrName(s1,pos1);
			pos1++;
			num=GetArrNum(s1,pos1);
			int temp=GetArrNum(s2,pos2);
			if(num<0||num>=mp[arr][-1]){
				flag=1;
				cout<<"-1"<<endl;
				return 0;
			}
			mp[arr][num]=temp;
		}
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值