Java语句的流程控制
1、Java语句的执行结构
Java程序是由语句组成的。语句能够通过创建和操作变量、对变量赋值并控制这些操作的执行流程来描述运算。语句通常会被组织成代码段,即花括号中的一系列语句。首先来大概说一说Java中的语句分类:
- 声明语句:创建某种类型的变量并用标识符为其命名。
- 赋值语句:将(由表达式产生的)某种类型的数值赋予一个变量。
- 条件语句:能够简单地改变执行流程—根据指定的条件选择执行两个代码段之一。
- 循环语句:更彻底的改变执行流程—只要条件为真就不断地反复执行代码段中的语句。
- 调用和返回语句:和静态方法有关,是改变执行流程和代码组织的另一种方式。
1996 年,计算机科学家 Bohm 和 Jacopini 证明了:任何简单或复杂的算法都可以由顺序结构、分支结构和 循环结构这三种基本结构组合而成。
它们的共同点是都包含一个入口和一个出口,它们的每个代码都有机会被执行,不会出现死循环。
1.1、顺序结构
顺序结构是一种基本的控制结构,它按照语句出现的顺序执行操作。
1.2、分支结构
分支结构又被称为选择结构,根据条件成立与否来执行操作。
1.2.1、if条件语句
if条件结构是根据条件判断之后再做处理,如果条件为真,则执行if之后的花括号内的代码,否则就执行else或者else if的花括号中的代码。如果没有else或者else if 那么当条件不满足的时候就直接跳过,执行后边的语句。
if(条件语句){…}
if (条件语句){…}else{…}
if (条件语句){…}else if(条件语句){…}
if (条件语句){…}else if(条件语句){…}else{…}
举个栗子,我们应该都考过试,学校按照我们的考试分数把成绩分为优秀(>=90),良好(80-90),合格(70-80),及格(60-70),不及格(<60),那么用程序可以描述为:
import java.util.Scanner;
public class Grade{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("请输入成绩:");
int score s= input.nextInt();
// 90以上优 80-90 良 70-80 合格 60-70 及格 <60 不及格
if(score >= 90){
System.out.println("您的成绩是优秀!不要骄傲继续加油哦!");
}else if(score >= 80 & score < 90){
System.out.println("您的成绩是良好!还要努力哦!");
}else if(score >= 70 & score < 80){
System.out.println("您的成绩是合格!还要加倍努力哦!");
else if(score >= 60 & score < 70){
System.out.println("您的成绩是及格!差一点点就不及格,下次要更努力了哦!");
}else{System.out.println("您的成绩不合格!下次可不能不好好听课了!");
}
}
}
1.2.2、switch语句
一般格式:
switch(表达式){
case 取值 1: 语句块 1;break;
case 取值 n: 语句块 n;break;
default: 语句块 n+1;break;
}
switch 语句有关规则
表达式的返回值必须是下述几种类型之一:byte, int, char, short, String;
case 子句中的取值必须是常量,且所有 case 子句中的取值应是不同的;
default 子句是可选的;
break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;如果 case 后面没有写 break 则直接往下面执行!
case 后面的执行体可写{ }也可以不写{ }.
这种选择语句一般用于case特别多的场景,举个栗子,我们想知道某一年某一月有多少天,可以如下编写代码:
import java.util.Scanner;
public class CalculationDays {
public static void main(String[] args) {
/*
一年中有 12 个月,而每个月的天数是不一样的。其中大月 31 天,分别为
1,3,5,7,8,10,12 月,小月 30 天,分别 为 4,6,9,11 月。还有二月比较特殊,平
年的二月只有 28 天,而闰年的二月有 29 天.在控制台输入年份和月份,程序计算该年该月的天数。
判断闰年条件①:非整百年数除以4,无余为闰,有余为平;②整百年数除以400,无余为闰有余平。
*/
Scanner input = new Scanner(System.in);
System.out.println("请输入年份:");
int year = input.nextInt();
System.out.println("请输入月份:");
int month = input.nextInt();
switch (month) {
case (1):
case (3):
case (5):
case (7):
case (8):
case (10):
case (12):
// 1,3,5,7,8,10,12月份有31天
System.out.println(year + "年" + month + "月有31天");
case (4):
case (6):
case (9):
case (11):
// 4,6,9,11月有30天
System.out.println(year + "年" + month + "月有30天");
case (2):
// 判断是否为闰年
if (year % 400 == 0 | (year % 100 != 0 & year % 4 == 0)) {
// 闰年2月有29天
System.out.println(year + "年" + month + "月有29天");
} else {
// 平年2月有28天
System.out.println(year + "年" + month + "月有28天");
}
}
}
1.3、循环结构
循环结构是一种重复结构,如果条件成立,它会重复执行某一循环体,直到出现不满足的条件为止。
循环语句分类:
- for 循环
- while 循环
- do/while 循环
1.3.1、while循环
首次先判断是否满足条件,符合条件则执行循环体,然后再判断,符合条件,循环继续执行;否则,循环退出。
特点:先判断,再执行
格式:
while(条件表达式){
//循环体;
}
使用 while 循环的步骤:
1、分析循环条件和循环操作
2、套用 while 语法写出代码
3、检查循环是否能够退出(重要)
举个栗子,计算1+2+3+4+…+n(n个数字之和):
int sum = 0;
int n = 10;
int i = 0;
while(i <= n ){
sum += i;
i++;
}
System.out.print("1+2+3+...+10的结果为:" + sum);
1.3.2、do-while 循环
首次先执行一遍循环操作,符合条件,循环继续执行;否则,循环退出。
特点:先执行,再判断
格式:
do {
// 循环题
}while ( 条件表达式 );
因此while 循环和 do-while 循环的区别就是:
while:先判断条件,如果条件满足,再执行循环操作。
do while:先执行一遍循环操作,然后再判断条件,如果条件满足,继续执行循环操作。
举个栗子,之前网上流传一个价值一个亿的人工智能代码:
import java.util.Scanner;
public class AI {
public static void main(String[] args) {
// 人工智障的精髓,把"吗"去掉,把"我"变成"我也",把?变成!,还可以有其他形式,感兴趣的自己玩玩
// 实例化一个Scanner对象,用来接收输入
Scanner input = new Scanner(System.in);
System.out.println("请输入聊天内容:");
String question, reply;
do {
question = input.next();
reply = question.replace("吗", "");
reply = reply.replace("我", "我也");
reply = reply.replace("?", "!");
System.out.println(reply);
} while (!reply.equals("滚"));
}
}
/*
在吗?
在!
吃了吗?
吃了!
我爱你
我也爱你
能听得懂吗?
能听得懂!
真的吗?
真的!
*/
1.3.3、for循环
格式:
for( 初始化参数;判断条件;更新循环变量){
// 循环体;
}
举个栗子,打印我们小学背过的九九乘法表:
public class MultiplicationTable {
public static void main(String[] args) {
System.out.println("乘法口诀表:");
// 打印乘法口诀表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + (i * j) + "\t");
}
System.out.println();
}
}
}
1.3.4、退出循环
最后说一下break和continue语句。break语句是直接跳出当前所在的循环(不执行循环体中break之后的语句),不再执行循环,而continue则是跳过这一次的循环(不执行循环体中continue之后的语句),继续执行之后下一次循环的判断和循环。看例子:
public class Demo {
/*
break与continue语句:
break是用于终止本轮所有次循环。即不执行本次循环中break后面的语句,直接跳出循环。
continue是用于终止本轮本次循环。即本次循环中continue后面的代码不执行,进行下一次循环的入口判断。
*/
public static void main(String[] args) {
for(int i=0;i<10;i++) {
if(i==5) {
break;
}
System.out.println(i);
}
System.out.println("-------------------------");
for(int j=0;j<10;j++) {
if(j==5) {
continue;
}
System.out.println(j);
}
}
}
运行之后可以发现,break的代码,只输出到0,1,2,3,4,continue的代码则是没有打印5.
有时候有多个循环嵌套,一个break只能退出它所在的循环,那怎么直接跳出所有循环呢?
通过给for循环起名字的方式,可以实现,参考代码如下:
public class Demo10 {
/*
对循环起名字退出多重循环
*/
public static void main(String[] args) {
loop1:for(int i=0;i<10;i++) {
for(int j=0;j<10;j++) {
System.out.println("i="+i+" , j="+j);
if(i==5 && j==5) {
break loop1;
}
}
}
}
}