java任务三

流程控制语句的分类:流程控制可以分为三类

  • 顺序控制语句
  • 分支控制语句(有if和swich两个结构哦)
  • 循环控制语句(有for、while、do……while三个结构)

顺序结构

  1. 定义:按照代码的先后顺序,依次执行,就是一条语句执行完执行下一条语句,程序中大多数的代码都是这样执行的。
  2. 结构就是:
    语句1;
    语句2;
    ……
    语句n;

分支语句

分支if语句

分支if语句包括三种

  1. if语句格式1:
if (关系表达式) {
    语句体;	
}
语句1;

程序怎么走(即怎么执行):

①首先计算关系表达式的值。

②如果关系表达式的值为true就执行语句体

③如果关系表达式的值为false就不执行语句体

④但是后面的语句1是一定会执行的

流程图为:

java两阶段 三阶段 java三段式结构三段式_前端

  1. if语句的格式2:
if (关系表达式) {
    语句体1;	
} else {
    语句体2;	
}
语句1;

程序怎么走(即怎么执行):

①首先计算关系表达式的值

②如果关系表达式的值为true就执行语句体1

③如果关系表达式的值为false就执行语句体2

④继续执行后面的语句内容,即语句1是一定会执行的。

流程图为:

java两阶段 三阶段 java三段式结构三段式_java两阶段 三阶段_02

  1. if语句的格式3:
if (关系表达式1) {
    语句体1;	
} else if (关系表达式2) {
    语句体2;	
} 
…
else {
    语句体n+1;
}

程序怎么走(即怎么执行):

①首先计算关系表达式1的值

②如果值为true就执行语句体1;如果值为false就不执行语句体1,然后去计算关系表达式2的值

③如果值为true就执行语句体2;如果值为false就不执行语句体2,然后去计算关系表达式3的值

④…

⑤如果前面的都为false,就执行语句体n+1。

流程图为:

java两阶段 三阶段 java三段式结构三段式_java_03

注意点

一个程序写好要去进行数据测试,数据测试一般测试几个正确数据,测试几个边界数据,测试一些错误数据

分支结构switch

  1. switch语句的格式
switch (表达式) {
	case 1:
		语句体1;
		break;
	case 2:
		语句体2;
		break;
	...
	default:
		语句体n+1;
		break;
}
  1. 这里switch这个语句的一些格式说明:
  • 这里的表达式的值可以为byte、short、int、char(注意long不行的,只能是int一下范围的整数数据类型),JDK5以后可以是“枚举”,JDK7以后可以是String。
  • ”case+空格+一个值:“,这个值是要和表达式进行比较的,要比较是否相等。相等才执行”case+空格+一个值:“后面的语句,遇到break退出,要是没有遇到break,就执行到下一个case的语句了,那就直接运行那个case下的语句,不用比较case后面的值是否与表达式一样了。case相当与switch语句的入口,break相当于switch语句的出口。
  • break:表示中断,结束的意思,用来结束switch语句。
  • default:表示前面所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似。(注意default后面是直接跟冒号的,注意格式)
package network;
import java.util.Scanner;
public class A {
	public static void main(String[] args) {
		int l=45;
		switch(l) {
		case 1:
			break;
		case 2:
			System.out.println("abc");
			break;
//		case 2://不能同时出现两个一样的case。
//			break;
		default:
			System.out.println("12");
		case 45:
			System.out.println("23");
			break;
		}
		//上面的结果还是输出23,所以可以看出,程序是跳着执行的,想找有没有匹配的值,再去看default的,上面不会因为default在case 45之前,就先执行default。
	}
}

要是最后一个case没有break,他也是会自动退出switch的。就算他不是default。

package network;
import java.util.Scanner;
public class A {
	public static void main(String[] args) {
		int l=45;
		switch(l) {
		case 1:
		case 2:
			System.out.println("abc");
			break;
		case 45:
			System.out.println("23");
		}
		System.out.println("hello");
	}
}
//输出结果是:
23
hello
  1. switch是怎么走的(即怎么执行的,执行流程)
    执行流程:
  • 首先计算出表达式的值
  • 其次,和case依次比较,一旦有对应的值,就会直接跳到相应case的语句去执行,在执行的过程中,遇到break就会结束。要是这个case结束还没有碰到break,就执行下一个case下面的语句,不用与他进行比较。一直到向下顺序执行,直到碰到break或执行到switch结束的“}”。要是向下执行碰到default,也会进去执行,且,要是default没有break,他还是会向下执行,并不会从default这里直接跳出switch循环。而是直接执行default下面case。要是default在switch的最后,那么他就会自动退出switch,因为switch的语句执行完了嘛,所以,就是会跳出来的。然后解释一下为什么说default的break是可选的,因为default习惯上是在最后的,所以不写break他也跳出switch了。
