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
原创粉丝点击