顺序、选择和循环语句(程序的三种基本控制结构)

顺序、选择和循环语句(程序的三种基本控制结构)

复合语句

1、在了解程序的三种基本控制结构之前,我们先了解以下什么是复合语句,即块语句。

2、与C语言及其他语言不同,Java语言的复合语句是以整个块区为单位的语句,所以又称为块语句。复合语句由开括号“ { ”开始,闭括号“ } ”结束。

3、在前面的学习中我们已经接触到了这种复合语句,例如:在定义一个类或方法时,类体就是以“ { ”作为开始,“ } ”作为结束的标记的,方法体同样也是以“ { ”作为开始,“ } ”作为结束的标记的。复合语句中的每个语句都是从上到下被执行。复合语句都是以整个块区为单位,能够用在任何一个单独语句可以用到的地方,并且在复合语句中还可以嵌套复合语句,例如:在类体里面嵌套方法体或内部类。

4、在使用复合语句时要注意,复合语句为局部变量创建了一个作用域,该作用域为程序的一部分,在该作用域中某个变量被创建并能够被使用。如果在某个变量的作用域外使用该变量,则会出现错误。

package com.zyt.lesson01;

public class Demo { 
	public static void main(String args[]) { 
		int num = 0;
		for (int i = 1; i <= 10; i++) { 
			num += i;
		}
		System.out.println(num);
	}
}
// 输出结果:55 
package com.zyt.lesson01;

public class Demo { 
	public static void main(String args[]) { 
		for (int i = 1, num = 0; i <= 10; i++) { 
			num += i;
		}
		System.out.println(num);
	}
}
// 报错
/* Exception in thread "main" java.lang.Error: 无法解析的编译问题: num cannot be resolved to a variable at com.zyt.lesson01.Demo.main(Demo.java:9) */
// 在for循环语句中声明的局部变量num,其作用域在for循环体中。在循环体之外使用num将会报错。

选择语句(条件语句)

我们都知道,计算机的主要功能是提供用户计算的功能,但在计算的过程中会遇到各种各样的情况,针对不同的情况会有不同的处理方法,这就要求程序开发语言要具有处理决策的能力。

一、if 条件语句

1、决策分支

决策:就是人们为某件事拿主意,下决心做出合理的选择的过程

2、if 语句

Java中处理决策的方法之一:if 语句

  1. 第一种形式的判断语句
// 语法一:
if(布尔表达式){ 
    语句;
}
//如果这个布尔表达式的结果是true,则执行大括号内的语句;如果这个布尔表达式的结果是false,则跳过大括号内的语句,而继续执行大括号外的语句。


// 语法二:
if(布尔表达式)
    语句;
//如果布尔表达式的结果是true,则执行圆括号后面的第一个分号内的语句;如果布尔表达式的结果为false,则跳过第一个分号内的语句,继续执行后面的语句。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-92EQ0HeE-1607846568787)(D:\新建文件夹\MarkDown学习\顺序、循环和选择语句\images\流程图1.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eLVwTbCs-1607846568790)(D:\新建文件夹\MarkDown学习\顺序、循环和选择语句\images\流程图2.jpg)]

常见的错误:

  • if(表达式)的后面多加了一个分号

    if(表达式); { }

    if(表达式); 
    {  
       语句;
    		  }
    

    这样的写法编辑器不会报错,但是是错误的,这时候 if 只会控制分号前的语句,不会控制分号后面花括号内的语句。

  • 没加大括号{ }

    if(表达式)
       语句;
       语句;
    

    这样的写法编辑器不会报错,但也是错误的。这时候 if 只能控制第一个分号前的语句,而控制不到第二个分号前的语句。

  • 在花括号后面加分号

    if(表达式) 
    {  
       语句;
    		  };
    

    这样的写法编辑器会报错,这样的语法是错误的

  1. 第二种形式的判断语句
// 语法
if(布尔表达式){ 
    语句一;
}else{ 
    语句二;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nTfsOqjg-1607846568791)(D:\新建文件夹\MarkDown学习\顺序、循环和选择语句\images\流程图3.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y65b5x5Q-1607846568793)(D:\新建文件夹\MarkDown学习\顺序、循环和选择语句\images\流程图4.jpg)]

实例:(流程图如上)

public class Demo{ 
    public static void main(String args[]){ 
        int balance = 500;
        if(balance==500){ 
            System.out.println("买豪车");
        }else{ 
            System.out.println("买自行车");
        }
        System.out.println("吃饭睡觉");
    }
}
// 输出结果:吃饭睡觉

