您的位置:首页 > 编程语言 > Java开发

四、java流程控制(三)——循环控制

2013-12-05 23:13 134 查看

4.3 循环控制

听其名而知其意,就是让代码可以循环地执行。

4.3.1 for语句

for(循环初值;循环条件;步长)

{

语句;
//循环体

}

 

思考题:

编写一个程序,可以打印10句

“为何我这么屌!”

分析:

可以用for语句

代码:

/*

 ***********************************************************************

作者:李俊挥

日期:2013-12-2

功能:用for语句,打印十句“为何我这么屌”

 ***********************************************************************

*/

 

 

public class Demo

{

public static void main(String []args)

{

int i;

for(i=0;i<10;i++)

{

System.out.println("为何我这么屌!"+i);

}//for

}

}

 


 

☆for循环的执行顺序

 

 


 

4.3.2 while 语句

☆while循环

while(循环条件)

{

语句;
//循环体

}

 

☆思考题

用while打印10句“我为何如此狂拽吊炸天!”

 

☆代码

/*

 ***********************************************************************

作者:李俊挥

日期:2013-12-3

功能:用while语句,打印十句“为何我这么屌”

 ***********************************************************************

*/

 

 

public class Demo

{

public static void main(String []args)

{

int i;

i=0;

while(i<10)

{

System.out.println("为何我如此狂拽吊炸天"+i);

i++;

}//while

}

}

 

 


 

☆while语句执行顺序

 

 




4.3.3 do while语句

☆do while循环

do{

语句;
//循环体

}while(循环条件);

注意:

do while循环是先执行,再判断

 

☆思考题

用do while打印10句“我为何如此狂拽吊炸天!”

 

☆代码

/*

 ***********************************************************************

作者:李俊挥

日期:2013-12-3

功能:用do while语句,打印十句“为何我这么屌”

 ***********************************************************************

*/

 

 

public class Demo

{

public static void main(String []args)

{

int i;

i=0;

do{

System.out.println("为何我如此狂拽吊炸天"+i);

i++;

}while(i<10);

 

}

}

 


 

☆do while语句执行顺序

 

 


 



4.3.4打印金字塔

☆思考题

根据前面学习到的三种语句,考虑如何打印出一个金字塔出来

 

 


☆分析

1、因为一下子打印出这样一个等边三角形金字塔比较难,不如换一种思考方式,先打印出一个直角三角形,如下图:

 

 


 

2、我们可以继续把问题简化,先模拟电脑实现打印:

*

**

***

****

现在就比较明白要怎么打印了。

3、首先要从上至下打印4行,然后每打印多一行的时候,*要打印多一个

4、可以清晰地知道这是需要两个循环来实现,暂时就用for语句

5、首先第一个循环,先控制打印4行

for(int i=0;i<4;i++)

{

}

6、然后在第一个循环里面嵌套另一个循环,每一行要打印的*数目为行数(即j<=i)

for(int i=0;i<=4;i++)

{

//每一行打印的*的数目等于行数

for(int j=0;j<i;j++)

{

System.out.print(“*”);

}//for j

//换行

System.out.println();

}//for i

 

☆代码

/*

 ***********************************************************************

作者:李俊挥

日期:2013-12-3

功能:打印直角三角形

 ***********************************************************************

*/

 

 

public class Demo

{

public static void main(String []args)

{

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

for(int j=0;j<i;j++)

{

System.out.print("*");

}//for j

System.out.println();

}//for i

}

}

 


 

注意:当i=0时,第一次循环照样会打出一个换行。所以如果要打印4行*,就要循环5次。要将条件改为i<=4

 

 

☆打印金字塔

 

分析

   *

  ***

 *****

*******

1、首先以打印4层为研究对象

2、从图中看出,每一行的开头需要打印(4 - 行数)个空格,然后后面加一些*

3、*的数量可以看出是有规律的,分别是1 3 5 7 ,显示这是个等差数列

