3 流程控制语句(选择分支)
3.1 流程控制语句分类
- 计算机中任何简单或复杂的程序都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。
- 顺序结构
- 程序中的各个操作是按照它们在源代码中的排列顺序依次执行的。
- 选择结构
- 根据某个特定的条件进行判断后,选择其中一支执行。
- 循环结构
- 反复执行某个或某些操作,直到条件为假时才停止循环。
- 顺序语句
- 分支语句
- if分支
- switch选择
- 循环语句
- for 循 环 (重点)
- while 循 环
- do while循环
3.2 if分支语句
3.2.1 简单if分支(单分支)
语法:
if(逻辑条件(boolean类型)){
满足逻辑条件执行的代码
}
字符串比较字符串比较使用equals()方法
import java.util.Scanner; public class Demo { //要求控制台输入是否中奖 public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入是否中奖?y/n"); String answer = sc.next(); if (answer.equals("y")){ System.out.println("买车、买房、旅游"); }else System.out.println("继续购买"); System.out.println("程序结束"); } }
3.2.1.1 Math.random 产生随机数
Math.random产生的是0-1之间的小数(含0不含1)
*产生随机数int random=(int)(Math.random()10);
//输入四位数字的会员号的百位数字等于产生的随机数字即为幸运会员,提示恭喜您中奖了,否则没中奖。 import java.util.Scanner; public class Demo30 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入四位数字会员卡号的百位数字"); int num = sc.nextInt(); //获取百位数字 int baiWei = num/100%10; //随机产生一个数字Math.random() 产生一个0-1之间的小数 含0不含1 int ran=(int)(Math.random()*10); if (baiWei==ran){ System.out.println("恭喜您中奖了"); }else System.out.println("谢谢惠顾"); System.out.println("程序结束"); } }
3.2.2 if…else分支
语法:
if(逻辑条件){
满足逻辑条件执行的代码
}else{
不满足逻辑条件执行的代码
}
需求:如果用户名为admin、密码为123456,则跳转首页,否则跳转登录页面
//案例:如果用户名为admin、密码为123456,则跳转首页,否则跳转登录页面 import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名"); String username = sc.next(); System.out.println("请输入密码"); String password = sc.next(); if(username.equals("admin") && password.equals("123456")){ System.out.println("跳转首页"); }else{ System.out.println("跳转登录页面"); } } }
需求:在控制台输入一个年份,判断这个年份是否是闰年,如果是闰年输出年和年份,如果不是闰年输出平年和年份
import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入一个年份:"); int year = input.nextInt(); if((year%4==0 && year%100!=0) || (year%400 ==0)){ System.out.println("是闰年:"+year); }else{ System.out.println("是平年:"+year); } } }
import java.util.Scanner; public class Demo { //控制台输入性别 public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入您的性别"); char gender = input.next().charAt(0); if (gender=='男'){ System.out.println("送一只手表"); }else if(gender=='女'){ System.out.println("送一只口红"); }else System.out.println("程序结束"); } }
3.2.3 多重if分支
语法:
if(逻辑条件1){
满足逻辑条件1执行的代码
}else if(逻辑条件2){ //隐藏条件(不满足条件1)
满足逻辑条件2执行的代码
}else if(逻辑条件3){ //隐藏条件(不满足条件1、2)
满足逻辑条件3执行的代码
}else{
不满足以上所有逻辑条件执行的代码
}
格式:if (关系表达式1) { //判断条件1 语句体1; } else if (关系表达式2) { //判断条件2 语句体2; } …else { 语句体n+1; } *特别注意:**最后的else可以省略不写【通过所有else if语句将条件都提供了】,else如果要书写必须出现在最后的 位置代表着最后的一种情况,之前所有提供判断条件都为false就执行对应else操作【推荐书写else形式,可以省略最后一个else if语句判断条件操作】* *只要在if-else if语句中提供的某个关系表达式判断结果为true,后续代码中提供判断条件皆不在执行*
需求:输入一个字符,判断该字符类型(数字,小写,大写,其他)
//需求:输入一个字符,判断该字符类型(数字,小写,大写,其他) import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入一个字符:"); // 在Java中Scanner是不可以着获取到一个字符的即没有nextChar方法 // 需要通过next方法在通过charAt方法获取到字符 char ch = input.next().charAt(0); if (ch >= '0' && ch<='9'){ System.out.println("是数字:"+ch); }else if(ch >= 'A' && ch <= 'Z'){ System.out.println("是大写字母:"+ch); }else if(ch >= 'a' && ch <= 'z'){ System.out.println("是小写字母:"+ch); }else{ System.out.println("其他字符:"+ch); } } }
3.2.4 嵌套if分支
语法:
if(逻辑条件1){
if(逻辑条件2){
满足逻辑条件1且满足条件2执行的代码
}else{
满足逻辑条件1但不满足条件2执行的代码
} // 内层代码块
}else{
不满足逻辑条件1执行的代码
}
- 执行流程:
- 当外层条件满足时,再判断内层条件
- 注意:
- 一个选择结构中,可嵌套另一个选择结构
- 嵌套格式正确的情况下,支持任意组合。
需求:学校举行跑步比赛,如果成绩在15秒以内,可以进入决赛,男的进入男子组决赛,女的进入女子组决赛
//学校举行跑步比赛,如果成绩在15秒以内,可以进入决赛,男的进入男子组决赛,女的进入女子组决赛 import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入你的比赛成绩"); double score = sc.nextDouble(); if(score < 15){ System.out.println("请输入你的性别"); String sex = sc.next(); if(sex.equals("男")){ System.out.println("恭喜进入男子组"); }else{ System.out.println("恭喜进入女子组"); } }else{ System.out.println("很遗憾你被淘汰了!!!"); } } }
需求:小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。
import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入小明的考试成绩:"); int score = input.nextInt(); //1.提供第一个判断,判断成绩是否合法【成绩是否在0~100之间】 if(score >= 0 && score <= 100){//证明成绩合法 //2.提供第二个判断 ,判断成绩范围得到奖励 if(score>=95){ //if(score>=95 && score<=100){ System.out.println("奖励一套别墅"); }else if(score>=85){ //else if(score>=85 && score<=94){ System.out.println("奖励1w元RMB"); }else{ System.out.println("小黑屋单独聊天....."); } }else{//证明成绩不合法 System.out.println("输入考试成绩不合法!!!"); } } }
3.2.5 if分支语句细节
注意1:
在java中 == 比较的是内存地址
String类的equals比较的是内容 .equals()
基本数据类型使用==比较
String类型使用equals比较
注意2:
在if分支中,大括号可以省略不写,但是如果不写大括号,那么这个if分支只能控制一行代码
如果if或else中只有一条语句,可以省略{ }
注意3:
多重if中要将苛刻条件写前面
3.3 switch 分支
3.3.1 switch分支使用
选择分支结构:
switch中的值:byte short int char String 枚举类型
switch(值){
case 值1:
switch中的值与值1相等时候执行的代码
break;
case 值2:
switch中的值与值2相等时候执行的代码
break;
case 值3:
switch中的值与值3相等时候执行的代码
break;
case 值4:
switch中的值与值4相等时候执行的代码
break;
default:
switch中的值与以上所有值都不相等时候执行的代码
break;
}
switch (表达式) { case 1: 语句体1; break; case 2: 语句体2; break; ... default: 语句体n+1; break; } *特别说明:* *在使用switch这个分支语句提供判断条件时,需要注意判断条件即表达式只能是【整数(long除外)、字 符、字符串和枚举】四种类型之一,剩余类型switch均不支持,偶尔可以使用算数运算符组成表达式进行计 算* *特别强调,不允许使用boolean类型* *case 后面提匹配条件,需要与表达式提供数据类型一直,并且是在提供数据类范围内的数据*
需求:要求选择A和a是一样的结果
import java.util.Scanner; //要求选择A和a是一样的结果 public class Demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入你的选择"); String option = sc.next(); switch (option){ case "a": case "A": System.out.println("好评"); break; case "b": case "B": System.out.println("一般"); break; case "c": case "C": System.out.println("良好"); break; case "d": case "D": System.out.println("差评"); break; } } }
3.3.2 switch分支细节
- 适合做等值判断 —在switch中值的类型:byte、short、int、char、String(JDK7+))、枚举
- 在switch中case值不允许重复
- 在switch中break表示结束当前switch语句
- break可以省略不写
- 如果省略break,执行完代码块后,不能退出switch,如果省略会出现case穿透(switch会一直往下执行,直到遇到下一个break)
- switch和多重if的区别:
- 多重if中可以做关系运算,在swtich中只能做等值判断
6.default可以放在任何位置,也可以省略
实现一个简易计算器
//实现一个简易计算器 import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入第一个数字"); int n1 = sc.nextInt(); System.out.println("请输入第二个数字"); int n2 = sc.nextInt(); System.out.println("请输入运算符"); char ope = sc.next().charAt(0); //保存结果* int result =0; switch (ope){ case '+': result = n1+n2; break; case '-': result = n1-n2; break; case '*': result = n1*n2; break; case '/': if (n2==0){ System.out.println("除数不能为0"); }else { result = n1 / n2; } break; case '%': result = n1%n2; break; default: System.out.println("不支持此运算"); break; } System.out.println("结果是"+result); } }
import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个季节"); char season = sc.next().charAt(0); //String season = sc.next(); 则双引号包裹内容"春" switch (season){ case '春': System.out.println("春暖花开"); break; case '夏': System.out.println("夏日炎炎"); break; case '秋': System.out.println("秋高气爽"); break; case '冬': System.out.println("白雪皑皑"); break; default: System.out.println("输入有误"); break; } } }
3.3.4 break语句case穿透的使用
switch语句中case语句内使用break关键字作为结束switch语句操作,但是Java中是允许case语句不写break关键字,如果不提供break关键字,此时switch语句中提供case操作就会贯穿【穿透】效果,穿透的效果是不会匹配后续case中提供条件【就算匹配不成功执行】,直到再次遇到break关键字时停止或者执行到代码末尾停止。
需求:在不考虑平闰年的前提下,通过控制台输入1-12月之间任意一个月份,输出对应的天数
如果不适用switch语句穿透效果,那么需要提供12个case进行数据匹配,但是在12个case中有多个case执行效果都是一样的
2 月份 28天 4,6,9,11 月份30天 1,3,5,7,8,10,12 月份 31天
利用case穿透特性节约代码,解决不同case条件但是执行语句操作相同的方式
import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入(1~12)之间数字代表月份:"); int month = input.nextInt(); switch (month){ case 2: System.out.println("28天"); break; case 4: case 6: case 9: case 11: System.out.println("30天"); break; default: System.out.println("31天"); break; } } }
import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个月份"); int month = sc.nextInt(); //1 3 5 7 8 10 12 31天 //2 //4 6 9 11 30天 switch (month){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: System.out.println("31天"); break; case 2: System.out.println("28天"); break; case 4: case 6: case 9: case 11: System.out.println("30天"); break; default: System.out.println("输入有误"); break; } } }
3.4 总结switch和if分支的区别
- 相同点: 都是分支语句,都是可以互相嵌套的
- 不同点: switch语法和if语法是不同,switch语句和if语句提供判断条件不同,
f语句使用boolean类型【关系和逻辑运算符组成表达式】,if使用场景多用于范围内数据值
switch语句使用整数【不包括long】、字符、枚举和字符串类型【更加倾向于具体的数值】,switch使用场景多用于某个固定数值
- 值】,switch使用场景多用于某个固定数值
PS:实际开发中还是使用if分支语句较多
变量类型(补充)
局部变量优先级高于成员变量
概念:声明在方法内部的变量,必须先赋值再使用。
作用范围:定义行开始到所在的代码块【即花括号内】结束。
注意:多个变量,在重合的作用范围内,不能出现重名。
概念:声明在方法外部,类内部的变量,有默认值(可以不赋值)。
作用范围:整个类内部使用。
注意:如果和局部变量同名,局部变量优先级高。
如果成员变量不赋值,则: byte int short long默认为0; double float默认为0.0; true false默认false char 默认空字符“ ”
public class Demo { public static void main(String[] args) { //局部变量 必须先赋值才能使用 int age = 20; System.out.println(age);//20 if (age>=18){ int num = 100; System.out.println(age); //20 System.out.println(num); //100 if (num>20){ System.out.println(++num); //101 System.out.println("--------"); } } System.out.println(age); //20 int num = 200; //int age = 30; Variable 'age' is already defined in the scope System.out.println(num); //200 } }
成员变量
public class Demo { //类内部,方法外部 static char money; public static void main(String[] args) { //局部变量 必须先赋值才能使用 int age = 20; System.out.println(age);//20 System.out.println(money);//static char money=77,输出77 // 不赋值byte int short long默认为0; // double float默认为0.0; // true false默认false // char 默认空字符“ ” } //类内部,方法外部 }