package network;
import java.util.Scanner;
public class A {
	public static void main(String[] args) {
		int l=2;
		switch(l) {
		case 1:
		case 2:
			System.out.println("abc");
		default:
			System.out.println("猜想正确");
		case 45:
			System.out.println("23");
		}
		System.out.println("hello");
	}
}
 结果是输出:
abc
猜想正确
23
hello

还有一个例子就是,你没有匹配到对应的case的值,去执行default,但是default不在最后且没有break,default后面还有case的话,那个case还是会执行的,就算一开始没有匹配到45,结果还是执行到了case 45下的语句

package network;
import java.util.Scanner;
public class A {
	public static void main(String[] args) {
		int l=4;
		switch(l) {
		case 1:
		case 2:
			System.out.println("abc");
		default:
			System.out.println("猜想正确");
		case 45:
			System.out.println("23");
		}
		System.out.println("hello");
	}
}
结果输出:
猜想正确
23
hello
  • 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。

总之,switch的重点就是(上面的switch不用看,只看这个就行):

  • 表达式的值只能是那么几个(不大于int的整数,枚举,字符串)
  • 他是跳着匹配的且要是没有匹配到就执行default,与顺序无关
  • break跳出,和执行完都可以跳出
  • 要是没有遇到break,他就继续向下执行下一个case或default,且default执行完也没有遇到break,也继续向下执行,一直到break或运行出switch
  1. 流程图
  2. case穿透现象:在switch语句中,如果case控制的语句体后面不写break,将出现穿透现象,在不判断下一个case值的情况下,向下运行, 直到遇到break,或者整体switch语句结束
    利用case穿透可以做一些事情如:
    需求:一年有12个月,分属于春夏秋冬4个季节,键盘录入一个月份,请用程序实现判断该月份属于哪个季节,并输出。
public class Demo1 {
    public static void main(String[] args) {
        //键盘录入月份数据,使用变量接收
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个月份:");
        int month = sc.nextInt();
        //case穿透
        switch(month) {
            case 1:
            case 2:
            case 12:
                System.out.println("冬季");
                break;
            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;
            default:
                System.out.println("你输入的月份有误");
        }
    }
}

运行结果:

春:3、4、5
夏:6、7、8
秋:9、10、11
冬:1、2、12

循环语句

循环体语句:循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句。

值得注意的是:当反复 执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。

循环结构都是有四部分组成的

  • 初始化语句: 用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样
  • 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
  • 循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情
  • 条件控制语句:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去

for循环语句

  1. for循环格式
for (初始化语句;条件判断语句;条件控制语句) {
	循环体语句;
}
  1. for语句的执行顺序
    ①执行初始化语句
    ②执行条件判断语句,看其结果是true还是false
    如果是false,循环结束
    如果是true,继续执行
    ③执行循环体语句
    ④执行条件控制语句
    ⑤回到②继续
for (A;B;C) {
	D;
}
E;
比如
    A是初始化语句
    B是条件判断语句
    C是条件控制语句
    D是循环体语句
    E是其他语句
那他的执行顺序是:A B D C B D C B然后B要是判断为false,就执行E
  1. 应用
    比如:在控制台输出1-5数据
public class ForTest01 {
    public static void main(String[] args) {
		//需求:输出数据1-5
        for(int i=1; i<=5; i++) {
			System.out.println(i);
		}
    }
}
结果
    1
    2
    3
    4
    5

运行结束后i为6

注意:如果题目外面要用到某个变量,比如求和,那么求和变量的定义位置,必须在循环外部,如果定义在在循环内部则计算出的数据将是错误的。

如下图,这个变量定义在for的{}内,所以他出了for就离开了他的作用域了

java两阶段 三阶段 java三段式结构三段式_开发语言_04

  1. for语句的流程图
  2. 例子:统计“水仙花数”一共有多少个,并在控制台输出个数
    示例代码:
