day04复习
1. 流程控制结构的说明
- Java语言对应的三类结构:
2. 分支结构1:if-else
- 格式
格式1:
if(条件表达式){
执行语句
}
格式2:二选一
if(条件表达式){
执行语句1
}else{
执行语句2
}
格式3:多选一
if(条件表达式1){
执行语句1
}else if(条件表达式2){
执行语句2
}...
}else{
执行语句n
}
- 基本使用
class IfTest {
public static void main(String[] args) {
//格式1:
int heartBeats = 70;
if(heartBeats < 60 || heartBeats > 100){
System.out.println("需要做进一步的检查");
}
System.out.println("体检结束");
//格式2:二选一
boolean isGirl = true;
if(isGirl){
System.out.println("我是一个女孩~");
}else{
System.out.println("我不是一个女孩~");
}
//格式3:多选一
int age = 23;
if(age < 0){
System.out.println("你输入的数据非法");
}else if(age < 8){
System.out.println("幼儿时期");
}else if(age < 18){
System.out.println("青少年时期");
}else if(age < 40){
System.out.println("青壮年时期");
}else if(age < 65){
System.out.println("中年时期");
}else{
System.out.println("老年时期");
}
//此时的else是可选的
}
}
- 使用说明
1.如果多个条件表达式彼此之间没有“交集”,则哪个条件写上面,哪个条件写下面,都可以。
如果多个条件表达式彼此之间有“交集”,但是还不是包含关系。此时孰上孰下是有影响的,需要具体问题具体分析。
如果多个条件表达式彼此之间是“包含”关系,此时孰上孰下是有影响的。通常范围小的一定要声明在范围大的上面。
2. 如果条件表达式对应的结构中的执行语句只有一行的话,可以省略其所在的一对大括号。
但是,建议大家开发时不要省略!
3. if-else可以嵌套使用
- 代码举例
/*
岳小鹏参加Java考试,他和父亲岳不群达成承诺:
如果:
成绩为100分时,奖励一辆BMW;
成绩为(80,99]时,奖励一台iphone 12 pro max;
当成绩为[60,80]时,奖励一个 iPad;
其它时,什么奖励也没有。
请从键盘输入岳小鹏的期末成绩,并加以判断
*/
//1.
import java.util.Scanner;
class IfTest {
public static void main(String[] args) {
//2.
Scanner scan = new Scanner(System.in);
//3.
System.out.print("请输入岳小鹏的期末成绩:(0-100)");
int score = scan.nextInt();//获取了岳小鹏的期末成绩
if(score == 100)
System.out.println("奖励一辆BMW");
else if(score >= 60 && score <= 80)
System.out.println("奖励一个 iPad");
else if(score > 80 && score <= 99){
System.out.println("奖励一台iphone 12 pro max");
System.out.println("奖励一台iphone 12 pro max");
}else{
System.out.println("什么奖励也没有");
System.out.println("什么奖励也没有");
}
}
}
- 代码举例
import java.util.Scanner;
class IfTest1{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//获取3个整数
System.out.println("请输入第1个整数:");
int num1 = scanner.nextInt();
System.out.println("请输入第2个整数:");
int num2 = scanner.nextInt();
System.out.println("请输入第3个整数:");
int num3 = scanner.nextInt();
if(num1 >= num2){
if(num3 >= num1){
System.out.println("从小到大排列为:" + num2 + "-" + num1 + "-" + num3);
}else if(num3 <= num2){
System.out.println("从小到大排列为:" + num3 + "-" + num2 + "-" + num1);
}else{
System.out.println("从小到大排列为:" + num2 + "-" + num3 + "-" + num1);
}
}else{//num1 < num2
if(num3 >= num2)
System.out.println("从小到大排列为:" + num1 + "-" + num2 + "-" + num3);
else if(num3 <= num1)
System.out.println("从小到大排列为:" + num3 + "-" + num1 + "-" + num2);
else
System.out.println("从小到大排列为:" + num1 + "-" + num3 + "-" + num2);
}
}
}
- 课后练习
/*
大家都知道,男大当婚,女大当嫁。那么女方家长要嫁女儿,当然要提出一定的条件:
高:180cm以上;富:财富1千万以上;帅:是。
如果这三个条件同时满足,则:“我一定要嫁给他!!!”
如果三个条件有为真的情况,则:“嫁吧,比上不足,比下有余。”
如果三个条件都不满足,则:“不嫁!”
*/
import java.util.Scanner;
class IfExer1 {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.print("身高(cm):");
int tall = scan.nextInt();
System.out.print("财富(单位:万):");
double money = scan.nextDouble();
/*
方式一:
System.out.print("帅否(true/false):");
boolean isHandsome = scan.nextBoolean();
if(tall >= 180 && money >= 1000 && isHandsome){
System.out.println("我一定要嫁给他!!!");
}else if(tall >= 180 || money >= 1000 || isHandsome){
System.out.println("嫁吧,比上不足,比下有余。");
}else{
System.out.println("不嫁!");
}
*/
//方式二:
System.out.print("帅否(是/否):");
String handsome = scan.next();
if(tall >= 180 && money >= 1000 && "是".equals(handsome)){
System.out.println("我一定要嫁给他!!!");
}else if(tall >= 180 || money >= 1000 || "是".equals(handsome)){
System.out.println("嫁吧,比上不足,比下有余。");
}else{
System.out.println("不嫁!");
}
}
}
3. 如何从键盘获取指定类型的数据
/*
需求:如何从键盘获取不同类型的变量
解决方案:使用Scanner类及其相关的方法
具体的实现步骤:
① 导包:import java.util.Scanner;
② 实例化Scanner(或创建Scanner类的对象):Scanner scan = new Scanner(System.in);
③ 调用Scanner类中相关方法,获取指定类型的数据即可。
nextByte():获取byte类型的变量值
nextShort():获取Short类型的变量值
nextInt():获取int类型的变量值
nextLong():获取long类型的变量值
nextFloat():获取float类型的变量值
nextDouble():获取double类型的变量值
nextBoolean():获取boolean类型的变量值
next()/nextLine():获取String类型的变量值
说明:
1. 如果用户输入的类型与接收的变量的类型不匹配,会报InputMismatchException的异常信息
2. Scanner类中没有直接获取一个char变量的方法!
*/
import java.util.Scanner;
class ScannerTest{
public static void main(String[] args){
//数据类型 变量名 = 变量值
Scanner scan = new Scanner(System.in);
//获取字符串
System.out.println("请输入你的姓名:");
String name = scan.next(); //"阻塞式"的方法
//获取整型
System.out.println("请输入你的年龄:");
int age = scan.nextInt();
//获取浮点型
System.out.println("请输入你的体重(公斤):");
double weight = scan.nextDouble();
//获取boolean类型
System.out.println("请输入你的性别(女:true ; 男:false):");
boolean isFemale = scan.nextBoolean();
//打印个人基本信息
System.out.println(name + "的年龄为:" + age + "岁,体重为:" + weight + "公斤,性别是女:" + isFemale);
//如何考虑获取一个char类型的变量
System.out.println("请输入你的性别(女/男):");
String gender = scan.next();
char genderChar = gender.charAt(0);//索引从0开始
System.out.println("性别为:" + genderChar);
}
}
4. 如何获取指定范围的随机数
/*
1. 如何获取随机数?
使用Math的random()能获取一个[0.0,1.0)范围的一个double型的数据
2. 如何获取一个两位数[10,99],作为彩票号码出现。
Math.random(): [0.0,1.0) * 90 ---> [0.0,90.0) + 10 ----> [10.0,100.0) -->(int)[10.0,100.0) --> [10,99]
[0.0,1.0) * 100 -->[0.0,100.0) + 10 --> [10.0,110.0)
3. 如何获取指定范围[a,b]的随机数:公式
(int)(Math.random() * (b - a + 1) + a)
*/
class RandomTest {
public static void main(String[] args) {
System.out.println("获取随机数:" + Math.random());
int value = (int)(Math.random() * (99 - 10 + 1)) + 10;
System.out.println("获取一个两位数的随机数:" + value);
}
}
5. 分支结构2:switch-case
结构:
switch(表达式){
case 常量1:
语句1;
// break;
case 常量2:
语句2;
// break;
… …
case 常量N:
语句N;
// break;
default:
语句;
// break;
}
- 代码演示
class SwitchCaseTest {
public static void main(String[] args) {
int num = 2;
switch(num){
//default:
// System.out.println("other");
// break;
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
break;
case 4:
System.out.println("four");
break;
default:
System.out.println("other");
break;
}
/*
编译失败
switch(num){
case num < 10:
System.out.println("1111");
break;
case num < 20:
System.out.println("2222");
break;
default:
System.out.println("3333");
break;
}
*/
String season = "summer";
switch (season) {
case "spring":
System.out.println("春暖花开");
break;
case "summer":
System.out.println("夏日炎炎");
break;
case "autumn":
System.out.println("秋高气爽");
break;
case "winter":
System.out.println("冬雪皑皑");
break;
default:
System.out.println("季节输入有误");
break;
}
}
}
- 使用说明
① 执行过程:根据switch中表达式的值,依次匹配case中的常量。如果与某一个case中的常量匹配,则进入此case对应结构的执行语句中进行执行。执行完此case结构以后,仍会考虑继续向下执行其下的其他case语句或出现break,跳出当前的switch结构。
② 我们在switch-case结构中可以使用关键字break。一旦执行break,则跳出当前switch-case结构。
③ switch后的表达式,其实也可以理解为一个变量。此表达式或变量的类型只能是如下的这些:
byte \ short \ char \ int \ 枚举类(jdk5.0) \ String(jdk7.0新增)
④ default 类似于if-else结构中的else。default结构是可选的,位置是灵活的。
1. 通常使用switch-case结构时,需要匹配的case的情况通常不会太多。
2. 多个case如果执行语句相同,可以合并
3. switch-case与if-else的对比:
3.1 使用switch-case的分支结构都可以转换为if-else。反之,不成立。
3.2 在二者都可以使用的场景下,建议使用switch-case。因为效率稍高。
- 代码举例
class SwitchCaseTest1{
public static void main(String[] args) {
int score = 67;
if(score >= 60){
System.out.println("合格");
}else{
System.out.println("不合格");
}
//switch-case实现:
/*
switch(score){
case 0:
//...
case 1:
//...
//....
case 100:
//....
}
*/
switch(score / 10){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("不合格");
break;
case 6:
case 7:
case 8:
case 9:
case 10:
System.out.println("合格");
break;
}
//更优的写法:
switch(case / 60){
case 1:
System.out.println("合格");
break;
case 0:
System.out.println("不合格");
break;
}
}
}
- 代码举例:switch-case中可以没有break
/*
编写程序:从键盘上输入2021年的“month”和“day”,要求通过程序输出输入的日期为2021年的第几天。
5只鸡5天下5个蛋, ? 100天 下100个蛋
*/
import java.util.Scanner;
class SwitchCaseTest2 {
public static void main(String[] args) {
Scanner scann = new Scanner(System.in);
System.out.println("请输入当年的月份:(month)");
int month = scann.nextInt();
System.out.println("请输入当月的日期:(day)");
int day = scann.nextInt();
int sumDays = 0;
/*
switch(month){
case 1:
sumDays = day;
break;
case 2:
sumDays = 31 + day;
break;
case 3:
sumDays = 31 + 28 + day;
break;
case 4:
//...
}
*/
switch(month){
case 12:
sumDays += 30;
case 11:
sumDays += 31;
case 10:
sumDays += 30;
case 9:
sumDays += 31;
case 8:
sumDays += 31;
case 7:
sumDays += 30;
case 6:
sumDays += 31;
case 5:
sumDays += 30;
case 4:
sumDays += 31;
case 3:
sumDays += 28;//28:一月份的总天数
case 2:
sumDays += 31; //31:一月份的总天数
case 1:
sumDays += day;
}
System.out.println(month + "月" + day + "日是2021年的第" + sumDays + "天");
}
}
拓展:
从键盘分别输入年、月、日,判断这一天是当年的第几天
注:判断一年是否是闰年的标准:
1)可以被4整除,但不可被100整除
或
2)可以被400整除
if( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
sumDays += 29;
}else{
sumDays += 28;
}
6. 循环结构的说明
- 只要是循环结构,都包含如上的4个要素。
- 循环条件部分,一定是boolean的。
7. 循环结构1:for
for循环结构的格式
for(①;②;④){
③
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
- 代码举例
class ForTest {
public static void main(String[] args) {
/*
System.out.println("Hello World!");
System.out.println("Hello World!");
System.out.println("Hello World!");
System.out.println("Hello World!");
System.out.println("Hello World!");
*/
for(int i = 1;i <= 5;i++){
System.out.println("Hello World!");
}
//System.out.println("i = " + i);
int i = 1;
for(System.out.print("a");i <= 3;System.out.print("c"),i++){
System.out.print("b");
}
System.out.println();
//输出结果:abcbcbc
//例题:遍历1 - 100的偶数,并计算偶数的和 以及 偶数的个数
int sum = 0;//统计偶数的和
int count = 0;//统计偶数的个数
for(int j = 1;j <= 100;j++){
if(j % 2 == 0){
System.out.println(j);
sum += j;
count++;
}
}
System.out.println("偶数的总和为:" + sum);
System.out.println("偶数的个数为:" + count);
}
}
8.循环中break的使用举例
/*
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
比如:12和20的最大公约数是4,最小公倍数是60。
说明:break关键字的使用
在循环结构中,可以使用break。表示一旦执行break,则跳出当前循环结构。
*/
class ForTest1{
public static void main(String[] args) {
int m = 12;
int n = 20;
//#########获取最大公约数##############
//获取二者的较小值
int min = (m > n)? n : m;
for(int i = min;i >= 1;i--){
if(m % i == 0 && n % i == 0){
System.out.println("最大公约数为:" + i);
break;//
}
}
//#########获取最小公倍数##############
int max = (m > n)? m : n;
for(int i = max;i <= m * n;i++){
if(i % m == 0 && i % n == 0){
System.out.println("最小公倍数:" + i);
break;
}
}
}
}
- 总结
总结:循环结构结束的方式:
方式一:循环条件不满足,返回false时
方式二:在循环体内,执行了break
9. 循环结构:while
while结构的格式:
①
while(②){
③
④
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
- 代码举例
class WhileTest {
public static void main(String[] args) {
//例题:遍历1 - 100的偶数,并计算偶数的和 以及 偶数的个数
int i = 1; //① 初始化部分
int sum = 0;//记录偶数总和
int count = 0;//记录偶数的个数
while(i <= 100){ //② 循环条件部分
//③ 循环体
if(i % 2 == 0){
System.out.println(i);
sum += i;
count++;
}
//④ 迭代条件
i++;
}
System.out.println("偶数的总和为:" + sum);
System.out.println("偶数的个数为:" + count);
System.out.println(i); //101
}
}
- 说明
1. 使用while循环时,一定要小心,不要丢了迭代条件!!一旦丢了,就可能构成一个死循环!
2. while循环初始化条件部分对应的变量的作用域与for循环的初始化条件部分对应的变量的作用域不同。
结论:for循环和while循环是可以相互转换的。
10. 循环结构:do-while
do-while格式:
①
do{
③
④
}while(②);
执行过程:① - ③ - ④ - ② - ③ - ④ - ... - ②
- 代码举例
class DoWhileTest {
public static void main(String[] args) {
//例题:遍历1 - 100的偶数,并计算偶数的和 以及 偶数的个数
int i = 1;
int sum = 0;//记录偶数总和
int count = 0;//记录偶数的个数
do{
if(i % 2 == 0){
System.out.println(i);
sum += i;
count++;
}
i++;
}while(i <= 100);
System.out.println("偶数的总和为:" + sum);
System.out.println("偶数的个数为:" + count);
//#######do-while至少执行一次循环体##########
int num = 10;
do{
System.out.println(num);
num--;
}while(num < 5);
}
}
- 说明
1. 相较于for、while循环来说,do-while至少执行一次循环体!
2. 从使用频率上来说,do-while 要少于while ,while要少于for
- 可以做的练习