课程大纲 |
课程内容 |
学习效果 |
掌握目标 |
Java流程控制 |
流程控制概念 |
掌握 |
熟练掌握流程控制的分类 |
分支结构
|
掌握 |
熟练掌握if、else语句和switch语句的使用 |
|
循环结构 |
掌握 |
熟练掌握for使用和跳出循环的方式 |
使用不同的关键字/语法来控制代码的执行流程/顺序
1、顺序结构
代码从上向下依次执行
2、分支结构
到达某个状态时,可能会有多种情况,每种情况都需要提前准备好,所以多条路的路口就是一个分支。代码写得多,程序运行的少。
之前例子中的三元运算符可以改写成选择结构
3、循环结构
某段代码相同或者相似,使用相同的逻辑。使用一定的格式,来完成相同代码的反复执行
格式:
if(关系表达式){//boolean 语句体; } |
执行流程:
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体
如果是false就不执行语句体
示例代码
小毛参加考试,如果小毛考试成绩及格(>60分),则输出小毛考试成绩及格。
public static void main(String[] args) { // 键盘输入小毛获得的分数,如果>=60 输出考试及格
Scanner sc = new Scanner(System.in);
System.out.println("请输入小毛获得分数:"); int score = sc.nextInt(); // 键盘输入一个整数赋值给 score
if(score>=60){ System.out.println("小毛考试及格了"); System.out.println("回家不用挨揍了"); } /* if(score>=60) System.out.println("小毛考试及格了"); // 当if后只有一句话是,可以省略{} 但不建议这样做 */ }
|
练习 :假设修正法
找出 int x = 12;
int y = 20;
int z = 8;
三个数中最大的数?
示例代码
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(关系表达式) { 语句体1; }else { 语句体2; } |
执行流程
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体1
如果是false就执行语句体2
if代码块和else代码块只会执行其中一个
示例代码
小邓参加考试,如果成绩>=60分,输出“成绩及格”。如果成绩<60分,输出“成绩不及格”。
public static void main(String[] args) { System.out.println("请输入小邓的成绩:"); Scanner sc = new Scanner(System.in); int score = sc.nextInt(); if(score>=60){ System.out.println("成绩及格"); }else{ System.out.println("不及格"); } } |
格式
if (判断条件1) { 执行语句1; } else if (判断条件2) { 执行语句2; } ... }else if (判断条件n) { 执行语句n; } else { 执行语句n+1; } |
执行流程
首先判断关系表达式1看其结果是true还是false
如果是true就执行语句体1
如果是false就继续判断关系表达式2看其结果是true还是false
如果是true就执行语句体2
如果是false就继续判断关系表达式…看其结果是true还是false
…
如果没有任何关系表达式为true,就执行语句体n+1。
示例代码
需求:根据键盘输入的数值不同,打印对应的星期数。
if 只能进行一层判断,if else 只能进行两层判断,那么需要多层判断时呢?星期可是有7个数的。如何设计代码?
int x = 2;
if (x == 1) { System.out.println("星期一"); } if (x == 2) { System.out.println("星期二"); } if (x == 3) { System.out.println("星期三"); } … |
缺点是什么?
int x = 4; if (x == 1) { System.out.println("星期一"); } else if (x == 2) { System.out.println("星期二"); } else if (x == 3) { System.out.println("星期三"); } else if (x == 4) { System.out.println("星期四"); } else if (x == 5) { System.out.println("星期五"); } else if (x == 6) { System.out.println("星期六"); } else if (x == 7) { System.out.println("星期日"); } else { System.out.println("请输入数字1-7"); } |
练习:
根据用户输入的不同成绩(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("分数输入有误"); } } |
格式
switch (表达式){ case 目标值1: 执行语句1 break; case 目标值2: 执行语句2 break; ...... case 目标值n: 执行语句n break; default: 执行语句n+1 break; } |
说明
在上面的格式中,switch语句将表达式的值与每个case中的目标值进行匹配,如果找到了匹配的值,会执行对应case后的语句,如果没找到任何匹配的值,就会执行default后的语句。switch语句中的break关键字将在后面的做具体介绍,此处,我们只需要知道break的作用是跳出switch语句即可。
注意
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; } } |
在使用switch语句的过程中,如果多个case条件后面的执行语句是一样的,则该执行语句只需书写一次即可,这是一种简写的方式。
例如,要判断一周中的某一天是否为工作日,同样使用数字1~7来表示星期一到星期天,当输入的数字为1、2、3、4、5时就视为工作日,否则就视为休息日。接下来通过一个案例来实现上面描述的情况,如下所示:
当变量week值为1、2、3、4、5中任意一个值时,处理方式相同,都会打印“今天是工作日”。同理,当变量week值为6、7中任意一个值时,打印“今天是休息日”。
示例代码
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; } } |
示例代码
int x = 1, y = 2; char ch = '*'; switch (ch) { case '+': System.out.println("x+y=" + (x + y)); break; case '-': System.out.println("x-y="+(x-y)); break; case '*': System.out.println("x*y="+(x*y)); break; case '/'://int i = 1; System.out.println("x/y="+(x/y)); break; default: System.out.println("不靠谱"); } |
键盘录入一个月份,输出这个月份的季节
345月是春季,678是夏季,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("月份输入错误"); } |
1、if语句格式相对灵活,更加强大,switch语句相对弱小。所有的switch语句都可以被if语句替代。
2、if语句更多的是做一些连续性的判断,而switch语句更多的是做一些离散性的匹配
3、if语句每次都需要获取表达式的值,而switch只获取一次表达式的值,所以相对switch的效率高一些。
1 判断闰年
需求分析
示例代码
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+"年不是闰年"); } } |
2水仙花数
说明:所谓的水仙花数是指一个三位数,其各个位数字的立方和等于该数本身。
举例:153就是一个水仙花数。 153 = 1*1*1 + 5*5*5 + 3*3*3
示例代码
/* * 说明:所谓的水仙花数是指一个三位数,其各个位数字的立方和等于该数本身。 举例: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();
/* * 取出num这个三位数的各个位上的数字 判断各个位上的数字的立方和是否等于num * */ int gewei = num%10; int shiwei = num/10%10; int baiwei = num/100; if(num==gewei*gewei*gewei+shiwei*shiwei*shiwei+baiwei*baiwei*baiwei){ System.out.println(num+"是水仙花数"); }else{ System.out.println(num+"不是水仙花数"); } } |
输出10000遍“好好学习,天天向上”该怎么做?
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在一定的时候让循环判断条件值为false,从而结束循环,否则循环将一直执行下去,形成死循环。
Java中三种循环结构:
1 for循环
2 while循环
3 do while循环
格式
for(初始化表达式①; 布尔表达式②; 步进表达式④){ 循环体③ } |
for(int i=1;i<=10;i++){ System.out.println("好好学习,天天向上!"); } |
执行流程
执行顺序:①②③④>②③④>②③④…②不满足为止。
①负责完成循环变量初始化
②负责判断是否满足循环条件,不满足则跳出循环
③具体执行的语句
④循环后,循环条件所涉及变量的变化情况
案例1:使用for循环在控制台输出1到10
for(int i=1;i<=10;i++){ System.out.println(i); } |
案例2:在控制台输出10到1
for(int i=10;i>=1;i--){ System.out.println(i); } |
案例3:在控制台输出1,3,5,7,9
/* for(int i=1;i<=10;i++){ if(i%2!=0){ System.out.println(i); } }*/
for(int i=1;i<=10;i=i+2){ System.out.println(i); } |
案例4:求出1到100的和
public static void main(String[] args) { /* * 思路:1 使用for产生1到100 * 2在循环外定义一个sum用来累积数据 * */ int sum = 0; for(int i=1;i<=100;i++){ sum = sum+i; } System.out.println(sum); } |
案例5: 键盘输入一个数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); } |
案例6:求出100----1000之间的水仙花数
/* * 求出所有水仙花数 * * 思路: * 1 产生 100 到 999 之间的 所有整数 * * 2 判断产生的数是否为水仙花数 * * */ public static void main(String[] args) { for(int i=100;i<1000;i++){ // 判断i是否为水仙花数 int ge = i%10; int shi = i/10%10; int bai = i/100; if(i==ge*ge*ge+shi*shi*shi+bai*bai*bai){ // 满足条件,i就是水仙花数 System.out.println(i); } } } |
案例7:输出1到100之间能被3整除的数
/* * 输出1到100之间能被3整除的数 * 思路: * 1 产生 1到100之间的整数 * 2 判断这个数能否被3整除 * */ public static void main(String[] args) { for(int i=1;i<=100;i++){ if(i%3==0){ System.out.println(i); } } } |
什么是死循环?
循环会永远执行下去,没有退出循环的条件
示例代码
public static void main(String[] args) { for(;;){ System.out.println("helloworld"); } } |
如果我们想让循环在某一步的时候结束或者跳过某些数据不要这些数据,该怎么办?
Java就提供了break,continue来实现控制语句的中断和跳转。
break的使用场景:在选择结构switch语句中、在循环语句中
break的作用:跳出当前switch/循环语句
continue的使用场景:在循环语句中
continue的作用:结束本次循环,继续下一次循环
总结
break 结束整个循环
continue 结束本次循环,继续下一次循环
示例代码
public static void main(String[] args) { for(int i=1;i<=10;i++){ if(i==5){ break; // 跳出循环 } System.out.println(i); } } |
案例1 判断一个数是不是素数(质数)
public class Demo12_判断是不是素数 { /* * 键盘输入一个数,判断是不是素数(质数) * * 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+"不是素数"); } } } } |
案例2:输出 1 到 100 之间能被 3 整除的前 5个数
public class Demo13_找出能被3整除的前5个数 { /* * 输出 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; } } } } |
案例3:打印1到10个数,遇到4的倍数程序自动退出
for(int i=1;i<=10;i++){ if(i%4==0){ break; } System.out.println(i); } |
案例4:打印1到10中的偶数(使用continue)
for(int i=1;i<=10;i++){ if(i%2!=0){ continue; } System.out.println(i); } |
案例5:打印1到100中非4的倍数的数字(使用continue)
public static void main(String[] args) { for(int i=1;i<=100;i++){ if(i%4==0){ continue; } System.out.println(i); } } |
案例6:鸡兔同笼问题: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); } } } |
案例7:最大公约数
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; // 找到第一个就是最大公约数,跳出循环 } } } |
案例8:最小公倍数
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; // 找到第一个就是最小公倍数,跳出循环 } } } } |
1、(if 语句)键盘输入一个整数,表示一个人的年龄。
如果小于6 岁,则输出“儿童”,
6 岁到13 岁,输出 “少儿”;
14 岁到18 岁,输出 “青少年”;
18 到35 岁,输 出“青年”;
35 岁到50 岁,输出 “中年”;
50 岁以上输出 “中老年”
import java.util.Scanner;
class Day03Homework01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入年龄:");
int age = sc.nextInt();
if(age>=50){
System.out.println("中老年");
}else if(age>=35){
System.out.println("中年");
}else if(age>=18){
System.out.println("青年");
}else if(age>=14){
System.out.println("青少年");
}else if(age>=6){
System.out.println("少儿");
}else if(age>0){
System.out.println("儿童");
}else{
System.out.println("您输入的年龄不合法");
}
}
}
2、使用switch语句完成如下需求
某学员考试名次决定奖励,奖励机制如下:
第1名 参加麻省理工大学组织的1个月夏令营
第2名 奖励苹果笔记本电脑一部
第3名 奖励移动硬盘一个
其他名次 没有奖励 (注:键盘输入获得名次。相应奖励,在控制台输出即可)
import java.util.Scanner;
class Day03Homework02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您获得的名次:");
int rand = sc.nextInt();
switch(rand){
case 1:
System.out.println("参加麻省理工大学组织的1个月夏令营");
break;
case 2:
System.out.println("奖励苹果笔记本电脑一部");
break;
case 3:
System.out.println("奖励移动硬盘一个");
break;
default:
System.out.println("没有奖励");
break;
}
}
}
3、分析以下需求,并用代码实现:
(1)根据工龄(整数)给员工涨工资(整数),工龄和基本工资通过键盘录入
(2)涨工资的条件如下:
[10-15) +5000
[5-10) +2500
[3~5) +1000
[1~3) +500
[0~1) +200
(3)如果用户输入的工龄为10,基本工资为3000,程序运行后打印格式"您目前工作了10年,
基本工资为 3000元, 应涨工资 5000元,涨后工资 8000元"
import java.util.Scanner;
class Day03Homework03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的工龄:");
int yearNumber = sc.nextInt();
System.out.println("请输入您的基本工资:");
int baseSalary = sc.nextInt();
//定义变量存储应该涨的工资
int addSalary;
//定义变量存储最终的工资
int finalSalary;
switch(yearNumber){
case 14:
case 13:
case 12:
case 11:
case 10:
addSalary = 5000;
finalSalary = baseSalary + addSalary;
System.out.println("您目前工作了"+yearNumber+"年,"+"基本工资为"+baseSalary+"元,"+"应涨工资"+addSalary+"元,"+"涨后工资 "+finalSalary+"元");
break;
case 9:
case 8:
case 7:
case 6:
case 5:
addSalary = 2500;
finalSalary = baseSalary + addSalary;
System.out.println("您目前工作了"+yearNumber+"年,"+"基本工资为"+baseSalary+"元,"+"应涨工资"+addSalary+"元,"+"涨后工资 "+finalSalary+"元");
break;
case 4:
case 3:
addSalary = 1000;
finalSalary = baseSalary + addSalary;
System.out.println("您目前工作了"+yearNumber+"年,"+"基本工资为"+baseSalary+"元,"+"应涨工资"+addSalary+"元,"+"涨后工资 "+finalSalary+"元");
break;
case 2:
case 1:
addSalary = 500;
finalSalary = baseSalary + addSalary;
System.out.println("您目前工作了"+yearNumber+"年,"+"基本工资为"+baseSalary+"元,"+"应涨工资"+addSalary+"元,"+"涨后工资 "+finalSalary+"元");
break;
case 0:
addSalary = 200;
finalSalary = baseSalary + addSalary;
System.out.println("您目前工作了"+yearNumber+"年,"+"基本工资为"+baseSalary+"元,"+"应涨工资"+addSalary+"元,"+"涨后工资 "+finalSalary+"元");
break;
default:
System.out.println("您输入的工龄不合法");
break;
}
}
}
4、分析以下需求,并用代码实现:
(1)珠穆朗玛峰高度为8848米,有一张足够大的纸,厚度为0.001米。
(2)请问,我折叠多少次,可以折成珠穆朗玛峰的高度。
/*
分析以下需求,并用代码实现:
(1)珠穆朗玛峰高度为8848米,有一张足够大的纸,厚度为0.001米。
(2)请问,我折叠多少次,可以折成珠穆朗玛峰的高度。
*/
class Day03Homework04 {
public static void main(String[] args) {
double height = 0.001;
int count = 0;
while(height<8848){
height*=2;//如果小于8848,就折叠一次
count++;
}
if(height>=8848){
System.out.println(count);
}
}
}
5、分析以下需求,并用代码实现:
(1)打印1到100之内的整数,但数字中包含9的要跳过
(2)每行输出5个满足条件的数,之间用空格分隔
/*
分析以下需求,并用代码实现:
(1)打印1到100之内的整数,但数字中包含9的要跳过
(2)每行输出5个满足条件的数,之间用空格分隔
分析:个位数中含9,十位数含9
i%10==9 i/10==9
*/
class Day03Homework05 {
public static void main(String[] args) {
/*int count = 0;
for(int i=1;i<=100;i++){
if(i%10!=9&&i/10!=9){
System.out.print(i+" ");
count++;
if(count%5==0){
System.out.println();
}
}
}*/
int count = 0;
for (int num = 1; num <= 100; num++)
{
if (num % 10 == 9 || num / 10 == 9)
{
continue;//满足含数字9的就跳过该次循环,继续下一次循环
}
count++;
System.out.print(num+" ");
if (num < 10)
{
System.out.print(" ");//为了对齐,小于10的输出一个空格
}
if (count % 5 == 0)
{
System.out.println();//5个换行
}
}
}
}