Day 4 : 循环结构(while、do…while、for)

1. 循环结构(while、do…while、for)

1.1. 什么是循环结构

在平常生活中,会有不少须要反复执行的事情,好比:每年的4个季节,每一周的7天,每日的3餐,打印机每份文档打印50份,一圈跑道400米跑3圈,都是在反复执行的。学习

再看软件系统中的需求:spa

问题1:输出100行语句,每行语句都同样,即:设计

  • 行动是成功的阶梯,行动越多,登得越高!
  • 行动是成功的阶梯,行动越多,登得越高!
  • 行动是成功的阶梯,行动越多,登得越高!

code

问题2:输出100行语句,每行语句都相似,即:blog

  • 第1,行动是成功的阶梯,行动越多,登得越高!
  • 第2,行动是成功的阶梯,行动越多,登得越高!
  • 第3,行动是成功的阶梯,行动越多,登得越高!
  • 第100,行动是成功的阶梯,行动越多,登得越高!

问题3:计算1到50乘以8.88的结果ip

  • 1× 8.88 =8.88
  • 2 × 8.88 =17.76
  • 3 × 8.88 =26.64
  • 4 × 8.88 =35.52
  • 50 × 8.88 =444

诸如此类问题都是在反复执行的,在软件系统中能够经过循环这种语法结构来解决。循环是程序设计语言中反复执行某些代码的一种计算机处理过程, 是一组相同或类似语句被有规律的重复性执行。ci

对于循环来讲,须要考虑两个要素,其一要素为循环体, 也就是被反复执行的相同或类似的语句,其二要素为循环的条件,也就是循环得以继续执行下去的条件,经常以循环次数的方式体现。文档

经常使用的循环结构有:while、do-while、for。it

1.2. while语句

1.2.1. while语句的执行逻辑

while语句是循环的一种常见语法结构,语法以下:for循环

 
while( boolean表达式 ) {        语句块;
}

 

while语句的执行过程为,首先计算boolean表达式的值,然后进行判断,若值为true则执行语句块,语句块执行完后再次判断boolean表达式的值,若是为true则继续执行语句块,如此循环往复,直到boolean表达式的值为false时退出while循环而执行while以后的语句。

1.2.2. while语句的流程图

while语句的流程图如图 - 11所示,须要注意的是,通常状况下,循环操做中会存在使得循环条件不知足的可能性,不然该循环将成为“死循环”。“死循环”意味着会一直执行循环体操做,循环后面的语句永远不会被执行,“死循环”在软件系统中是须要避免的。


图 - 11

1.2.3. while语句用于处理循环逻辑

while语句在实际应用中应用比较普遍,经过以下示例体会while语句的执行逻辑:

int age = 1;
while (age<=100) {
System.out.println(“立刻有钱”);
age++;
}

 

上面的语句执行过程以下,首先声明整型变量age并赋初始值为1,然后判断age是否小于等于100,条件为真,输出“立刻有钱”并将age的值增1变为2,再次判断条件,此时age为2,依然小于100,再一次输出“立刻有钱”并将age的值再增1变为3,以此类推,直到age等于101时,判断条件为false,循环结束。

1.2.4. 使用break语句跳出循环

break用在循环体中用于退出循环结构。看以下示例代码:

int x = 0;
while ( x < 10 ) {
        if ( 5 == x )
    {
            break;
    }
        System.out.println(x);
        x + + ;
}

 

分析上面的代码得出结论,输出结果为0 1 2 3 4,由于当x等于5时执行break语句直接退出循环结构了,即if语句块后面的输出x的值以及x++再也不被执行。

1.3. do-while语句

1.3.1. do-while语句的执行逻辑

do-while语句也是循环的一种常见语法结构,语法以下:

do {
        语句块
} while( boolean表达式 ) ;

 

do-while语句的执行过程为,先执行语句块,再判断boolean表达式,若是为true则再次执行语句块,如此循环往复,直到boolean表达式的值为false时止。也就是说,do-while语句,不管boolean表达式是否为true,都先执行一次语句块。

1.3.2. do-while语句的流程图

do-while语句的流程图如图 - 12所示,与while语句同样,do-while语句也要避免“死循环”的发生。


图- 12

