二、程序流程控制
流程控制语句是用来控制程序中各语言执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
三种基本流程结构:
顺序结构
程序从上到下逐行执行,中间没有任何判断和跳转。
分支结构
根据条件,选择性地执行某段代码。
有if-else和switch-case两种分支语句。
循环结构
根据循环条件,重复性的执行某段代码。
有while、do……while,for三种循环语句
注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
if-else
所有三元运算符都可以用if-else结构替代,if-else不一定能改成三元运算符。
如果既可以使用三元运算符又可以使用if-else,优先选用三元运算符。原因:简洁、执行效率高。
例如,3个数取最大值
class SanYuan{
public static void main(String[] args){
int n1=12;
int n2=30;
int n3=-43;
int max=((n1>n2?n1:n2)>n3)?(n1>n2?n1:n2):n3;//不建议这么写,可读性差
System.out.println("The max of n1 n2 n3 is " + max);
int max1,max2;
if(n1>n2){
max1=n1;
} else{
max1=n2;
} if(max1>n3){
max2=max1;
} else{
max2=n3;
}
System.out.println("The max of n1 n2 n3 is " + max2);
}
}
if语句三种结构(条件判断结构):
1、if(条件表达式){执行代码块} //只有一种选择
2、if(条件表达式){执行代码块1} else {执行代码块2} //二选一
3、if(条件表达式){执行代码块1} else if(条件表达式2){执行代码块2} else{执行代码块3} 多选一,中间可以多个elseif
&和&&的异同
都是且的关系
左边true,右边都执行
左边false,短路与后面不执行,逻辑与后面执行
Scanner类
从键盘获取不同类型的变量,char型的获取,Scanner没有提供相关办法,只能获取一个字符串。
当输入的值和获取的类型不一致时会报错。
具体实现步骤:
1、导包:import java.util.Scanner;写在类的上面,类Scanner在包util下。
2、Scanner的实例化,Scanner scan=new Scanner(System.in);
3、调用Scanner类的相关方法获取指定类型的变量,int num=scan.nextInt();
例1:
输入一个整数并输出。
import java.util.Scanner;
class Scan{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
System.out.println("The input number is "+i);
}
}
javac Scanner.java
$ java Scan
88
The input number is 88
例2:
输入字符串。
import java.util.Scanner;
class ScannerString{
public static void main(String[] args){
Scanner sc =new Scanner(System.in);
System.out.println("请输出你的名字:n");
String userName = sc.next();
System.out.println("欢迎"+userName+"登录系统");
}
}
$ javac ScannerString.java
$ java ScannerString
请输出你的名字:
lisi
欢迎lisi登录系统
例3:
输入期末考试成绩,100分降落宝马,80-99奖励手机,60-80奖励玩具,不及格什么都没有。
import java.util.Scanner;
class IfTest{
public static void main(String[] args){
int score;
Scanner scan = new Scanner(System.in);
System.out.println("请输入成绩,在0到100之间");
score=scan.nextInt();
if(score == 100){
System.out.println("奖励一辆BMW");
}else if(score < 100 && score > 80){
System.out.println("奖励一个手机");
}else if(score >= 60 && score <= 80){
System.out.println("奖励一个玩具");
}
else{
System.out.println("什么都没有");
}
}
}
说明
1、else结构是可选的。
2、针对条件表达式:如果多个条件表达式之间是“互斥”关系,哪个判断在上面或下面都无所谓;如果有交集,应该考虑清楚哪个条件应该在上面;如果条件表达式之间有包含关系,需要将范围小的声明在上面,否则小的永远不会执行,因为if else只有一个出口。
例4:
输入3个整数,按小到大输出排序。
import java.util.Scanner;
class SortTest{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("Please insert the first number");
int num1 = scan.nextInt();
System.out.println("Please insert the second number");
int num2 = scan.nextInt();
System.out.println("Please insert the third number");
int num3 = scan.nextInt();
if(num1 > num2){
if(num2 > num3){
System.out.println(num3 + "," + num2 + "," + num1);
}else if(num3 > num1){
System.out.println(num2 + "," + num1 + "," + num3);
} else{
System.out.println(num2 + "," + num3 + "," + num1);
}
} else {
if(num1 > num3){
System.out.println(num3 + "," + num1 + "," + num2);
}else if(num3 > num2){
System.out.println(num1 + "," + num2 + "," + num3);
} else{
System.out.println(num1 + "," + num3 + "," + num2);
}
}
}
}
$ java SortTest
Please insert the first number
1000
Please insert the second number
0
Please insert the third number
888
0,888,1000
说明:
1、if-else可以互相嵌套,不过一遍不要嵌套3层以上,3层以上自己就晕了。
2、if-else 后面如果只有一行执行语句,可以省略{},一般不建议省略.
Java用法:
String isHandsome=scan.next();
if(isHandsome.equals("是"))
switch-case
结构switch(表达式){
case 常量1:
语句1;
//break;
case 常量2;
语句2;
//break;
case 常量N:
语句N;
//
default:
语句;
//break;
}
分支结构之二:switch-case
说明:
1、根据switch表达式中的值,依次匹配各个case中的常量,一旦匹配成功,会进入相应case中,调用其执行语句。当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或到switch-case结构末尾为止结束,后面的case条件不会做判断。
例子:
class SwitchCase{
public static void main(String[] args){
int num1=2;
switch(num1){
case 0:
System.out.println("zero");
case 1:
System.out.println("one");
case 2:
System.out.println("two");
case 3:
System.out.println("three");
default:
System.out.println("others");
}
}
}
$ java SwitchCase
two
three
others
2、break可以用在switch-case结构中,表示一旦执行到次关键字就跳出switch-case结构
3、switch结构中的表达式,只能是如下6中数据类型之一:byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)。
4、case后面只能声明常量,不能是范围值。
5、break关键字是可选的,不是必须加的,绝大多数情况都需要加。
6、default相当于if-else中的else,default选项是可选的,而且位置是灵活的,通常放到最后。
例1
switch-case判断成绩,小于60输出不合格,大于等于60输出合格。
class Test{
public static void main(String[] args){
int score=78;
switch(score/60){
case 0:
System.out.println("不及格");
break;
case 1:
System.out.println("及格");
break;
default:
System.out.println("输入值有误");
break;
}
}
}
例2:
输入年月日,计算出是第几天
import java.util.Scanner;
class Date{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入年份");
int years = scan.nextInt();
System.out.println("请输入月份,1-12");
int months = scan.nextInt();
System.out.println("请输入日期,1-31");
int days = scan.nextInt();
int sum=0;
switch(months){
case 12:
sum += 30;
case 11:
sum += 31;
case 10:
sum += 30;
case 9:
sum += 31;
case 8:
sum += 31;
case 7:
sum += 30;
case 6:
sum += 31;
case 5:
sum += 30;
case 4:
sum += 31;
case 3:
//判断是否闰年
if((years % 4 == 0 && years % 100 != 0)||(years % 400 == 0)){
sum += 29;
}else{
sum += 28;
}
case 2:
sum +=31;
case 1:
sum +=days;
System.out.println(years + "年" + months + "月" + days + "日" + "是当年的第" + sum + "天");
break;
default:
System.out.println("月份输入错误");
}
}
}
$ java Date
请输入年份
2019
请输入月份,1-12
12
请输入日期,1-31
31
2019年12月31日是当年的第365天
总结:
1、凡是可以使用switch-case的结构都可以转换为if-else。反之,不成立。
2、当我们写分支结构时,我们发现既可以使用switch-case,case取值不太多,又可以使用if-else时,优先选择使用switch-case。原因:switch-case执行效率稍高。