UVA1597--Bug Hunt
来源:互联网 发布:应象中医 知乎 编辑:程序博客网 时间:2024/05/16 13:03
题目:
输入并模拟一段程序,输出第一个bug所在的行。每行程序有两种可能:
数组定义:格式为arr[size],例如a[10];
赋值语句:格式为arr[index]=value,例如a[0]=3或者a[a[0]]=3
赋值语句可能会出现两种bug:下标index越界,使用未初始化变量。
思路:
定义数组类Array,包含长度,已经赋值的下标集合map,所有的数组用map处理,key未数组名,value为对应的Array对象。
采用递归求值,求值过程中判断是否出错。最后判断赋值和声明时是否出错。
代码如下:
#include<iostream>#include<string.h>#include<string>#include<vector>#include<sstream>#include<cctype>#include<map>using namespace std;class Array {//一个数组,包含长度和已经赋值的下标public: Array(int l = 0) : len(l) {} int len;//长度 map<int, int> value;//赋值的下标};map<string, Array> mmap;//存储声明的数组bool flag = true;//获得数组的名字string getName(string str) { return str.substr(0, str.find_first_of('['));}//获取[]中的内容string getValue(string str) { int pos1 = str.find_first_of('['); int pos2 = str.find_last_of(']'); return str.substr(pos1 + 1, pos2 - pos1 - 1);}//递归获得值int getNum(string str) { if(isdigit(str[0])) { int pos = 0; stringstream ss(str); ss >> pos; return pos; } else { string name = getName(str); int pos = getNum(getValue(str)); if(!mmap[name].value.count(pos)){ flag = false; return 0; } return mmap[name].value[pos]; }}//添加节点bool addArray(string str) { string name = getName(str); flag = true; int len = getNum(getValue(str)); if(!flag) return false; mmap[name] = Array(len); return true;}//处理赋值等号前半部分bool dealFront(string str_front, int &pos_f){ string name = getName(str_front); flag = true; pos_f = getNum(getValue(str_front)); if(!flag) return false; if(mmap[name].len <= pos_f) return false; return true;}//处理赋值等号后半部分bool dealBack(string str_back, int &value_b){ flag = true; value_b = getNum(str_back); if(!flag) return false; return true;}//赋值bool massign(string row) { int equelpos = row.find_first_of('='); string str_front = row.substr(0, equelpos); string str_back = row.substr(equelpos + 1); int pos_f = 0; int value_b = 0; if(!dealFront(str_front, pos_f)) return false; if(!dealBack(str_back, value_b)) return false; string name = getName(str_front); mmap[name].value[pos_f] = value_b; return true;}int main() { string str; while(cin >> str) { if(str[0] == '.') break; mmap.clear(); vector<string> vv; vv.push_back(str); string ss; while(cin >> ss) { if(ss[0] == '.') break; vv.push_back(ss); } int pos = 0; for(int i = 0; i < vv.size(); i++) { string row = vv[i]; if(row.find_first_of('=') == row.npos) { //声明数组 if(!addArray(row)) { pos = i + 1; break; } } else { //赋值 if(!massign(row)) { pos = i + 1; break; } } } cout << pos << endl; } return 0;}
0 0
- UVA1597--Bug Hunt
- POJ 3524 Bug Hunt
- UVa 1596 - Bug Hunt
- UVa1596 - Bug Hunt
- 1596 - Bug Hunt
- UVa 1596 - Bug Hunt
- UVa:1596 - Bug Hunt
- 1596 - Bug Hunt【STL】
- UVa-1596-Bug Hunt
- UVA1596 Bug Hunt
- UVA 1596 Bug Hunt
- 1596 - Bug Hunt
- Bug Hunt UVA
- UVA 1596 Bug Hunt
- UVa 1596 - Bug Hunt(细节)
- 紫书章五习题九 Bug Hunt UVA 1596
- 5-9 UVA 1596 Bug Hunt找BUG
- 习题5-9 找bug(Bug Hunt, UVa1596)
- 136. Single Number 难度:easy
- VC8 常用代码汇编 返回值,入参,全局变量
- 欢迎使用CSDN-markdown编辑器
- UVA 6859 Points(凸包的应用)
- Mysql连接错误:Mysql Host is blocked because of many connection errors
- UVA1597--Bug Hunt
- 火柴盒高仿源代码下载,以及视频教学
- php使用mongoclient简单操作mongodb数据库
- pageControll的使用
- 数据结构之【图】
- mysql进阶(二十七)数据库索引原理
- Blog 搭建参考
- 传值与传址 static 继承
- 对libevent+多线程服务器模型的C++封装类 转载