1 Star 0 Fork 0

LLL2343 / vJudge

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
1596.cpp 4.37 KB
一键复制 编辑 原始数据 按行查看 历史
lll2343 提交于 2022-09-08 16:41 . 1596
#include<cstdio>
#include<string>
#include<vector>
#include<algorithm>
#include<bitset>
#include<iostream>
#include<stack>
#include<math.h>
using namespace std;
class Var{
public:
string name;
int len;
vector<int> element;
Var(string n,int l){
this->len = l;
this->name = n;
for(int i=0;i<this->len;++i){
this->element.push_back(-1);
}
}
bool OutOfRange(int k){
return k<0 || k>=len;
}
};
// 一个数组只会申明一次
// 用于存储所有的变量集合
vector<Var> Arr;
// bug类型
// case 1 : 数组下标出界
// case 2 : 使用一个未初始化的变量
int FindVar(string name){
int ix=0;
while(ix < Arr.size()){
if(Arr[ix].name == name){
return ix;
}
ix++;
}
return -1;
}
// 声明的时候用
void GetNameAndLen(string op,int begin,int end,string& name,int &len){
int ix = begin;
while(ix<end && op[ix] != '['){
if(op[ix] != ' '){
name += op[ix];
}
ix++;
}
cout<<"name in fun is "<<name<<" and ix is "<<ix<<endl;
ix++;
while(ix<end && op[ix] != ']'){
if(op[ix] != ' '){
len = len*10 + op[ix]-'0';
}
ix++;
}
}
int GetValue(string op,int begin,int end,stack<string>& spname){
int ix = begin;
string name;
int val = 0;
// 首先去除前置空格
while(ix<end && op[ix]==' '){
ix++;
}
if(op[ix] >='0' && op[ix] <= '9'){
// 这时已经是 数字类型 1..9
while(ix<end && op[ix]!=' ' && op[ix]>='0' && op[ix]<='9'){
if(op[ix] != ' '){
val = val*10 + op[ix]-'0';
}
ix++;
}
} else {
// 现在是数组变量取值
while(ix < end && op[ix] !='['){
if(op[ix] != ' '){
name += op[ix];
}
ix++;
}
spname.push(name);
ix++;
val = GetValue(op,ix,end,spname);
}
return val;
}
int main(){
string op;
int line = 0;
while(getline(cin,op)){
if(op[0]=='.'){
Arr.clear();
getline(cin,op);
if(op[0]=='.'){
break;
}
continue;
}
if(op.size()==0){
continue;
}
line++;
int equ_ix = op.find('=');
bool flag = true;
if(equ_ix == -1){
// 没有出现等号,则可以认为是声明
string name;
int len=0;
GetNameAndLen(op,0,op.size(),name,len);
Var var = Var(name,len);
Arr.push_back(var);
cout<<" name is "<<name<<" and len is "<<len<<endl;
}
else {
// 赋值操作
// 分为等号前和等号后,=的index是eqi_ix
stack<string> spname;
int val;
// 首先处理等号右边
val = GetValue(op,equ_ix+1,op.size(),spname);
//
// cout<<"val of right is "<<val<<" and spname.size = "<<spname.size();
// continue;
string cur;
int ix;
while(! spname.empty() ){
cur = spname.top();
ix = FindVar(cur);
if(ix == -1){
// 未声明变量
cout<<line<<endl;
flag = false;
break;
} else {
if (val < 0 || val >= Arr[ix].len){
// 下标越界
cout<<line<<endl;
flag = false;
break;
}
val = Arr[ix].element[val];
if(val == -1){
// 未声明的变量
cout<<line<<endl;
flag = false;
break;
}
}
spname.pop();
}
if(flag == false){
continue;
}
while(!spname.empty()){
spname.pop();
}
int equ_right = val;
// 等号左边
val = GetValue(op,0,equ_ix,spname);
// 此时应该留一个最后一个是赋值操作
while(spname.size()>1 ){
cur = spname.top();
ix = FindVar(cur);
if(ix == -1){
// 未声明变量
cout<<line<<endl;
flag = false;
break;
} else {
if (val < 0 || val >= Arr[ix].len){
// 下标越界
cout<<line<<endl;
flag = false;
break;
}
val = Arr[ix].element[val];
if(val == -1){
// 未声明的变量
cout<<line<<endl;
flag = false;
break;
}
}
spname.pop();
}
if(flag == false){
continue;
}
cur = spname.top();
ix = FindVar(cur);
if(ix == -1){
cout<<line<<endl;
} else {
if (val < 0 || val >= Arr[ix].len){
cout<<line;
}
Arr[ix].element[val] = equ_right;
}
// cout<<"equ_ix is "<<equ_ix<<endl;
// while(!spname.empty()){
// cout<<spname.top()<<endl;
// spname.pop();
// }
// cout<<"last val is "<<val << endl ;
//
}
}
return 0;
}
1
https://gitee.com/lll2343/v-judge.git
git@gitee.com:lll2343/v-judge.git
lll2343
v-judge
vJudge
master

搜索帮助