Java-流程控制
学习视频:B站 狂神说Java – https://www.bilibili.com/video/BV12J41137hu?p=1
学习资料:Java 菜鸟教程 – https://www.runoob.com/java/java-tutorial.html
1、用户交互Scanner
Scanner对象
Java提供了Scanner类,去获取用户的输入,来实现程序与人的交互。
创建 Scanner 对象的基本语法:Scanner s = new Scanner(System.in);
通过 Scanner 类的 next() 与 nextLine() 方法获取输入的字符串,在读取前我们一般需要使用两种方法对应的 hasNext 与 hasNextLine 判断是否还有输入的数据。
例子: 一个类 class中,只能有一个main()方法。这里为了区分开,所以用了两个java文件。
next()方法:
public class Demo01 { public static void main(String[] args) { //创建一个扫描器对象, 用于接受键盘数据 Scanner scanner = new Scanner(System.in); System.out.println("使用next方式接受:"); //判断用户有没有向键盘输入 if (scanner.hasNext()){ //使用next方式接收 String str = scanner.next(); System.out.println("输入的内容为:"+str); } // IO流的类需要关闭 scanner.close(); } }nextLine()方法: 这种方法就是小驼峰的命名规则
public class Demo02 { public static void main(String[] args) { //创建一个扫描器对象, 用于接受键盘数据 // Scanner是一个类, 新建一个类 scanner,继承了类Scanner // System.in 对应于System.out.用来输入的, input的功能 Scanner scanner = new Scanner(System.in); System.out.println("s输入的内容为:"); // scanner,hasNextLine() 这就是scanner中的方法 // 判断是否还有输入 if (scanner.hasNextLine()){ //使用nextLine方式接收. 然后按照这个方式进行输出 String str = scanner.nextLine(); System.out.println("输入的内容为:"+str); } // IO流的类需要关闭 scanner.close(); } }观察: 需要注意的是IO流的类需要关闭。
next() 与 nextLine() 区别
next():
1、一定要读取到有效字符后才可以结束输入。
2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next() 不能得到带有空格的字符串。即这些输出的字符串里面是不可能有空格的。
nextLine():
- 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
- 2、可以获得空白。
next和nextLine这两种方法都是是用于读取字符类型的。
Scanner 读取数据类型可以利用 nextInt() 和nextFloat()方法。
例子如下:
import java.util.Scanner;
public class Demo04 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i =0;
float b = 0.0f;
// 从键盘输入数据
System.out.println("请输入数据");
//判断是否是整数型,并进行对应类型输出
if (scan.hasNextInt()){
i = scan.nextInt();
System.out.println("输入的数据为整型:"+i);
}
if (scan.hasNextFloat()){
b = scan.nextFloat();
System.out.println("输入的数据为浮点型:"+b);
}
else {
System.out.println("输入数据类型无法识别!");
}
scan.close();
}
}
用户向键盘输入多个数据,并求和计算平均值。 为了防止内存溢出,这里选择数据类型为 double, 所以选择Scanner 中的 nextDouble()方法。如下所示:
import java.util.Scanner;
public class Demo05 {
public static void main(String[] args) {
//输入多个数据,求和以及平均数
Scanner scanner = new Scanner(System.in);
System.out.println("请开始输入数据:");
//和
double sum = 0;
//计算个数
int m=0;
//只要有输入数据,就求和并计算平均值
while (scanner.hasNextDouble()){
double x = scanner.nextDouble();
m +=1;
sum = sum +x;
}
System.out.println("输入数据个数为:"+m);
System.out.println("输入数据的平均值为:"+(sum/m));
scanner.close();
}
}
2、顺序结构
顺序结构为最简单的算法结构,当没有特别指明的时候,代码就按照顺序 一句一句地执行。
3、选择结构
3.1、if结构
我们很多时候需要对一个东西判断是否可行,然后才会去执行。对于这样的过程就采用 if 语句。
if语句
一个 if 语句包含一个布尔表达式和一条或多条语句。语法如下所示:
if(布尔表达式) { //如果布尔表达式为true将执行的语句 }例子:利用Scanner,判断键盘输入的字符是否和目标 hello 相等, 用到了 equals()方法
public class IfDemo01 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入字符串:"); String str = scanner.nextLine(); //equals: 判断字符串是否相等 if (str.equals("hello")){ System.out.println(str); } System.out.println(""); scanner.close(); } }if…else语句
if 语句后面可以跟 else 语句,
当 if 语句的布尔表达式值为 false 时,else 语句块才会被执行。
语法如下:
if(布尔表达式){ //如果布尔表达式的值为true }else{ //如果布尔表达式的值为false }例子:
public class IfDemo02 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入成绩:"); // scanner.nextInt()用于接受整型的数据 int score = scanner.nextInt(); //equals: 判断字符串是否相等 if (score>60){ System.out.println("及格"); }else{System.out.println("不及格");} scanner.close(); } }if…else if … else语句
if 语句后面可以跟 else if…else 语句,这种语句可以检测到多种可能的情况。
使用 if,else if,else 语句的时候,需要注意下面几点:
- if 语句至多有 1 个 else 语句,else 语句在所有的 else if 语句之后。
- 一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。
语法如下:
if(布尔表达式 1){ //如果布尔表达式 1的值为true执行代码 }else if(布尔表达式 2){ //如果布尔表达式 2的值为true执行代码 }else if(布尔表达式 3){ //如果布尔表达式 3的值为true执行代码 }else { //如果以上布尔表达式都不为true执行代码 }例子:
public class IfDemo03 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入成绩:"); // scanner.nextInt()用于接受整型的数据 int score = scanner.nextInt(); //equals: 判断字符串是否相等 if (100 > score && score>60){ System.out.println("及格"); }else if(score==100){ System.out.println("棒极了"); }else{ System.out.println("不及格"); } scanner.close(); } }
3.2、switch结构
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。语法结构如下:
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
1、switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型。
2、case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
注意:
switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断。
如果 case 语句块中没有 break 语句时,匹配成功后,从当前 case 开始,后续所有 case 的值都会输出。这种情况叫做 case 穿透现象。
例子:
public class SwitchDemo01 {
public static void main(String[] args) {
//case 穿透。
char grade = 'D';
switch(grade){
case 'A':
System.out.println("优秀");
break;
case 'C':
System.out.println("加油吧!");
case 'D':
System.out.println("你不行啊?");
break;
//break;
default:
System.out.println("逃离地球!!!");
}
}
}
结果:
当存在break时,输出结果为 你不行啊?
当没有break时, 输出结果为: case穿透现象
你不行啊?
逃离地球!!!
4、循环结构
4.1、while循环
while是最基本的循环,它的结构为:只要布尔表达式为 true,循环就会一直执行下去。
while(布尔表达式){
//循环内容
}
while语句是先进行 布尔表达式 判断,再决定是否循环。
例子:输出1-100
public class WhileDemo01 {
public static void main(String[] args) {
//输出1-100
int i = 0;
while(i<100){
i++;
System.out.println(i);
}
}
}
4.2、do…while 循环
对于 while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
do…while 循环和 while 循环相似,不同的是:
- do…while 循环至少会执行一次。
- while先判断 后执行, do…while 是先执行 后判断
do {
//代码语句
}while(布尔表达式);
**注意:**布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。
例子:采用 do…while循环进行 1-100的加法
public class WhileDemo03 {
public static void main(String[] args) {
int i = 0;
int sum = 0;
do {
sum = sum + i;
i++;
}while (i <= 100);
System.out.println(sum);
}
}
4.3、for循环
for循环执行的次数是在执行前就确定的。语法格式如下:
for(初始化; 布尔表达式; 更新) {
//代码语句
}
关于 for 循环有以下几点说明:
- 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
- 然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
- 执行一次循环后,更新循环控制变量。
- 再次检测布尔表达式。循环执行上面的过程。
例子:
//输出1-100
public class ForDemo01 {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++){
System.out.println(i);
}
System.out.println("循环结束!");
}
}
练习1: 0-100之间的奇数和偶数的和
public class ForDemo02 {
public static void main(String[] args) {
//100中的奇数之和,偶数之和
int oddsum = 0;
int evensum = 0;
for (int i = 0; i < 100; i++) {
if (i%2 == 0){
oddsum = oddsum + i;
}else { evensum += i;
}
}
System.out.println("奇数和为:"+ oddsum);
System.out.println("偶数和为:"+ evensum);
}
}
4.4、增强for循环
增强型 for 循环 主要用于数组。
Java 增强 for 循环语法格式如下:
for(声明语句 : 表达式) {
//代码句子
}
**声明语句:**声明新的局部变量,该变量的类型必须和数组元素的类型匹配。
public class ForDemo004 {
public static void main(String args[]){
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ){ //x的数据类型为 int, numbers的数组元素类型也为int
System.out.print( x );
System.out.print(",");
}
System.out.print("\n");
String [] names ={"the shy", "lucky", "Tom", "cat"};
for( String name : names ) { //name的数据类型为 string, names的数组元素类型也为 string
System.out.print( name );
System.out.print(",");
}
}
}
5、break & continue
5.1、break 关键字
break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
例子: 当i=30的时候,循环直接结束。且整个while语句结束
public class BreakDemo {
public static void main(String[] args) {
// break 强行退出循环
int i =0;
while(i<100){
i++;
System.out.println(i);
if (i==30){
break;
}
}
System.out.println("123");
}
}
5.2、continue 关键字
continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序立即跳转到更新语句。在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。
例子:
public class Continue{
public static void main(String[] args) {
int i =0;
while(i<100){
i++;
if (i%10==0){
System.out.println(i);
continue;
}
System.out.println(i);
}
}
}
结果: 会发现结果是输出1-100。
并没有在 10%10==0 为 true的时候,就结束整个循环,而是跳转到下一次循环中进行迭代。