JavaSE(3)(流程控制,循环)
JavaSE(3)(流程控制,循环)
条件控制语句
p40 if 语句
- 大括号的开头可以另起一行书写, 但是建议写在第一行的末尾.
- 再语句体中, 如果只有一句代码, 大括号可以省略不写.(建议不省略)
- 如果对一个布尔型变量做判断, 不要用==号, 直接把变量写在小括号中即可.
p41 if - else 为 二选一
练习 : (if -else) 电影院买票 1~100 格座位, 奇数号坐左边, 偶数号坐右边, 录入一个座位号, 输出左边或右边.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("输入你的座位号:(1-100)");
int num = sc.nextInt();
if (num <= 100 && num > 0) { //限制num在1-100之间
if (num % 2 == 0) { //偶数
System.out.println("右边");
} else { //奇数
System.out.println("左边");
}
}else System.out.println("错误,重新输入");
}
}
p42 if - else if - ... else 多选一
练习 : (if - else if 多选一) 考试成绩评价, 100-90 为 A , 89-80 为 B , 79-70 为 C , 69-0 为 D. 录入成绩 , 并评价.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("输入你的成绩:(1-100)");
int score = sc.nextInt();
if (score >= 0 && score <= 100) { //判断在正常范围内
if (score >= 90) {
System.out.println("A");
} else if (score >= 80) {
System.out.println("B");
} else if (score >= 70) {
System.out.println("C");
} else System.out.println("D");
}else System.out.println("输入错误");
}
}
练习 : (if - else if 多选一) 会员打折, 非会员(0)不打折, 会员1打9折, 会员2打8折, 会员3打7折, 录入商品价格(0-99999), 再录入会员等级(0-3), 输出实际价格
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("输入你的会员等级:(0-3)");
int level = sc.nextInt(); //
System.out.println("输入商品价格:(0-99999)");
int price = sc.nextInt();
if (level <= 3 && level >= 0 && price <= 99999 && price >= 0) { //正常范围
if (level == 1) {
System.out.println("商品折后价格为:" + price * 0.9);
} else if (level == 2) {
System.out.println("商品折后价格为:" + price * 0.8);
} else if (level == 3) {
System.out.println("商品折后价格为:" + price * 0.7);
} else System.out.println("商品折后价格为:" + price);
} else System.out.println("输入错误, 重新输入:");
}
}
p43 switch case
/*格式 : switch (表达式) {
case 值1 :
语句体1 ;
break;
case 值2 :
语句体2 ;
break;
......
default :
语句体 n + 1 ;
break ;
}*/
执行流程:
I. 首先计算表达式的值。
II. 依次和 case 后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程 中,遇到break就会结束。
III. 如果所有的 case 后面的值和表达式的值都不匹配, 就会执行 default 里面的语句体, 然后 结束整个switch语句。
格式说明:
I. 表达式: (将要匹配的值)取值为byte、short、int、char。
JDK5以后可以是枚举,JDK7以后可以是String。
II. case: 后面跟的是要和表达式进行比较的值(被匹配的值)。
III. break: 表示中断,结束的意思,用来结束switch语句。
IV. default: 表示所有情况都不匹配的时候,就执行该处的内容,
和if语句的else相似。
V. case后面的值只能是字面量,不能是变量
VI. case 给出的值不允许重复
练习 : 运动计划 : 需求 : 录入星期数, 显示当天的活动.
周一: 跑步 周二: 游泳 周三: 慢走 周四: 单车 周五: 爬山 周六: 打篮球 周日: 好好吃一顿
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("输入星期几:(0-7)");
int day = sc.nextInt(); //
switch (day) {
case 1:
System.out.println("周一: 跑步");
break;
case 2:
System.out.println("周二: 游泳");
break;
case 3:
System.out.println("周三: 慢走");
break;
case 4:
System.out.println("周四: 单车");
break;
case 5:
System.out.println("周五: 爬山");
break;
case 6:
System.out.println("周六: 打篮球");
break;
case 7:
System.out.println("周日: 好好吃一顿");
break;
default:
System.out.println("输入错误.");
}
}
}
ctrl + shift + / - 多行注释
p44 default 的位置和省略
- 位置 : default 不一定要写在最下面, 我们可以写在任何位置, 只不过习惯写在最下面.
- 省略 : default可以省略, 语法不会有问题, 但是不建议省略.
case 穿透
就是语句中没写 break 导致的.
执行流程 : 首先匹配case, 匹配上了就执行, 如果没有break, 就接着执行下一个case的语句, 直到遇到break或右大括号为止.
使用场景 : 如果多个case语句体重复了, 我们就考虑利用case穿透去简化代码.
JDK 12 switch的新特性
简略写法 :
//如果case后的语句只有一句,那么就可以用2,3的写法省略大括号
switch (day) {
case 1 -> {
System.out.println("周一: 跑步");
}
case 2 -> System.out.println("周二: 游泳");
case 3 -> System.out.println("周三: 慢走");
default -> System.out.println("输入错误.");
}
switch和if 各自的使用场景
if的第三种格式 : 一般用于对范围的判断. 比如例子成绩评价.
switch : 把有限格数据一一列举出来, 让我们任选其一. 比如例子运动计划.
练习 : 工作日
需求 : 录入星期数, 输出工作日或休息日. 1-5工作日, 6-7休息日.
package Demo01;
import java.util.Scanner;
/*
练习 : 工作日
需求 : 录入星期数, 输出工作日或休息日. 1-5工作日, 6-7休息日.
*/
public class helloWorld {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("输入星期数:");
int week = sc.nextInt();
// <<使用 if>>
// if (week >= 1 && week <= 5){
// System.out.println("工作日");
// }else if (week <=7 && week >=6){
// System.out.println("休息日");
// }else System.out.println("输入错误.");
// <<使用switch>>
// switch (week) {
// case 1: //case穿透
// case 2:
// case 3:
// case 4:
// case 5: System.out.println("工作日");
// break;
// case 6:
// case 7: System.out.println("休息日");
// break;
// default:
// System.out.println("输入错误.");
// }
// <<使用switch>>简化写法1.
// switch (week){
// case 1,2,3,4,5 : ----把要穿透的case写在一起----
// System.out.println("工作日");
// break;
// case 6,7 :System.out.println("休息日");
// break;
// default:
// System.out.println("输入错误.");
// }
// <<使用switch>>简化写法2.
switch (week) { //jdk12后的特性 ->
case 1, 2, 3, 4, 5 -> System.out.println("工作日");
case 6, 7 -> System.out.println("休息日");
default -> System.out.println("输入错误.");
}
}
}
}
循环结构
p45 for循环
注意点 : 变量的作用域 : 在循环中变量只在所属的大括号中有效.
所以在用循环累加时,求和的变量不能定义在循环里面, 要定义在循环外.
简便写法 100.fori 就等于 变量i 循环一百次.
在实际开发中, 如果需要获取一个范围中的每一个数据时, 就能用到循环. 但是, 大多数情况下,不会获取所有的数据, 而是获取符合要求的数据.
p46 练习 : 求和. 需求 : 求1~100之间的偶数和.
public static void main(String[] args) {
int sum = 0; //累加变量定义在循环外
for (int i = 1; i <= 100; i++){ //从1到100
if (i % 2 == 0){ //判断是偶数
sum += i; //累加
}
}
System.out.println(sum); //输出结果
}
练习 : 统计满足条件的数字
需求 : 录入两个数字, 表示一个范围, 统计这个范围中, 既能被3整除,又能被5整除的数字有多少格?
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入范围的开头:");
int start = sc.nextInt();
System.out.println("输入范围的结尾:");
int end = sc.nextInt();
int counts = 0; //统计个数
for (int i = start; i <= end; i++) { //从start开始到end结束,<<简写为end.fori>>
if (i % 3 == 0 && i % 5 == 0) { //既能被3整除,又能被5整除的数
counts++; //累加进入此循环的次数
System.out.println(i); //输出这个数
}
}
System.out.println("这样的数有" + counts + "个");//输出个数
}
p47 while 循环
for 和 while 的对比 :
相同点 : 运行规律都是一样的.
不同点 : (从变量的角度)
-
for 循环中, 控制循环的变量, 因为归属循环的语法结构中, 在for循环结束后, 就不能再次被访问到了.
-
while循环中, 控制循环的变量, 不归属于其语法结构中, 在while循环结束后, 该变量还可以继续使用.
//但是for循环写成这样,变量的作用域就和while一样了
int i = 0;
for( ; i < 4 ; i++){
System.out.println(i);
}
//while循环
int i = 0; //初始化语句
while(i < 4){ //条件判断语句
System.out.println(i); //循环体语句
i++ //条件控制语句
}
不同点 :(从应用场景)
- for循环中 : 知道循环次数或者循环范围.
- while循环中 : 不知道循环次数和范围, 值知道循环的结束条件.
练习 : 折纸的次数.
需求 : 珠穆朗玛峰高(8848.43米=8848430毫米), 假如我有一张足够大的纸张, 他的厚度是0.1毫米, 请问, 我折叠多少次, 可以折成珠穆朗玛峰的高度?
public static void main(String[] args) {
int counts = 0; //折叠的次数
double thickness = 0.1; //纸的厚度
while (thickness <= 8848430) { //大于等于山高就停止循环
thickness *= 2; //每次对折
counts++; //累加次数
}
System.out.println("需要折" + counts + "次");
}
p48 练习 : 回文数
需求 : 给你一个整数 x , 如果x 是一个回文整数, 输出true, 否则 输出false, 例如: 121是回文数, 123 就不是.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入一个整数:");
int x = sc.nextInt();
int temp = x; //临时保存x原来的值,最后用于比较.(因为x最后要等于0.)
int num = 0; //倒序的x
//把原数倒序
while (x != 0){
int ge = x % 10; //获取个位数
x /= 10; //个位数没用了,去掉个位数
num = num * 10 + ge; //这个式子可以把获得数字拼接到最右边
}
System.out.println(temp == num); //俩数比较,如果一样输出true
}
练习 : 求商和余数
需求 : 给定两个整数, 被除数和除数( 都是正数, 且不超过int的范围).
将两个数相除, 要求不使用乘法, 除法和 % 运算符, 得到商和余数.
public static void main(String[] args) {
int a = 100; //被除数
int b = 23; //除数
int i = 0; //商
int y = 0; //余数
while (a >= b){
a = a - b;
i ++;
}
System.out.println(i);
System.out.println(a);
}
do while 循环
先执行, 后判断.
//格式
public static void main(String[] args) {
int i = 0; //初始化语句
do {
System.out.println(i); //循环体语句
i++; //条件控制语句
} while (i < 10); //条件判断语句
}
p49 循环综合练习
无限循环
三种格式
for(;;){ //for循环的三个条件都可以不写,不写条件判断语句就会无限循环
System.out.println("java");
}
//-----------
while(true){ //true一定要写
System.out.println("java");
}
//------------
do{
System.out.println("java");
}while(true);
我们一般用 while 做无限循环.
无限循环的下面不能写其他代码, 上面无限循环, 下面的代码永远也不能执行.
跳转控制循环
- continue : 跳过本次循环, 继续执行下次循环.
- break : 结束整个循环.
//continue
//循环5次, 跳过第三次
for (int i = 1; i <= 5; i++) {
if (i == 3){
continue; //跳过 3 这次循环
}
System.out.println(i);
}
1
2
4
5
//break
//循环5次, 到第三次就结束循环
for (int i = 1; i <= 5; i++) {
if (i == 3){
break; //结束循环
}
System.out.println(i);
}
1
2
p50 练习-逢七过
需求 : 输出1-100间的数字, 包含7或者7的倍数要标记出来 "过!".
for (int i = 1; i <= 100; i++) {
if (i % 7 == 0 || i % 10 == 7 || i / 10 % 10 == 7){
System.out.println(i + "<<过!"); //过!!
continue; //结束本次循环,继续下一轮
}
System.out.println(i);
}
p51 练习-求平方根
需求 : 录入一个大于等于2 的整数 x , 计算并返回 x 的平方根. 结果只保留整数部分,小数部分将被舍去.
win + R -> calc : 计算器
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("InputNumber:");
int x = sc.nextInt();
for (int i = 1; i <= x; i++) { //从1开始, 大于x 就结束,
if (i * i == x) { //循环乘方判断,如果等于x, 就是它的平方根.结束循环
System.out.println(i + "是" + x + "的平方根.");
break;
} else if (i * i > x) { //如果大于x 就说明过了,输出i-1(这次循环的上一个数), 结束循环
System.out.println((i - 1) + "是" + x + "的平方根整数部分.");
break;
}
}
}
p52 练习-- 判断质数
练习16: 判断质数
需求 : 录入一个整数, 判断它是否是质数.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("InputNumber:");
int x = sc.nextInt();
//只能被1 和 它本身 整除的数 就是质数.
int i = 2; //从2开始累加(去掉1和这个数自己)
boolean flag = true;//是否是质数
while (i < x) { //被除数要小于除数
if (x % i == 0) { //被除尽了就不是质数
//输出可以被什么数除尽
System.out.println("可以被" + i + "整除.");
flag = false;
}
i++;
}
if (flag) {
System.out.println(x + "是质数.");
} else
System.out.println(x + "不是质数.");
}
p53 练习- 猜数字小游戏
获取随机数 Random类
import java.util.Random; //导包
Random r = new Random(); // 创建对象
int number = r.nextInt(10); // 获取随机数, 参数为随机数的范围(0~9)
//这个范围一定是从0开始,到这个数 -1结束.
//口诀: 包头不包尾, 包左不包右
技巧 : 生成任意随机数
- 让这个范围头尾减去一个值,让它从0 开始.
- 尾巴 +1
- 最终结果再加上第一步减去的值.
需求 : 程序生成一个随机整数(1~100),你来猜是多少.
public static void main(String[] args) {
Random r = new Random();
int num = r.nextInt(100) + 1;//获得的随机数
int count = 0;//猜的次数
Scanner sc = new Scanner(System.in);
int youGuessNumber = 1; //你猜的数
System.out.println(num); //显示答案
if (youGuessNumber <= 100 && youGuessNumber > 0) { //控制输入的范围
while (true) {
count++; //次数累加
System.out.println("InputYourGuessNumber:(1~100)");
youGuessNumber = sc.nextInt(); //输入你猜的数字
if (count == 5) { //保底机制,5次就算赢了.
System.out.println("YouWin...");
break;
}
if (youGuessNumber < num) { //小了
System.out.println("You number is small.");
} else if (youGuessNumber > num) { //大了
System.out.println("Your number is big.");
} else {
System.out.println("YouWin!");
break;
}
}
} else System.out.println("Error!InputAgain:");//超过范围重新输入
}