UVa 1596 - Bug Hunt

来源:互联网 发布:软件开发外包靠谱吗 编辑:程序博客网 时间:2024/05/21 22:16

输入一段程序代码,要你找出bug,有两种bug,一是引用未赋值变量,二是下标越界。

思路:有两个map,一个用来记录每个元素对应的值,map<元素,值>,例如a[0]=>1,a[2]=>3,b[2]=>12之类的,前面的a[0],a[2],b[2]就是map的key,而值就是value

另外一个用来记录数组大小,形式是map2<a[,12>,其中a[表明是数组a,12是指大小

首先是声明数组,例如a[9]

我们切割字符串,取出a[,取出9,将两个构成键值对,存入map2中,于是其中就有a[=>9,说明了a数组的大小

然后是赋值语句,例如a[0]=1

首先根据等号切割,然后使用一个getvalue()函数,这个函数可以获取值(如果是整数,就返回整数本身,如果是元素,就查找map表,返回对应的值)

右边直接使用getvalue()就可以了,左边要先切割字符串,取出a[,然后用getvalue()获取对应0的值,当然0只是一个例子,它也可以是更复杂的元素嵌套,但是我们在可以在getvalue里面使用递归解决

在getvalue中我们要判断是否越界,这个越界判断只要跟map2比较就好了

如果没有越界,右边就是要赋的值

左边会得到a[0..9]的形式(也就是去除了嵌套)

最后将a[0..9]和值作为键值对加入map

package test;import java.util.HashMap;import java.util.Scanner;public class Test{static HashMap<String,Integer> map = new HashMap<String,Integer>();//记录a[0..9]对应的值static HashMap<String,Integer> map2 = new HashMap<String,Integer>();//记录a[]数组的大小static Integer getValue(String s){//获取值if(s.indexOf("[")==-1){//如果是数字,直接返回数字return Integer.valueOf(s);}//不是数字,说明是数组形式String s0 = s.substring(0, s.indexOf("[")+1);//获取数组的标记a[String s1 = s.substring(s.indexOf("[")+1,s.lastIndexOf("]"));//获取indexif(s1.indexOf("[")==-1){//如果index为数字,说明s是a[0..9]的形式if(map2.get(s0)==null || map2.get(s0)<=Integer.valueOf(s1)){//s1是否溢出System.out.println("下标溢出");System.exit(0);}if(map.get(s0+s1+"]")!=null){//是否初始化变量return map.get(s0+s1+"]");}else{System.out.println("该值未初始化");System.exit(0);}}else{//s是嵌套形式a[a[a[0...9]]]..int index = getValue(s1);//递归获取if(map2.get(s0)==null || map2.get(s0)<=Integer.valueOf(index)){//检查是否溢出System.out.println("下标溢出");System.exit(0);}if(map.get(s0+index+"]")!=null){return map.get(s0+index+"]");}else{System.out.println("该值未初始化");System.exit(0);}}return null;}static void getArr(String s){//记录数组和其大小map2.put(s.substring(0, s.indexOf("[")+1),Integer.valueOf(s.substring(s.indexOf("[")+1,s.indexOf("]"))));}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String line;while(!"end".equals((line=scanner.nextLine()))){if(line.indexOf("=")==-1){//说明是a[0..9]形式的数组声明getArr(line);}else{//说明是赋值String ss = line.substring(0,line.indexOf("="));//根据等号切割String s0 = line.substring(0,ss.indexOf("[")+1);String s2 = line.substring(ss.indexOf("[")+1,ss.lastIndexOf("]"));String s1 = line.substring(line.indexOf("=")+1);if(map2.get(s0)==null || map2.get(s0)<=getValue(s2)){System.out.println("下标溢出");System.exit(0);}map.put(s0+getValue(s2)+"]",getValue(s1));}System.out.println(map);System.out.println(map2);}scanner.close();}          }


0 0
原创粉丝点击