常见的错误:

  • 未加大括号{ }

    else 之前若有两个 if 且都没加大括号,则这个 else 会匹配离它最近的那个 if

    if()
        if()
            else{ 
    		
            }
    
  • else 不能单独使用,必须和关键字 if 一起使用

  1. 第三种形式的判断语句
// 语法
if(表达式 1){ 
	语句 1;
    ......
    
}else if(表达式 2){ 
	语句 2;
    ......

}else if(表达式 m){ 
	语句 m;
    ......

}else{ 
	语句 n;
    ......        
}

3、在书写判断语句时要遵循一定的书写规范,否则容易出现错误

布尔表达式书写规范

boolean flag = flase;
if(flag==true)		
//这样书写没有错误,但如果不注意漏写一个"="就会出现错误,但不会报错。
//因此更规范的写法应该为:if(flag) 和 if(!flag)

4、if 判断语句的总结

  1. 表达式:关系表达式或逻辑表达式

  2. 表达式的运算结果应该是真或者假

    真:执行该语句

    假:跳过该语句,执行下一条语句

  3. ” 语句 “可以是单语句也可以是复合语句。

  4. else if 可以有多条。

  5. if 和 else if 都需要判断表达式真假,else 不需要,else if 和 else 必须配合 if 一起使用,不能单独使用。

二、Switch 多分支语句

在编程中经常会碰到这样一种问题,就是我们需要判断一个变量是否等于某一个值,如果不等于,再用另一个值来与它做对比,比如我们要实现给某一个同学打评语的功能

char grade = 'B';
if(grade=='A'){ 
    System.out.println("真棒");
}
if(grade=='B'){ 
    System.out.println("做的不错");
}
if(grade=='C'){ 
    System.out.println("再接再厉");
}
/* 进行多次判断实现多选一 代码过于繁杂 每一个判断语句都要测试 容易混乱 */

如果需要写几十个 if 语句,维护起来将会非常的困难,为了简化这种多层判断的开发效率,Java提供了Switch语句

1、

Switch中用于判断的参数,可以是byte、short、int、String、枚举

! String和枚举是在 Java 7 之后才允许的,现在很多的公司做项目都用的是 JDK 1.6 ,所以不是很推荐使用字符串作为switch的参数

long、float、double 类型的参数是不能放在 Switch 中的

2、

default 的位置不固定,可以放在 switch 语句块中的任何一个位置,只有在所有的 case 都无法匹配的情况下,才会执行 default 之后的语句

default 在 switch 语句块是可写可不写的

String name = "张三";
switch(name){ 
    default :
        System.out.println("查无此人");      
    case "张三" :
        System.out.println("张三报道!"); break;
    case "李四" :
        System.out.println("李四报道!"); break;
    case "王五" :
        System.out.println("王五报道!"); break;
}
//输出结果:张三报道!
String name = "张三";
		switch (name) { 
		default:
			System.out.println("查无此人");
		case "张三":
			System.out.println("张三报道!");
		case "李四":
			System.out.println("李四报道!");
		case "王五":
			System.out.println("王五报道!");
/* 输出结果: 张三报道! 李四报道! 王五报道! */
String name = "张三";
		switch (name) { 
		case "张三":
			System.out.println("张三报道!");
		case "李四":
			System.out.println("李四报道!");
		case "王五":
			System.out.println("王五报道!");
		default:
			System.out.println("查无此人");
		}    
/* 输出结果: 张三报道! 李四报道! 王五报道! 查无此人 */                

3、

break 用于跳出 switch 语句,也是是可写可不写的

//语法
Switch(用于判断的参数){ 
    case 常量表达式 1 :  语句 1;   break; 		//break是用于跳出语句的,可以不写
    case 常量表达式 2 :  语句 2;   break;
    ......
    case 常量表达式 n :  语句 n;   break;
    default :  语句 n+1;   break;		//default也是可不写的
}

4、

switch 语句的执行顺序:

从表达式值等于某个 case 语句后的值开始,它下方的所有语句都会被运行,直到遇见一个 break 为止

实例:

public class Demo{ 
    public static void main(String args[]){ 
        int score = 10;
        switch(score){ 
            case 10: 
            case 9: System.out.println("成绩为优");  break;
            case 8: System.out.println("成绩为良");  break;
            case 7:
            case 6: System.out.println("成绩为中");  break;
            case 5:
            case 4:
            case 3:
            case 2:
            case 1:
            case 0: System.out.println("成绩为差");  break;
            default : System.out.println("成绩无效");  break;
        }
    }
}
//输出结果:成绩为优
int i;
for (i = 0; i < 3; i++) { 
    switch (i) { 
        case 0:
            printf("%d", i);
        case 2:
            printf("%d", i);
        default:
            printf("%d", i);
    }
}
//输出结果:000122

循环语句

do while 语句的执行效率比 while 语句高

一、While循环语句

1、while语句也称条件判断语句,它的循环方式为利用一个条件来控制是否继续反复执行这个语句

2、语法

while(条件表达式){ 		//返回布尔值,判断是否继续执行语句
    执行语句;		//可被循环执行的语句
}

实例:

//用计算机循环计算从1加到100的累加
public class Demo{ 
    public static void main(String args[]){ 
        int sum = 0;
        int i = 1;
        while(i<=100){ 
            sum+=i;
            i++;
        }
        System.out.println(sum);
    }
}
//输出结果:5050

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jUHIdheF-1607846568795)(D:\新建文件夹\MarkDown学习\顺序、循环和选择语句\images\流程图6.jpg)]

