敬请期待后续 嵌套循环打印正三角形星星阵●学渣的自我救赎第一期

嵌套循环打印正三角形星星阵●学渣的自我救赎第一期(敬请期待后续)老师是怎么做的? 我的想法真的行不通吗?
最开始的想法 为什么会出错呢?
一开始想的是先把空格存到empty里面去,然后再将empty和星星一起输出,废话不多说贴代码
//用*打印一个奇数正三角形(最初的错误)for(int i = 0;i < 4;i++) {for(int j = 0;j < 2*i+1;j++) {String empty = null;//用于计算每一行所需空格for(int k = 0;k < i;k++) {//左边i个,右边i个//再加上中间的*刚好2*i+1个字符empty = (empty == null?"":empty + "");//根据i的值循环加上空格}System.out.println(empty + "*" + empty);}System.out.println();}
输出结果惨不忍睹
太糗了,我自己实在是想不出来,只好先看看老师的做法
老师是怎么做的?
【敬请期待后续嵌套循环打印正三角形星星阵●学渣的自我救赎第一期】简单描述一下老师的思路:
1.数清楚每一行的空格和星星
2.开两个平行的内层循环先打空格再打星星(注意要去掉换行)
3.完成
我得到了些什么?
等下,**先把空格打出来!**我怎么没想到呢不好意思 冷汗 尴尬,我试试吧
//用*打印一个奇数正三角形for(int i = 0;i < 4;i++) {//行→0,1,2,3for(int k = 0;k < 3-i;k++) { //列→3,2,1,0(空格数量)//for(int k = i+1;k < 4;k++) { //老师的思路:i越大,k越小//1.先打空格(易发现i+k=3,所以k=3-i个空格)System.out.print(" ");}for(int j = 0;j < 2*i+1;j++) {//列→1,3,5,7(*的数量)//2.再打*System.out.print("*");}System.out.println();}
贴图贴图!!!
能打出来我是很开心的,但是又有些郁闷:为什么我的想法不行呢?我觉得没问题呀
于是我又转头研究之前那个乱七八糟的代码了
我的想法真的行不通吗?
带着这个问题,我好好地审视了自己的代码,倒真让我发现了几个问题:
我的发现1
每一行的空格数量都不一定,去发现它与行数的关系固然是最便捷的方式,谁让我一开始没想到呢笑哭 哭笑 笑出眼泪 破涕为笑 笑死 笑尿 笑cry
我一开始想到的是:无论每一行怎么变,有一个地方永远不会动,那就是中轴线(第四个字符的位置永远是星星),那我从中轴线开始数不就行了?
抱着这样的想法我发现了从中轴线往左数的空格是有规律的:i越大,空格越少,而且无论怎样**“i+空格”的数目永远是4**(也就是中轴线的位置),那空格的数目不就是4-i嘛!
话不多说代码敲起来!
//用*打印一个奇数正三角形(我的想法调试版)for(int i = 0;i < 4;i++) {for(int j = 0;j < 2*i+1;j++) {String empty = null;//用于计算每一行所需空格for(int k = 0;k < 4-i;k++) {//左边i个,右边i个//再加上中间的星星刚好2*i+1个字符(错误错误!!!)//光是星星就2*i+1了,加上空格就更不止了!!!//所以应该是.....我乱了~暴风哭泣//先试试4-i吧empty = (empty == null?" ":empty + " ");//根据i的值循环加上空格}System.out.print(empty + "*" + empty);}System.out.println();}
贴图贴图!!!

敬请期待后续  嵌套循环打印正三角形星星阵●学渣的自我救赎第一期

文章插图
有点头绪了,再看看哪里需要改进呢?
我的发现2
在和老师的讨论中我发现了,前面都是对的,就是后面的空格有点多,仔细想想是因为它
System.out.print(empty + "*" + empty); //多余的empty
为了追求与图形一致的对称感,**我盲目地在后面也加入了空格,导致了每个星星的后面都有空格,间隙可不就变大了嘛!**于是我改了一下
System.out.print(empty + "*");//删去了后面的empty
疯狂贴图!!!
em…好像好了点,但还是有问题
我的发现3
每个星星的前面也有空格不好意思 冷汗 尴尬事实上只需要第一个星星的前面挨着empty就行了
那咋办呢(摊手)继续造呗~
//用*打印一个奇数正三角形(我的想法完成版)for(int i = 0;i < 4;i++) {int virgin = 1;//判断是否为第一次进入内层循环for(int j = 0;j < 2*i+1;j++) {//int virgin = 1;//不能定义在这里,否则每一次进入都初始化为1,无法判断是否第一次String empty = null;//用于计算每一行所需空格for(int k = 0;k < 4-i;k++) {//左边i个,右边i个//再加上中间的星星刚好2*i+1个字符(错误错误!!!)//光是星星就2*i+1了,加上空格就不止了!!!//所以应该是.....我乱了~暴风哭泣empty = (empty == null?" ":empty + " ");//根据i的值循环加上空格}if(virgin == 1) {//请不要去百度virgin的意思谢谢(手动围笑)System.out.print(empty + "*");//如果是第一次,就接emptyvirgin = 0;}else {System.out.print("*");//如果不是第一次,就只打星星就好了}}System.out.println();}
把图给我贴上来!!!
搞定了,可把我累死了,费这么大力气打出来的代码还不如老师那几行简短有力…我哭了~你呢