30天速成Java-Day04
又一天过去了。
今天过得怎么样,梦想是不是更远了?
程序流程控制
顺序结构
程序自上到下执行,中间没有任何判断和跳转
分支结构
根据条件,选择性地执行某段代码
If
有三种结构,第一种:
if (条件表达式){
}
int age = 23;
if (age < 20) {
System.out.println("你成年了!");
}
第二种:
if (条件表达式){
执行表达式1
}else {
执行表达式2
}
package com.javalike;
public class IfTest {
public static void main(String[] args) {
int age=23;
if(age>18){
System.out.println("你可以看动作电影了!");
}else {
System.out.println("你只能看动画片!");
}
}
}
第三种:
if (条件表达式1) {
执行表达式1
} else if (条件表达式2) {
执行表达式2
} else if (条件表达式3) {
执行表达式3
} else if (条件表达式4) {
执行表达式4
}else{
执行表达式n
}
int score = 88;
if (score < 0 || score > 100) {
System.out.println("您输入的数据非法,请重新输入!");
} else if (score >= 90) {
System.out.println("成绩优秀");
} else if (score >= 60) {
System.out.println("成绩良好");
} else {
System.out.println("你家里有家业继承吧!你最好有事!");
}
强化训练
使用Scanner从键盘获取int类型的变量数据
package com.javalike;
import java.util.Scanner;
/*使用Scanner从键盘获取不同的数据类
*具体实现步骤:
*1.导包:import java.util.Scanner
* 2.Scanner实例化(面向对象)
* 3.调用Scanner相关类型的方法,以获取指定类型的数据变量
* */
public class ScannerTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//表示从键盘输入
int num = scan.nextInt();//调用int类型的方法
if (num < 0 || num > 100) {
System.out.println("您输入的数据非法,请重新输入!");
} else if (num >= 90) {
System.out.println("成绩优秀");
} else if (num >= 60) {
System.out.println("成绩良好");
} else {
System.out.println("你家里有家业继承吧!你最好有事!");
}
}
}
使用Scanner从键盘获取多种类型的变量数据
package com.javalike;
import java.util.Scanner;
public class ScannerTest2 {
public static void main(String[] args) {
Scanner scan1 = new Scanner(System.in);
System.out.println("请输入您的姓名: ");
String name = scan1.next();
System.out.println(name);
System.out.println("请输入您的体重: ");
Double weight = scan1.nextDouble();
System.out.println(weight);
System.out.println("请输入您的年龄: ");
int age = scan1.nextInt();
System.out.println(age);
System.out.println("你是否有房有车?(是或者否)");
boolean isMoney = scan1.nextBoolean();
System.out.println(isMoney);
}
}
对于char类型的获取,Scanner没有提供相关的方法,可以使用String的方法来获取。如果非要用char,可以这样写:
System.out.println("您的性别是?(难或者女)");
String sex = scan1.next();
char sexChar = sex.charAt(0);//获取索引为0位置上的字符
System.out.println(sexChar);
从键盘输入三个数,判断它们之间的大小,并且排序输出
package com.javalike;
import java.util.Scanner;
public class ScannerTest3 {
public static void main(String[] args) {
Scanner scan3 = new Scanner(System.in);
System.out.println("请输入第一个整数: ");
int num1 = scan3.nextInt();
System.out.println("请输入第二个整数: ");
int num2 = scan3.nextInt();
System.out.println("请输入第三个整数: ");
int num3 = scan3.nextInt();
//由小到大
if (num1 >= num2) {
if (num3 >= num1) {
System.out.println(num2 + "<" + num1 + "<" + num3);
} else if (num3 <= num2)
System.out.println(num3 + "<" + num2 + "<" + num1);
} else {
if (num3 >= num2)
System.out.println(num1 + "<" + num2 + "<" + num3);
else if (num3 <= num2)
System.out.println(num3 + "<" + num1 + "<" + num2);
else
System.out.println(num1 + "<" + num3 + "<" + num2);
}
}
}
深度练习
1. 下列代码,若有输出,请指出输出结果。
int x = 4;
int y = 1;
if (x > 2) {
if (y > 2)
System.out.println(x + y);
System.out.println("hello java");
} else
System.out.println("x is" + x);
2. 请指出一下程序输出的结果
//将会输出什么?
boolean b = true;
//如果写成if(b=false)能编译通过吗?如果能,结果是?
if (b == false)
System.out.println(1);
else if (b)
System.out.println(2);
else if (!b)
System.out.println(3);
else
System.out.println(4);
3. 我家的狗5岁啦,5岁的狗相当于人类多大呢?其实,狗的前两年每一年相当一人的10.5岁,之后的每增加一年就增加4岁。那么5岁的狗相当于人类多少年龄呢?编写一个程序,获取用户输入的狗的年龄,通过程序显示其相当于人类的年龄。如果用户输入负数,请显示一个提示信息。
package com.javalike;
import java.util.Scanner;
public class DogAge {
public static void main(String[] args) {
Scanner scan4 = new Scanner(System.in);
int dogAge = scan4.nextInt();
if (dogAge >= 0 && dogAge <= 2)
System.out.println("相当于人的年龄: " + dogAge * 10.5);
else if (dogAge > 2)
System.out.println("相当于人的年龄: " + (2 * 10.5 + (dogAge - 2) * 4));
else
System.out.println("狗崽子还没出生呢。");
}
}
switch-case
根据Switch表达式里的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。当调用完执行语句后,则继续向下执行其他case结构中的执行语句,直到遇到break关键字或此Switch-case结构末尾为止结束该程序。
结构:
switch (表达式){
case 常量1:
语句1;
break;
case 常量2:
语句2;
break;
... ...
case 常量n:
语句n;
break;
default:
语句;
break;
}
package com.javalike;
import java.util.Scanner;
public class SwitchCaseTest {
public static void main(String[] args) {
Scanner scan5 = new Scanner(System.in);
int number = scan5.nextInt();
switch (number) {
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
break;
case 5:
System.out.println("5_5");
break;
default:
System.out.println("0.0");
}
}
}
Switch结构中的表达式,只能是如下的6种数据类型之一:byte、short、char、int、枚举类型、string类型。
强化训练
1. 使用Switch把小写的char类型转换为大写,只转换abcde,其他的输出“other”。
package com.javalike;
import java.util.Scanner;
public class SwitchCaseTest2 {
public static void main(String[] args) {
Scanner scan6 = new Scanner(System.in);
String word = scan6.next();
char c = word.charAt(0);
switch (c) {
case 'a':
System.out.println("A");
break;
case 'b':
System.out.println("B");
break;
case 'c':
System.out.println("C");
break;
case 'd':
System.out.println("D");
break;
case 'e':
System.out.println("E");
break;
default:
System.out.println("other");
break;
}
}
}
2. 对学生成绩大于60分的,输出合格。低于60分的,输出不合格。
如果Switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。
package com.javalike;
public class SwitchCaseTest3 {
public static void main(String[] args) {
int score = 60;
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;
}
}
}
更优雅的写法
int score = 60;
switch (score / 60) {
case 0:
System.out.println("不合格");
break;
case 1:
System.out.println("合格");
break;
}
3. 根据用于指定月份,打印该月份所属的季节。345春季;678夏季;91011秋季;1212冬季。
package com.javalike;
import java.util.Scanner;
public class SwitchCaseTest3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int month = scan.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;
}
}
}
4.编写程序:从键盘上输入2022年的“month”和“day”,要求通过程序输出输入的日期为20252年的第几天。
package com.javalike;
import java.util.Scanner;
public class SwitchCaseTest4 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入2022年的月份");
int month = scan.nextInt();
System.out.println("请输入2022年的天");
int day = scan.nextInt();
int sumDays = 0;
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 += 31;
case 2:
sumDays += 29;
case 1:
sumDays += day;
}
System.out.println("2022年"+month+"月"+day+"日"+",是2022年的"+sumDays+"天");
}
}
循环结构
根据循环条件,重复性的执行某段代码
for循环
结构:
for(表达式1; 表达式2; 表达式3){
语句块;
}
输出100句“我爱你”
for (int i = 0;i<=100;i++){
System.out.println("我爱你!"+i);
}
输出100以内的所有偶数,并输出它们的总和
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
System.out.println(i);
sum += i;
}
System.out.println("总和为: "+sum)
}
break 关键字
braek 主要用在循环语句或者Switch语句中,用来跳出整个语句块,在哪里写就在哪里跳出。
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40, 50};
for (int i :arr) {
if (i == 30){
break;
}
System.out.println(i);
}
}
Java增强for循环
Java5 引入了一种主要用于数组的增强型 for 循环。
Java 增强 for 循环语法格式如下:
for(声明语句:数组或集合对象){
//代码块
}
例如:
for (int i :arr) {
System.out.println(i)
}
优点:更方便,比使用迭代器方便一点。
缺点:只能从头到尾的遍历数组和集合,而不能只遍历部分,且遍历数组时无法获取当前的角标
continue 关键字
continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序立即跳转到更新语句。
在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40, 50};
for (int i : arr) {
if (i == 30) {
// break;
continue;
}
System.out.println(i);
}
}
强化训练
1. 编写程序从1循环到150,并在每行打印一个值,另外在每个3的倍数行上打印出“foo”,在每个5的倍数上打印“biz”,在每个7的倍数上打印输出“baz”。
for (int i = 1; i <= 150; i++) {
System.out.print(i + " ");
if (i % 3 == 0)
System.out.print("foo ");
if (i % 5 == 0)
System.out.print("biz ");
if (i % 7 == 0)
System.out.print("baz ");
System.out.println();
}
2. 输入两个正整数m和n,求其最大公约数和最小公倍数。比如,12和20的最大公约数是4,最小公倍数是60。(break关键字的使用)
package com.javalike;
import java.util.Scanner;
public class ForTest3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数");
int m = scan.nextInt();
System.out.println("请输入第二个数");
int n = scan.nextInt();
//获取最大公约数
//获取两个数中的较小值
int min = (m <= n) ? m : n;
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 % m == 0) {
System.out.println("最小公倍数为: " + i);
break;
}
}
}
}
while循环
- while 语句,先判断条件是否满足,如果满足就执行循环体内的语句,执行完毕后再回来判断条件是否满足,如此无限重复
- 直到条件不满足时,执行while循环后边的语句。
结构:
初始化条件;
while (循环条件[是boolean类型]){
循环体;
迭代条件;
}
只要布尔表达式为 true,循环就会一直执行下去。
public static void main(String[] args) {
int x = 10;
while (x < 20){
System.out.println("x = " +x);
x++;
}
}
do-while循环
结构:
do {
//代码语句
}while(布尔表达式);
注意: 布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。因此, do-while循环至少要执行一次循环语句。
public class WhileTest {
public static void main(String[] args) {
int x = 10;
do {
System.out.print("x = " + x);
x++;
System.out.print("\n");
} while (x < 20);
}