Java学习第三章:流程控制语句
3.1条件语句
条件语句是程序中根据条件是否成立进行选择执行的一类语句。在Java语言中,条件语句主要有两类语法:if语句和switch语句,下面分别进行介绍。
3.1.1if语句
- if语句(单一条件)
该类语句的语法格式为:
if (表达式) {
执行语句块;
}
语法说明:
-
if是该语句中的关键字,后续小括号不可省略;
-
条件表达式返回的结果为布尔型,当返回为真值时才能执行if功能代码;
-
功能代码块为多行时,应将其放在花括号"{}"中间,当功能代码块为单行时,则不需要花括号;
-
不论if语句块是单行还是多行,建议都用花括号"{}"括起来;
-
if()子句后不能跟分号";"。
if语句的代码执行过程为:如果条件表达式返回真值,则执行功能代码块中的语句;如果条件表达式返回值为假,则不执行功能代码块。
执行流程如下图所示。
例3.1 if语句的执行。
public class If_sample1 {
public static void main(String args[]){
int x = 0;
if(x==1){
System.out.println(\"x等于1\");
}
System.out.println("x的值为"+x);
}
}
运行结果如下:
例3.2 if-else语句的执行。
public class If_Sample2 {
public static void main(String[] args) {
int n = 7;
if (n % 2 != 0) {
System.out.println("n是奇数");
System.out.println("条件表达式返回值为真");
} else {
System.out.println("n不是奇数");
System.out.println("条件表达式返回值为假");
}
}
}
运行结果如下图所示。
语法说明:
-
else if是else和if两个关键字,中间使用空格进行间隔;
-
条件表达式返回值都是布尔类型;
-
else if语句可以有任意多句;
-
最后的else语句为可选;
-
如果功能代码部分只有一条语句而不是语句块,花括号"{}"可以省略。
if-else if-else语句的代码执行过程为:当条件表达式1返回值为真时,则执行功能代码块1;当条件表达式1返回值为假时且条件表达式2返回值为真时,则执行功能代码块2;如果条件表达式1、条件表达式2都返回假且条件表达式3返回值为真,则执行功能代码块3,依次类推,如果所有条件都不成立,则执行else语句的功能代码。
接下来通过一个将百分制的成绩转换为A、B、C、D、E五个等级的实例来说明if-else if-else语句的用法,具体代码见下例。
例3.3 使用if-else if-else语句实现百分制成绩到成绩等级的转换。
public class If_Sample3{
public static void main(String args[]) {
int i = 55;
if (i <= 100 && i >= 90) {
System.out.println("成绩是A");
} else if (i >= 80) {
System.out.println("成绩是B");
} else if (i >= 70) {
System.out.println("成绩是C");
} else if (i >= 60) {
System.out.println("成绩是D");
} else {
System.out.println("成绩是E");
}
}
}
运行结果如下图所示。
当i = 55时,if条件都不成立,程序执行else的语句,所以输出"成绩是E"的信息,如果把i的值换成 81时,条件2成立,应该输出"成绩是B"的信息。从例3.3可以看出,当需要进行判断的条件很多时使用if-else if-else语句比较繁琐,这时,我们可以使用switch语句来实现多分支语句的多重选择。
3.1.2switch语句
switch语句从多种情况中选择一种执行,在结构上比if语句要清晰很多。switch语句的语法格式如下:
switch(表达式){
case 取值1:
语句块1;
\[break;\]
case 取值2:
语句块2;
\[break;\]
......
case 取值n:
语句块n;
\[break;\]
default:
语句块n+1;
语法说明:
-
表达式的类型只能为byte、short、char、int,在Java7中增加了对String类型的支持;
-
case语句是标号语句,只确定程序的入口;
-
值1、值2…值n只能为常数或常量,不能为变量,而且值不能重复;
-
功能代码部分可以写任意多句;
-
break关键字结束switch语句,为可选项;
-
default语句功能类似于if-else语句中的else。
switch语句的代码执行过程为:将case语句后的值和表达式的值比较,若相等即从该case语句开始向下执行,如果没有break语句,则一直执行到switch语句的结束,如果遇到break语句,则结束switch语句的执行。
例3.4 使用switch语句实现多重选择。
public class Switch_sample1 {
public static void main(String args[]) {
int n = 2;
int result;
switch (n) {
case 1:
System.out.println("Block A");
result = n;
break;
case 2:
System.out.println("Block B");
result = n * n;
break;
case 3:
System.out.println("Block C");
result = n * n * n;
break;
default:
result = 0;
break;
}
System.out.println("result="+result);
}
}
运行结果如下图所示。
例3.5 使用switch语句实现百分制成绩到成绩等级的转换。
public class Switch_sample2 {
public static void main(String[] args) {
int score = 100;
switch (score / 10) {
case 10:
case 9:
System.out.println(\"成绩等级为A\");
break;
case 8:
System.out.println(\"成绩等级为B\");
break;
case 7:
System.out.println(\"成绩等级为C\");
break;
case 6:
System.out.println(\"成绩等级为D\");
break;
default:
System.out.println(\"成绩等级为E\");
}
}
}
运行结果如下图所示。
例3.6 根据变量判断今天星期几。
public class Switch_ sample3 {
public static void main(String args[]) {
int x = 1;
switch (x) {
case 5:
System.out.println("Finally Friday!");
break;
case 6:
System.out.println("Super Saturday!");
break;
case 0:
System.out.println("Sleepy Sunday!");
break;
default:
System.out.println("I hope for my Weekend!");
break;
}
}
}
运行结果如下图所示。
由上面的例题可以看出程序的功能是如果是星期五则在页面上显示"Finally Friday!",如果是星期六则在页面上显示"Super Saturday!",如果是星期日则在页面上显示"Sleepy Sunday!",其他日子显示"I hope for my weekend!"。
3.2循环语句
如果某段代码想要反复执行多次,可以使用循环语句。本节主要讲述循环语句的三种语法格式:for语句、while语句和do-while语句。
3.2.1while语句
while语句语法格式:
while(循环条件){
循环体;
}
语法说明:
-
循环条件的类型为布尔类型,指循环成立的条件;
-
花括号{}不是必须的,当循环体中只有一条语句时,可以省略;
-
循环体是需要重复执行的代码。
-
while语句的执行流程如下图3.11所示。
例3.7 使用while语句输出x的值。
public class While_sample {
public static void main(String args[]){
int x=1;
while(x<3){
System.out.println("x="+x);
x++;
}
}
}
运行结果如下图所示。
例3.8 使用while语句输出x的值。
public class While_sample {
public static void main(String args[]){
int x=1;
while(x<3){
x++;
System.out.println("x="+x);
}
}
}
运行结果如下图所示。
例3.9 使用while语句计算1+2+3+…+10的和。
public class While_Sum {
public static void main(String args[]) {
int i = 1;
int sum = 0;
while (i <= 10) {
sum += i;
i++;
}
System.out.println("1+2+...+10=" + sum);
}
}
运行结果如下图所示。
例3.10 使用while语句计算从1到100的所有奇数相加。
public class While_OddSum {
public static void main(String args[]) {
int i = 1;
int sum = 0;
while (i <= 100) {
if(i%2!=0)
sum += i;
i++;
}
System.out.println("1到100之间的奇数和为" + sum);
}
}
运行结果如下图所示。
3.2.2do-while语句
do-while语句的语法格式为:
do{
循环体;
}while(循环条件);
语法说明:
-
循环体是重复执行的代码部分,循环条件要求是布尔类型,值为true时执行循环体,否则循环结束,最后整个语句以分号结束;
-
do-while语句是 "先循环再判断"的流程控制结构。
为什么说do-while语句是"先循环再判断"呢?我们来分析一下do-while语句的代码执行过程。首先执行循环体,然后判断循环条件,如果循环条件成立,则继续执行循环体,循环体执行完成以后再判断循环条件,依次类推,直到循环条件不成立,循环结束。从中可以看出,无论循环条件是否成立,循环体都至少会被执行一次。
例3.11 使用do-while语句输出x的值。
class DoWhile_sample {
public static void main(String args[]){
int x=3;
do{
System.out.println("x="+x);
x++;
} while(x<3);
}
}
运行结果如下图所示。
例3.12 使用do-while语句计算从1到100的所有奇数相加。
class DoWhile_OddSum {
public static void main(String args[]) {
int i = 1;
int sum = 0;
do {
if (i % 2 != 0)
sum += i;
i++;
} while (i <= 100);
System.out.println("1到100之间的奇数和为" + sum);
}
}
运行结果如下图所示。
3.2.3 for语句
for语句的语法格式为:
for(表达式1;表达式2;表达式3){
循环体;
}
语法说明:
-
表达式1用于初始化,一般书写变量初始化的代码,例如循环变量的声明、赋值等,它在for语句中执行且只执行一次。表达式1可以为空;
-
表达式2是循环条件,要求必须为布尔类型,如果该条件为空,则默认为true,即条件成立;
-
表达式3为迭代语句,是指循环变量变化的语句,一般书写i++、i–这样的结构。该语句可以为空。
-
循环体指循环重复执行的功能代码。
-
花括号{}不是必须的,当循环体部分只有一条语句时可以省略。
for语句的代码执行过程为:
-
执行表达式1,实现初始化;
-
执行表达式2,判断循环条件是否成立,如果循环条件为false,则结束循环,否则执行下一步;
-
执行循环体;
-
执行表达式3,完成迭代;
-
跳转到步骤2重复执行。
例3.13 使用for语句输出x的值。
public class For_Sample {
public static void main(String[] args) {
for(int x=1;x<3;x++){
System.out.println("x="+x);
}
}
}
运行结果如下图所示。
例3.14 用for循环改写从1到100的所有奇数相加的和。
public class For_OddSum {
public static void main(String args[]) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 2 != 0)
sum += i;
}
System.out.println("1到100之间的奇数和为" + sum);
}
}
运行结果如下图所示。
3.2.4死循环
循环语句中如果循环条件永远为真,那么这样的循环就是死循环,一般情况下都要在代码中避免死循环的出现。由于不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环,所以,当前任何编译系统都不做死循环检查。
下图是两个死循环的例子
在编写Java程序时,若遇到死循环,可以通过按下控制台中的程序结束按钮的方式结束死循环。
然而,在编程中死循环并不是一个一定要避免的问题,相反,在实际应用中,经常需要用到死循环。例如,我们使用的Windows操作系统下的窗口程序中的窗口都是通过一个叫消息循环的死循环实现的。在单片机、嵌入式编程中也经常要用到死循环。在Java语言网络和数据库编程中,也是需要用到死循环的。
3.2.5嵌套循环
循环可以解决反复做的问题,编程时还涉及到循环的嵌套,例如下面的例子是用来实现输出乘法口诀,通过双重for循环,外层的循环控制行的变化,内层的循环控制列的变化。
例3.15 使用for语句输出三行三列的"*"。
public class Multiplication_Sample {
public static void main(String args[]) {
for (int i = 1; i< 3; i++) {
System.out.println("***");
}
}
}
使用嵌套循环可以实现如下
public class Multiplication_Sample {
public static void main(String args[]) {
for (int i = 1; i<=3; i++) {
for (int j = 1; j<=3; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
3.2.6循环的中断
在使用循环语句时,只有循环条件表达式的值为false时,才能结束循环。有时,想提前中断循环,要实现这一点,只需要在循环语句块中添加break或continue语句。
- break语句
在前面switch语句的介绍中已经接触过break语句,其功能是中断switch语句的执行。同样,在循环语句中,break语句的作用也是结束循环语句的执行。
- break语句用于终止某个语句块的执行。用在循环语句体中,可以强行退出循环。
- "break;"语句:可以出现在while、do…while、for、switch语句体中。
- "break label"语句 :可以出现在任何语句体中。
下面以for语句为例来说明break语句的基本使用及其功能。
例3.16 break语句的简单练习。
public class Break_Sample1 {
public static void main(String[] args) {
int i, sum=0;
for (i = 1; i < 101; i++) {
sum += i;
if (sum >= 666) {
break;
}
}
System.out.println("从1到" + i + "的和为" + sum);
}
}
运行结果如下:
例3.17 break语句在循环嵌套中的使用。
public class Break_Sample2 {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.print(j+" ");
if (j == 5) {
break;
}
}
System.out.print("\n");
}
}
}
运行结果如下:
例3.18 带标签的break语句。
public class Break_Sample3 {
public static void main(String[] args) {
label1: for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.print(j+" ");
if (j == 5) {
break label1;
}
}
}
}
}
运行结果如下:
例3.19 带标签的break语句。
import java.util.Scanner;
public class Break_Sample4 {
public static void main(String[] args) {
outer: for (int i = 0; i < 10; i++) {
System.out.println("Outer loop");
inner: while (true) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
System.out.println("inner Loop:" + s);
if (s.equals("hello"))
break inner;
if (s.equals("kitty"))
break outer;
}
}
}
}
运行结果如下图所示。
- continue语句
continue语句虽然也完成循环的终止,但与break语句的区别在于:continue语句只跳出本次循环,但还要继续执行下一次循环;break语句则完全跳出它所在或所标记的循环。下面以while语句为例,来说明continue语句的功能,见例3.20。
例3.20 显示20以内的奇数。
public class Continue_Sample1 {
public static void main(String[] args) {
for (int i = 1; i < 20; i++) {
if ((i % 2) == 0) {
continue;
}
System.out.print(i + " ");
}
}
}
运行结果如下图所示。
例3.21 continue语句的简单使用。
public class Continue_Sample2 {
public static void main(String[] args) {
int i = 0;
while (i < 5) {
i++;
if (i == 3) {
continue;
}
System.out.println(i);
}
}
}
例3.22 带标签的continue语句。
public class Continue_Sample3 {
public static void main(String[] args) {
label1: for (int i = 0; i < 10; i++) {
System.out.print("\n");
for (int j = 0; j < 10; j++) {
System.out.print(j + " ");
if (j == 5) {
continue label1;
}
}
}
}
}
运行如下:
3.3控制语句应用
水仙花数
问题描述:水仙花数指一个特殊的三位数,它的各位数字的立方和与其自身相等。请输出所有的水仙花数。
编程思路:关键是将三位数的个位、十位和百位数字分别拆分出来。
例3.23 水仙花数的求解。
public class Narcissus {
public static void main(String args[]) {
for (int i = 100; i < 1000; i++) { // 循环所有三位数
int a = i % 10; // 拆分出个位数字
int b = (i / 10) % 10; // 拆分出十位数字
int c = i / 100; // 拆分出百位数字
// 判断立方和是否等于自身
if (a * a * a + b * b * b + c * c * c == i) {
System.out.println(i);
}
}
}
}
乘法表
问题描述:在控制台打印九九乘法表
编程思路:总结九九乘法表的规律,得出总计9行,第一行有1个数字,第二行有2个数字,依次类推,数字的值为行号和列号的乘积。由于涉及到行与列的相互关系,可以使用嵌套循环,外部循环控制行数,内部循环解决如何输出每行的数值。
例3.24 九九乘法表。
public class MultiplicationTable1 {
public static void main(String[] args) {
for (int row = 1; row <= 9; row++) { //循环行
for (int col = 1; col <= row; col++) { //循环列
System.out.print(row * col); //输出数值
System.out.print(' '); //输出数字之间的间隔空格
}
System.out.println(); //一行输出结束,换行
}
}
}
运行结果如下:
求8和12的最大公约数
public class CommonDivisor1 {
public static void main(String[] args) {
int m = 8;
int n = 12;
int result = 1;
for (int i = 1; i <= m; i++) {
if ((m % i == 0) && (n % i == 0)) {
result = i;
}
}
System.out.println(result);
}
}
求9和12的最大公约数
public class CommonDivisor2 {
public static void main(String[] args) {
int n = 9;
int m = 12;
int result = n > m ? m : n;
for (int i = result; i >= 1; i\--) {
if ((n % i == 0) && (m % i == 0)) {
result = i;
break; // 结束循环
}
}
System.out.println(result);
}
}
百元百鸡问题
问题描述:母鸡3元/只,公鸡4元/只,小鸡0.5元/只,如果花100元钱买100只鸡,每一种鸡可以买0只,请问有哪些可能?
百元百鸡问题属于数学上的组合问题,可以通过循环控制语句来列举所有的情况,并判断其是否符合要求。
第一种编程思路:首先确定母鸡的购买数量为0,使公鸡的购买数量从0-100逐次变化,每当公鸡的数量变化一次,小鸡的数量就从0逐次变化到100,其数值组合。
公鸡、母鸡和小鸡的组合共有1013种,可以通过程序的循环嵌套语句来实现。
例3.28 用第一种思路解决百元百鸡问题。
public class ChickenPurchase1 {
public static void main(String[] args) {
for (int i = 0; i <= 100; i++) { // 母鸡数量
for (int j = 0; j <= 100; j++) { // 公鸡数量
for (int k = 0; k <= 100; k++) { // 小鸡数量
// 判断数量是否为100,以及金额是否为100
if ((i+j+k == 100) && (i*3+j*4+k*0.5 == 100)) {
System.out.println("母鸡数量:" + i+ "公鸡数量:" + j + "小鸡数量" + k);
}
}
}
}
}
}
所有数值组合的穷举通过循环语句的嵌套来实现。在循环的内部还需要判断公鸡、母鸡和小鸡的数量之和与所用金额是否符合题目要求。通过循环语句的嵌套来解决此问题程序运行效率低,我们简单地使用第二种编程思路优化一下程序结构。
第二种编程思路:100元最多能购买33只母鸡,若只买公鸡只能买25只,而按照用100元买100只的要求,100减去公鸡和母鸡的购买数量即是小鸡的购买数量。
例3.29 用第二种思路解决百元百鸡问题。
public class ChickenPurchase2 {
public static void main(String[] args) {
for (int i = 0; i <= 33; i++) { // 母鸡的购买数量
for (int j = 0; j <= 25; j++) { // 公鸡的购买数量
int k = 100 - i - j; // 小鸡的购买数量
// 判断购买金额是否为100
if (i*3+j*4+k*0.5 == 100) {
System.out.println("母鸡的购买数量:" + i+ "公鸡的购买数量:" + j + "小鸡的购买数量" + k);
}
}
}
}
}
打印图形
问题描述:在控制台中用星号"*"输出如下样式的图形:
控制台中的输出方式只能按行上下依次输出,打印图形时,也只能按行从上到下依次输出每行,此问题的关键是找到图形的规律。
编程思路:在外部使用循环语句执行5次每次打印1行,每行的内容分别为空格和星号"",每行空格缩进的数量为5减去所在行数,星号"“的数量是所在行数的2倍减1。在内部使用循环语句首先打印空格,然后打印星号”*",对应的打印次数用循环次数控制,打印星号之后就可以换行。
例3.30 星型图形的打印。
public class StarPrint {
public static void main(String[] args) {
for (int row = 1; row <= 5; row++) { // 外层循环执行换行
// 打印空格的数量为5减去所在行数
for (int c1 = 0; c1 < 5 - row; c1++) {
System.out.print(' ');
}
// 打印星号的数量为所在行数的2倍减1
for (int c2 = 0; c2 < 2 * row - 1; c2++) {
System.out.print('*');
}
// 换行
System.out.println();
}
}
}
质数判断
问题描述:如何判断某个自然数是否为质数。
质数是只能被1和自身整除的自然数,也称素数,质数中最小的为2。所有自然数都可以被自身和1整除。
编程思路:我们只需判断一个数能否被1和自身以外的数字整除即可,大于其本身的自然数除外。若数字为n,则只需判断从2到n-1之间的所有数字,即程序只需判断该数能否被区间[2,n-1]内的某个自然数整除即可,若在区间内存在能被整除的数则说明不是质数。
例3.31 质数判断
public class Exponent {
public static void main(String[] args) {
int n = 29;
boolean b = true; //布尔类型,表示是否为质数,初始值为真
for (int i = 2; i < n; i++) {
//若能够整除则不是质数
if (n % i == 0) {
b = false;
break; //跳出循环
}
}
//输出结果,判断是否为质数
if (b) {
System.out.println(n + "是质数");
} else {
System.out.println(n + "不是质数");
}
}
}
【总结与提示】
-
控制语句可分为条件语句、循环语句、跳转语句三大类;
-
条件语句包括if语句、if-else语句和switch语句,switch语句中要注意break和default语句的使用;
-
循环语句包括for循环、while循环和do-while循环,三种循环语句可以互换;
-
跳转语句包括break语句和continue语句两大类,break语句是终止本层循环,continue是结束本次迭代进入本层循环的下一个循环。