4、根据等差数列公式 an = a1 + (n-1)*d ,其中an为*的数量,a1 = 1,n为行数,d为2

5、所以每一行要打印的规律是:先打印(4 - 行数)个控制 + (1 + (行数 - 1)*2)个*

 

代码 

 

/*

 ***********************************************************************

作者:李俊挥

日期:2013-12-3

功能:打印三角形

 ***********************************************************************

*/

 

 

public class Demo

{

public static void main(String []args)

{

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

//先打印(4-i)个空格

for(int j=1;j<=(4-i);j++)

{

System.out.print(" ");

}//for j

//打印等差数列的*

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

{

System.out.print("*");

}//for k

System.out.println();

}//for i

}

}

 

 




4.3.5打印中空的金字塔

 


要打印出这样的金字塔出来,就要继续找不一样的逻辑关系了。

 

☆简化问题

先打印这个图形

1:*

2:* *

3:*   *

4:*******

 

☆分析

1、可以看出前三行的打印规律基本如下:

星号+(1+(行数-2)*2)*空格+星号

 

2、最后一行则是:

(1+(行数-1)*2)个星号

 

☆代码

/*

 ***********************************************************************

作者:李俊挥

日期:2013-12-3

功能:打印中空三角形

 ***********************************************************************

*/

 

 

public class Demo

{

public static void main(String []args)

{

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

//打印前三行

if(i<=3)

{

//先在前面打印一个*

System.out.print("*");

//打印(1+(行数-2)*2)*空格

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

{

System.out.print(" ");

}

//第一行不需要打印

if(i!=1)

{

//在后面再打印一个*

System.out.print("*");

}

}//if 3

//打印最后一行

if(i==4)

{

//打印*

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

{

System.out.print("*");

}

}//if 4

System.out.println();

}//for i

}

}

 

 


 

 

☆还原问题

1:   *

2:  * *

3: *   *

4:*******

 

☆分析

要在上面的基础上,每一行的前面增加打印(4 - 行数)个空格

1、可以看出前三行的打印规律基本如下:

(4 - 行数)*空格+星号+(1+(行数-2)*2)*空格+星号

 

2、最后一行则是:

(1+(行数-1)*2)个星号

 

☆代码

/*

 ***********************************************************************

作者:李俊挥

日期:2013-12-3

功能:打印中空三角形

 ***********************************************************************

*/

 

 

public class Demo

{

public static void main(String []args)

{

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

//打印前三行

if(i<=3)

{

//打印(4-行数)*空格

for(int d=1;d<=(4-i);d++)

{

System.out.print(" ");

}

//先在前面打印一个*

System.out.print("*");

//打印(1+(行数-2)*2)*空格

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

{

System.out.print(" ");

}

//第一行不需要打印

if(i!=1)

{

//在后面再打印一个*

System.out.print("*");

}

}//if 3

//打印最后一行

if(i==4)

{

//打印*

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

{

System.out.print("*");

}

}//if 4

System.out.println();

}//for i

}

}


 

 

 

☆优化性能

可以从上面代码看出,整个代码打印前3行就用了3个循环,打印最后一行又用了1个循环,总共4个循环。只要减少循环的次数,就可以优化性能。

 

☆分析

在打印实心金字塔的时候,才用了2个循环,所以可以在里面做文章。

for(int i=1;i<=4;i++)

{

//先打印(4-i)个空格

for(int j=1;j<=(4-i);j++)

{

System.out.print(" ");

}//for j

//打印等差数列的*

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

{

System.out.print("*");

}//for k

System.out.println();

}//for i

1、可以在for k循环中进行if语句控制

2、如果行数为1(开头一行)或者4(最后一行)照常打印

3、如果不是,则只需要打印开头的*或者结尾的*,中间打印空格

 

☆代码

/*

 ***********************************************************************

作者:李俊挥

日期:2013-12-3

功能:打印三角形

 ***********************************************************************

*/

 

 

public class Demo

