题意:
输入很多行代码,找出这些代码中第一个错误的,代码就是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; }