学习目标:掌握for循环结构的使用方法。
1、 for循环结构
for循环语句是Java语言提供的功能更强,使用更广泛的一种循环语句。Java语言的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环条件的情况,它完全可以代替while循环。
for循环的一般语法为:
for(表达式1; 表达式2; 表达式3;)
{
语句;
}
语法说明如下:
表达式1:通常用来给循环变量赋初值,一般是赋值表达式,也允许在for语句外给循环变量赋初值,此时可以省略该表达式;
表达式2:通常是循环条件,一般为关系表达式或逻辑表达式;
表达式3: 通常可用来修改循环变量的值,一般是赋值语句。
for循环中的这三部分必须用分号隔开,组成循环体的语句可以是单条语句或多条语句。
一般语法中的“语句”即为循环体语句。for语句的语义是:
(1)首先计算表达式1的值,通常为循环变量赋初值;
(2)再计算表达式2的值,即判断循环条件是否为真,若值为真则执行循环体一次,否则跳出循环;
(3)再计算表达式3的值,这里通常写更新循环变量的赋值表达式,然后转回第二步重复执行。
在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。循环体可能执行多次,也可能一次都不执行。
案例12:使用for循环求数的阶乘。
在Punit3项目unit包下创建Case12类。代码如下:
package com.unit;
import java.util.Scanner;
/**
* @date: 2021/6/2
* @author:xinch
*/
public class Case12 {
public static void main(String[] args) {
int number, count;
int factorial = 1;
Scanner sc = new Scanner(System.in);
System.out.println("请输入任意一个正整数");
number = sc.nextInt();
for (count = 1; count <= number; count++) {
factorial = factorial * count;
}
System.out.printf("%d的阶乘 = %d", number, factorial);
}
}
程序结构分析
程序声明了3个int类型的变量,number、count、factorial。分别用于存储输入的整数、循环变量的值、阶乘值。for循环中表达式count=1为变量赋初值,表达式count<=number作为循环条件用来测试是否继续执行循环,表达式count++用来修改循环变量的值。
案例13:使用for循环输出加法表。
在Punit3项目unit包下创建Case13类。代码如下:
package com.unit;
import java.util.Scanner;
/**
* @date: 2021/6/2
* @author:xinch
*/
public class Case13 {
public static void main(String[] args) {
int i, j, max;
Scanner sc = new Scanner(System.in);
System.out.println("请输入任意一个数值");
System.out.println("根据这个值可以输出以下加法表");
max = sc.nextInt();
for (i = 0, j = max; i <= max; i++, j--) {
System.out.printf("\n %d + %d = %d", i, j, i + j);
}
}
}
程序结构分析
程序功能主要是演示for循环中逗号表达式的使用。
程序在for循环中,表达式1为逗号表达式,该表达式为循环变量i和j赋初值,执行此表达式后,i被赋值为0,j被赋予max中的当前值;表达式3也是一个逗号表达式,每次循环后,i自加1,j自减1。
前面已讨论,for循环中有三个表达式,for循环中的这三个表达式都可以省略,但要注意分号分割符号不能省略,下面分别讨论for循环中省略部分或者全部表达式的情况。
(1)省略表达式1
for循环语句中表达式1可以省略不写,此时,循环变量应在循环语句之外赋值,例如如下语句:
int i = 0;
for( ; i < 10; i++ )
{
System.out.printf("\n %d=", i*2)
}
程序输出20以内的偶数,int i = 0对循环变量进行赋值,因为循环变量i已经被赋值,此时循环语句可以省略表达式1。
(2)省略表达式2
for循环语句中的表达式2,在一定条件下也可以省略, 表达式2主要用于循环条件的判断。如果省略表达式2,就必须要在循环体中增加循环条件判断语句,如果不满足循环条件,则跳出循环。跳出循环可以用break语句,break语句将在后面介绍。省略表达式2的示例语句如下:
int i;
for( i=0;; i++ )
{
if( i >=10 )
break;
System.out.printf("\n %d=", i*2)
}
程序在循环体内增加了if( i >= 10 )条件判断语句,如果i>=10为真,则通过break语句跳出循环,如果循环体内没有跳出循环的条件判断语句,程序将进入无限循环。
(3)省略表达式3
for循环语句中的表达式3一般是用来修改循环变量的值,如果在循环体内有修改循环变量的语句,此时表达式3可以省略。例如如下语句:
循环体内的i = i+1等同于for( ; i < 10; i++ )语句中的i++,每循环一次,i就进行加1操作,当i自增到10时,循环终止。
三个表达式都省略
三个表达式都省略的情况比较少见,此时,循环体为有循环变量的赋值语句,循环体内应有修改循环变量和循环条件判断的语句,否则很容易形成无限循环。例如如下语句:
int i=0;
for( ;; ; )
{
i = i+1;
if( i >=10 )
break;
System.out.printf("\n %d=", i*2)
}
程序中int i=0为循环变量i赋初值,循环体内i = i+1修改循环变量i的值,if( i >= 10 )判断循环变量i的值是否大于等于10,如果条件为真,则跳出循环。
for循环在Java编程中应用非常广泛,它不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环条件的情况,它完全可以代替while循环。只要弄明白了for循环的三个表达式,就可以掌握for循环的用法,表达式1是进入第一次for循环之前运行,并且只会执行一次;表示式2是for循环的执行条件,满足这个条件后才能进入循环里面的语句;表达式3是在执行一次循环后执行的语句。
2、 循环控制语句
break语句
有时可能不知道循环将要执行的次数,终止循环的条件可在以后确定。所以需要提供一种机制在条件满足的时候跳出循环。有时候,我们需要根据条件跳过循环中的一些语句。Java语言提供了break和continue两个关键字(也称为break语句和continue语句),用于改变程序的控制流。
break语句通常用在前面介绍过的switch语句及循环语句中。当break语句用于switch语句时,可使程序跳出switch结构而执行switch语句之后的语句;当break语句用于while、do-while、for循环语句时,可使程序终止循环而执行循环后面的语句。
break语句实际上就是为了使人能方便地描述从循环执行中退出的动作。通常应把break语句放在条件语句控制之下,以便在某些条件成立时立即结束循环。
案例14:使用break语句退出循环。
在Punit3项目unit包下创建Case14类。代码如下:
package com.unit;
/**
* @date: 2021/6/2
* @author:xinch
*/
public class Case14 {
public static void main(String[] args) {
int i = 0;
while (i < 7) {
i++;
System.out.printf("\n 第%d次循环", i);
// 当i==时,跳出循环
if (i == 5) {
System.out.printf("\n i==5 跳出循环,程序结束", i);
break;
}
}
}
}
程序结构分析
该循环在变量i的值等于5时,满足条件,然后执行break语句,结束整个循环,循环语句后面没有其它语句可执行,程序退出。
continue语句
continue语句只能用在循环里。continue语句的作用是跳过循环体中剩余的语句而准备执行下一次循环。对于while和do-while循环,continue执行之后的动作是条件判断;对于for循环,随后的动作是变量更新。
注意break语句和continue语句的差别。break语句导致循环终止,使程序控制流转向这个循环语句之后;而continue引起的则是循环内部的一次控制转移,使执行控制跳到循环体的最后,相当于跳过循环体里continue语句后面的那些语句,继续下一次循环,下图说明了break语句和continue语句引起的控制转移的情况。