3、三个注意!

  • 表达式不允许为空
  • 表达式不应该是常数(true 或 false),这样会进入死循环
  • 循环体中必须要有改变条件表达式值的语句,否则将成为死循环

二、do while循环语句

1、do while 循环语句与 while 循环语句类似,它们之间的区别是 while 语句为先判断再执行,do while 语句为先执行,再判断。也就是说,do while 语句中,{ }的程序段至少要被执行一次。

2、语法

do{ 
    执行语句;
}while(条件表达式);

3、do while 语句与 while 语句的一个明显区别是,do while 语句在结尾处多加了一个分号

根据do while 循环语句的语法特点总结出的do while 循环语句的执行过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oa7uXbB0-1607846568796)(D:\新建文件夹\MarkDown学习\顺序、循环和选择语句\images\流程图5.jpg)]

4、当我们想使用某个社交网站时,都会要求我们登录或注册新账户,为了防止用户手误,都会要求我们输入两次密码。如果两次密码不一致,则会提示用户,两次输入的密码不一致,请重新输入,用户就会重新输入密码了。要实现这个功能,需要先让用户输入密码,然后系统再做判断。如果条件不符合,就要求用户重复执行输入密码的操作,我们可以发现,注册的过程中有两个特点:

  • 先输入密码,再做判断
  • 如果判断一直假,则循环执行同一逻辑

此时,如果使用 while 循环语句来书写代码,不仅需要在循环外对输入的信息做判断,还要在循环内也对输入的信息做判断,这样重复的代码,会使程序笨重有余,不过我们可以使用 do while 语句完美的解决这个问题。

//密码输入
public class Demo{ 
    public static void main(String args[]){ 
        Scanner sc = new Scanner(System.in);		//创建一个扫描器
        String pwd1 = "0";
        String pwd2 = "-1";
        
        do{ 
            System.out.println("请输入密码:");
            pwd1 = sc.nextLine();
            System.out.println("请再次输入密码:");
            pwd2 = sc.nextLine();
            if(!pwd1.equals(pwd2)){ 
                System.out.println("您两次输入的密码不一致,请重新输入!");
            }while(!pwd1.equals(pwd2));
            System.put.println("设置密码成功!");
        }
    }
}

5、while 和 do while 的比较

do while 的执行效率比 while 要高

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dk260RHg-1607846568797)(D:\新建文件夹\MarkDown学习\顺序、循环和选择语句\images\比较.jpg)]

public class Demo{ 
	public static void main(String args[]){ 
        int i=0,j=0;
        System.out.println("j="+j);
        while(i>1){ 
            j++;
        }
        System.out.println("j="+j);
    }
}
/* 输出结果:j=0 j=0 */
public class Demo{ 
	public static void main(String args[]){ 
        int i=0,j=0;
        System.out.println("before while j="+j);
        do{ 
            j++;
        }while(i>1);
        System.out.println("after while j="+j);
    }
}
/* 输出结果:before while j=0 after while j=1 */    

三、for循环语句

for 循环是 Java 程序设计中最有用的循环语句之一。一个 for 循环可以用来重复执行某条(或多条)语句,直到某个条件得到满足。在 Java 5以后增加了 foreach 语法。

1、语法

for(初始化表达式1;布尔表达式2;表达式3){ 
    语句;
}

