第四节:程序控制结构
4.1分支结构中的if-else(条件判断结构)
4.1.1结构
①:
if(条件表达式){
执行表达式
}
②:二选一
if(条件表达式){
执行表达式1
}else{
执行表达式2
}
③:n选一
if(条件表达式){
执行表达式1
}else if(条件表达式){
执行表达式2
}else if(条件表达式){
执行表达式3
}
...
else{
执行表达式n
}
4.1.2从键盘获取不同类型的变量:需要使用Scanner类
具体实现步骤:
1.导包:import java.util.Scanner;
2.Scanner的实例化:Scanner scan = new Scanner(System.in);
3.调用Scanner类的相关方法(next() / nextXxx()),来获取指定类型的变量
4.1.3获取随机数10 - 99
intvalue=(int)(Math.random()*90+10)
//公式:[a,b] : (int)(Math.random() * (b - a + 1) )+ a
4.2分支结构之二:switch-case
4.2.1格式
switch(表达式){
case常量1:
执行语句1;
//break;
case常量2:
执行语句2;
//break;
...
default:
执行语句n;
//break;
}
4.2.2说明
①根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。
当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构
末尾结束为止。
②break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构
③switch结构中的表达式,只能是如下的6种数据类型之一:
byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)
④case之后只能声明常量。不能声明范围。
⑤break关键字是可选的。
⑥default:相当于if-else结构中的else.
default结构是可选的,而且位置是灵活的。
⑦如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。
4.2.3总结
1.凡是可以使用switch-case的结构,都可以转换为if-else。反之,不成立。
2.我们写分支结构时,当发现既可以使用switch-case,(同时,switch中表达式的取值情况不太多),
又可以使用if-else时,我们优先选择使用switch-case。原因:switch-case执行效率稍高。
4.3For循环结构
4.3.1循环结构的4个要素
① 初始化条件
② 循环条件 --->是boolean类型
③ 循环体
④ 迭代条件
4.3.2for循环的结构
for(①;②;④){
③
}
执行过程:①-②-③-④-②-③-④-...-②
4.3.3for循环的使用场景
/*
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
比如:12和20的最大公约数是4,最小公倍数是60。
说明:break关键字的使用:一旦在循环中执行到break,就跳出循环
*/
importjava.util.Scanner;
classForTest{
publicstaticvoidmain(String[]args){
Scannerscan=newScanner(System.in);
System.out.println("请输入第一个正整数:");
intm=scan.nextInt();
System.out.println("请输入第二个正整数:");
intn=scan.nextInt();
//获取最大公约数
//1.获取两个数中的较小值
intmin=(m<=n)?m:n;
//2.遍历
for(inti=min;i>=1;i--){
if(m%i==0&&n%i==0){
System.out.println("最大公约数为:"+i);
break;//一旦在循环中执行到break,就跳出循环
}
}
//获取最小公倍数
//1.获取两个数中的较大值
intmax=(m>=n)?m:n;
//2.遍历
for(inti=max;i<=m*n;i++){
if(i%m==0&&i%n==0){
System.out.println("最小公倍数:"+i);
break;
}
}
}
}
4.4While 循环的使用
4.4.1循环结构的4个要素
① 初始化条件
② 循环条件 --->是boolean类型
③ 循环体
④ 迭代条件
4.4.2while循环的结构
①
while(②){
③;
④;
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
4.4.3while循环的使用说明
1.写while循环千万小心不要丢了迭代条件。一旦丢了,就可能导致死循环!
2.我们写程序,要避免出现死循环。
3.for循环和while循环是可以相互转换的!
区别:for循环和while循环的初始化条件部分的作用范围不同。
4.5do-while循环的使用
4.5.1循环结构的4个要素
① 初始化条件
② 循环条件 --->是boolean类型
③ 循环体
④ 迭代条件
4.5.2do-while循环结构
①
do{
③;
④;
}while(②);
执行过程:① - ③ - ④ - ② - ③ - ④ - ... - ②
4.5.3do-while循环的使用说明
1.do-while循环至少会执行一次循环体!
2.开发中,使用for和while更多一些。较少使用do-while
4.5.4其他说明
1. 不在循环条件部分限制次数的结构:for(;;) 或 while(true)
2. 结束循环有几种方式?
方式一:循环条件部分返回false
方式二:在循环体中,执行break
4.6break和continue关键字的使用
使用范围 循环中使用的作用(不同点) 相同点
break: switch-case
循环结构中 结束当前循环 关键字后面不能声明执行语句
continue: 循环结构中 结束当次循环 关键字后面不能声明执行语句
classBreakContinueTest{
publicstaticvoidmain(String[]args) {
for(inti=1;i<=10;i++){
if(i%4==0){
break;//123
//continue;//123567910
//System.out.println("今晚迪丽热巴要约我!!!");
}
System.out.print(i);
}
System.out.println("\n");
//******************************
label:for(inti=1;i<=4;i++){
for(intj=1;j<=10;j++){
if(j%4==0){
//break;//默认跳出包裹此关键字最近的一层循环。
//continue;
//break label;//结束指定标识的一层循环结构
continuelabel;//结束指定标识的一层循环结构当次循环
}
System.out.print(j);
}
System.out.println();
}
}
}
4.7 例题
4.7.1100000以内的所有质数的输出。实现方式一
/*
质数:素数,只能被1和它本身整除的自然数。-->从2开始,到这个数-1结束为止,都不能被这个数本身整除。
*/
classPrimeNumberTest1{
publicstaticvoidmain(String[]args) {
booleanisFlag=true;//标识i是否被j除尽,一旦除尽,修改其值
intcount=0;//记录质数的个数
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
longstart=System.currentTimeMillis();
for(inti=2;i<=100000;i++){//遍历100000以内的自然数
//优化二:对本身是质数的自然数是有效的。
//for(int j = 2;j < i;j++){
for(intj=2;j<=Math.sqrt(i);j++){//j:被i去除
if(i%j==0){//i被j除尽
isFlag=false;
break;//优化一:只对本身非质数的自然数是有效的。
}
}
//
if(isFlag==true){
//System.out.println(i);
count++;
}
//重置isFlag
isFlag=true;
}
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
longend=System.currentTimeMillis();
System.out.println("质数的个数为:"+count);
System.out.println("所花费的时间为:"+(end-start));//17110 - 优化一:break:1546 - 优化二:13
}
}
4.7.2100000以内的所有质数的输出。实现方式二
/*
质数
}:素数,只能被1和它本身整除的自然数。-->从2开始,到这个数-1结束为止,都不能被这个数本身整除。
*/
classPrimeNumberTest2{
publicstaticvoidmain(String[]args) {intcount=0;//记录质数的个数
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
longstart=System.currentTimeMillis();
label:for(inti=2;i<=100000;i++){//遍历100000以内的自然数
for(intj=2;j<=Math.sqrt(i);j++){//j:被i去除
if(i%j==0){//i被j除尽
continuelabel;
}
}
//能执行到此步骤的,都是质数
count++;
}
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
longend=System.currentTimeMillis();
System.out.println("质数的个数为:"+count);
System.out.println("所花费的时间为:"+(end-start));//17110 - 优化一:break:1546 - 优化二:13
}
}