Java流程控制、循环、嵌套循环案例(此节重点掌握!!!)
一、流程控制
1、定义
在一个Java程序中,各条语句的执行对程序的结果有直接影响,也就是说 个语句的执行顺序对程序的结果有直接影响
在程序中,可能出现不同的执行顺序,必须自上而下顺序执行,或者条件判断的顺序,或者循环执行的顺序
2、分类
1. 顺序执行
//顺序执行,自上而下执行代码
public static void main(String[] args){
System.out.println(1);
System.out.println(2);
System.out.println(3);
2. 条件分支
2.1、if条件分支
语法:
if(条件){
语句块
}其他代码
解释:如果条件成立,则执行语句块,如果条件不成立,则不执行语句块
2.2、if...else条件分支
语法
if(条件){
语句块1
}else{
语句块
}
解释:如果条件成立,则执行语句块1,如果条件不成立,则执行语句块2
//一个程序员去买菜,如果看到西瓜就买一个,如果看到葡萄就买葡萄
int n=(int)(Math.random()*100);
//n<50 需要买西瓜 >50 需要买葡萄
if(n<50){
System.out.println("买了一个大西瓜");
}else{
System.out.println("买了一串葡萄");
}
System.out.println("n->"+n);
System.out.println("嗯,程序猿的女朋友很高兴,至少买到水果了");
2.3、if...else if...else多条件分支
if(条件1){
语句块1
}else if(条件2){
语句块2
}else if(条件3){
语句块3
}else{
语句块4
}
解释:从条件1开始依次判断,如果条件1成立,则执行语句块1,其他条件不再执行,如果条件2成立,则执行语句块2,其他条件不再执行。。。依次类推如果条件都不成立,则执行else语句块,最终只执行其中一条语句块
//随机生成90以内的年龄 整数
int n= (int)(Math.random()*90);
if(n<18){
System.out.println("未成年");
}else if (n<30){
System.out.println("青年");
}else if (n<50){
System.out.println("中年");
}else if (n<70){
System.out.println("老年");
}else{
System.out.println("晚年");
}
System.out.println("n->"+n);
}
2.4、嵌套条件判断
语法:以上三条同时使用,在一个if语句中在嵌套一个if语句
//接受控制台输入 判断 输入的数 是否能被3整除
//如果能被3整除,输出这个数除以3的结果,并判断结果能被7整除
//如果不能被3整除,判断是否为偶数
Scanner sc=new Scanner(System.in);
//接受控制台输入的整数
int n=sc.nextInt();
if (n%3==0){
System.out.println("这个数能被3整除");
//在if语句中继续判断,就是嵌套条件判断,然后往后缩进
int result=n/3;
if (result%7==0){
System.out.println("这个数能被7整除");
}else{
System.out.println("这个数不能被7整除");
}
}else {
System.out.println("这个数不能被3整除");
if (n%2==0){
System.out.println("这个数不能被2整除");
}else {
System.out.println("这个数能被2整除");
}
}
注意:嵌套条件是为了增强代码的可读性,将条件语句块向后缩进,{}作为一个整体,条件语句块如果只有一个可以省略缩进
3. 选择条件判断switch
switch(switch(表达式){
case 常量值1;
语句块1;
break; //语句块接受的标记
case 常量值2;
语句块2;
break;
...
defaul;
语句块3;
break;
}
```
}
public static void main(String[] args) {
//柑橘数字判断星期几 iny
int n=(int)(Math.random()*7+1);
switch (n){
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;
default::
System.out.println("星期天");
break;
}
注意:switch的表达式判断只能等值比较,其中case的常量值,类型为(byte int shrot)字符型,字符串型,枚举型
// case 中可以是字符 或字符串
String s="hello";
switch(s){
case "hello":
System.out.println("你好");
break;
case "hi":
System.out.println("嗨");
}
case穿透问题
在switch中,如果case后面不屑break,将会出现穿透现象也就是说不会执行下一个case的判断条件,直接往后运行,直到遇到break,或整体switch结束
二、循环
1、循环定义
在Java程序中,重复的执行某一代码,这个过程称之为循环,为了避免出现死循环,循环分为四个部分:
-
初始条件
-
循环的判断条件,条件为true,则进入循环体
-
循环体
-
迭代变量
while循环
语法:
初始条件
while(判断条件){
循环体
迭代部分 (为了改变循环的判断条件)
}
例题: 计算1到100的累计之和 1+2+3+4...+100=?
初始值 n= 1
条件: 100以内的 数可以一直累加(一直循环)
迭代: n++
//计算 1到100的累加之和
int sum=0;
int n=1;
while(n<=100){
sum+=n;
n++;
}
System.out.println("n:"+n);
System.out.println("sum:"+sum);
如果知道循环的次数:
int i = 0;
while(i < x){
i++;
}
//循环x遍
如果不知道循环的次数:
boolean flag = true;
while(flag){
if(达到条件){
flag = false;
}
}
do...while循环
语法:
初始值1
do{
循环体2
迭代部分3
}while(返回boolean类型的表达式4);
执行顺序: 123-》423 -》423-》423 .。。4 直到条件4为false 则退出循环。
先执行初始值 1,循环体2 ,迭代3
再判断条件4是否成立,成立,继续执行2,3
再判断条件4是否成立,成立,继续执行2,3
...
判断条件4是否成立,不成立,退出
int i=0;
do{
System.out.println("i--"+i);
i++;
}while(i<10);
System.out.println("i===="+i);
/**
* 第一遍: 输出 0 i=1
* 第二遍: 判断 1<10 成立 输出1 i=2
* 第三遍: 判断 2<10 成立 输出2 i=3
* .。。
* 第九遍: 判断8<10 成立 输出8 i=9
* 第十遍:判断 9<10 成立 输出9 i=10
* 第十一遍: 判断 10<10 不成立。退出
*
*
*/
面试题: while循环与do while循环的区别?
- while 先判断后执行,do—while是先执行后判断
- do—while总是保证循环体会被至少执行依次!这是他们的主要区别
for循环
for循环的升级版就是 foreach循环
for循环通常在明确循环次数的情况下使用
语法
for(初始值1 ; 循环判断条件2 ; 迭代部分3 ){
循环体4
}
或者
初始值
for( ; 循环判断条件 ; ){
循环体
迭代部分
}
// 他们的区别是 初始值定义在for的外边,就可以在循环外边使用
循环执行流程:
1243-》243-》243-》243-》。。。》2 为false 循环退出
例如 :循环输出5遍hello world
// i 表示计数器,从1开始 到5结束
for(int i=1 ;i<=5 ; i++){
System.out.println("hello world");
}
循环的执行顺序:
//第一遍: i=1 1<5 成立 输出“hello world ” i++ i=2
//第二遍 :2<=5 成立 输出“hello world” i=3
//第三遍 : 3<=5 成立 输出”hello world“ i=4
//第四遍: 4<=5成立 输出”hello world“ i=5
//第五遍: 5<=5 成立 输出”hello world“ i=6
//第六遍: 6<=5 不成立,退出
//i=6
使用for循环计算10的阶乘
// 使用for循环 计算 10的阶乘
int sun=0;
for(int i=1;i<=10;i++){
sum*=i;
}
System.out.println("10的阶乘:"+sum);
for循环部分可以省略
// 死循环
for(;;){
System.out.println("hello");
}
// 死循环
for(;;){
System.out.println("hello");
}
for循环的迭代部分可以放在 循环体中
// 迭代部分的代码 可以 放入循环体中
int i=0;
for( ; i<10; ){
System.out.println("第"+i+"次输出");
i++;
}
for循环的特点
for循环语句是支持迭代的一种通用结构,是最有效,最灵活的循环结构
for循环执行的次数是在执行器那就确定的。
三、关键字break、continue、return的区别
1.break:用于switch...case中防止语句块穿透
用于跳出循环
//从1到7 遇到7的倍数break
for(int i=1;i<100;i++){
//遇到7跳出
if (i%7==0){
break;
}
System.out.println("i---"+i);
}
-
continue:跳出本次循环,继续下一次循环
for (int i=0;i<100;i++){ if (i%7==0){ continue; //跳出本次循环 继续下一次循环 } System.out.println("i----"+i); } }
面试题:break 和 continue的区别
-
break在任何循环语句的主体部分,均可用break控制循环的流程,break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)
-
continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定
-
return:返回本次方法
用法1:如果return放置在循环中,会跳出循环,且不会执行循环外面的语句
用法2:作为方法的返回值
用法3:无论方法是否有返回值,可以在条件判断的位置 直接return
return和break再循环语句块是,break只是结束循环语句块,对于循环外面的代码会执行,而return是结束当前所在方法的剩下的语句块。
public static void main(String[] args) { for(int i = 1;i<100;i++) { if (i == 50) { return; } System.out.println("i----"+i); } System.out.println("程序结束"); } public void method1(){ // return 还可以在条件判断的位置 直接返回方法 int n = (int)(Math.random()*10); if(n%2 ==0){ return ; // 方法的后面就不再运行 } System.out.println("方法的其他代码块"); }
结论:只要执行return,那么它后面的代码都不执行。
public int add(){ return 0; }
return作为方法返回值的关键字
四、以嵌套循环为案例
嵌套循环:在一个循环语句中。还包含了另外一个循环,例如在一个for循环中还有一个for循环,
它的总循环次数=外循环的次数*内循环次数
语法
for(){//外循环
for(){内层循环
}
}
执行顺序:外层循环循环依次,内层循环循环完整的一遍
*
* *
* * *
* * * *
* * * * *
public static void main(String[] args) {
//for
for (int j=1;j<=5;j++) {
for (int i = 0; i < j; i++) {
System.out.print("* ");
}
System.out.println();
}
}
*
***
*****
*******
*********
public static void main(String[] args) {
int j = 1;
for (int k = 5; k <= 9; k++) {
for (int i = 0; i < k; i++) {
if (i < k - j) {
System.out.print(" ");
} else {
System.out.print("*");
}
}
j += 2;
System.out.println();
}
}
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * *
* * * * *
* * *
*
思路 : 考虑一行打多少个空格 多少个*
一共5 行 空格的个数(5-i) *的个数 (2 * i - 1)
i=1 4 1
i=2 3 3
i=3 2 5
i=4 1 7
i=5 0 9
public static void main(String[] args) {
// 上半角
for (int j = 1; j < 5; j++) {
for (int k = 0; k < 4 - j; k++) {
System.out.print(" ");
}
for (int i = 0; i < 2 * j - 1; i++) {
System.out.print("* ");
}
System.out.println();
}
// 下半角
for (int j = 3; j >0; j--) {
for (int i = 0; i < 4-j; i++) {
System.out.print(" ");
}
for (int k = 0; k < 2*j-1; k++) {
System.out.print("* ");
}
System.out.println();
}
}