目录
一、概念
使用不同的关键字/语法来控制代码的执行流程/顺序。
流程控制语句:
控制代码执行的顺序的语句。
二、分类
1、顺序结构
按照从上往下的顺序,逐行执行代码。
2、条件分支结构
代码写得多,程序运行的少。
3、循环结构
某段代码相同或者相似,使用相同的逻辑。使用一定的格式,来完成相同代码的反复执行。
三、分支结构
1、分支结构分为两种:
- if判断语句
- switch语句
2、if语句有三种格式:
- 只有一种选择;
- 有两种选择,只能选择其中的一种;
- 有多种选择,只能选择其中的一种;
if判断语句
- if语句第一种格式:if
if(条件语句){
语句体;
}
解释:
条件语句: 就是一个关系表达式 或者 逻辑表达式;
语句体: 可以是一个行代码 可以是 多好代码;
执行流程:
首先判断关系表达式看其结果是true还是false,如果是true就执行语句体,如果是false就不执行语句体。
练习:假设修正法
找出三个数中最大的数
public static void main(String[] args) {
int a = 11;
int b = 65;
int c = 99;
// 找出三个数中的最大值
// 编程方法:假设修正法
int max = a; // 1 假设 a最大
if(b>max){ // 修正
max = b;
}
if(c>max){ // 修正
max = c;
}
System.out.println("最大值为:"+max);
}
- if语句第二种格式:if...else
if(条件判断语句){
语句体1;
}else{
语句体2;
}
执行流程:
首先判断关系表达式看其结果是true还是false,如果是true就执行语句体1,如果是false就执行语句体2。
- if语句第三种格式:if...else if...else
if(条件语句1){
语句体1;}else if(条件语句2){
语句体2;}
...
else{
语句体n+1;}
执行流程:
首先判断关系表达式1看其结果是true还是false,如果是true就执行语句体1,如果是false就继续判断关系表达式2看其结果是true还是false,如果是true就执行语句体2,如果是false就继续判断关系表达
式…看其结果是true还是false,… ,如果没有任何关系表达式为true,就执行语句体n+1。
练习:根据用户输入的不同成绩(0~100),给出相应的提示:优秀,良好,及格,不及格...
public static void main(String[] args) {
System.out.println("请输入成绩:");
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
if(score>=90 && score<=100){
System.out.println("优秀");
}else if(score>=80 && score<90){
System.out.println("良好");
}else if(score >=60 && score<80){
System.out.println("及格");
}else if(score<60 && score>=0){
System.out.println("不及格");
}else{
System.out.println("分数输入有误");
}
}
练习:判断闰年
public static void main(String[] args) {
System.out.println("请输入一个年份:");
Scanner sc = new Scanner(System.in);
int year = sc.nextInt();
if((year%4==0 && year%100!=0) || year%400==0){
System.out.println(year+"年是闰年");
}else{
System.out.println(year+"年不是闰年");
}
}
练习:水仙花数
说明:所谓的水仙花数是指一个三位数,其各个位数字的立方和等于该数本身。 举例:153就是一个水仙花数。 153 = 1*1*1 + 5*5*5 + 3*3*3
public static void main(String[] args) {
System.out.println("请输入一个三位数:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int ge = num%10;
int shi = num/10%10;
int bai = num/100%10;
int result = ge*ge*ge+shi*shi*shi+bai*bai*bai;
if (num == result){
System.out.println(num+"是水仙花数");
}else {
System.out.println(num+"不是水仙花数");
}
}
switch结构
switch(表达式){
case 目标值1:
语句体1
break;
case 目标值2:
语句体2
break;
...
default:
语句体n+1
break;
}
在上面的格式中,switch语句将表达式的值与每个case中的目标值进行匹配,如果找到了匹配的值,会执行对应case后的语句,如果没找到任何匹配的值,就会执行default后的语句。
注意:
switch语句中的表达式只能是byte、short、char、int类型的值,在JDK5.0中引入的新特性enum枚举也可以作为switch语句表达式的值,在JDK7.0中也引入了新特性,switch语句可以接收一个String类型的值。
练习:键盘输入一个数值,根据输入的数字 输出对应的星期几
public static void main(String[] args) {
/*
* 键盘输入一个数值,根据输入的数字 输出对应的星期几
* */
System.out.println("请输入数字:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
switch(num){
case 1:System.out.println("星期1");break;
case 2:System.out.println("星期2");break;
case 3:System.out.println("星期3");break;
case 4:System.out.println("星期4");break;
case 5:System.out.println("星期5");break;
case 6:System.out.println("星期6");break;
case 7:System.out.println("星期日");break;
default:System.out.println("请输入正确的星期数");break;
}
}
case穿透(下坠)
当switch中的表达式 与case后面的 目标值 一样时,程序就会执行这个case和它下面的case中的代码,直到遇到break才停止执行。
public static void main(String[] args) {
int week = 2;
switch (week) {
case 1:
case 2:
case 3:
case 4:
case 5:
// 当 week 满足值 1、2、3、4、5 中任意一个时,处理方式相同
System.out.println("今天是工作日");
break;
case 6:
case 7:
// 当 week 满足值 6、7 中任意一个时,处理方式相同
System.out.println("今天是休息日");
break;
}
}
练习:键盘录入一个月份,输出这个月份的季节,3、4、5月是春季,6、7、8是夏季,9、10、11秋季,12、1、2冬季,其他数字,没有任何季节,录入错误。
System.out.println("请输入月份:");
Scanner sc = new Scanner(System.in);
int month = sc.nextInt();
switch(month){
case 3:
case 4:
case 5:System.out.println("春季");break;
case 6:
case 7:
case 8:System.out.println("夏季");break;
case 9:
case 10:
case 11:System.out.println("秋季");break;
case 12:
case 1:
case 2:System.out.println("冬季");break;
default:System.out.println("月份输入错误");
}
if和switch的区别
1、相同点:if语句和switch语句都可以表达分支结构
2、不同点:
1、if语句格式相对灵活,更加强大,switch语句相对弱小。所有的switch语句都可以被if语句替代。
2、if语句更多的是做一些连续性的判断,而switch语句更多的是做一些离散性的匹配。
3、if语句每次都需要获取表达式的值,而switch只获取一次表达式的值,所以相对switch的效率高一些。
四、循环结构
Java中三种循环结构:
- for循环
- while循环
- do while循环
for循环
格式:
for(初始化表达式①; 布尔表达式②; 步进表达式④){
循环体③
}
执行流程
执行顺序:①②③④>②③④>②③④…②不满足为止。
①负责完成循环变量初始化
②负责判断是否满足循环条件,不满足则跳出循环
③具体执行的语句
④循环后,循环条件所涉及变量的变化情况
练习:键盘输入一个数n,求n的阶乘
//5!= 5*4*3*2*1
System.out.println("请输出要求阶乘的正整数");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if(n<0){
System.out.println("请输入正确数字");
}else if(n==0){
System.out.println(n+"的阶乘是1");
}else{
int jiecheng = 1; // 在循环外定义一个变量用来累积数据
for(int i=1;i<=n;i++){
//jiecheng=jiecheng*i;
jiecheng*=i;
}
System.out.println(n+"的阶乘是"+jiecheng);
}
死循环
写循环语句的时候,由于粗心或逻辑错误,导致循环一直下去,无法结束。
无限循环
在循环语句的时候,设计成一直循环的语句,不让结束。
跳出控制语句
Java提供了break,continue来实现控制语句的中断和跳转。
(1)break
break的使用场景:在选择结构switch语句中、在循环语句中
break的作用:跳出当前switch/循环语句
(2)continue
continue的使用场景:在循环语句中
continue的作用:结束本次循环,继续下一次循环
练习:判断一个数是不是素数(质数)
public class Test {
/*
* 键盘输入一个数,判断是不是素数(质数)
*
* 1 键盘输入n
* 2 产生2到n-1的数据 判断 n能不能被产生的这些数整除,只要其中一个能整除n,n就不是素数
* */
public static void main(String[] args) {
System.out.println("请输入要判断的数据:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 9 2-8 (2-4)
if(n==2){
System.out.println("是素数");
}else{
boolean flag = true; // 先假设n是素数
for(int i=2;i<n/2;i++){ // 整个循环都是在修正 ,n不能被 n/2以上的数整除
if(n%i==0){
flag = false; // 只要找到了一个能整除n的数,n就不是素数
break; // 找到第一个能整除n的值后,就不需要再向后找了,跳出循环即可
}
}
if(flag){
System.out.println(n+"是素数");
}else{
System.out.println(n+"不是素数");
}
}
}
}
练习:输出 1 到 100 之间能被 3 整除的前 5个数
public class Test02 {
/*
* 输出 1 到 100 之间能被 3 整除的前 5个数
* 思路:
* 1 先产生1到100之间的整数
* 2 判断这个数能不能被3整除
* 3 做一个计数器,找到一个满足的计数器就+1
* 4 判断计数器的值,如果是5 跳出循环
* */
public static void main(String[] args) {
int count = 0;
for(int i=1;i<=100;i++){
if(i%3==0){
System.out.println(i);
count++; // 每找到一个满足条件的数据,计数器就+1
}
if(count==5){ // 一直判断计数器的值,当计数器的值为5时,不要在继续了,跳出循环
break;
}
}
}
}
练习:鸡兔同笼问题:50个头,120个脚 多少鸡? 多少兔?暴力破解法
public static void main(String[] args){
for(int chicken=0;chicken<=50;chicken++){
int rabbit = 50-chicken;
if(rabbit*4+chicken*2==120){
System.out.println("鸡: "+chicken+" 兔: "+rabbit);
}
}
}
练习:最大公约数
public static void main(String[] args) {
int x = 90;
int y = 150;
// 求最大公约数 同时能整除 x和y的最大的那个整数
// int i= x>y?y:x 从两个数中较小的那个开始
for(int i=x>y?y:x;i>=1;i--){
if(x%i==0 && y%i==0){
System.out.println(i);
break; // 找到第一个就是最大公约数,跳出循环
}
}
}
练习:最小公被数
public static void main(String[] args) {
int x = 15;
int y = 25;
// 求最小公倍数 能同时被x也y 整除的最小的整数
/*
* 思路:
* 从 两个数中较大的那个开始找,找到 x*y
* */
for(int i=x>y?x:y;i<=x*y;i++){
if(i%x==0 && i%y==0){
System.out.println(i);
break; // 找到第一个就是最小公倍数,跳出循环
}
}
}