黑马程序员技术交流社区
标题:
数组的问题
[打印本页]
作者:
陈林阳
时间:
2011-9-15 20:40
标题:
数组的问题
class ArrayDemo
{
public static void main(String[] args)
{
int[] a ={2,5,3,9,6,1,8};
int x;
for(x =0;x<a.length-1;x++)
{
for(int y =x+1;y<a.length;y++)
{
if(a[x]>a[y])
{
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
}
}
System.out.println(a[x]);
}
}
取数组中的最大值,通过这个程序可以取出最大值,可是我不知道为什么最后的输出语句上是a[x],x不是x<a.length-1吗?那么a[x]就应该是数组中倒数第二个啊,可是它的取值却是最后一个,还有System.out.println(a[x])语句在for循环外,for循环里的x的变化不是只在循环里有效吗?那么循环外a[x]的x就应该是只定义了int,而没有取值范围的啊?请大家帮我详细解释下,谢谢
作者:
杜桂发
时间:
2011-9-15 20:50
楼主,你那个代码是排序用的,求最大值应该是这样:
public static void max(int [] arr)
{
int max=arr[0];
for(int x=0;x<arr.length;x++)
{
if(arr[x]>max)
max=arr[x];
}
System.out.print("max="+max);
}
调用max把你的数组作参数就可以得出你数组里的最大值.求最大值的思路是这样的:把数组第一个元素的值赋给变量max,并遍历数组用数组每一个元素与max比较,当有比max大的值时,把该值赋给max.
[
本帖最后由 杜桂发 于 2011-09-15 21:11 编辑
]
作者:
匿名
时间:
2011-9-15 21:38
标题:
回复 藤椅 的帖子
x<a.length-1, a.length-1不是最后一个吗?那么x<a.length-1的话,x最大也就是倒数第二位的啊 ,把你的运行出来的x是6,也就是最后一位,可是按照x<a.length-1,a[x]应该是倒数第二位的
作者:
匿名
时间:
2011-9-15 21:47
你这个是 排序,,大的数排后,,
这里输出 a[x] ,,为正确值,是因为,x在等于5时,又++了,只是没满足<a.length-1而再执行循环。。
还有,这里的x的声明是在循环外的,所以最后的输出语句依然能访问。。而在循环里赋值,那怕这循环不执行 x 也=0,,
作者:
匿名
时间:
2011-9-15 22:26
楼主的这个程序可以实现数组从小到大的排序,并把数组最后一个元素打印出来,看楼主的代码[code]for(x =0;x<a.length-1;x++)
{
for(int y =x+1;y<a.length;y++)
{
if(a[x]>a[y])
{
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
}
} [/code]楼主定义的数组中实际有7个元素,当x=5时,程序执行完循环代码后加一,即x=6,在执行判断语句x<a.length-1,不成立,跳出循环,此时x=6,故打印的是最后一个元素.
作者:
匿名
时间:
2011-9-16 16:09
a[x]是在第一个for外显示的,所以x++后,a【x】就是最后一个了。你不妨把System.out.println(a[x]); 他移动到两个for中间,那就只显示6个数了。你的x定义在for外所以System.out.println(a[x]); 能在for外显示。个人理解,有错指教
作者:
匿名
时间:
2011-9-16 23:22
我同意7楼lily的回答
先回答你的第二个问题:System.out.println(a[x])语句在for循环外,for循环里的x的变化不是只在循环里有效吗?那么循环外a[x]的x就应该是只定义了int,而没有取值范围的啊?
这涉及到一个变量的作用域的问题,x变量的作用域从它定义的位置起,到main()函数结束,所以在for语句中是可以访问到x变量并对其值做修改的。
然后第一个问题:为什么最后的输出语句上是a[x],x不是x<a.length-1吗?那么a[x]就应该是数组中倒数第二个啊,可是它的取值却是最后一个
你应该这样理解,程序为什么会跳出for循环,是因为x<a.length-1这个条件不满足,所以跳出for循环的时候x=a.length-1,而不是x=a.length-2,反过来想,当x=a.length-2时此时满足x<a.length-1这个条件,所以不会跳出for循环,会再循环一次,执行x++后,x=a.length-1,此时不满足x<a.length-1这个条件所以跳出了for循环,所以在跳出for循环的时候x=a.length-1,a[x]是数组的最后一个元素
作者:
李叶
时间:
2011-9-17 08:57
呵呵,这个问题分两个部分解释一下吧:
===========================分割线===========================
首先,对于x的取值问题,楼上的贾双涛童鞋已经回答的很正确了,在此我们先把结论提取出来:
一个变量,只要是在它的作用域内,任何语句对它进行修改或者访问的时候,操作的都是同一个变量
那么,什么是变量的作用域呢?
为了方便讲解,咱们先看一下下面两段代码吧:[code=java]//代码1
public void printX() {
int x; //在for循环之外定义了x
for(x=0; x<10; x++) { //在for循环之中改变x的值
//... //本处代码略,下同
}
System.out.println(x); //在for循环之外打印x的值
} [/code][code=java]//代码2
public void printX () {
for (int x=0; x<10; x++) { //在for循环之中定义x和改变x的值
//...
}
System.out.println(x); //在for循环之外打印x的值
}[/code]如果你实际测试一下的话,你就会发现
代码1中的x可以被正常打印出来,而代码2则会编译报错
这是为什么呢?其实只需要简单观察一下代码,我们就可以发现
代码1中的x是在printX方法之中(也就是for循环之外)定义的,而代码2中的x是在for循环之中定义的
所以,代码1中的x就能在整个printX方法中使用,而代码2中的x就只能在for循环之中使用
所以,我们就可以说,代码1中的x的作用域就是整个printX方法中,而代码2中的x的作用域就只有for循环中
所以,我们再回来看一下你的代码吧:[code=java]public static void main(String[] args) {
//...
int x;
for(x =0;x<a.length-1;x++) {
//...
}
System.out.println(a[x]);
} [/code]我们可以很清楚的看到,由于x是在main方法中定义的
所以,我们就可以说,你的代码中的x的作用域就是整个main方法中
好了,我们再结合一开始所说的那句话来重新理解一下你的程序吧:
一个变量,只要是在它的作用域内,任何语句对它进行修改或者访问的时候,操作的都是同一个变量
之前我们已经说过了,在你的代码中,x的作用域是在整个main方法中的
而for语句和下面打印a[x]的语句也是存在于main方法之中的
所以,for语句和打印a[x]的语句就都在x的作用域内
因此,for语句对x的修改,修改的就是在main方法中定义的这个x
而下面打印a[x]的语句中访问的x,访问的也是在main方法中定义的这个x
所以,在for语句中对x的修改,就可以被下面的a[x]访问到,因为它们操作的都是同一个x
===========================分割线===========================
然后我们再来看一下第二个问题,其实这个问题很简单,我只要写一段等价的代码,你应该就明白了[code=java]//for循环的代码
for(x =0;x<a.length-1;x++) {
...
}
//等价的代码
x = 0; //首先为x赋初始值
while (x<a.length-1) { //然后循环判断x的值是否满足条件
...
x++; //最后再执行x++
}[/code]从等价的代码可以看到,
x++实际上是每次循环结束后才执行的
然后就还是楼上贾双涛童鞋的解释了:
当x=a.length-2的时候,while条件满足
于是执行循环中的语句,然后再执行x++,此时x=a.length-1
然后继续判断while条件,由于不满足,于是跳出循环
此时x就已经是a.length-1了,所以a[x]就是数组中的最后一个元素
[
本帖最后由 李叶 于 2011-09-17 09:01 编辑
]
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2