public class ForTest05 {
    public static void main(String[] args) {
		//定义变量count,用于保存“水仙花数”的数量,初始值为0
		int count = 0;
		//输出所有的水仙花数必然要使用到循环,遍历所有的三位数,三位数从100开始,到999结束
		for(int i=100; i<1000; i++) {
			//在计算之前获取三位数中每个位上的值
			int ge = i%10;
			int shi = i/10%10;
			int bai = i/10/10%10;
			//在判定水仙花数的过程中,满足条件不再输出,更改为修改count的值,使count+1
			if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) {
				count++;
			}
		}
		//打印输出最终结果
		System.out.println("水仙花共有:" + count + "个");
    }
}
  • 本题要点1:
  • 今后如果需求带有统计xxx,请先想到计数器变量。就是count,习惯上我们都用这个变量来计数。
  • 计数器变量定义的位置,必须在循环外部
  • 本题要点二:
  • 取个位的技巧用%,比如:4212要取个位,则,int i=4212%10;
  • 取开头的1位或几位,用/,因为两边都是整数,所以这个/就是整除。比如要取4212的最高位则int i=1412/1000;比如要取4212的最高两位则int i=4212/100;
  • 比如要取中间的那个1怎么取?int i=4212/10。把这个1移到个位上,然后取个位,int j=i % 10;
    比如要取很多位的中间一位,那也是同理:123456789 先整除10000得到12345 ,再对10取余得到5

但是上面都对以知道数取其中的一个数,或者是已知数的位数,取他的第几位。

while循环

  1. while循环的完整结构
初始化语句;
while (条件判断语句) {
	循环体语句;
    条件控制语句;
}
  1. while循环执行流程:
    ①执行初始化语句
    ②执行条件判断语句,看其结果是true还是false
    如果是false,循环结束
    如果是true,继续执行
    ③执行循环体语句
    ④执行条件控制语句
    ⑤回到②继续
  2. 流程图一看就可以知道执行顺序了
  3. 例子:
package network;
public class A {
    public static void main(String[] args) {
        //需求:在控制台输出5次"HelloWorld和一个数字"
		//while循环实现
		int j = 1;
		while(j<=5) {
			System.out.println("HelloWorld"+j);
			j++;
		}
    }
}

运行结果:

HelloWorld1
HelloWorld2
HelloWorld3
HelloWorld4
HelloWorld5

do……while循环

  1. do……while语句的完整格式:
初始化语句;
do {
	循环体语句;
	条件控制语句;
}while(条件判断语句);
  1. 执行流程
    执行流程:
    ① 执行初始化语句
    ② 执行循环体语句
    ③ 执行条件控制语句
    ④ 执行条件判断语句,看其结果是true还是false
    如果是false,循环结束
    如果是true,继续执行
    ⑤ 回到②继续
  2. 例子
public class DoWhileDemo {
    public static void main(String[] args) {
        //需求:在控制台输出5次"HelloWorld"
		//for循环实现
		for(int i=1; i<=5; i++) {
			System.out.println("HelloWorld");
		}
		System.out.println("--------");
		//do...while循环实现
		int j = 1;
		do {
			System.out.println("HelloWorld");
			j++;
		}while(j<=5);
    }
}
  1. 流程图
  2. 三种循环语句的区别
    do……while与for循环、while循环的区别:
  • for循环和while循环先判断条件是否成立,然后决定是否执行循环体(即先判断后执行)
  • do…while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)

for、while、do……while的使用上的区别:

  • for语句适合知道循环次数的循环,while和do……while适合不知道循环次数但是知道循环结束条件的循环
  • while适合先判断再执行循环体的循环,do……while适合至少执行一次循环体的循环。

