二重循环解题思路

本文通过一道习题,讲解做二重循环习题的思路:

 

题目:使用二重循环打印如下图形:


分析:首先要明确我们需要打印的种类有:字符串”*”,字符串”  ”(空格)。比如第一行,先打印了4个空格”  ”,然后打印了一个”*” 

我们分析一下每行的具体打印情况:

 

0行:先打印4个空格,然后打印1”*”

1行:先打印3个空格,然后打印3”*”

2行:先打印2个空格,然后打印5”*”

3行:先打印1个空格,然后打印7”*”

4行:先打印0个空格,然后打印9”*”

 

通过上面分析,我们不难发现,”0”, ”1”… ”4”这些行数在重复,所以我们可以用外层循环控制行数(即打印第几行)。在每行的内部,”打印n个空格”又是一个重复的过程,所以可以用内层循环来控制打印空格的个数。同理,在每行的内部,”打印n*”也是一个重复的过程,所以可以用内层循环来控制打印”*”的个数。即:用外层循环控制打印的行数,用两个内层循环分别控制打印空格的个数和打印”*”的个数。还要注意,在把每行的空格和”*”打印完后,还需要换行。

即可得伪代码:

public static void main(String[] args) {

int rows = 5;

for (int i = 0; i < 行数; i++) {

for (int j = 0; j < 空格的个数; j++) {

System.out.print(" ");

}

for (int j = 0; j < "*"的个数; j++) {

System.out.print("*");

}

System.out.println();//每行的空格和”*”打印完后,需要换行

}

}

 

我们在用i表示行数(第几行),用j表示打印空格的个数,用k表示打印”*”的个数,可得下表:

 

分析外层循环和内层循环的数学关系,可得:

i+j=4 j=4-i=(rows-1)-i, 即空格的个数等于:(当前行数-1)-i

k=2*i+1 ,即”*”的个数等于: 2*当前行数+1

现在,用计算后的关系式将伪代码中的汉字替换,即可实现等腰三角形的打印:

public static void main(String[] args) throws Exception {

int rows = 5;

for (int i = 0; i < rows; i++) {

for (int j = 0; j < rows - i - 1; j++) {

System.out.print(" ");

}

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

System.out.print("*");

}

System.out.println();//每行的空格和”*”打印完后,需要换行

}

}

运行结果:

 

 

思考:现将题目变为:打印倒等腰三角形,如图:

 

该如何实现呢?

分析:对比“正等腰三角形”和“倒等腰三角形”,如下

 

不难发现,“倒等腰三角形”的第0行,就是“正等腰三角形”的最后一行;“倒等腰三角形”的第1行,就是“正等腰三角形”的倒数第二一行;“倒等腰三角形”的最后一行,就是“正等腰三角形”的第一行。即:把“正等腰三角形”的行数逆序输出,就变成了“倒等腰三角形”。控制“正等腰三角形”行数的是外层循环for (int i = 0; i < rows; i++),将它逆序输出,即改为for (int i = rows-1; i>=0; i--),就实现了“倒等腰三角形”的打印,如下:

public static void main(String[] args) throws Exception {

int rows = 5;

// for (int i = 0; i < rows; i++)正等腰三角形

for (int i = rows - 1; i >= 0; i--) {// 正等腰三角形等行数逆序输出

for (int j = 0; j < rows - i - 1; j++) {

System.out.print(" ");

}

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

System.out.print("*");

}

System.out.println();// 每行的空格和”*”打印完后,需要换行

}

}

运行结果:

 

 

思考:现将题目变为:打印菱形,如图:

 

该如何实现呢?

分析:

将菱形上下拆开、一分为二,即可分为“正等腰三角形”和“到等腰三角形”,如图:

 

因此,只需要先打印“正等腰三角形”,然后再打印“到等腰三角形”即可。需要注意,菱形的中间那一行,既是“正等腰三角形”的最后一行,同时也是“倒等腰三角形”的第一行。因此,在打印“正等腰三角形”时,不需要打印最后一行,如下:

public static void main(String[] args) throws Exception {

int rows = 5;

// 正等腰三角形

//for (int i = 0; i < rows; i++) {

for (int i = 0; i < rows-1; i++) {//for的第二个参数从row变为row-1,即无需打印"正等腰三角形"的最后一行

for (int j = 0; j < rows - i - 1; j++) {

System.out.print(" ");

}

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

System.out.print("*");

}

System.out.println();// 每行的空格和”*”打印完后,需要换行

}

// 倒等腰三角形

for (int i = rows - 1; i >= 0; i--) {// 正等腰三角形等行数逆序输出

for (int j = 0; j < rows - i - 1; j++) {

System.out.print(" ");

}

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

System.out.print("*");

}

System.out.println();// 每行的空格和”*”打印完后,需要换行

}

}

运行结果:

 

 

思考:

现将题目变为:打印空心菱形,如图:

 

该如何实现呢?

分析:

 

实心菱形与空心菱形的区别是:空心菱形就是实心菱形的边界,如下图:



即在打印
“实心菱形”的“*”时,只需要把每一行“*”的开头第一个“*”和结尾最后一个“*”打印出来,每行中间部分的“*”用空格替代即可。即对System.out.print("*");进行判断,伪代码如下:

if (开头第一个*” 或 结尾最后一个“*) {

System.out.print("*");

} else {//即中间部分打印空格

System.out.print(" ");

}

完整代码如下:

public static void main(String[] args) throws Exception {

int rows = 5;

// 正等腰三角形

for (int i = 0; i < rows; i++) {

for (int j = 0; j < rows - i - 1; j++) {

System.out.print(" ");

}

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

if (j == 0 || j == 2 * i) {//开头第一个“*” 或 结尾最后一个“*”

System.out.print("*");

} else {//即中间部分打印空格

System.out.print(" ");

}

}

System.out.println();// 每行的空格和”*”打印完后,需要换行

}

// 倒等腰三角形

// for (int i = rows - 1; i >= 0; i--) {

for (int i = rows - 2; i >= 0; i--) {// “倒等腰三角形的第0行(即rows-1)不用打,直接从第1(rows-2)开始打印

for (int j = 0; j < rows - i - 1; j++) {

System.out.print(" ");

}

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

if (j == 0 || j == 2 * i) {//开头第一个“*” 或 结尾最后一个“*”

System.out.print("*");

} else {//即中间部分打印空格

System.out.print(" ");

}

}

System.out.println();// 每行的空格和”*”打印完后,需要换行

}

}

运行结果:

 

 

来源:http://xueyuan.lanqiao.org,解释权归蓝桥软件学院所有。

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31419827/viewspace-2130665/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31419827/viewspace-2130665/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值