顺序、选择和循环语句(程序的三种基本控制结构)
复合语句
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 语句
- 第一种形式的判断语句
// 语法一:
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(表达式) { 语句; };
这样的写法编辑器会报错,这样的语法是错误的
- 第二种形式的判断语句
// 语法
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 一起使用
- 第三种形式的判断语句
// 语法
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 判断语句的总结
表达式:关系表达式或逻辑表达式
表达式的运算结果应该是真或者假
真:执行该语句
假:跳过该语句,执行下一条语句
” 语句 “可以是单语句也可以是复合语句。
else if 可以有多条。
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;
}
}