3.01Java语言基础(顺序结构语句)
流程控制语句:在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接 影响的。也就是说程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执 行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
if(布尔表达式){
语句体
}
/*需求:找出公约数是5的数,再找出公约数是2的数*/
import java.util.Scanner;
class SimplelfDemo{
public static void main(String[] args){
Scanner scanner=new Scanner(System,in);
System.out.print("Enter an integer:");
int number=scanner.nextInt();
if(number%5==0){
System.out.println("HiFive");
}
if(number%2==0){
System.out.println("HiEven");
}
}
}
提示:如果if语句中只有一条语句,则可以省略花括号。如下所示:
/*需求:找出公约数是5的数,再找出公约数是2的数*/
import java.util.Scanner;
class SimplelfDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter an integer: ");
int number = scanner.nextlnt();
if (number%5==0)
System.out.printlnC'HiFive");
if (number%2==0)
System.out.println("HiEven");
}
}
注意:省略括号可以让代码更加简短,但是容易产生错误。
if(布尔表达式){
语句体1
}else{
语句体2
}
/*判断是否是闰年*/
import java.util.Scanner;
class RunDemo00{
public static void main(String[] args){
/*
数据:输入年份
指令:
1.输入年份
2.判断是否闰年
3.程序结束
*/
Scanner scanner=new Scanner(System.in);
System.out.print("请输入年份:");
int year=scanner.nextInt();
if((year%4==0&&year%100!=0)||(year%400==0)){
System.out.println("闰年");
}else{
System.out.print("不是闰年");
}
}
}
注意:双分支结构如果语句体只有一句话,也可以像单分支结构一样省略大括号。
if(布尔表达式1){
语句体1
}else if(布尔表达式2){
语句体2
}
...
else{
语句体n+1
}
...
执行流程:
/*需求:彩票问题*/
import java.util.Scanner;
class IfDemo01{
public static void main(String[] args){
/*
数据:随机数 输入的两位数
指令:
1.获取一个随机数
2.随机数×100
3.强制转换
4.输入一个两位数
5.取出随机数的各位数a1 b1和两位数的各位数a2 b2
6.判断各位数字
6.1判断a1==a2&&b1==b2
6.2判断a1==b2&&a2==b1
6.3判断a1==b1||a1==b2||b1==a2||b1==b2
7.程序结束
*/
int num1=(int)(Math.random()*100);
System.out.println(num1);
int a1=num1%10;
num1/=10;
int b1=num1;
Scanner scanner=new Scanner(System.in);
System.out.print("Enter the num2:");
int num2=scanner.nextInt();
int a2=num2%10;
num2/=10;
int b2=num2;
if(a1==a2&&b1==b2){
System.out.println("恭喜您中了10000美金!");
}else if(a1==b2&&a2==b1){
System.out.println("恭喜您中了3000美金!");
}else if(a1==a2||a1==b2||b1==a2||b1==b2){
System.out.println("恭喜您中了1000美金!");
}else{
System.out.println("谢谢惠顾!");
}
}
}
/*需求:BMI*/
import java.util.Scanner;
class BMIDemo00{
public static void main(String[] args){
/*
数据:体重(千克) 身高(米) 年龄
指令:
1.输入年龄age
2.判断年龄age>=20;
3.输入体重,身高
4.计算BMI
5.判断BMI的范围
6.程序结束
*/
Scanner scanner=new Scanner(System.in);
System.out.print("请输入年龄:");
int age=scanner.nextInt();
if(age>=20){
System.out.print("请输入体重和身高(千克、米):");
double weight=scanner.nextDouble();
double height=scanner.nextDouble();
double BMI=weight/(height*height);
if (BMI<18.5){
System.out.println("偏瘦");
}else if (BMI<25.0){
System.out.println("正常");
}else if (BMI<30.0){
System.out.println("超重");
}else{
System.out.println("过胖");
}
}else{
System.out.println("年龄过小!!!");
}
}
}
if(布尔表达式1){
if(布尔表达式2){
语句体2
...
}
}
执行过程:
/*需求:当x和y大于2时,求和*/
import java.util.Scanner;
class Demo00{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int x=scanner.nextInt();
int y=scanner.nextInt();
int z;
if (x > 2) {
if (y > 2) {
z=x + y;
System.out.println("z is "+z);
}
}
}
}
if语句常见错误和陷阱
错误:
忘记必要的括号;
在if行出现错误的分号;
对布尔值的冗余测试;
悬空else出现的歧义;
两个浮点数值的相等测试。
陷阱:
简化布尔变量赋值;
避免不同情形中的重复代码;
双分支if-else语句与三目运算符的转换
我们前面讲解过三元运算符,它根据比较判断后,给出的也是两个结果,所以,这种情 况和if语句的第二种格式很相似,他们在某些情况下应该是可以相互转换的。 三元运算符的操作都可以使用if语句改进,反之不成立 当if语句控制的语句体是一条输出语句时,就不成立,因为三元运算符是一个运算符, 必须要求有一个结果返回。而输出语句不能作为一个返回结果。
2.switch语句
要点提示:switch 语句基于变量或者表达式的值来执行语句。
switch语句格式
switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
.......
default:
语句体n+1;
break;
}
执行过程:
/*需求:输出几天后是星期几*/
import java.util.Scanner;
class Demo3_3{
public static void main(String[] args){
/*
数据:今天周几,未来几天后,这天星期几
指令:
1.输入今天周几(0 1 2 3 4 5 6 )
2.输入几天后
3.判断几天后是周几
4.输出
*/
Scanner scanner=new Scanner(System.in);
System.out.print("Enter today's day:");
int today=scanner.nextInt();
System.out.print("Enter the number of days elapsed since today:");
int future=scanner.nextInt();
int week=(today+future)%7;
String todayStr="";
String weekStr="";
switch(week){
case 0:
weekStr="Sunday";
break;
case 1:
weekStr="Monday";
break;
case 2:
weekStr="Tuesday";
break;
case 3:
weekStr="Wednesday";
break;
case 4:
weekStr="Thursday";
break;
case 5:
weekStr="Friday";
break;
case 6:
weekStr="Saturday";
break;
}
switch(today){
case 0:
todayStr="Sunday";
break;
case 1:
todayStr="Monday";
break;
case 2:
todayStr="Tuesday";
break;
case 3:
todayStr="Wednesday";
break;
case 4:
todayStr="Thursday";
break;
case 5:
todayStr="Friday";
break;
case 6:
todayStr="Saturday";
break;
}
System.out.println("Today is "+todayStr+" and the future day is "+weekStr);
}
}
注意事项:
不要忘记在需要的时候使用 break 语句。一旦匹配其中一个 case, 就从匹配的case 处开始执行,直到遇到 break 语句或到达 switch 语句的结束。这种现象称为落空行为(fall-through behavior)。
switch和if各自使用的场景
if使用场景:
switch使用场景:
3.03Java语言基础(循环结构语句)
要点提示: 循环可以用于让一个程序重复地执行语句。
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码 被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为 false,从而结束循环,否则循环将一直执行下去,形成死循环。
循环四要素
1.for语句
***要点提示:***:for 循环具有编写循环的简明语法。
for(初始化语句;继续条件;步长){
循环体
}
执行过程:
/*需求:求最大公约数*/
import java.util.Scanner;
class MaxDemo{
public static void main(String[] args){
/*
数据:两个整数 最大公约数
指令:
1.输入两个整数
2.取出最小的开始进入循环,并判断
3.输出
4.程序结束
*/
Scanner scanner=new Scanner(System.in);
System.out.print("请输入两个整数:");
int num1=scanner.nextInt();
int num2=scanner.nextInt();
for(int i=Math.min(num1,num2);i>=1;i--){
if(num1%i==0&&num2%i==0){
System.out.printf("gcd=%d",i);
break;
}
}
}
}
/*需求:打印空心菱形*/
class KongLingXing{
public static void main(String[] args){
/*
k i j
5 1 1
4 2 1 2
3 3 1 3
2 4 1 4
1 5 1 5
0 6 1 6
1 7 1 5
2 8 1 4
3 9 1 3
4 10 1 2
5 11 1
k的规律是绝对值|6-i|
i j 的规律是j<=i&&i+j<=12
空心的规律:j==1||j==i||i+j==12
*/
for(int i=1;i<=11;i++){
for(int k=1;k<=Math.abs(6-i);k++){
System.out.print(" ");
}
for(int j=1;j<=i&&i+j<=12;j++){
if(j==1||j==i||i+j==12){
System.out.print("* ");
}else{
System.out.print(" ");
}
}
System.out.println();
}
}
}
提示
1.控制变量必须在循环控制结构体内或循环前说明。如果循环控制变量只在循环内使 用而不在其他地方使用,那么在 for 循环的初始动作中声明它是一个很好的编程习慣。如果在循环控制结构体内声明变量,那么在循环外不能引用它。
注意事项
while(循环继续条件){
循环体语句
}
或
循环初始化语句
while(循环继续条件){
循环体语句
步长
}
执行流程:
案例
class Demo3_14{
public static void main(String[] args){
/*
需求:遍历一个平方大于12000的最小正整数
*/
int n=1;
while(true){
if(n*n>12000){
System.out.println("n="+n);
break;
}
n++;
}
n=1;
/*遍历一个n^3>12000的最小正整数*/
while(true){
if(n*n*n>12000){
System.out.println("n="+(n-1));
break;
}
n++;
}
}
}
提示: 循环继续条件应该总是放在固括号内。只有当循环体只包含一条语句或不包含语句 时,循环体的花括号才可以省略。
警告
for与while的对比
区别:
死循环:
3.04Java语言基础(控制跳转语句)
要点提示: 关键字 break 和 continue 在循环中提供了額外的控制。
break关键字
作用:
使用场景:
continue关键字
作用:
使用场景:
注意: continue 语句总是在一个循环内。在 while 和 do-while 循环中,continue 语句之 后会马上计算循环继续条件;而在 for 循环中,continue 语句之后会立即先执行每次迭代 后的动作,再计算循环继续条件。
警告: 过多使用 break 和 continue 会使循环有很多退出点,使程序很难阅读。