java空心金字塔详解(增强for循环的能力)

空心金字塔详解(锻炼for循环思维能力)

1. 打印一个矩形以高度5为例 输出*

(1)最简单的方法 ,单层循环实现

For(int i = 1;i<=5;i++){

System.out.print(“*****”);

}

2e7a364c1c22c476bd8d513c743c0fae2f0cc711?

(2) 双层循环的使用

正确代码:

6d528361f7b371af62db9a92604f4a7d28dfb575?

第一位同学也有自己的想法

ae6a1b22562c74ccdd2976506bd8001ccd09431e?

可是打印出来的结果却是错误的:

e4ac63b430aa59ceabce4bf2b3646eaf58782e68?

为什么呢?

首先呢我们要有一个双重循环的思维,如上图例子,有两重循环i和j,他们的程序运行顺序应该是:当i=1时,进入内层j循环,然后j不断地自增,直到j达到最大的时候,内层的第一层j就结束了,并同时开始了i的自增,i就自增为2,这个时候再次进入内层循环j,j再从1自增到最大后,i才可以继续自增成3,以此类推。

图中的System.out.print(“*”);语句的意思就是不换行的打印输出*,于是就会出现一横排*,

3b46b7d3b3dc34fba600a88b7e3bbb49f290408b?

他其实就是分为了五个部分,分别代表了i=1——5的情况。

主要原因就是在print 和println的区别上,前边网课我们大家都学习过print 和println的用法,print是正常打印输出,println则是换行输出。

第二位同学想,刚刚我只是因为没有换行,那我将print换成println不就可以啦吗,于是他又写了以下代码:

51383bcdffce953d4fa2b3e44f6fd8e8ccefcbee?

  这个时候我们又发现,为什么从一个横着的变成了一个竖着的*,这与我们要的矩形完全不达边。其实他与之前一样由红色线分为了五个部分,分别代表i从1到5,这“五层”,只不过println是每用内部循环j输出一个*就会进行换行操作,所以就会出现这种结果。

于是我们该如何改良呢?

我们就在第一位同学的代码基础上修改吧。

第一位同学输出不了矩形的原因就是他的行都连在一起了,我们需要把每一行都分清楚,那我们就可以想到了个办法:在每一行j结束之后进行换行操作不就可以了吗。

就像这样,我们把System.out.println(“”); 写在外层循环里面不就可以吗,每当j循环从1到5打印完成之后,System.out.println(“”); 都会执行一遍,这样就做到了换行的操作。

fa3d1b222c029b89c8dfc0dfa5b2324306911634?

 

 

于是我们就打印出来了矩形。

cb68cd2ece1934bf29ffa6349e37436fd1ac6af9?

Ps:当你打印输出的时候,矩形的长和宽都可以通过自己输入来进行调节,有兴趣的同学自己使用Scanner试一下。

2、 打印半个金字塔​

还是老方法,先用

for(int i = 1;i<=5;i++){

 

}

来把金字塔整体的高度先确定好

然后镶入内层循环j:

e6e4db9bc760052b220d8fd71775d88a92d85e48?

这个时候我们就开始找规律

观察半个金字塔图形发现:

8d90c0a1db771c06d3592b113ef9b346d7292f7a?

第一行 是1个*

第二行 是2个*

第三行 是3个*

第四行 是4个*

第五行 是5个*

每一层的*数量都与他的层数相等,就代表j需要打印到i个*

于是我们:

5574460a7a7c1512986f9d2ed26d16664855e2f9?

注意:千万不能忘记刚刚所学的换行。否则仍然是一条横着的*。

a9739f6f417b4c9ae824e368598811eacd92fe4e?

 

 

3、 打印一个全金字塔

首先呢,我们仍然是从图形中找规律。而全金字塔和半金字塔就不同了,半金字塔因为输出的都是*,所以不需要考虑其他符号,但是你观察图就会发现,每一行都比下一行少了*,那空余的地方我们该怎么办?可以用“ ”(空格)来表示,这个时候我们就可以在外层循环i和内层循环j的基础上,再加一个内层循环k来实现空格的打印输出,让j只负责打印输出*就可以啦。

12575ca12538ad8ab44e4cae3f6fa7c0fed54ecc?

这个时候我们就发现 :

第一层1个*   空格数 4

第二层3个*   空格数 3

第三层5个*​  空格数 2

第四层7个*   空格数 1

第五层9个*   空格数 0

 

也就是说,我们可以看出全金字塔每一层*的个数 j与他层数 i的关系可以表达为 j=2 x i - 1

而他空格的数量k 和层数的关系就是 k=5-i

于是我们就可以这样写代码:

194504d1f4d6d7c932bb0e6340f79345048491f7?

f22b36c80559258c12bcf8438add7ef3ac5d290c?

4、 打印一个空心金字塔

 还是老办法,先上图,看规律。

65d2e9f1734085e30af4c56b0814d6ca3f38d753?

我们可以看出他与全金字塔的哪些不同?

空心金字塔:只有外壳 ,内部没有*,底部*不变,每一行的第一个*和最后一个*打印输出。

 

这个时候我们想打印出空心金字塔的关键是就是*的打印,于是我们就看内层j循环,

for(int j=1;j<=2*i-1;j++){

 

​​​​}

由上面我们观察到每一行的第一个*和最后一个*都打印输出,而第一个*就是就j=1,最后一个*就是j=2*i-1。

于是我们可以在内层循环j中套一个if语句,来让每一行的第一个j和最后一个j输出*,而其他的j都输出“ ”(空格)

if(j==1||j==(2*i-1)){

System.out.print("*");

}else{

System.out.print("*");

}

 

这个时候我们打印输出:

60cd73b047554fc3d830d80a3d94e2b0e8b02b77?

这个时候我们就发现,这跟我们要得出来的空心金字塔还有一点不一样,就是他的底部没有*,这个时候我们就可以在if语句里面再添加一个条件:当层数i等于最后一层时候,输出*。

用语句表达就是:

if(j==1||i==5||j==(i*2-1)){

​​​​​System.out.print("*");

​​​​}else{

​​​​​System.out.print(" ");

​​​​}

这个时候我们再运行会发现,得到了我们想要的空心金字塔。

1025fcbe995038107fa0ca932836b3f08c92dea7?

 

5、 总结

以上就是关于循环打印输出金字塔的所有内容,这部分主要就是锻炼我们的循环逻辑能力,知道外循环和内循环的顺序关系,并通过对题目的分析来寻找规律,从而用代码来解决实际问题。这部分内容非常重要,一定要捋清楚外循环是在内循环自增完成之后再自增,然后内循环继续自增,以此类推。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值