Java学习第六天~第七天-程序控制结构:
Java学习第六天~第七天-程序控制结构:
从这章开始,编程思想开始出现了。(应该和其它语言没什么区别吧~)(153——910)
流程控制介绍:
在程序中,程序运行的流程控制决定程序是如何运行的,是必须掌握的,主要有三大流程控制:
- 顺序控制;
- 分支控制;
- 循环控制。
顺序控制:
程序从上到下,中间没有任何的跳转和判断。
前向引用:
语句里使用的变量,必须在前文已经声明过了,否则报错。
分支控制 :
让程序有选择的执行,分支控制有三种:
- 单分支;
- 双分支;
- 多分支。
单分支:
基本语法:
if(条件表达式){执行代码块;(可有多条语句)
}
当条件表达式位true,执行代码块;否则不执行代码块中的语句,执行下面的语句。(若代码块只有一条语句,可以不写大括号,但是建议写上)。
import java.util.Scanner;
public class If01{public static void main(String[] args){// 编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁;// 则输出你的年龄大于等于18岁,需要负法律责任。Scanner scanner = new Scanner(System.in);System.out.println("Please enter your age:");int age = scanner.nextInt();if (age >= 18){System.out.println("你已满十八,需要负法律责任。");}System.out.println("程序结束。");}
}
双分支:
基本语法:
if(条件表达式){执行代码块;(可有多条语句)
}
else{执行代码块;(可有多条语句)
}
当条件表达式位true,执行 if 下的代码块;否则,执行 else 下面的语句。(若代码块只有一条语句,可以不写大括号,但是建议写上)。结束后,执行后续语句。
import java.util.Scanner;
public class If01{public static void main(String[] args){// 编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁;// 则输出你的年龄大于等于18岁,需要负法律责任。Scanner scanner = new Scanner(System.in);System.out.println("Please enter your age:");int age = scanner.nextInt();if (age >= 18){System.out.println("你已满十八,需要负法律责任。");}else{System.out.println("你未满十八,暂不需要负法律责任。");}}
}
多分支:
基本语法:
if(条件表达式1){执行代码块;(可有多条语句)
}
else if(条件表达式2){执行代码块;(可有多条语句)
}else if(条件表达式3){执行代码块;(可有多条语句)
}
...
else{执行代码块;(可有多条语句)
}
说明:
- 当条件一不满足时,才去看条件二是否满足;
- 若条件二不满足,才去看条件三是否满足;
- 若前面所有的条件都不成立,执行else后的代码块。
- 多分支可以没有else;
- 执行入口若有且只能有一个,说明意思呢,就是说,我们只执行遇到的第一个符合条件的 if 语句下的代码块。执行入口可以没有,即都不符合,会发生在没有else的情况下。
import java.util.Scanner;
public class If02{public static void main(String[] args){// 编写一个程序,输入芝麻信用分;// 若为100,输出信用极好;// 为(80,99],输出信用优秀;// (60,80],输出信用良好;// 其它情况,不及格。Scanner myScanner = new Scanner(System.in);System.out.println("请输入你的芝麻信用分:");int score = myScanner.nextInt();// 先对输入的数据是否有效进行一个判断:// 是否再0-100的范围内:if (score >= 0 && score <= 100){if (score == 100){System.out.println("信用极好。");}else if(score >80 && score <= 99){System.out.println("信用优秀。");}else if(score > 60 && score <= 80){System.out.println("信用良好。");}else{System.out.println("不及格。");}}else{System.out.println("非法输入!");}}
}
嵌套分支:
在一个分支结构里又完整地嵌套了另一个完整地分支结构,里面的分支结构称为内层分支,外面的称为外层分支,规范——不超过三层(可读性不好)。
基本语法:
if(条件表达式1){if(条件表达式2){执行代码块;(可有多条语句)}else{}
}
实例:
import java.util.Scanner;
public class NestedIf{public static void main(String[] args){// 需求:// 参加歌手比赛,若初赛成绩大于8.0进入决赛,否则淘汰;// 并且根据性别告知进入男子组还是女子组。// 分析:// 1、先创建一个double和一个String类型的值来存放分数和性别的输入;// 2、外层分支判断是否进入决赛;// 3、内层分支判断男子组还是女子组。Scanner myScanner = new Scanner(System.in);System.out.println("请输入你的初赛分数:");double grade = myScanner.nextDouble();System.out.println("请输入你的性别:");String gender = myScanner.next();if (grade > 8.0){// 判断字符串是否相等得要用.equals()// 在Java中==号若是判断基本数据类型,是判断内容是否相等;// 对引用类型的判断则是对他们的地址进行判断if (gender.equals("man")){System.out.println("你进入了男子组决赛。");}else if(gender.equals("woman")){System.out.println("你进入了女子组决赛。");}else{System.out.println("请输入正确的性别。");}}else{System.out.println("很抱歉,你没有进入决赛。");}}
}
switch分支结构:
基本语法:
switch(表达式){case 常量1:语句块1;break;case 常量2:语句块2;break;...case 常量n:语句块n;break;default:default语句块;break;
}
说明:
- switch 关键字,表示switch分支;
- 表达式对应一个具体的值;
- case 常量1: 当表达式的值是常量1,就执行语句块1;
- break;表示退出switch;
- 如果和 case 常量1匹配,就执行语句块1,若没有就往下;
- 若一个case 常量都每匹配到,执行default。
- 若每个case中没有break语句,其还会继续执行其它case 常量的语句块(这时候不看是否满足了),这个现象叫做穿透。
注意细节:
- 表达式的类型,应该要与 case 后的常量类型一致,或者是可以自动转换为可以相互比较的类型,例如:输入的是字符,而常量是int;
- switch 表达式中的返回值必须是:byte,short,int,char,enum,String这六种数据类型的一种;
- case 子句后面跟的必须是常量,而不能是变量;
- default 子句是可以选的,当没有匹配的 case 时,执行 default ;
- break 语句用来在执行完一个case分支后,跳出switch循环,若没有写,则会一直执行到遇到switch语句的结尾(不会再判断case后的常量是否等于表达式了,这是穿透效应)。
import java.util.Scanner;
public class SwitchExercise{public static void main(String[] args){// 需求:// 对学生成绩大于60的输出合格;// 否则输出不合格;// 且输入的成绩不能大于100.// // 分析:// 这类用if——else更合适,但是要求使用switch实现;// 1、[60,100]的部分(int)[60,100]/60 = 1;// 2、[0,60)的部分(int)[0,60)/60 = 0;// Scanner myScanner = new Scanner(System.in);System.out.println("请输入你的分数:");double score = myScanner.nextDouble();if (score <= 100){switch ((int)(score/60)){case 0:System.out.println("不合格:");case 1:System.out.println("合格:");}}else{System.out.println("输入的分数有误。");}}
}
switch和if的不同:
- 如果判断的具体数值不多,而且复合byte、short、int、char、enum、String这六种类型,虽然两个语句都可以使用,建议使用switch;
- 其它情况,如有对区间的判断,对结果为boolean类型判断,使用if。
循环控制:
在条件满足时,执行循环内部的语句。
四要素:
- 循环变量初始化;
- 循环条件;
- 循环操作;
- 循环变量迭代。
for循环控制:
基本语法:
for (循环变量初始化;循环条件;循环变量迭代){循环操作语句;
}
细节:
- 循环条件是返回一个布尔值的表达式;
- for(;循环条件;)——即除了循环条件,循环变量的初始化和迭代都可以写到其它地方(若是死循环,循环条件也可以不写);将循环变量的初始化写在for循环外的意义,是为了以后调用(有需要的话),否则,作用域仅局限在for循环中。
- 循环初始值可以有多条初始化语句,但是要求类型一样,并且用逗号隔开,循环变量的迭代也允许有多条语句。
编程思想:
对所有的程序都适用:
化繁为简,化死为活。
while循环控制:
基本语法:
循环变量初始化;
while(循环条件){循环体(语句);循环变量迭代;
}
说明:
- while也有循环的四要素;
- 只是四要素的书写位置与for不同。
细节:
- 循环条件是返回一个布尔值的表达式;
- while循环是先判断再执行语句。
do…while循环控制:
基本语法:
循环变量初始化;
do{循环体;循环变量迭代;
}while(循环条件);
说明:
- do while 是关键字;
- 也有循环 四要素,只是位置不同;
- 先执行,再判断,一定会执行一次;
- 最后有一个’;'号;
细节:
- 循环条件是返回一个布尔值的表达式;
- do…while循环是先执行,再判断,因此其至少执行一次。
多重循环(难点):
介绍:循环里使用循环【建议不超过三层,这样可读性会变差】。
实质上:嵌套循环就是将内层循环看成外层循环的循环体。当内层循环的循环条件为false时,才会跳出内层循环,中止本次的外层循环,开始下一次的循环。
exp:当外层循环次数为m,内层循环为n次,一共要执行m*n次
import java.util.Scanner;
public class MulFor{public static void main(String[] args){// 需求:统计三个班的成绩,每个班有五个人,求出每个班的平均分和所有班级的平均分;// // 分析:// (1):先计算一个班级的平均分。// (2):再计算三个班级// (3):计算三个班级的总分Scanner myScanner = new Scanner(System.in);double totalsum = 0;for(int i = 1;i<=3;i++){double sum = 0;for(int j = 1;j <= 5 ;j++){System.out.println("请输入第"+ i +"个班级,第"+ j +"个学生的成绩:");double score = myScanner.nextDouble();sum += score;}totalsum += sum;System.out.println("第" + i + "个班级的总分为:"+sum+" 均分为:"+(sum/5));}System.out.println("三个班级的总分为:"+ totalsum +" 均分为:"+(totalsum/5));}
}
public class MulForExercise01{public static void main(String[] args){// 需求:打印九九乘法表;for(int i = 1;i <= 9; i++){for(int j = 1; j<=i; j++)System.out.print(i + "x" + j + "=" + (i*j) + "\t");System.out.print('\n');}}
}
public class Stars{public static void main(String[] args){/*** ** ********思路分析:1、先打印一个矩形;2、打印半个金字塔。 3、打印整个金字塔。*/// 1、先打印一个矩形;// for(int i = 1; i <=5;i++){// System.out.println("*****");// }// // 2、打印半个金字塔。// 2.1、我们分析发现,打印几个*受到高度的限制;// 2.2、先打印一行;// 2.3、然后打完完整一行后,再换行。// for(int i = 1; i <= 5; i++){// for(int j = 1; j <= i; j++){// System.out.print('*');// }// System.out.print('\n');// }// // 3、打印整个金字塔:// 3.1、首先,我们发现,每行*的个数都是2倍得到高-1个;// 3.2、然后,发现,前面的空格个数,为高-第几行。// 3.3、打印完成。// for(int i = 1; i <= 5; i++){// for(int k = 5 - i; k > 0; k--){// System.out.print(' ');// }// for(int j = 1; j <= 2*i-1;j++){// System.out.print('*');// }// System.out.print('\n');// }// // 4、打印空心金字塔(没想出来):// 4.1、整体思路仍然是先把金字塔打印出来;// 4.2、怎么修改呢?只要在每行输出*的时候,判断是不是末尾行;(这一步没有转过弯)// 4.3 若不是,则判断是不是首位元素,是就输出*,否则为空格;// 4.4 若是,按原来金子塔输出。for(int i = 1; i <= 5; i++){for(int k = 5 - i; k > 0; k--){System.out.print(' ');}for(int j = 1; j <= 2*i-1;j++){if(i == 5){System.out.print('*');}else{if(j == 1 || j == 2*i-1){System.out.print('*');}else{System.out.print(' ');}}}System.out.print('\n');}}
}
跳转控制语句:
break:
当遇到该语句的时候,终止并跳出循环。用于终止某个语句块的执行,一般用在分支控制和循环中。
基本语法:
{...break;...
}
细节:
- break语句一般出现在多层嵌套语句块中,可以通过标签(标签名可以随意指定,只要满足标识符的规范)指明要终止的时那一层语句块;若没有标签,认为是跳出最近的循环体。(尽量不使用label)
- 标签的使用;
// 标签的使用:
label1:{ ....
label2: {......
label3: {break label1;}}}
public class Break01{public static void main(String[] args){abc1:for(int j = 0;j < 4; j++){abc2:for(int i = 0; i < 10; i++){if(i == 2){break abc1;}System.out.println("i="+i);}}}
}
continue语句:
用于结束本次循环,继续执行下一次循环;若有标签,可以指定跳过的是哪一层循环。
基本语法:
{......continue;......
}
return:
return 使用方法,表示跳出所在的方法,在讲解方法(可以理解为函数)时,会详细讲解。(若写在main中,会结束函数)