在这一讲中,我将流程控制语句分为判断结构、选择结构、循环结构以及其他流程控制语句。
判断结构
if语句中有一种格式如下:
if (关系表达式) {
语句体1;
} else {
语句体2;
}
有的时候可以简写成三元运算符的格式:
变量 = (条件表达式) ? 表达式1 : 表达式2;
好处当然是可以简化if else
格式的代码啊!但有一个弊端,因为是一个运算符,所以运算完必须要有一个结果。
下面分别用二个例子来讲解if语句的使用。
例一,根据用户的给定的数值,显示该数值对应的星期。如:2,星期二。
class IfTest { public static void main(String[] args) { /* 需求:根据用户的给定的数值,显示该数值对应的星期。如:2,星期二。 思路: 1,咋获取这个数值呢?来源有很多,不确定,只要是不确定的数据,都用变量存储。 只要操作该变量即可。 2,数值不确定,如何显示对应的星期呢?那就需要对该数值进行判断。 3,咋显示呢?通过输出语句就可以显示在屏幕上。 步骤: 1,定义变量,记录数据。 2,通过判断结构语句对该变量进行判断。 3,根据不同的条件,通过输出语句显示不同的结果。 */ // 1,定义变量,记录数据。 int week = 9; // 2,通过判断结构语句对该变量进行判断。 if (week == 1) // 3,根据不同的条件,通过输出语句显示不同的结果。 System.out.println(week + "对应的是星期一"); else if (week == 2) System.out.println(week + "对应的是星期二"); else if (week == 3) System.out.println(week + "对应的是星期三"); else if (week == 4) System.out.println(week + "对应的是星期四"); else if (week == 5) System.out.println(week + "对应的是星期五"); else if (week == 6) System.out.println(week + "对应的是星期六"); else if (week == 7) System.out.println(week + "对应的是星期日"); else System.out.println(week + "没有对应的星期"); } }
例二,根据用户的给定月份数据,显示该月份在哪个季节。
第一种方式:
//需求:根据用户的给定月份数据,显示该月份在哪个季节。 // 3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12,1,2 冬季 class IfTest { public static void main(String[] args) { int x = 4; if(x == 3 || x == 4 || x == 5) { System.out.println(x + "春季"); } else if(x == 6 || x == 7 || x == 8) { System.out.println(x + "夏季"); } else if(x == 9 || x == 10 || x == 11) { System.out.println(x + "秋季"); } else if(x == 12 || x == 1 || x == 2) { System.out.println(x + "冬季"); } else { System.out.println(x + "月份不存在"); } } }
第二种方式:
class IfTest { public static void main(String[] args) { int x = 4; if(x > 12 || x < 1) { System.out.println(x + "月份不存在"); } else if(x >= 3 && x <= 5) { System.out.println(x + "春季"); } else if(x >= 6 && x <= 8) { System.out.println(x + "夏季"); } else if(x >= 9 && x <= 11) { System.out.println(x + "秋季"); } else { System.out.println(x + "冬季"); } } }
选择结构
switch语句的格式如下:
switch (表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
…
default:
语句体n+1;
break;
}
对于该语句,重点知道如下四点:
- switch语句选择的类型只有四种:byte,short,int,char。但JDK7.0对switch语句进行了增强,可以判断字符串,JDK5.0对switch语句也进行了增强,可以对枚举类型进行判断。
- case之间与default没有顺序。先执行第一个case,没有匹配的case执行default。
- 结束switch语句的两种情况:遇到break或者执行到switch语句结束。
- 如果匹配的case或者default没有对应的break,那么程序会继续向下
执行,运行可以执行的语句,直到遇到break或者switch结尾结束(switch特性——case穿透性)。
观察下面的代码,你知道输出的是什么吗?
int x = 3;
switch(x) { // byte,short,int,char
default:
System.out.println("d");
case 4:
System.out.println("a");
case 6:
System.out.println("b");
break;
case 2:
System.out.println("c");
break;
}
以上代码输出:
d
a
b
下面分别用二个例子来讲解switch语句的使用。
例一,根据用户的给定的数值,显示该数值对应的星期。如:2,星期二。
class SwitchTest { public static void main(String[] args) { // 需求1:根据用户的给定的数值,显示该数值对应的星期。如:2,星期二。 int week = 9; switch (week) { case 1: System.out.println(week + "对应的是星期一"); break; case 2: System.out.println(week + "对应的是星期二"); break; case 3: System.out.println(week + "对应的是星期三"); break; case 4: System.out.println(week + "对应的是星期四"); break; case 5: System.out.println(week + "对应的是星期五"); break; case 6: System.out.println(week + "对应的是星期六"); break; case 7: System.out.println(week + "对应的是星期日"); break; default: System.out.println(week + "没有对应的星期"); break; } } }
例二,根据用户的给定月份数据,显示该月份在哪个季节。
class SwitchTest { public static void main(String[] args) { int x = 4; switch(x) { case 3: case 4: case 5: System.out.println(x + "春季"); break; case 6: case 7: case 8: System.out.println(x + "夏季"); break; case 9: case 10: case 11: System.out.println(x + "秋季"); break; case 12: case 1: case 2: System.out.println(x + "冬季"); break; default: System.out.println("nono"); } } }
if语句和switch语句的区别
if和switch语句很像,具体什么场景下,应用哪个语句呢?如果判断的具体数值不多,而且符合byte、short、int、char这四种类型,虽然两个语句都可以使用,但建议使用switch语句,因为效率稍高。其他情况如对区间判断,对结果为boolean类型的判断,使用if,if的使用范围更广。
循环结构
什么时候使用循环结构呢?当要对某些语句执行很多次时,就使用循环结构。循环结构这一节重点讲for循环语句,因为其在程序中应该是最常用的吧!
for循环语句
格式:
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
当for循环写成如下代码时,你觉得输出结果会是什么?
int x = 1;
for (System.out.println("a"); x < 3; System.out.println("c"), x++) {
System.out.println("d");
}
输出结果为:
a
d
c
d
c
你可以试着运行如下程序代码:
class ForDemo {
public static void main(String[] args) {
for (int x = 0; x < 3; x++) {
System.out.println("x = " + x);
}
//System.out.println("x ======= " + x);
int y = 0;
while (y < 3) {
System.out.println("y = " + y);
y++;
}
System.out.println("y ======= " + y);
}
}
从打印结果,你是不是可以得出结论:
- 变量有自己的作用域,对于for来讲,如果将用于控制循环的增量定义在for语句中,那么该变量只在for语句内有效,for语句执行完毕,该变量在内存中被释放。而while循环使用的变量在循环结束后还可以继续使用。
- for和while可以进行互换。如果需要定义循环增量,用for更为合适。
下面再用二个例子来加强for循环语句的练习。
获取1~10的和,并打印。
class ForTest2 { public static void main(String[] args) { int sum = 0; for (int x = 1; x <= 10; x++) { sum += x; } System.out.println("sum = " + sum); } }
其实这就是累加思想。原理:通过变量记录住每次变化的结果,并通过循环的形式,进行累加动作。
获取1~100之间7的倍数的个数,并打印。
/* 获取1~100之间7的倍数的个数,并打印 思路: 1.先对1~100进行循环(遍历) 2.在遍历的过程中,定义条件,只对7的倍数进行操作 3.因为7的倍数不确定,只要符合条件,就通过一个变量来记录这个变化的次数。 步骤: 1.定义循环语句,选择for语句 2.在循环中定义判断,只要是7的倍数即可,使用if语句。条件:7的倍数 x % 7 == 0; 3.定义变量,该变量随着7的倍数的出现而自增 */ class ForTest3 { public static void main(String[] args) { int count = 0; for (int x = 1; x <= 100; x++) { if(x % 7 == 0) { count++; } } System.out.println("count = " + count); } }
其实这就是计数器思想,原理:通过一个变量记录住数据的状态变化,也需要通过循环完成。
两种最简单死循环格式
两种最简单的死循环格式分别为:
for(;;) {
}
和
while(true) {
}
死循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。
循环嵌套
这里重点讲解for循环嵌套。下面通过六个例子来练习forfor循环嵌套。
例一,使用for循环打印如下所示的图形:
****
****
****
对于打印长方形,外循环控制行数,内循环控制每一行的列数,也就是一行中元素的个数。代码如下:
class ForForDemo {
public static void main(String[] args) {
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 4; y++) {
System.out.print("*");
}
System.out.println();
}
}
}
例二,使用for循环打印如下所示的图形:
*****
****
***
**
*
发现图形有很多行,每一个行有很多列,所以得使用嵌套循环。原理:形象说法,大圈套小圈。代码如下:
class ForForDemo {
public static void main(String[] args) {
for (int x = 0; x < 5; x++) {
for (int y = x; y < 5; y++) {
System.out.print("*");
}
System.out.println();
}
}
}
例三,使用for循环打印如下所示的图形:
*
**
***
****
*****
代码如下:
class ForForDemo {
public static void main(String[] args) {
for (int x = 0; x < 5; x++) {
for (int y = 0; y <= x; y++) {
System.out.print("*");
}
System.out.println();
}
}
}
总结:不是规律的规律:
- 尖朝上,可以改变条件,让条件随着外循环变化。
- 尖朝下,可以初始化值,让初始化值随着外循环变化。
例四,使用for循环打印如下所示的图形:
1
12
123
1234
12345
代码如下:
class ForForDemo {
public static void main(String[] args) {
for (int x = 0; x < 5; x++) {
for (int y = 1; y <= x + 1; y++) {
System.out.print(y);
}
System.out.println();
}
}
}
例五,打印一个99乘法表。
代码如下:
class ForForDemo {
public static void main(String[] args) {
for (int x = 1; x <= 9; x++) {
for (int y = 1; y <= x; y++) {
System.out.print(y + "*" + x + "=" + (y*x) + "\t");
}
System.out.println();
}
}
}
例六,打印如下所示的图形:
□□□□*
□□□*□*
□□*□*□*
□*□*□*□*
*□*□*□*□*
注意:□
表示空格。
代码如下:
class ForForDemo {
public static void main(String[] args) {
for (int x = 0; x < 5; x++) {
for (int y = x + 1; y < 5; y++) {
System.out.print(" ");
}
for (int z = 0; z <= x; z++) {
System.out.print("* ");
}
System.out.println();
}
}
}
循环结构语句的其他二种格式
- while:先判断条件,只有条件满足才执行循环体。
- do while:先执行循环体,再判断条件,条件满足,再继续执行循环体。简单一句话:do while无论条件是否满足,循环体至少执行一次。
其他流程控制语句
break(跳出),应用于选择结构和循环结构。例如,
w:for (int x = 0; x < 3; x++) {
for (int y = 0; y < 4; y++) {
System.out.println("x = " + x);
break w;
}
}
你可以给循环标号哟,然后通过break指定跳出哪个循环。
continue(继续),只能作用于循环结构,继续循环。特点:结束本次循环,继续下一次循环。 例如,
for (int x = 1; x <= 10; x++) {
if(x % 2 == 1)
continue;
System.out.println("x = " + x);
}
你也可以给循环标号,然后通过continue指定继续哪个循环。
w:for (int x = 0; x < 3; x++) {
for (int y = 0; y < 4; y++) {
System.out.println("x = " + x);
continue w;
}
}
这里,你需要注意两点:
- break和continue语句作用的范围。
- break和continue单独存在时,下面不可以有任何语句,因为都执行不到。