黑马程序员技术交流社区

标题: 关于嵌套循环 [打印本页]

作者: 侯茂绵    时间: 2012-7-14 23:38
标题: 关于嵌套循环
本帖最后由 侯茂绵 于 2012-7-16 14:54 编辑

class ForFor99
{
public static void main (String[] args)
{
for(int x=1;x<=9;x++)
{
for(int y=1;y<=x;y++)
{
System.out.print(y+"*"+x+"="+x*y);
}
System.out.println();
}
}
}
我就是搞不清这个X和Y哪个代表行和列,所以经常打印这个(x+"*"+y+"="+x*y),跟99反啦
能不能具体解释下。。。搞晕啦

作者: 许瑞航老师    时间: 2012-7-14 23:53
楼主,你首先得知道,java里的程序都是一步一步执行的,并且了解for循环的原理,他是先初始化,判断条件,条件成立执行循环体,不成立跳出,当一循环体执行后,跳到赋值递增或者递减,得到的值再进行与条件判断匹配:
1、for (int i = 1; i < 10; i++)
  {
2、  for (int j = 1; j <10; j++)
      {
3、   System.out.print(i + "*" + j + "=" + i * j + "\t");
4、   }
5、   System.out.println();
6、 }
比如这个,
看步骤:
1、先声明一个int类型的变量i,并且初始化值为1,且设置i的取值范围不能超过9(包括9),条件成立;
2、然后带着i=1的值执行第二行语句,开始又声明一个int类型的变量j,初始值未1,且范围不超过i的值(包括的当前值1),条件成立,执行3、第三行语句,即输出:1*j=1*1,(引号的区别你应该知道),\t是个字符类型的变量值,你可以在前面声明char ch='\t',然后调用ch,也可以直接写"\t",效果是一样的,也就是跳格的意思,可以理解为打印一表,print就是不换行,意思是,如果还有下一条执行语句在执行输出的时候跟着这个语句最后字节后输出,
4、结果输出后,在跳到j++位置,执行j++,j的值就变成了2,再放入条件j<10中匹配,条件成立,执行第三行的语句,即输出:1*2=2;
5、然后一直到1*9的时候,输出1*9=9,这个时候,进行j++,在匹配的时侯就会发现j=10<10,条件不成立,即跳出当前for循环,也就是第二行的for循环,并且执行第五行的语句,进行换行,到此,第一行for循环的循环体已经执行过一次,然后执行i++,此时i=2,然后又开始想第一步一样开始往下执行,直到条件不成立时,跳出整个循环!最后输出了99乘法表!

作者: 黑马刘涛    时间: 2012-7-15 00:08
  1. class ForFor99
  2. {
  3.         public static void main (String[] args)
  4.         {
  5.                 for(int x=1;x<=9;x++)
  6.                 {
  7.                         for(int y=1;y<=x;y++)
  8.                         {
  9.                                 System.out.print(y+"*"+x+"="+x*y+" "); // 加个空格,打印好看些。但是你你没有弄反么
  10.                         }
  11.                         System.out.println();
  12.                 }
  13.         }
  14. }
复制代码

作者: 陈冲    时间: 2012-7-15 00:13
本帖最后由 陈冲 于 2012-7-15 00:16 编辑


上图是我的输出结果,想要搞清楚x,y的顺序问题,由九九乘法表可以看出:
这个程序需要首先将一行的数据输出完毕,才继续输出下一行,这是一次内循环;可以看出是a*b中的a在变,而内循环中变化的是y的值,x值保持不变;
一次内循环结束后,再执行一次外循环,x=x+1;
  1. class  ForFor99
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         /*
  6.         1*1=1
  7.         1*2=2    2*2=4
  8.         1*3=3    2*3=6    3*3=9
  9.         ……
  10.         */
  11.         for (int x=1;x<=9 ;x++ )
  12.         {
  13.             for (int y=1; y<=x;y++ )
  14.             {
  15.                 //首先输出每行(第x行)的数据,共有y个;然后继续外循环,输出第x+1行
  16.                 System.out.print(y+"*"+x+"="+y*x+"\t");//使用制表符'\t'能够实现输出时对齐
  17.             }
  18.             System.out.println();
  19.         }
  20.     }
  21. }
复制代码

作者: 程潇    时间: 2012-7-15 00:19
本帖最后由 jeffreyno1 于 2012-7-15 00:20 编辑

想确定哪个是行哪个是列,可根据for循环中的x、y取值来判断。
第一个for循环for(int x=1;x<=9;x++),x的最值是确定的值9,那么可以判断这个循环会执行9次
第二个for循环for(int y=1;y<=x;y++),y的最值依赖于x的取值,那么可以判断循环的次数会根据x的取值而变化
在99乘法表中,行数是确定的,一定是9行,列数是递增的。那么就可以判断x代表行,y代表列

至于详细的过程,你可以按照2楼兄弟介绍的,在eclipse里进行调试,单步执行,查看结果
作者: 侯茂绵    时间: 2012-7-15 00:38
许瑞航 发表于 2012-7-14 23:53
楼主,你首先得知道,java里的程序都是一步一步执行的,并且了解for循环的原理,他是先初始化,判断条件, ...

:handshake 其实代码意思还是懂的
就是外循环和内循环代表的哪个数没弄清楚 所以经常就打出
1*1
2*1  2*2
3*1  3*2 3*3
.....
作者: 侯茂绵    时间: 2012-7-15 00:39
陈冲 发表于 2012-7-15 00:13
上图是我的输出结果,想要搞清楚x,y的顺序问题,由九九乘法表可以看出:
这个程序需要首先将一行的数据输 ...

:D  懂啦  多谢
作者: 曹印亮    时间: 2012-7-15 00:51
第一:外循环控制行数,内循环控制每一行的列数,也就是一行中元素的个数
第二:毕老师说的是大圈套小圈理论,大圈管行,小圈管列
第三:还有个不是规律的规律,尖朝上,可以改变条件,让条件随着外循环变化
第四:尖朝下可以初始化值,让初始化随着外循环变化
99乘法表,尖朝上,该变内循环条件
class ForFor99
{
public static void main (String[] args)
{
for(int x=1;x<=9;x++)
{
for(int y=1;y<=x;y++)
{
System.out.print(y+"*"+x+"="+x*y
+"\t");
}
System.out.println();
}
}
}
你写的代码没什么错误,就是红色的部分加个制表符,打印时美观,你能搞定{:soso_e179:}{:soso_e112:}

1.jpg (36.81 KB, 下载次数: 27)

1.jpg





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