if选择结构
1、分类
if单选结构
if双选结构
if多选结构
2、if单选结构
语法:
if (条件表达式) {
}说明:只有当条件表达式返回值为true时,才会执行花括号(代码块)中的代码
3、if双选结构
语法:
if (条件表达式) {
}
else {
}说明:if双选结构有且只有一个代码块中的代码会执行(二选一)
练习:模拟用户登录,用户名为“admin”,密码为“123456”
Scanner input = new Scanner(System.in);
System.out.print("请输入用户名:");
String userName = input.next();
System.out.print("请输入密码:");
String password = input.next();
if (userName.equals("admin") && password.equals("123456")) {
System.out.println("登录成功");
}
else {
System.out.println("登陆失败");
}
- 注意点:在该练习中,比较两字符串使用的equals方法,在前面数据类型的学习中,了解到基本数据类型使用“==”是比较“数据值”是否相等,而引用数据类型使用“==”是比较“地址值”是否相等,而字符串属于引用数据类型,所以使用equals方法比较内容是否相等
4、if多选结构
- 语法:
if (条件表达式) {
} else if(条件表达式){
}else if(条件表达式){
}......
else{
} - 说明:if多选结构中有且只有一个代码块会执行(多选一)
5、if选择结构总结
- 如果if选择结构中只有一行代码,花括号可以省略,但初学者不建议省略,会影响代码可读性
- 当if单选结构和if多选结构都能解决同一问题时,建议使用if多选结构,因为多选结构效率更高
例如:
// 根据分数输出分数所代表级别int num = 98;
if (num >= 90) {
System.out.println("优秀");
} else if (num >= 70 && num < 90) {
System.out.println("良好");
} else if (num >= 60 && num < 70) {
System.out.println("及格");
} else if (num >= 0 && num < 60) {
System.out.println("不及格");
}
// 多选结构,当num = 98 时,运行到第一个条件表达式时,满足条件,输出优秀后跳出选择结构
int num = 98;
if (num >= 90) {
System.out.println("优秀");
}
if (num >= 70 && num < 90) {
System.out.println("良好");
}
if (num >= 60 && num < 70) {
System.out.println("及格");
}
if (num >= 0 && num < 60) {
System.out.println("不及格");
}
// 单选结构,每次都需要运行一次条件表达式,执行效率低
-
在Java语言中,“{}”我们称之为代码块,而定义在方法体和代码块中的变量,我们称之为局部变量
1、局部变量生命周期:定义局部变量时“出生”,执行到大括号的结束位置“死亡”
2、代码块的特点:在代码块中定义的变量,只能在当前作用域中使用,在代码块之外不能使用
3、if选择结构,我们也称之为“带名称”或“带条件”的代码块 -
练习:
输入时(hour)、分(minute)、秒(second)的一个具体时间,要求打印出它的下一秒出来(一天24小时)。例如输入的是23时59分59秒,则输出00:00:00;例如输入17时09分59秒,则输出17:10:00。
2、switch选择结构
- 语法:
switch (表达式) {
case 常量1:
// 当“表达式”结果和“常量1”的值匹配的时候,则执行此处的代码。
break;
case 常量2:
// 当“表达式”结果和“常量2”的值匹配的时候,则执行此处的代码。
break;
case 常量3:
// 当“表达式”结果和“常量3”的值匹配的时候,则执行此处的代码。
break;
......
default:
// 当以上case都无法匹配成功的时候,则执行此处的代码。
}
-
switch选择结构的注意点
1、关于switch的注意点- 此处表达式结果支持byte、short、int、char、String和枚举,不支持boolean和浮点型
2、关于case的注意点
- case后只能接常量,不能接变量,这样保证了匹配的安全性
- case后面的常量值不能有相同的,否则会编译错误
- case后面的常量数据类型必须和表达式返回值的数据类型一致,此处的数据类型保持一致,包含了隐式类型转换后的类型
3、关于break的注意点
- 一旦执行了break语句,就会跳出选择结构,执行选择结构之后的代码
- break可以省略,省略过后会发生穿透现象,直到遇到下一个break
例如:
/*
需求:随机生成[0,100],如果成绩为: 90(包含)到100(包含)输出优秀,70(包含)到90输出良好, 60(包含)到70输出及格,60分以下输出不及格
*/
// 随机生成[30,60]的数
int num = (int)(Math.random() * 31) + 30;
System.out.println(num);
int score = (int)(Math.random() * 101);
System.out.println("生成的分数为:" + score);
if (score < 0 || score > 100) {
System.out.println("成绩输入有误");
} else {
switch (score / 10) {
case 10 :
case 9 :
System.out.println("优秀");
break;
case 8 :
case 7 :
System.out.println("良好");
break;
case 6 :
System.out.println("及格");
break;
default:
System.out.println("不合格");
}
}
在本例中使用到了Math类中的random方法,该方法可以随机生成一个[0.0, 1.0)的小数
3、if和switch的总结
- switch能做的事,if都能完成;但if能完成的操作,switch不一定能完成
- if常用于“区间判断”,也就是boolean类型结果的判断
- switch常用于“固定值判断”,很多公司明确规定对固定值的判断使用switch,结构清晰
4、for循环结构
- 语法:
for(循环初始化表达式; 循环条件表达式; 循环后的操作表达式) {
循环体;
} - 执行顺序:循环初始化表达式 --> 循环条件表达式 --> 循环体 --> 循环后的操作表达式 --> 循环条件表达式 --> 循环体 --> ......
5、while循环结构
- 语法:
while(循环条件表达式){
循环体;
} - 执行顺序:先判断循环条件表达式,然后执行循环体
- 注意点:在while循环结构中,”循环后的操作表达式“放的位置对结果有影响
6、do...while循环结构
- 语法:
do {
循环体;
} while (循环条件表达式) - 执行顺序:先执行一次循环体,然后对循环条件表达式进行判断
7、三种循环的使用频率
for循环最常使用,while其次,do...while使用频率很低,几乎不会使用
8、死循环
-
概念:无法靠自身的控制终止的循环
-
分类
1、有害的死循环- 引起原因:逻辑混乱或书写语法错误
2、有利的死循环
- 最简单的死循环
// for死循环
for (; ; ;) {
}
// while死循环while (true) {
}
9、break关键字和continue关键字
- break关键字
1、使用场合:可以在switch选择结构中使用,还可以在循环结构中使用
2、具体作用:在switch中使用,跳出switch选择结构;在循环结构中使用,跳出循环结构,继续执行循环结构之后的代码 - continue关键字
1、使用场合:只能在循环结构中使用
2、具体作用:跳过一次循环,继续执行下一次循环 - 示例:
// 韩信点兵,三人一组余两人,五人一组余三人,七人一组余四人,请问最少需要多少士兵。int i = 1;
while (true) {
if (i % 3 == 2 && i % 5 == 3 && i % 7 == 4) {
break;
}
i++;
}
System.out.println("最少需要人数:" + i);
- 带标签的break和continue
因为break和continue终止或跳过的是最近的循环结构,如果想要终止或跳过外层循环结构,可以给外层循环加上一个标签,然后使用“break 标签名”或“continue 标签名”来完成
10、假设法
// 输入一个任意整数,判断它是否为质数/*
先假设输入的数为质数,设置一个flag为true,当判断出该数不为质数时,将flag重新赋值为false
*/
Scanner input = new Scanner(System.in);
System.out.print("请输入一个正整数:");
int num = input.nextInt();
boolean flag = true;
for (int i = 2; i < num; i++) {
if (num % i == 0) {
flag = false;
}
}
if (flag) {
System.out.println(num + "是一个素数");
}
else {
System.out.println(num + "不是一个素数");
}
11、嵌套循环(难点)
主要是一些练习,能使用单循环解决问题,尽量不要使用嵌套循环,嵌套循环的效率较低
//打印等腰三角形int count = 5;
for (int i = 0; i < count; i++) {
for (int j = 1; j <= count-i-1; j++) {
System.out.print(" ");
}
for (int k = 1; k <= 2 * i + 1; k++) {
System.out.print("*");
}
System.out.println();
}
// 2、使用嵌套循环实现九九乘法表(注意循环变量的初始值)。
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + i*j + "\t");
}
System.out.println();
}