5-9 UVA 1596 Bug Hunt找BUG

题意:

输入很多行代码,找出这些代码中第一个错误的,代码就是C语言中的数组建立,数组元素的赋值。多组数据用'点'隔开,最后以点结束。


好恶心的题,只要类似这种,字符串操作的题目,我都会反感,但没办法,只能耐住性子一点一点找了一下午BUG(T T),

越是复杂的题目就得写的越规范,所以可以尝试采用紫书之前提到的“自顶向下,逐步求精”的方法。

因为自己在写的过程中,没想整体思路,而是一步一步的写的,导致自己越写越不规范,导致浪费了太多时间!


思路:

代码整体分为两类:

一是建立数组(字符串中没有等号),而是赋值,中间有等号,

所以,我建立了一个结构体数组,当作数组,里面有siz代表数组大小,还有一个map<int,int>代表数组元素键和键值。

建立数组,就是结构体初始化的过程!

赋值就是给map加入东西的过程!

建立数组的代码肯定是正确的,直接建立。关键是赋值,把等号分割开,左边一部分,右边一部分,分别处理。


自己的代码自己都不想看了,写的比较丑,相当于硬凑出来的!


代码如下:


#include<string>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<map>
#include<cstdio>
#include<vector>
#include<sstream>
using namespace std;
const int maxn = 1000 + 5;
map<string,int>id;
vector<string>result[2];
int resul,res2,cnt_id=0;
struct vars{
    int siz;
    map<int,int>value;
}var[maxn];
int to_digt(const string &s){
    int v =0;
    for (int i = 0; i < (int)s.size(); ++i)v=v*10+s[i]-48;
    return v;
}
int solve2(string s,int way){
    for(int i = 0; i < (int)s.size(); ++i)if (s[i]=='['||s[i]==']')s[i]=' ';
    stringstream ss(s);
    vector<string>String;String.clear();
    string code;
    while(ss >> code)String.push_back(code);
    int val=to_digt(String[String.size()-1]),val_flag=to_digt(String[String.size()-1]);
    if (String.size()==1){res2=val;return 1;}
    for (int i=String.size()-1; i > 0; --i){
        string str = String[i-1];int idd= id[str];
        if(var[idd].siz <= val) return false;
        if (way==2){if (!var[idd].value.count(val))return false;}
        else {if (i>1 && !var[idd].value.count(val))return false;}
        val = var[idd].value[val];
        if (i>1)val_flag=val;
    }
    result[0].clear();result[1].clear();
    if (way==1){resul=val_flag;result[0].push_back(String[0]);}
    else res2=val;
    return true;
}
int solve(string s){
    int m = s.find("=");
    if (m == -1){
        int m1=s.find("["),m2=s.find("]");
        string s1=s.substr(0,m1),s2=s.substr(m1+1,m2-2);
        id[s1]=++cnt_id;
        var[id[s1]].siz=to_digt(s2);
        return 1;
    }else{
        string bef=s.substr(0,m);
        string aft=s.substr(m+1);
        int a2=solve2(aft,2),a1=solve2(bef,1);
        if(a1 && a2){
            int val =res2;
            var[id[result[0][0]]].value[resul]=val;// fuzhi
            return 1;
        }return 0;
    }
}
int main(){
    string s,t;
    int cnt_cont=0;
    while(cin >> s && s != "."){
        bool bug=false;
        if(!bug)++cnt_cont;
        if (!bug)if (!solve(s))bug=true;
        while(cin >> t && t != "."){
            if (!bug)++cnt_cont;
            if (!bug)if (!solve(t))bug=true;
        }
        if (!bug)printf("0\n");
        else printf("%d\n",cnt_cont);
        cnt_cont=0;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值