这三个循环语句的死循环(无限循环)格式

  1. for(;😉{}
  2. while(true){}
  3. do {} while(true);

还有就是比如像for循环一般这么定义for(int i;i<10;i++){……}的i这样定义在for的()里面,那么这个变量i的作用域就是在for循环的{}中,但是while循环,一般while的那个循环控制语句的那个变量是定义在while循环外面的,所以在while块外面也是可以访问的。但是如果for循环的循环初始化语句定义了空,反正就是那个访问的变量定义在for的外面,那么在for里面可以访问(因为小块是可以访问大块的内容的嘛),且在for循环外面也是可以访问的,因为这个z是定义在main中的,且第17行的访问z的那个语句也是在main下的,他们是属于同一个块内,所以可以访问。如图

java两阶段 三阶段 java三段式结构三段式_java_05

还有就是java不想c语言,小块内的变量可以覆盖大块内的变量,如下图

java两阶段 三阶段 java三段式结构三段式_开发语言_06

但是方法中,几个同级别的方法。比如下面这样是可以的,他们没有大块包小块。

java两阶段 三阶段 java三段式结构三段式_java_07

且这样也是可以的

java两阶段 三阶段 java三段式结构三段式_java_08

跳转控制语句

即continue和break。

  1. continue和break都是用在循环(三种循环都可以用)中的,并且一般是基于条件控制的,即一般是有if(){},然后continue和break就放在if的{}里面。(break也可能在switch等上面出现,但是continue就只能在循环中使用了)
  2. continue是执行到这个continue,这一轮循环,continue下面的语句都不执行了,直接开始下一轮循环
  3. break是执行到break,那这个break所在的那个循环就结束了(即如果有多层循环嵌套,break在里面的for循环内,那执行到break是退出里面的那一层for循环)
  4. 例子:
package network;
public class A {
    public static void main(String[] args) {
    	for(int i=0;i<5;i++) {
    		if(i%2==1) {
    			continue;
    		}
    		System.out.println(i);
    	}
    }
}
结果输出:
0
2
4

例子:

package network;
public class A {
    public static void main(String[] args) {
    	for(int i=0;i<5;i++) {
    		if(i==3) {
    			break;
    		}
    		System.out.println(i);
    	}
    }
}
结果输出:
0
1
2

例子:

package network;
public class A {
    public static void main(String[] args) {
    	for(int i=0;i<5;i++) {
    		for(int j=20;j<23;j++) {
	    		if(i==3) {
	    			break;
	    		}
    		System.out.println(i+"and"+j);
    		}
    	}
    }
}
结果输出:
0and20
0and21
0and22
1and20
1and21
1and22
2and20
2and21
2and22
4and20
4and21
4and22

循环嵌套

注意理解一句话:就是if(){………………}和for(){………………}和while(){…………}和do{……}while();和switch(){…………}等这这个结构就相当于一句话(上面的这些语句,只有do……while是后面有;的,其他都是以 } 结尾的没有;)

  1. 嵌套就是,一个语句里面有另一个语句。比如
if(){
    if(){
        
    }
}//这就是if的嵌套
for(){
    for(){
        
    }
}//这就是for的嵌套。你可以理解为,里面的那个for循环就是相当于一句语句而已
//就想象是这个
for(){
    System.out.println("");//这个语句和for语句一样呀,都是一句话嘛。所以有什么难理解的呢
}
  1. 嵌套循环怎么走(怎么执行,执行流程)
    我们看一个例子就知道了
public static void main(String[] args) {
        //外循环控制小时的范围,内循环控制分钟的范围
        for (int hour = 0; hour < 24; hour++) {
            for (int minute = 0; minute < 60; minute++) {
                System.out.println(hour + "时" + minute + "分");
            }
            System.out.println("--------");
        }
    }
//执行的过程就是这样
hour=0					hour=1				……………………		hour=23
    minute=0,				minute=0,						minute=0,
    minute=1,				minute=1,						minute=1,
    minute=2,				minute=2,						minute=2,
    ……						……								……
    minute=59,				minute=59,						minute=59,

Random类

  1. 概述:Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能。就是一个封装好的类,相当于一种工具的类。这个类里面有提供随机数的方法。
  2. 使用步骤:
  1. 导入包
    import java.util.Random;
  2. 创建对象
    Random r = new Random();
  3. 产生随机数
    int num = r.nextInt(10);
    //这个Random的这个nextInt(10)方法的作用是:产生一个[0,10)的随机数,且是整数。所以就是产生一个 [ 0,9 ] 的随机整数。
  1. Random的方法:
    现在我们就用到nextInt(int i)这个方法。作用是:产生一个[0,10)的随机整数
  2. 例子
import java.util.Random;
public class RandomDemo {
	public static void main(String[] args) {
		//创建对象
		Random r = new Random();
		//用循环获取10个随机数
		for(int i=0; i<10; i++) {
			//获取随机数
			int number = r.nextInt(10);
			System.out.println("number:" + number);
		}
		//需求:获取一个1-100之间的随机数
		int x = r.nextInt(100) + 1;
		System.out.println(x);
	}
}