一.流程控制语句
1.Java中的流程控制语句
三类
顺序结构语句:从进入到程序的入口之后,代码从上而下依次加载
- 如: 从main进来之后,直接去输出,依次输出...
选择结构语句:
- if语句-----开发中使用比较多的,尤其格式2:if...else...
- switch语句
循环结构语句:
- for
- while
- do-while
2.选择结构语句之if
格式一:
- 判断表达式是否成立,如果成立,则执行语句,否则不执行;
注意事项:
- if()后面不能带分号
有分号的地方就不能{,有{的地方,不能有分号
if(表达式){ 语句; }
//导包
import java.util.Scanner ;
public class IfDemo1{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//提示并录入数据
System.out.println("请输入一个数据num:");
int num = sc.nextInt();
//判断
if(num >=15){
System.out.println("num大于等于15");
}
System.out.println("over");
}
}
格式二:
执行流程:
- 首先判断表达式是否成立,如果成立,则执行语句1...
如果不成立,执行语句2...
if(表达式){ 语句1 ...; }else{ 语句2...; }
//导包
import java.util.Scanner;
public class IfDemo2{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//提示并录入数据
System.out.println("请输入第一个数据:");
int a = sc.nextInt();
System.out.println("请输入第二个数据:");
int b = sc.nextInt();
//if...else... 流程语句
//方式1:直接使用变量接收 (推荐第一种)
//定义一个变量
int max;
if(a > b){
//将a的值赋值给max
max = a;
//System.out.println(a+"是最大值");
}else {
//将b的值赋值给max
max = b ;
//System.out.println(b+"是最大值");
}
System.out.println("max:" + max);
System.out.println("----------------------------------");
//方式2:直接输出
if(a > b){
System.out.println(a + "是最大值");
}else {
System.out.println(b + "是最大值");
}
}
}
格式三:
执行流程:
- 先判断表达式1是否成立,成立,执行语句1
如果不成立,继续判断表达式2是否成立,成立,则执行语句2,,,
...
如果上面的表达式都不成立,执行else中的语句n..
if(表达式1){ 语句1 ...; }else if(表达式2){ 语句2...; ... }else{ 语句n...; }
//导包
import java.util.Scanner ;
class IfDemo4{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示,录入数据
System.out.println("请输入学生的成绩:") ;
int socre = sc.nextInt() ;
/*
90-100 优秀
80-90 较好
70-80 良好
60-70 及格
60以下 不及格
*/
//if格式3
/*
if(socre>=90 && socre<=100){
System.out.println("优秀") ;
}else if(socre>=80 && socre<90){
System.out.println("较好") ;
}else if(socre>=70 && socre<80){
System.out.println("良好") ;
}else if(socre>=60 && socre<70){
System.out.println("及格") ;
}else{
System.out.println("不及格") ;
}
*/
//学习任何计算机语言:程序---最终给客户去用的,考虑开发完成之后,自测
//测试 :正确的数据 ,错误数据,边界数据
//优化:最终版:加入一些非法数据的提示
if(socre>100 || socre<0){
System.out.println("您输入的数据不合法") ;
}else if(socre>=90 && socre<=100){
System.out.println("优秀") ;
}else if(socre>=80 && socre<90){
System.out.println("较好") ;
}else if(socre>=70 && socre<80){
System.out.println("良好") ;
}else if(socre>=60 && socre<70){
System.out.println("及格") ;
}else{
System.out.println("不及格") ;
}
//jvm:java虚拟机 校验你的语法的时候,需要校验语法的整个结构,考虑如果if的里面都不成立,这个程序没有结束;
//就会出现问题;
}
}
if...else...嵌套
格式
if(表达式1){ if(表达式2){ 语句1; }else{ 语句2; } }eles{ if(表达式3){ 语句3...; }else{ 语句4...; } }
import java.util.Scanner ; class IfTest{ public static void main(String[] args){ //创建键盘录入对象 Scanner sc = new Scanner(System.in) ; //提示并录入数据 System.out.println("请输入第一个数据:") ; int num1 = sc.nextInt() ; System.out.println("请输入第二个数据:") ; int num2 = sc.nextInt() ; System.out.println("请输入第三个数据:") ; int num3 = sc.nextInt() ; int max ; if(num1>num2){ //语句----if...else if(num1>num3){ max = num1 ; //num1大 }else{ max = num3 ; //num3大 } }else{ //num2比num1大 if(num2>num3){ //将num2赋值max max = num2 ; }else{ //将num3赋值给max max = num3 ; } } System.out.println("三个数据的最大值是:"+max) ; } }
3.选择结构语句之switch
格式
switch(表达式或者某个变量值){ case 值1: 语句1; break ; case 值2: 语句2: break ; ... default: 语句n; break ; }
/*需求: 键盘录入一个值,判断星期 1,星期一 2,星期二 3,星期三, 4,星期四 5,星期五 6,星期六 7,星期日 */ import java.util.Scanner; public class SwicthDemo { public static void main(String[] args) { //创建键盘录入对象 Scanner sc = new Scanner(System.in) ; //提示并录入数据 System.out.println("请输入一个星期(1-7的数据): ") ; int week = sc.nextInt() ; switch (week){ 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("非法数据") ; break ; } } }
执行流程
switch接收结果
- 接收的结果和case后面的值1进行对比,成立,执行语句1,break 结束语句;
- 值1和switch接收的结果不匹配,和值2进行比较,成立,执行语句2, break,结束语句;
- ...
- 如果上面case都不匹配,执行default语句,语句n,break ,结束...
switch后面的跟的值的数据类型可以有哪些类型?
- 基本数据类型:byte,short,int,char
- jdk5以后可以是枚举类型 enum:引用类型
- jdk7以后可以是String字符串 :引用类型
switch语句中的注意事项也是 (考点)
关于switch中的case语句后面只能常量,不能是变量 (体现Java是一种强类型语言)
* 前端的javascript(弱类型语言):它里面的swtich的case是可以是变量,可以是个常量
在书写switch语句的标准结构,不忘了break,如果语句中忘了书写break,会出现一个现象:case穿透!
public class SwitchTest { public static void main(String[] args) { // case穿透 int a = 3 ; int b = 4 ; switch (a){//3 default: b++ ; break; case 2: b ++; case 3://匹配成功 b++ ; //4 ++ = 5 case 4 : b++ ; // 5++ = 6 } //b的值是多少; System.out.println("b:"+b);
* 在有的需求里面利用 case穿透 来完成一些需求; ```java import java.util.Scanner; public class SwitchTest2 { public static void main(String[] args) { //创建键盘录入对象 Scanner sc = new Scanner(System.in) ; //提示并录入数据 System.out.println("请您输入一个月份的值:") ; int month = sc.nextInt() ; //利用case穿透:灵活运用 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 ; default: System.out.println("非法数据!!") ; break ; } } } ```
关于switch语句的结束条件
- 要么遇见break结束
- 程序默认执行到末尾
关于default语句可以在switch语句中的任何位置,不影响语句的执行流程;
- 不管在任何位置,只要case语句都不匹配,执行default;
- 如果default语句在语句中,break不要省略
- 如果default语句的末尾,break可以省略(不建议);
/*
使用switch语句,完成模拟单项选择题操作
*/
import java.util.Scanner;
public class Demo9 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("电视剧《仙剑奇侠传》中,李逍遥的扮演者是谁?");
System.out.println("请选择以下选项:" + "\n" + "[A.胡歌]" + "\t" + "[B.彭于晏]" + "\t" + "[C.袁弘]" + "\t" + "[D.霍建华]");
String choice = scanner.next();//使用字符串
switch (choice){
case "A":
System.out.println("恭喜你,回答正确!");
break;
case "B":
System.out.println("对不起,回答错误!");
break;
case "C":
System.out.println("对不起,回答错误!");
break;
case "D":
System.out.println("对不起,回答错误!");
break;
default:
System.out.println("没有该选项 ");
break ;
}
System.out.println("-------------------------------------------------------");
int choice = sc.nextInt() ;
//将int类型---转换成char
char choiceNum = (char) choice ;
System.out.println(choiceNum);
switch (choiceNum){
case 'A': //65
System.out.println("√");
break ;
case 'B': //66
System.out.println("×");
break ;
case 'C': //67
System.out.println("×");
break ;
case 'D': //68
System.out.println("×");
break ;
default:
System.out.println("没有该选项 ");
break ;
}
}
}
4.循环结构语句之for
格式
for(初始化语句;条件表达式;控制体语句或者步长语句){ 循环体语句; } //降低了冗余度
执行流程
- 初始化语句:给变量赋值 (只执行一次)
- 然后执行条件表达式,看其是否成立,如果成立,执行的是循环体语句------>再次回到控制体语句或者步长语句--->变量自增或者自减
- 随后再次执行条件表达式,看其是否成立,成立,继续循环体语句---->再次回到控制体语句或者步长语句---->变量自增或者自减
....
- 一直执行到条件表达式不成立,for循环结束;
举例
需求:
- 在控制台输出1-10的每一个数据
- 循环的求和思想
- 在控制台输出1-10的之间的所有的数据之和
求和思想:
- 将上面的这种格式变形一下:
定义一个结果变量: 从0开始 sum这个变量
0 + 1 = 1 ;
1 + 2 = 3 ;
3 + 3 = 6 ;
6 + 4 = 10 ;
- 10 +5 = 15 ;
....
- 10 +5 = 15 ;
- 两个加数:
- 前面的这个加数:就是求和结果变量sum,从0开始
- 后面的这个加数:就是1-10的数据;
使用步骤:
- 定义一个最终结果变量sum,从0开始记录
- 使用 for(初始化语句;条件表达式;控制体语句){
//循环体语句
//先取出来每一个数据
使用结果变量就是上面的数据求和,然后再赋值给最终结果变量;
}
- 输出sum即可
public class ForDemo {
public static void main(String[] args) {
//定义一个结果变量
int sum = 0 ;
for(int x = 1 ; x <=10 ; x ++) {// 1-10之间的数据
//x的取整:1,2....10;
sum += x ; //sum = sum + x ;
}
System.out.println("1-10的数据之和是:"+sum);
}
}
经典-水仙花数
需求:在控制台输出所有的水仙花数
水仙花数
- 水仙花指的是三位数,而且这个三位数的每一个位上的立方相加就是当期数据本身
举例:153 = 1 1 1 + 555 + 333
- 153 % 10 = 3 ;---确定个位的数据
- 153 / 10 % 10 = 5 --- 确定十位的数据
- 153 /10 /10 %10 = 1 --- 确定百位上的数据 或 153 / 100 = 1
分析:
- 三位数,明确了范围 100-999---使用for循环
确定每各位的数据本身的值:
- 定义三个变量,分别代表个位,十位,百位数据本身
- int ge = 当前这个数据 % 10 ;
int shi = 当前这个数据 /10 %10 ;
int bai = 当前这个数据 /10/10 % 10 ;
- for循环中加入逻辑判断
- 如果当前x == (gegege)+(shishishi)+(baibaibai),
- 满足条件,直接输出x
public class forDemo {
public static void main(String[] args) {
System.out.println("水仙花数是:") ;
// 三位数,明确了范围 100-999---使用for循环
for (int x = 100; x < 1000; x++) {
//x:100-999的数据
//确定每各位的数据本身的值:
// 定义三个变量,分别代表个位,十位,百位数据本身
int ge = x %10 ; //x=153
int shi = x /10 %10 ;
int bai = x /10 /10 % 10;
if(x==(ge*ge*ge+shi*shi*shi+bai*bai*bai)){
System.out.println(x) ;
}
}
}
}
5.循环结构语句之while
格式
初始化语句; while(条件表达式){ 循环体语句 ; 控制体语句或者步长语句; }
执行流程:
- 首先,先初始化语句,对变量赋值;
- 执行条件表达式,是否成立;若成立,则执行循环体语句,依据控制体语句进行变量控制--->再次判断条件表达式是否成立,成立,执行循环体语句--->控制体语句进行变量控制
- ...
- 当条件表达式不成立,while循环结束;
- 注意事项:控制体语句不要忘了,否则死循环;
举例
- while循环统计水仙花有多少个,并输出
public class WhileTest {
public static void main(String[] args) {
//定义统计变量
int count = 0 ;
//初始化语句
int m = 100 ;
while(m<=999){
//循环体
//求出ge,shi,bai的数据
int ge = m % 10 ;
int shi = m /10 % 10;
int bai = m /10 /10 % 10 ;
//满足条件
if(m ==(ge*ge*ge+shi*shi*shi+bai*bai*bai)){
//统计变量自增
count ++;
System.out.println("第"+count+"次,"+"水仙数是:"+m);
}
m++ ;
}
System.out.println("水仙花数共有:"+count+"个");
}
}
for循环和while循环的区别
1)共同点:
- 都能够描述一种循环思想,可以将重复性冗余代码进行优化,提搞程序阅读性
2)不同点:
格式不同
for(初始化语句;条件表达式;控制体语句){ 循环体语句; }
初始化语句;
while(条件表达式){ 循环体语句; 步长语句; }
场景不同
- for循环:明确循环次数 (开发中优先都使用for)
- while循环:不明确循环次数:
- 举例:
键盘录入一个数据,玩猜数字游戏,你也不知道到录入多少次才能猜中
是否节省内存资源:从格式上说
- for循环的好处:循环结束之后,变量被释放了
- 而while循环,循环结束,依然能够使用这个变量,相对for循环格式来说,比较耗费内存资源
- 实际开发中:for是使用最常见的
6.循环结构语句之do while
格式
初始化语句; do{ 循环体语句 ; 控制体语句 ; }while(条件表达式) ;
这个循环语句和while,for循环最大的区别: 当条件不成立的,循环体至少执行一次.
public class DoWhileDemo {
public static void main(String[] args) {
int x = 6 ; //初始化了
do{
System.out.println("helloJavaSE"); //执行循环体
x++; //7
}while(x<=5) ;
}
}
7.循环结构语句之死循环
死循环的两种格式
第一个格式
for(;;){ 循环体语句; }
第二个格式:
while(true){ //死循环格式中使用比较多 循环体语句; }
举例
猜数游戏
分析:
需要产生一个随机数:java.lang.Math 里面的功能random()产生一个1-100之间的随机数
- jdk提供了类:java.lang.Math
- java.lang包下的类不需要导包,针对数学运算的工具类,提供了很多的方法;
- 获取伪随机数,取值范围:[0.0,1.0)
//不断的键盘录入
while(true){
- 创建一个键盘录入对象,录入int类型
- 录入的数据要和Math里面产生的1-100之间数据进行对比,
- 如果大了,提示 "你要猜的数据大了"
- 如果小了,提示"你要猜的数据小了"
- 如果一致,提示"恭喜您,猜对了"
- 结束死循环,break ;
}
public class DieLooperTest { public static void main(String[] args) { //需要产生一个随机数:java.lang.Math 里面的功能random()产生一个 //1-100之间的随机数 int number = (int) (Math.random() *100 +1); //[0.0-1.0)*100-->[0.0-100.0)-->[1.0-101.0) 强转取整1-100 System.out.println(number) ; //定义统计变量 int count = 0 ; //不断的键盘录入 while(true){ //只要进一次循环就开始计算 count ++; //创建键盘录入对象 Scanner sc = new Scanner(System.in) ; //提示并录入数据 System.out.println("请您输入要猜的数字:") ; int guessNumber = sc.nextInt() ; //使用guessNumber上面的随机数获取到的number进行对比 if(guessNumber>100 || guessNumber< 0){ System.out.println("你要输入数据不合法,它是在0-100之间"); }else if(guessNumber> number){ //如果大了,提示 "你猜的数据大了" System.out.println("你猜的"+guessNumber+"大了") ; }else if(guessNumber <number){ //如果小了,提示"你猜的数据小了" System.out.println("你猜的"+guessNumber+"小了") ; }else{ //如果一致,提示"恭喜您,猜对了" System.out.println("恭喜您,第"+count+"次猜对了") ; //结束死循环 break ; } } } }
8.循环结构语句(补充)
for循环嵌套(双重for循环)
//for循环的嵌套 for(初始化语句1;条件表达式1;控制体语句1){ //可以看做控制行 //循环体就是for循环语句 for(初始化语句2;条件表达式2;控制体语句2){ //可以看做控制列 循环体语句;,,, } }
举例
99乘法表
public class ForForDemo { public static void main(String[] args) for(int x = 1 ; x <= 9 ; x++){ //9行列 for(int y = 1 ; y<= x ; y++){//列数随着x的变化而变化 System.out.print(x + "×" + y + "=" + (y*x) + "\t"); //1*1=1 //2*1=2 2*2=4 //3*1=3 3*2=6 3*3=9 //4*1=4 4*2=8 4*3=12 4*4=16... } System.out.println();//换行 } } }
二.跳转控制语句
1.break
break:中断结束(结束循环或者switch语句中)
public class BreakDemo { public static void main(String[] args) { // break ; //for循环,10次 for(int x = 1 ; x <=10 ; x++){ //加入一个逻辑判断 if(x == 3){ break ; //循环中使用/ switch本身语法就带break } System.out.println(x) ; // 1 2 (x == 3时跳出循环) } } }
2.continue
continue:只是结束当前循环,继续立即进入下次循环(循环语句中使用)
public class ContinueDemo { public static void main(String[] args) { //for循环 for(int x = 1; x<=10 ; x++){ if(x == 2){ continue;//只是结束当前循环,继续立即进入下次循环 } System.out.println(x); //2不输出 //1 //3 //4 //5 //6 //7 //8 //9 //10 } } }
3.return
return:结束方法的 (结束有具体返回值的方法)
- return: 实际开发中,return 需要携带结果,-------引入Java中定义方法
- return: 与Java中的方法相关的,很少单独去使用
public static void main(String[] args) {
System.out.println("程序开始了...");
//for循环
for(int x =1 ; x <=10 ;x ++){
//加入逻辑判断
if(x==3){
System.out.println("条件成立..");
return ; //很少单独用---->结束了方法
}
System.out.println(x) ;
}
System.out.println("程序结束了,Over...");
}
)]