一、概述与顺序结构
1.逻辑控制的概述
逻辑控制包括三种结构:顺序结构,分支结构和循环结构,这里主介绍后面两种
2.顺序结构
顺序结构是结构中最简单,也是最常见的一种。从上到下写代码,从上到下打印数字,就是顺序的一种
二、分支结构
分支结构有两种:if语句和switch语句
1.if语句
(1)简单的if条件语句
【语法规则】如果布尔表达式结果为true,执行if中的语句,否则不执行
if(布尔表达式){ // 复合语句 }
【实例】
public static void main(String[] agrs) { int score = 88; if(score>=80) { System.out.println("分数>="+score+"可以吃大鸡腿"); } }
只要满足条件,就会进入花括号内执行语句;否则直接跳过。
(2)if…else语句
【语法规则】如果布尔表达式结果为true,则执行if中语句,否则执行else中语句
if(布尔表达式){ // 复合语句1 }else{ // 复合语句2 }
【实例】二选一
public static void main(String[] agrs) { int score = 88; if(score>=90) { System.out.println("吃鸡腿"); } else { System.out.println("吃大嘴巴子"); } }
(3)if…else if多分支语句
【语法结构】表达式1成立,执行语句1,否则表达式2成立,执行语句2,否则执行语句3。其中,可以嵌套多层else if结构
if(布尔表达式1){ // 语句1 }else if(布尔表达式2){ // 语句2 }else{ // 语句3 }
【实例】
题目:
分数在 [90, 100] 之间的,为优秀
分数在 [80, 90) 之前的,为良好
分数在 [70, 80) 之间的,为中等
分数在 [60, 70) 之间的,为及格
分数在 [ 0, 60) 之间的,为不及格
错误数据
public static void main(String[] agrs) { int score = 88; if(score >= 90){ System.out.println("优秀"); }else if(score >= 80 && score < 90){ System.out.println("良好"); }else if(score >= 70 && score < 80){ System.out.println("中等"); }else if(score >= 60 && score < 70){ System.out.println("及格"); System.out.println("不及格"); }else{ System.out.println("错误数据"); } } }
(4)代码风格与易错点
【代码风格】
建议:{ 放在 if / else 同一行
int x = 10; if (x == 10) { // 语句1 } else { // 语句2 }
【易错1】分号问题:在if后面加了个分号
public static void main(String[] args) { int a=10; if(a>12); { System.out.println("测试"); } }
【易错2】悬垂else:也就是if与else的配对问题
public static void main(String[] args) { /* int a=10; if(a>12); { System.out.println("测试"); }*/ int x = 10; int y = 10; if (x == 10) if (y == 10) System.out.println("aaa"); else System.out.println("bbb"); }
正确做法:需要合理使用括号,不然易出现错误
public static void main(String[] args) { int x = 10; int y = 10; if (x == 10) { if (y == 10) System.out.println("aaa"); }else System.out.println("bbb"); }
2.switch语句
(1)基本语法
switch(表达式){ case 常量值1:{ 语句1; [break;] } case 常量值2:{ 语句2; [break;] } ... default:{ 内容都不满足时执行语句; [break;] } }
【执行流程】
1. 先计算表达式的值
2. 和case依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到break时结束
3. 当表达式的值没有与所列项匹配时,执行default
(2)代码实例:根据 day 的值输出星期
public static void main(String[] args) { int day = 1; switch(day) { case 1: System.out.println("星期一"); break; case 2: System.out.println("星期二"); break; case 3: System.out.println("星期三"); break; case 4: System.out.println("星期四"); break; case 5: System.out.println("星期五"); break; case 6: System.out.println("星期六"); break; case 7: System.out.println("星期日"); break; default: System.out.println("输入有误"); break; } }
表达式的值会与case后面的值匹配,决定从哪个入口进去
(3)switch语句需要注意的点
- 多个case后的常量值不可以重复
- switch的括号内不能是以下类型的表达式:long、float、double、boolean
- break 不要遗漏, 否则会失去 "多分支选择" 的效果
- switch 不能表达复杂的条件
- switch 虽然支持嵌套, 但是很丑,一般不推荐~
- 表达式的值可以是字符串
3.switch语句与if语句的对比
(1)if语句中的表达式可以是复杂表达式,但是switch不能表达复杂的条件
(2)分支越多,switch语句的优质越大
(3)从使用效率上区分,早对同一个变量的不同值作条件判断时,使用switch语句的效率更高一些,尤其分支越多的时候;从语句的实用性的角度,switch语句肯定不如if语句
三、循环结构
1.while语句
(1)语法结构
while(条件表达式){ 循环体; }
(2)用法举例:用while循环打印1-10的数字
public static void main(String[] args) { int i=1; while(i<=10) { System.out.println(i); i++; } }
2.for语句
(1)语法结构
for(表达式1;布尔表达式2;表达式3){ 循环体; }
表达式1:该表达式用于初始化循环控制变量,它只在循环开始时执行一次。
表达式2:循环条件表达式,它的类型为boolean,如果表达式的值为true就执行一次循环体。
表达式3:该表达式用于改变循环体变量的值。
(2)代码实例:用来计算1-100数字的和
public static void main(String[] args) { int i = 1; int sum = 0; for(i=1;i<=100;i++) { sum+=i; } System.out.println(sum); }
3.do…while循环(选学)
(1)语法结构
do{ 循环语句; }while(循环条件);
与while循环不同,do…while循环无论条件是否满足,都会执行一次循环语句,剩下的与while循环相同。
(2)注意事项
do while 循环最后的分号不要忘记
四、循环的跳转
循环的跳转也就是由两个语句控制:break与continue;在C语言中都学过,break也就是跳出整个循环体,而continue就是跳过本次的循环(会少一次循环次数),直接进入下一场的循环。
1.break语句
break语句分为两种:不带标号的break与带标号的break。
(1)不带标号的break语句
【介绍】不带标号的break也就是常见的break,用于终止break语句所在的循环。
【用处】可以用在switch、while循环、do…while循环和for循环中
【实例】用来求1-100数字的和,计算完就跳出循环
public static void main(String[] args) { int sum = 0; int control = 1; while(true) { sum+=control; if(control==100) { break; } control++; } System.out.println("1-100的总和="+sum); }
(2)带标号的break语句
【语法结构】break 标号;
意思:将标号后面的循环终止
【用处】可以终止标号指定的循环,常用于跳出多层循环的情况
【实例】当九九口诀表的积大于16时终止外层循环(部分,用于测试)
先看没有使用break的时候:
public static void main(String[] args) { int i = 1; for(i=1;i<=5;i++) { int j = 1; for(j=1;j<=i;j++) { System.out.println(i+"*"+j+"="+(i*j)); } System.out.print("\n"); } }
加了标号:
public static void main(String[] args) { int i = 1; loop: for(i=1;i<=5;i++) { int j = 1; for(j=1;j<=i;j++) { if(i*j>10) { break loop; } String result = String.format("%-1d*%d=%-2d", j, i, (i * j)); System.out.print(result + " "); } System.out.print("\n"); }
对比:
2.continue语句
continue语句也分为两种,不带标号的continue语句和带标号的continue语句
(1)不带标号的
【介绍】和常见的continue一样,用于终止一次循环,进入下一次循环
【去向】常用在while、do…while和for语句中
【用例】输出1-100的数字,过滤掉不能被7整除的数
public static void main(String[] args) { int i = 1; for(i=1;i<=100;i++) { if(i%7!=0) { continue; } System.out.println(i+"、"); } }
结果:
(2)带标号的
【语法格式】continue 标号;
【用处】跳过标号指定的循环语句一次循环,然后判断指定标号的循环条件,以决定是否执行标号指定的循环
【用例】使用带标号的for循环和带标号的continue语句输出九九口诀表
public static void main(String[] args) { outer:for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) { if(j>i) { System.out.println(); continue outer; } String result = String.format("%-1d*%d=%-2d", j, i, (i * j)); System.out.print(result + " "); } System.out.println(); } }
结果:
去掉标号:
五、总结(与C的差异)
(1)if语句的条件表达式必须是布尔表达式
(2)switch的表达式可以是字符串,但是有类型的限制
(3)多了带标号的break和continue