1.3.3. do-while语句用于处理循环逻辑

do-while语句在实际应用中应用比较普遍, 经过以下示例体会do-while语句的执行逻辑:

int pwd ;
do{
    System.out.print(“请输入密码”);
    pwd = scanner.nextInt();
} while ( 123 != pwd) ;

 

上面的语句执行过程以下,首先声明整型变量pwd,在do语句中提示“请输入密码”,接收用户输入的数据赋给pwd, 然后判断123是否不等于pwd,若为true则执行do语句块,以此类推,直到123等于pwd时,循环结束。

1.3.4. while和do-while语句的区别

while与do-while都是用于执行循环结构的语句,区别在于,while循环先判断再执行,而do-while循环先执行一次,再判断。那么,当初始状况不知足循环条件时,while循环就一次都不会执行,而do-while循环无论任何状况都至少会执行一次。

注意:while和do-while语句的不一样仅仅体如今第一次就不知足条件的循环中;若是不是这样的状况,while与do-while能够互换。请看以下两段示例程序:

//示例1:while循环方式
int pwd = 0;
while ( 123 != pwd){
        System.out.print(“密码:”);
        pwd = scanner.nextInt();
}
//示例2: do-while循环方式
int    pwd ;
do{
        System.out.print(“密码”);
        pwd = scanner.nextInt();
} while ( 123 != pwd) ;

 

分析示例1与示例2得出结论,运行结果彻底同样。这是由于两段代码第一次的while条件都知足,此时while与do-whlie能够互换,因此结果彻底同样。

1.4. for语句

1.4.1. 考虑以下循环问题的相同之处

请考虑以下三个题目的类似之处:

  1. 计算从1加到100的值;
  2. 计算1+1/3+1/5+…+1/999;
  3. 找出从第1号学员到第500号学员中成绩大于90的学员。

经过上面的问题能够看出,如上三个题目都是在有规律的重复执行某个操做,在程序中

考虑使用循环结构来解决。首先须要先找到前面介绍的循环变量,此循环变量在每一次的循环中有规律的发生变化,而且经常做为判断是否继续循环的条件。

首先,看第1个题目,设计循环变量i ,i的值为1,2,…,100,即:从1开始,每次增1。第二个题目,设计循环变量i , i的值为1,3,5,…,999,即:从1开始,每次增2。第三个题目,设计循环变量i , i的值为1,2,…,500,即:从1开始,每次增1。

经过上面的分析,能够看出,如上的循环都是固定次数的循环,这种状况,优先考虑使用for语句来实现。

1.4.2. for语句的执行逻辑

for语句是循环中最最经常使用的一种方式。for循环用于将某个语句或语句块重复执行预约次数的情形。语法以下:

  1. for ( 表达式1;表达式2;表达式3 ) {
  2. 语句块(循环体)
  3. }

能够看出,for循环的三个表达式之间经过分号;进行分隔,其执行逻辑以下所示:

  1. 计算表达式1的值,一般为循环变量赋初值;
  2. 计算表达式2(表达式2为逻辑表达式)的值,即判断循环条件是否为真,若值为真则执行循环体一次(语句块),不然跳出循环;
  3. 执行循环体;
  4. 计算表达式3的值,此处一般写更新循环变量的赋值表达式;
  5. 计算表达式2的值,若值为true则执行循环体,不然跳出循环;
  6. 如此循环往复,直到表达式2的值为false。

1.4.3. for语句的流程图

for语句流程图如图-1所示:


图- 1

简单示例以下:

for ( int i = 1 ; i <= 10 ; i + + ) {
        System.out.println( i );
}

 

如上程序的输出结果为:1 2 3 4 5 6 7 8 9 10

分析如上程序的执行过程:首先,初始化i的值为1,判断i是否小于等于10,结果为true,其次,输出i的值1,而后,执行i的自增1,再判断i是否小于等于10,结果为true,执行输出i的值2,以此类推……输出i的值10后,执行i的自增1,此为i为11,判断结果为false,程序终止。

1.4.4. for语句用于实现固定次数循环

for语句经常用于解决固定次数循环的处理,好比说累加和,想求1+2+3+…+100的结果,次数固定执行100次,能够考虑使用for循环处理,参见以下代码:

int sum = 0 ;
for ( int i = 1 ; i <= 100 ; i + + ) {
sum += i ;
}
System.out.println(“1到100的和为:” + sum ) ;

 

分析上面代码的执行过程,首先,声明一个变量用于保存累加和,此变量命名为sum,赋初始值为0,然后,for循环从1开始,每次增1,执行100次,循环体中将i的值累加到sum变量中。注意:每次都是在sum的基础之上加上i,因此使用了sum += i。循环结束后,输出结果“1到100的和为:5050“。

了解了如上题目以后,问:想求10的阶乘,即1*2*3*…*10,可不可使用for循环来解决,若是能够的话要如何解决呢?固然能够,try!!!

1.4.5. for语句三个表达式特殊用法

首先回顾for语句的语法:

for ( 表达式1;表达式2;表达式3 ) {
语句块    }

 

经过上面的代码能够看出,for语句实现循环时须要3个表达式而且使用分号;分隔,

在实际使用时,for语句能够有几种特殊的使用方法:

特殊方式1:表达式1位置内容为空,看以下代码:

int sum = 0 ;
int i = 1;
for ( ; i <= 10 ; i + + ) {
        sum += i ;
}
System.out.println(“1到10的和为:” + sum ) ;

 

经过上面的代码能够看出,虽然省略了表达式1,但只是将它放在了for循环的外面进行声明,只是位置不一样而已。在此须要注意一点,即便for语句中不写表达式1了,表达式2前面的分号;也不能省略。

特殊方式2:表达式3位置内容为空时,看以下代码:

int sum = 0 ;
for ( int i = 1 ; i <= 10 ; ) {
sum += i ;
        i + + ;
}
System.out.println(“1到10的和为:” + sum ) ;

 

经过上面的代码能够看出,虽然省略了表达式3,但也只是将它放在了for循环体之中,只是位置不一样而已。在此须要注意一点,即便for语句中不写表达式3了,表达式2后面的分号;也不能省略。

特殊方式3:表达式1,2,3位置内容均为空时,看以下代码:

for ( ; ; ) {
System.out.println(“我要学习……”);
}

 

经过上面的代码能够看出,如上代码没有循环变量、没有条件控制,所以会形成死循环,而死循环在编写程序过程当中是必需要避免的,能够在循环体中添加break跳出循环。

特殊方式4:表达式 1 和 3 位置内容的多样化

for语句中的三个表达式中表达式1和表达式3可使用逗号表达式,逗号表达式就是经过”,”运算符隔开的多个表达式组成的表达式,从左向右进行计算。看以下示例:

 
for ( int i =1 , j = 6 ; i <= 6 ; i +=2 , j -=2 ) {
System.out.println(“ i , j = “ + i + “,” + j );
}

 

上面的代码的执行逻辑以下:初始设置i为1,j为6,判断i是否小于等于6,为真执行循环体,然后执行i+=2,j-=2,即:i增2,j减2。再判断i是否小于等于6,为真继续执行循环体,以此类推,直到条件为false。本程序的输出结果为:

i , j = 1 , 6
i , j = 3 , 4
i , j = 5 , 2

 

1.4.6. 循环中使用break语句

循环中的break语句应用率很广,break可用于循环语句或switch语句中,其用于循环时,可以使程序终止循环而执行循环后面的语句,经常与条件语句一块儿使用,看以下代码:

 
int sum = 0;
for(int i=1; i<=100; i++){
if(sum>=4000){
break;
}
sum += i;
}
System.out.println(sum);

 

上面的程序须要统计1到100的累加和,条件是当和大于等于4000时则终止计算,此案例经过在if语句中使用break实现了for语句的退出,本程序最终sum的值为:4005。

1.4.7. 循环中使用continue语句

continue语句只能用于循环中,它的做用为跳过循环体中剩余语句而执行下一次循环,看以下代码:

 
int sum = 0;
for(int i=1; i<=100; i++){
if( i % 10 == 3 ){
continue;
}
sum += i;
}
System.out.println(sum);

 

上面的程序须要统计1到100的累加和,条件是跳过全部个位为3的,此案例经过在if语句中使用continue实现了跳过for语句中剩余的循环体语句,本程序最终sum的值为: 4570。

相关文章
相关标签/搜索