Java 控制语句

本文最后更新于:2024年3月18日 凌晨

Java 控制语句

循环语句是在一定条件下反复执行一段代码,被反复执行的程序段称为循环体,Java语言中提供的循环语句有while语句,do…while语句,for语句。

While语句

while语句的格式如下。

1
2
3
4
While(条件表达式)
{
循环体;
}

while语句的执行首先检查条件表达式的值是否为真,若为真,则执行循环体,然后继续判断是否继续循环,直到条件表达式的值为假,执行后续语句,循环体通常是一个组合语句,在某些特殊情况下,也可以是单个语句。

[例3-3]:在3位数中找出所有水仙花数,水仙花数的条件是该数等于其各位数字的立方和。

分析

3位数的范围是从100开始到999,显然要对该范围内的所有数进行检查,因此可以设置一个循环变量,初始时让其为100,以后随着循环的进行不断增值,直到其值超出999结束循环,这里的一个难点是如何获取各位数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class 循环语句 {
public static void main(String[] args) {
int i, j, k, n = 100, m = 1;
while (n < 1000) {
i = n / 100;
j = (n - i * 100) / 10;
k = n % 10;
if (Math.pow(i, 3) + Math.pow(j, 3) + Math.pow(k, 3) == n)
System.out.println("找到第 "+m+++"个水仙花数:"+n);
n++;
}
}
}

找到第1个水仙花数: 153
找到第2个水仙花数: 370
找到第3个水仙花数: 371
找到第4个水仙花数: 407

说明

在程序中用到了Math类的一个静态方法pow()来计算某位数字的立方,第5行取最高位和第7行取最低位的方法是典型做法,但取中间那位办法变化多,第6行也可以是(n/10)%10或者(n%100)/10等。

注意

while循环的特点是"先判断,后执行"如果条件一开始就不满足。则循环执行0次。另外,在循环体中通常要执行某个操作影响循环条件的改变,如果循环条件永不改变,则循环永不终止,称此为死循环。要强制停止死循环的执行,只有按Ctrl+C快捷键。在循环程序设计中,要注意避免死循环。

[例3-4]:从键盘输入一个长整数,求其各位数字之和。

分析

这里的关键是如何得到各位数字,注意,得到一个整数的最低位数字可用除10求余数的方法,而要得到该整数的除最低为外的数只要用除10取整即可,因此,利用循环即可将一个整数的所有各位数字取出。

1
2
3
4
5
6
7
8
9
10
11
12
13
import javax.swing.*;
public class Ex3_4{
public static void mian(String args[]){
long n,m = 0;
n = Long.parseLong(JOptionPane.showInputDialog("输入整数"));
long a = n;
while(a >0){
m += a%10;// 累加计算各位数字之和。
a = a/10;
}
System.out.println(n+"的各位数字之和="+m);
}
}

说明

程序中引入了3个变量,n记下要分析的整数,m记录其各位数字之和,a记录数据的递推变化,第9行把最低位抛去后,其值越来越小,最后变为0,则不再循环。

do…while语句

如果需要再任何情况下都执行一遍循环体,则可以采用do…while循环,其格式如下:

1
2
3
do{
循环体;
}while(条件表达式);

先执行循环体的语句,再检查表达式,若表达式值为真则继续循环,否则结束循环,执行后续语句。

do…while循环的特点是"先执行,后判断",循环体至少要执行一次,这点是与while循环的重要区别,在应用时要注意选择。

for语句

1
2
3
4
for(控制变量设定初值;循环条件;迭代部分)
{
循环体;
}

for语句执行时,首先执行初始化操作,然后判断循环条件是否满足,如果满足,则执行循环体中的语句,最后通过执行迭代部分给控制变量增值,完成以此循环后,重新判断循环条件。

for循环的优点在于变量计数的透明性,很容易看到控制变量的数值变化范围,使用for循环要注意以下几点:

  • 初始化,循环条件以及迭代部分都可以为空语句(但分号不能省略),三者均为空的时候,相当于一个无限循环。
  • 初始化部分和迭代部分可是使用逗号语句来进行多个操作,所谓逗号语句是用逗号分隔的语句序列,例如:
1
for(i = 0;i < j;i++,j--){...}

[例3-5]:求1+1/2+1/3+1/3+…+1/100的值。

1
2
3
4
5
6
7
8
9
10
public class Ex3_5{
public static void mian(String args[]){
double sum=1;
for (int k=2;k<=100;k++)
sum=sum+1.0/k;
System.out.println("1+1/2+1/3+...+1/100="+sum);
}
}

1+1/2+1/3+...+1/100=5.187377517639621

说明

计算结果包括小数,所以保存计算结果的变量要定义为double类型,第5行中累加项1.0/k不能写成1/k,否则就是整除运算。

[例3-6]:求Fibonacci数列的前10个数。

Fibonacci数列指的是数列的第0个元素是0,第1个元素是1,后面的每个元素都是其前面两个元素之和,程序代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Ex3_6{
public static void mian(String args[]){
int n0 = 0,n1 = 1,n2;
System.out.print(n0+""+n1+"");
for(int i = 0;i < 8;i++){
n2 = n1 + n0; // 计算。
System.out.print(n2+"");
n0 = n1; // 递归。
n1 = n2;
}
}
}

0 1 1 2 3 5 8 13 21 34

说明:在利用循环解决问题时经常要用到迭代推进的思想,根据Fibonacci数列规律,在循环内先计算n2,输出n2,后将变量n0,n1的值向前递推,以便下一轮求新值,注意循环体内语句的排列次序。

[例3-7]:利用随机函数产生10道两位数的加法测试题,根据用户的解答输入计算得分。

程序代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import javax.swing.*;
public class Ex3_7{
public static void mian(String args[]){
int score = 0;
for(int i = 0;i <10;i++){
int a = 10 + (int)(90*Math.random());
int b = 10 + (int)(90*Math.random());
String s = JoptionPane.showInputDialog(a+"+"+b+"=?");
int ans = Interger.parseInt(s);
if(a + b == ans)
score = score+10;// 每道题10分。
}
JOptionPane.showMessageDialog(null,"your score="+score);
}
}

说明:表达式"10+(int)(Math.random()*90)"产生[10,99]之间的随机数,这里,循环起计数作用,在循环内,第6,7行产生两个被加数,第8行提示用户解答,第10行判断解答的正确性,第11行通过累加分值的方法统计得分。

循环嵌套

循环嵌套就是循环体中又含循环语句.3种循环语句可以自身嵌套,也可以相互嵌套。嵌套将循环分为内外两层,外层循环每循环一次,内循环要执行一圈。注意,编写嵌套循环时不能出现内外循环的结构交叉现象。

[例3-8]:找出3~50中的所有素数,按每行5个数输出。

分析:素数是除了1和本身,不能被其他整数整除的数,因此,要判断一个数n是否为素数可用一个循环解决,用从2~(n-1)之间的数去除n,有一个能除尽,则可断定该数不是素数,这时应结束循环,引入一个标记变量f来表示这方面的信息,f为true时表示该数为素数,为false时则表示该数不是素数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Ex3_8{
public static void mian(String args[]){
int m = 0;
for (int n = 3; n <= 50; n++) {// 外循环。
boolean f = true;
int k = 2;
while (f&&k<=(n-1)){// 内循环,从2~(n-1)去除n
if (n%k==0)
f=false;// 发现有一个数能除尽n就不是素数。
k++;
}
if (f){
System.out.print("\t"+n);
m++;
if (m%5==0)
System.out.println();
}
}
}
}

3 5 7 11 13
17 19 23 29 31
37 41 43 47

说明:本例包含多种结构嵌套情况,读者需要仔细思考整个程序的组织,从循环的角度,包含一个二重循环,外层循环是有规律地变化,适合用for循环实现,内存循环要判断数n是否为素数,由于内循环的循环次数是不变的,所以采用while循环,注意循环进行的条件是f为true且控制变量<=n-1