{

public static void main(String []args)

{

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

//先打印(4-i)个空格

for(int j=1;j<=(4-i);j++)

{

System.out.print(" ");

}//for j

//打印等差数列的*

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

{

//如果行数为1(开头一行)或者4(最后一行)照常打印

if(i==1||i==4)

{

System.out.print("*");

}else

{//如果不是,则只需要打印开头的*或者结尾的*,中间打印空格

if(k==1||k==(1+(i-1)*2))

{

System.out.print("*");

}else

{

System.out.print(" ");

}//if k 

}//if i

}//for k

System.out.println();

}//for i

}

}

 

 


 



4.3.6打印中空的菱形

 


☆简化

先打印实心的菱形,再通过控制语句,打印中空的菱形

 

☆分析

 


 

1、可以看出前3行打印的金字塔,后面两行打印的是2行的倒三角

2、可以看出菱形的行数都是奇数,只要打印到中间那行就开始打印倒三角。

中间行=(行数/2+1)

3、所以需要两个循环进行控制,第一个循环打印金字塔,当行数为中间行时,打印倒三角。

4、难点在于打倒三角:

 


可以从4行倒三角进行找每一行打印的规律:

 

0 1 2 3 空格 (行数-1)*空格

 

7 5 3 1 * (9-2*行数)*空格

 

☆代码

/*

 ***********************************************************************

作者:李俊挥

日期:2013-12-4

功能:打印五行菱形

 ***********************************************************************

*/

 

 

public class Demo

{

public static void main(String []args)

{

//求出中间行

int middle = ((int)(5/2)+1);

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

//当行数大于等于中间行前,打印金字塔

if(i<=middle)

{

//先打印(4-i)个空格

for(int j=1;j<=(4-i);j++)

{

System.out.print(" ");

}//for j

//打印等差数列的*

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

{

System.out.print("*");

}//for k

System.out.println();

}//打印金字塔

//打印倒三角

//从中间行下面开始打印

if(i>=middle)

{

//打印(i-1)*空格

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

{

System.out.print(" ");

}//for j

//打印(9-2i)*星号

for(int k=1;k<=(9-2*i);k++)

{

System.out.print("*");

}//for k

System.out.println();

}//if

}//for i

}

}

 


 

☆打印中空菱形

将打空格的条件加上,通过if语句进行控制,打印出中空菱形

 

☆分析

1、只要在打印*的部分通过if语句进行控制即可

2、当行数为第一行或者最后一行,照常打印

3、其他情况只打印开头第一个*和最后一个*,中间打印空格

 

☆代码

/*

 ***********************************************************************

作者:李俊挥

日期:2013-12-4

功能:打印中空的五行菱形

 ***********************************************************************

*/

 

 

public class Demo

{

public static void main(String []args)

{

//求出中间行

int middle = ((int)(5/2)+1);

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

 

//当行数大于等于中间行前,打印金字塔

if(i<=middle)

{

//先打印(4-i)个空格

for(int j=1;j<=(4-i);j++)

{

System.out.print(" ");

}//for j

//打印等差数列的*

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

{

//当行数为第一行,照常打印

if(i==1)

{

System.out.print("*");

}else

{

//其他行只打印开头第一个*和最后一个*

if(k==1||k==(1+(i-1)*2))

{

System.out.print("*");

}else

{

System.out.print(" ");

}

}

}//for k

System.out.println();

}//打印金字塔

//打印倒三角

//从中间行下面开始打印

if(i>=middle)

{

//打印(i-1)*空格

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

{

System.out.print(" ");

}//for j

//打印(9-2i)*星号

for(int k=1;k<=(9-2*i);k++)

{

//当行数为最后一行,照常打印

if(i==6)

{

System.out.print("*");

}else

{

if(k==1||k==(9-2*i))

{

System.out.print("*");

}else

{

System.out.print(" ");

}

}

}//for k

System.out.println();

}//if

}//for i

}

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: