前些天做循环嵌套练习,打印99乘法表。
并且练习了老师所说的“不是规律的规律”——
打印三角形尖朝上:改变内循环条件,使其随外循环初始值的变化而变化;
打印三角形尖朝下:改变内循环初始值,使其随外循环初始值的变化而变化;
99乘法表代码如下:
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(); }
这样的写法好处是:
内外循环的条件及循环后操作语句格式比较统一,方便阅读。
但后来发现,如果我想打印一次99表的镜像,这个不是规律的规律则不好用了。
需求:
本体:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
----------------------------------
镜像:
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*4=4 2*4=8 3*4=12 4*4=16
1*3=3 2*3=6 3*3=9
1*2=2 2*2=4
1*1=1
在这个例子里,因为如果单纯的用“尖朝下”规律来进行改动的话,并不能打印出镜像。
所以我的做法是——
先来看成功的镜像代码:
for(int x=9; x>=1; x--) { for(int y=1; y<=x; y++) { System.out.print(y+"*"+x+"="+x*y+"\t"); } System.out.println(); }
然后开始分析:
首先通过简单的文本复制粘贴,得到需要打印的镜像图形。
因为打印输出语句
System.out.print(y+"*"+x+"="+x*y+"\t"); } System.out.println();
这部份是不变的,内循环打印语句打印x和y的乘法算式,外循环打印语句负责换行。
由第一句得出,算式中首先出现的数值是y,然后是*,再其次是x,最后是=和乘积。
然后根据第一行图像得出,y的值在进行自增。并且从1增加到9然后停止。
于是得出结论,内循环语句写法应为:
for(int y=1; y?; y++)
此时内循环条件还不确定。
这时来看第一列。
y不变,x的值在进行自减,从9减到1然后停止。
于是得出结论,外循环语句写法应为:
for(int x=9; x>=1; x--)
这个时候代码基本成型:
for(int x=9; x>=1; x--) { for(int y=1; y?; y++) { System.out.print(y+"*"+x+"="+x*y+"\t"); } System.out.println(); }
由于知道内循环中,y的值为自增,初步判断条件应为
y<=9
但这样写会出现一个问题,最终打印的结果会是一个矩阵,而不是99表镜像。
原因如下:
当第一行打印完毕后,条件不满足跳出内循环,到外循环开始执行x=8的打印。
这时,条件满足后跳入内循环,由于y初始化值为1,条件为y<=9,所以语句会将y的值从1到9再打印一次,
这样第二行的元素数(列数)依然为9.
以此类推,最终会变成打印出9*9的乘法算式矩阵。
所以。
为了让内循环条件随着外循环的变化而变化,此时内循环条件应为:
y<=x
如此一来,当语句执行到内循环时,每行的元素数(列数)就会随着外循环的自减而依次减少。
最终完成镜像的打印。