Loading... # 第四章 控制执行流程 **所有的条件语句都利用条件表达式的真假来决定执行的路径,java中不允许将一个数字作为布尔类型的值使用。** ------- ### 1.流程控制(判断) **if - else 是最基本的控制流程** ------ #### 流程控制(迭代) * while、do-while 和 for 用来控制循环,称他们为迭代语句 **(iteration statement)** ,语句会重复执行,直到其控制作用的布尔表达式 ( Booleanexpression )得到假的结果为止。 * while() 循环,在循环开始时,会计算一次布尔表达式的值,而在下一次迭代开始前会再次计算一次。 ```java //产生随机数,直到符合特定的条件为止 public class WhileTest{ //静态方法,调用即执行 static boolean condition(){ /*产生0~1之间(包括0但是不包括1)的一个double值,之后0.99比较决定返回true或者false*/ boolean result = Math.random() < 0.99 ; System.out.printf(result + " . ") ; return result ; } public static void main(String[] args){ while(condition()){ System.out.printf("Inside 'while'") ; } System.out.printf("Exited 'while'"); } } ``` * do-while , do-while 会比 while 多执行一次。如果条件第一次为false,while不会执行,但是do-while会执行一次。 * for , 在第一次迭代前进行初始化,随后,每一次迭代结束后,进行某种形式的 “ 步进 ”。 * for( initialization ; Boolean-expression ; step ) . 初始化 ( initialization ) 表达式、布尔表达式 ( Boolean-expression ) 、步进 ( step ) 都可以为空。 ```java public static void main(String[] args){ /* * Character.isLowerCase(c) * 调用isLowerCase()方法来检查问题中的是否是小写字母。 * */ for(char c = 0 ; c< 128 ;c++){ if(Character.isLowerCase(c)){ System.out.println("value: " + (int)c + " character: " + c); } } } ``` * 逗号操作符,唯一用到的就是 **for** 循环的控制表达式,可以使用逗号分隔语句,定义多个变量,但是他们必须具有相同的类型。 * Foreach 语法 , 使用 foreach 语法在录入代码时节省时间,阅读起来也比较方便。 ```java public static void main(String[] args){ Random rand = new Random(47) ; float f[] = new float[10] ; for (int i = 0 ; i < 10 ;i++){ f[i] = rand.nextFloat(); } for(float x : f){ System.out.println(x); } } ``` ---- #### 流程控制(返回) * return ,**return**关键字由两方面的用途,一方面指定一个方法返回什么值(假设他没有 void 返回值),另一方面它会导致当前的方法推出,并返回那个值。 * **break** 和 **continue**,在任何迭代语句的主体部分,都可用 break 和 continue 控制循环的流程。其中,break 用于强制退出循环,不执行循环中剩余的语句。而 continue 则停止执行当前的迭代,然后退回循环起始处,开始下一次迭代。 * 关于无穷循环的 while 和 for 的表达形式 ---> while(true) for(::) * goto是在源码级上的跳转. * 标签:标签是后面跟有冒号的标识符,在 java 中·,标签起作用的唯一的地方刚好是在迭代语句之前。 * 一般的 continue 会退回最内层循环的开头(顶部),继续执行,带标签的 continue 会到达标签的位置,并重新进入紧接在那个标签后面的循环。 * 一般的 break 会中断并跳出当前循环,带标签的 break 会中断并跳出标签所指的循环,(即使外面有双重循环) ```java public static void main(String[] args){ int i = 0 ; outer: while(true){ System.out.println("Outer while loop"); while(true){ i++ ; System.out.println(" i = " + i); if(i == 1){ System.out.println(" continue "); continue ; } if(i == 3){ System.out.println(" continue outer"); continue outer ; } if(i == 5){ System.out.println(" break "); break ; } if(i == 7){ System.out.println(" break outer "); break outer; } } } } ``` * switch 有时候也被称为选择语句。switch 的选择因子必须是 int 或者 char 之类的整数值 ------ ### 2. 练习 * 斐波那切数列 ```java import java.util.Scanner; /* * 递归是最简单的实现方式,但递归有很多的问题,在n的值非常大时,会占用很多的内存空间 * * */ public class For4Test9 { public static int Fibinacci1(int fa){ if(fa < 0){ return -1 ; }else if(fa == 0){ return 0 ; }else if(fa == 1 || fa ==2){ return 1 ; }else{ return Fibinacci1(fa - 1) + Fibinacci1(fa - 2); } } /* *从上面的实现中我们定义了3个变量a、b、c其中c=a+b,然后逐步进行计算从而得到下标为n的值。 * 既然我们可以定义变量进行存储,那么同样我们还可以定义一个数组, * 该数组的每一个元素即一个斐波那契数列的值, * 这样我们不仅能得到第n个值,还能获取整个斐波那契数列 * * * */ public static int Fibinacci2(int fa){ if(fa < 0){ return -1 ; }else if(fa == 0){ return 0 ; }else if(fa == 1 || fa ==2){ return 1 ; }else{ int c = 0 , a= 1 , b =1 ; for(int i = 3 ;i <= fa ;i++){ c = a+b; a = b ; b = c ; } return c ; } } /* *数组 * */ public static int Fibinacci3(int fa){ if(fa < 0){ return -1 ; }else if(fa == 0){ return 0 ; }else if(fa == 1 || fa ==2){ return 1 ; }else{ int[] fibAry = new int[fa+1] ; fibAry[0] = 0 ; fibAry[1] = fibAry[2] = 1 ; for(int i = 3 ; i <=fa ; i++){ fibAry[i] = fibAry[i-1] + fibAry[i-2] ; } return fibAry[fa] ; } } public static void main(String[] args){ Scanner in =new Scanner(System.in); System.out.println("输入数字求斐波那切数列"); int a = in.nextInt() ; System.out.println(Fibinacci3(a)); in.close(); } } ``` ----------------- 由本人从 Thinking in java ( java 编程思想 ) 整理而来 最后修改:2018 年 07 月 15 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 哇卡哇卡