案例15:求整数1—100的累加值,但要求跳过所有个位为3的数。
提示:在循环中加一个判断,如果该数个位是3,就跳过该数不加。如何判断1到100中的哪些整数的个位数是3呢?可以使用取余运算符“%”,将一个正整数,除以10以后余数是3,就说明这个数的个位数为3。
在Punit3项目unit包下创建Case15类。代码如下:
package com.unit;
/**
* @date: 2021/6/2
* @author:xinch
*/
public class Case15 {
public static void main(String[] args) {
int i;
int sum = 0;
for (i = 1; i <= 100; i++) {
// 判断i的余数是否是3
if (i % 10 == 3) {
// 执行下一轮循环
continue;
}
sum += i;
}
System.out.printf("sum = %d", sum);
}
}
程序结构分析
程序检查i除以10的余数是否等于3,如果是,则说明该数的个位数是3,这种情况下,将使用continue语句跳过后续语句,然后转向for循环的表达式3更新循环变量,继续下一次循环。
3、 for嵌套循环
前面已经介绍了嵌套循环的概念,并通过示例介绍了while循环和do-while循环嵌套的情况。for循环也可以嵌套,它可以和for循环结构,也可以和while循环结构混合嵌套。
嵌套循环时,必须将被嵌套的循环语句完整地包含在外层循环的循环体内,下面给出嵌套循环的示例。
案例16:用“*”输出一个菱形图案,图案如下:

在Punit3项目unit包下创建Case16类。代码如下:
package com.unit;
/**
* @date: 2021/6/2
* @author:xinch
*/
public class Case16 {
public static void main(String[] args) {
int i, j, k;
// 先打印上边的四行
for (i = 1; i <= 4; i++) {
// 控制要打印的空格数
for (j = 1; j <= 4 - i; j++)
System.out.print(" ");
// 控制要打印的星号数
for (k = 1; k <= 2 * i - 1; k++)
System.out.print("*");
System.out.print("\n");
}
// 打印下边的三行
for (i = 1; i <= 3; i++) {
// 控制要打印的空格数
for (j = 1; j <= i; j++)
System.out.print(" ");
// 控制要打印的星号数
for (k = 1; k <= 7 - 2 * i; k++)
System.out.print("*");
System.out.print("\n");
}
}
}
程序结构分析
程序分为两部分循环,第一部分循环输出菱形图案的上边四行,最外层循环控制输出的行数,内层嵌套了两个for循环,第一个嵌套循环输出打印的空格数,第二个嵌套循环输出打印的星号数;第二部分循环输出菱形图案的下边三行,原理和第一部分循环相同。
案例17:打印输出100至200之间的全部素数。
提示:素数是指能被1和它本身整除的数。算法比较简单,先将这个数被2除,如果能整除,且该数又不等于2,则该数不是素数。如果该数不能被2整除,再看是否能被3整除,并且该数不等于3,则该数不是素数,否则再判断是否能被4整除,依次类推,该数只要是能被小于其本身的某个数整除时,就不是素数。
在Punit3项目unit包下创建Case17类。代码如下:
package com.unit;
/**
* @date: 2021/6/2
* @author:xinch
*/
public class Case17 {
public static void main(String[] args) {
int i, j, n;
n = 0;
for (i = 100; i <= 200; i++) {
j = 2;
// 从2到i之间寻找第一个能被整除的数
while (i % j != 0)
j++;
// 如果第一个能被整除的数等于该数本身,则说明该数为素数
if (i == j) {
System.out.printf("%4d", i);
n++;
// 控制每行输出8个素数
if (n % 8 == 0)
System.out.print("\n");
}
}
System.out.print("\n");
}
}
程序结构分析
程序外层循环控制输出100至200之间的数,内层的while循环用于找寻从2到该数之间第一个能被整除的数,内层循环判断条件为i%j != 0,其中i为当前要判断是否是素数的数,j为从2开始循环递增的数,如果i%j != 0,则说明i不能被j整除,j自增后程序继续执行while循环,如果i%j == 0,则说明i能被j整除,程序跳出while循环,循环后面的if语句判断i与j是否相等,如果相等,则说明i为素数,程序输出i。