黑马程序员技术交流社区

标题: 解释程序的运算结果 [打印本页]

作者: 黄飞1991    时间: 2014-3-14 15:31
标题: 解释程序的运算结果
本帖最后由 黄飞1991 于 2014-3-15 09:13 编辑

class LuckNumber
{
        public static void main(String[] args)
        {
                int[] arr = {1,2,3,4,5,6,7,8};

                int pos = -1;

                for(int x=0;x<arr.length-1; x++)
                {
                        for(int y=0; y<3;y++)
                        {
                                pos++;

                                if(pos==arr.length)
                                        pos=0;
                                while(arr[pos]==0)
                                {
                                        pos++;
                                        if(pos==arr.length)
                                                pos=0;
                                }
                        }
                        arr[pos] = 0;
                        //System.out.println(arr[pos]);
                }

                for(int x=0; x<arr.length; x++)
                {
                        if(arr[x]!=0)
                        {
                                System.out.println(arr[x]);
                                break;
                        }
                }
        }
}


程序运行的结果为什么是7,谁能把程序的流程详细解释一遍吗?


作者: chen_x    时间: 2014-3-14 16:18
可以用下面的方法打印一下for(int x=0;x<arr.length-1; x++)每次x循环完一次后,arr[]数组的取值变化:
class LuckNumber
{
        public static void main(String[] args)
        {
                int[] arr = {1,2,3,4,5,6,7,8};

                int pos = -1;

                for(int x=0;x<arr.length-1; x++)
                {
                        for(int y=0; y<3;y++)
                        {
                                pos++;

                                if(pos==arr.length)
                                        pos=0;
                                while(arr[pos]==0)
                                {
                                        pos++;
                                        if(pos==arr.length)
                                                pos=0;
                                }
                        }
                        arr[pos] = 0;
                        //System.out.println(arr[pos]);
                        sop(arr);
                }
        }
        public static void sop(int[] arr){
               for(int r=0;r<arr.length;r++){
                       System.out.print(arr[r]);
               }
               System.out.println("");
        }
        
}
运行结果是
12045678
12045078
02045078
02040078
00040078
00040070
00000070
结合代码解释的话,就是从数组的位置值pos=0起,开始数数组的非零元素,每数到第3个非零元素时,就将这第3个非零元素赋为0。每数到3个非零元素后,计数归1,重新开始从1数,但是是继续从当前pos位置数, 数到arr[7]结尾时再从arr开关数数。
之所以是数非零元素,可以看代码里遇到arr[pos]==0时,pos++但是y值没变, 也就是不计数,该位置跳过。
这样解释应该是对的吧?
作者: 张贺    时间: 2014-3-14 17:02
第一次外循环时,内循环执行时pos的值依次为0,1,2,此时pos既不等于数组的长度,对应的数组值也

不为0,内循环只执行了pos++,结束后,arr[2]=0;
第二次外循环时,内循环执行时pos的值依次为3,4,5,此时pos既不等于数组的长度,对应的数组值也不

为哦,内循环只执行了pos++,结束后,arr[5]=0;
第三次外循环时,内循环执行时pos的值依次为5,7,8,当最后一次循环时,pos的值等于数组长度,所以

将pos=0;循环结束后,arr[0]=0;
第四次外循环时,内循环第一次执行时,pos的值为1,即不满足pos等于数组长度,也不满足arr[1]=0,第

二次执行时,arr[2]=0,满足while循环,所以对pos进行自增,pos=3,第三次执行时只执行了pos++,所以

内循环结束后pos=4,所以arr[4]=0;
第五次外循环时,内循环第一次执行,pos自增为5,满足while循环条件即arr[5]=0,所以pos进行自增为6

,第二次执行时,循环只执行了pos++,pos值为7,第三次执行时pos值为8,满足等于数组长度,执行pos=0

。然后又满足while循环条件即arr[0]=0;所以pos++为1,循环结束,arr[1]=0;
第六次外循环时,内循环第一次执行时,pos自增为2,满足while循环pos自增为3,第二次执行时,pos为4

满足while循环条件,所以pos自增为5,继续满足循环条件,pos自增为6,第三次执行时,只执行了pos++,循环结束pos值为7,arr[7]=0;
第七次外循环时,内循环第一次执行时,pos自增为8,满足等于数组长度,pos=0,且满足while循环pos自

增为1,继续满足循环条件,pos自增为2,继续执行循环,pos为3,不满足结束while循环,第二次执行时,pos自增为4满足while循环知道pos为6时,结束while循环,第三次循环,while会不断循环,直到pos为3时,不满足条件结束循环,此时pos为3,arr[3]=0。外循环结束,此时数组的值为{0,0,0,0,0,0,7,0}
所以当进行最后的循环时只有7满足条件。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2