初始化表达式:只在循环开始前运行一次,常用来做赋值操作,最常用的就是给循环变量赋值

布尔表达式:返回布尔值,控制循环是否继续执行

表达式:通常是赋值表达式,在完成一次循环之后执行

每循环一次,布尔表达式和表达式就会交替执行一次

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGnMpocu-1607846568798)(D:\新建文件夹\MarkDown学习\顺序、循环和选择语句\images\流程图7.jpg)]

2、使用 for 循环,计算从 1 加至 100 的和

public class demo{ 
    public static void main(String args[]){ 
        int sum = 0;
        for(int i=1;i<100;i++){ 
            sum+=i;	//即sum=sum+i;
        }
        System.out.println("sum="+sum);
    }
}
//输出结果:sum=5050

四、foreach循环语句

1、语法

for(type x:obj){ 
    引用了x的java语句;
}

循环变量 type x,其中 type 为变量类型,x 为变量名,依次将 obj 中的值赋给 x

obj : 是一个可以被遍历的集合,例如数组

2、

遍历:我们可以简单理解为,对数组或集合中的所有元素,逐一访问,依次读取一遍

数组:就是相同数据类型的元素按一定顺序排列的集合

int arr[] = { 7,10,1};
for(int x:arr){ 
    System.out.print(x);
}
//输出结果:7101

int sum = 0;
int arr[] = { 1,2,3,4,...,49,50};
for(int x:arr){ 
    sum+=x;
}
System.out.println("sum="+sum);
//输出结果:sum=5050

3、百钱买百鸡问题

鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何

public class Demo{ 
	public static void main(String args[]){ 
        int cock,hen,chick;
        for(cock=1;cock<=20;cock++){ 
            for(hen=1;hen<=33;hen++){ 
                for(chick=3;chick<=99;chick+=3)
                    if(cock*5+hen*3+chick/3==100){ 		//百钱
                        if(cock+hen+chick==100){ 		//百鸡
                            System.out.println("公鸡:"+cock+"母鸡:"+hen+"小鸡:"+chick);
                        }
                    }
            }
        }
    }
}

循环控制

循环控制包含两方面的内容,一方面是控制循环变量的变化方式,另一方面是控制循环的跳转。控制循环的跳转需要用到 break 和 continue 这两个关键字,这两条跳转语句的跳转效果不一样,break 是中断跳出循环,continue 是结束当前循环。

1、在我们编写复杂代码时,通常会碰到一些特殊的情况,要求我们立即中断循环或忽略某次的循环,这就要求要对循环进行控制,循环控制有两个关键字, break 和 continue

2、break 关键字的使用场景

while(  ){ 
    ......
    break;
}
do{ 
    ......
    break;
}while(  );
for(......){ 
    ......
    break;
}
switch(  ){ 
    case 1 :break;
    case 2 :break;
        .....        
}

break的作用:中断跳出循环

int i = 1;
while(i>0){ 
    i++;
    System.out.println(i);
    if(i==10)
        break;
}
System.out.println("循环结束");

3、Loop 标签

可能有的人会有疑惑:break 控制的是内层循环还是外层循环?

想要控制这个,我们就要用到 Loop 标签Loop 标签使 break 具有了指向性,将跳出被 Loop 标记的这个循环

未使用 Loop 标签的场景

for(int i=0;i<3;i++){ 
    for(int j=0;j<6;j++){ 
        if(j==4)
            break;		//跳出内层循环
    }
}

使用了 Loop 标签的场景

Loop:for(int i=0;i<3;i++){ 
    for(int j=0;j<6;j++){ 
        if(j==4)
            break Loop;		//跳出外层循环
    }
}

4、continue 关键字的使用场景

continue 关键字的使用场景与 break 类似,但不适用于 switch

while(...){ 
    ...
    continue;    
}
do{ 
    ...
    continue;    
}while(...);
for(...){ 
    ...
    continue;    
}

continue 关键字的作用:结束当前循环,执行下一次循环

for(int i=1;i<=10;i++){ 
    if(i%2==0)
        continue;
    System.out.println("i="+i);
}

continue也可以使用 Loop 标签

for(int i=0;i<3;i++){ 
    for(int j=0;j<6;j++){ 
        if(j==4)
            continue;
    }
}

Loop:for(int i=0;i<3;i++){ 
    for(j=0;j<6;j++){ 
        if(j==4)
            continue Loop;
    }
}
    原文作者:tgd77
    原文地址: https://blog.csdn.net/tgd77/article/details/111125456
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