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

目标是获得一堆星星哈哈哈哈哈

最开始的想法

为什么会出错呢?

一开始想的是先把空格存到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,3
			for(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 + "*");//如果是第一次,就接empty
					virgin = 0;
				}else {
					System.out.print("*");//如果不是第一次,就只打星星就好了

				}
				
			}
			System.out.println();
		}

把图给我贴上来!!!
金星老师同款完美,嘻嘻
搞定了,可把我累死了,费这么大力气打出来的代码还不如老师那几行简短有力…我哭了~你呢

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值