1.循环结构
- 作用:通过某个条件,可以反复执行代码。
- 程序的执行流程:
1. 顺序执行流程:从第一行代码开始运行到最后一行代码结束,每行代码执行次数1次。 2. 条件分支流程:根据某个条件选择要执行的代码,每行代码执行次数 0~1次。 3. 循环执行流程:根据某个条件反复执行代码,每行代码执行次数 0~n次。
2.循环的分类
2.1 while循环
- 语法:
while( 布尔表达式 ){ // [循环体]当布尔表达式为true执行,执行完毕后再次判断布尔表达式是否为true。 }
- 执行流程:
1. 判断布尔表达式是否为true。 2. 如果为true执行循环体(1~2反复执行), 如果为false 立即跳出循环。
如图所示:
掌握循环的执行流程,记录每一次变量的变化。
- 有限次数循环
概念:将循环执行次数控制在一个固定的范围。
演示的代码如下:循环打印10个HelloWorld。
public class TestLoop{
public static void main(String[]args) {
System.out.println("----程序开始----");
// 打印10个HelloWorld
int i = 1; // 循环变量
while(i<=10){ // 循环条件
System.out.println("HelloWorld!"+i);
i++; // 修改循环变量的值
}
System.out.println("----程序结束----");
}
}
- 有限次数循环的三要素
- 定义循环变量:设置循环起点
- 设置循环条件:设置循环终点
- 改变循环变量的值:控制步长
如图所示的跑步:
演示,使用while循环计算1~100的和代码如下:
public class TestWhile{
public static void main(String[]args){
// 1+2+3+4+5+6.....+100
int sum = 0; // 存储每次相加的结果
int i = 1;
/*
sum += i; //累加 1
i++; // i=2
sum += i; // 累加 3
i++; // i=3
sum += i; // 累加6
i++; // i=4
*/
//....
while( i<=100 ){
sum += i; // 累加求和
i++; // i变量自增1
System.out.println( sum ); // 打印每次运算结果
}
}
}
2.2 do…while
- 语法:
演示:打印10个HelloWorld。do{ // [循环体] 当布尔表达式为true时执行 }while( 布尔表达式 );
public class TestDoWhile{
public static void main(String[]args){
// 1.定义循环变量
int i = 1;
do{
System.out.println("HelloWorld " + i);
// 3.改变循环变量的值
i++;
}while( i>=10 ); // 2.设置循环条件
}
}
执行流程:
1. 执行循环体。
2. 再判断循环条件的真假。
如图所示:
- while与do…while的区别?
while循环:先判断,再执行。 do...while循环:先执行,再判断,用于先尝试执行一次再决定是否循环。 如果第一次验证循环条件为false,do..while比while多执行一次,否则执行次数一致。
2.3 for
- 特点:将三要素融入到语法中形成一行,直观的看到循环次数。
语法:
for(定义循环变量; 设置循环条件; 改变循环变量的值){
// [循环体]当布尔表达式为true时执行
}
演示:使用for循环打印10个HelloWorld。
package com.txw.test;
public class TestFor {
public static void main(String[] args) {
// 打印10个HelloWorld
for (int i = 1; i <= 10; i++) {
System.out.println("HelloWorld" + i);
}
}
}
执行流程:
与while循环一致。
1、定义循环变量。
2、判断循环条件。
3、执行循环体。
4、改变循环变量的值。
如图所示:
根据for循环的声明直观看出循环次数。
for(int i=0; i<=20; i++) // 循环次数:21
for(int i=5; i>=0; i--) // 循环次数:6
for(int i=1; i<=10; i*=2) // 循环次数:4
for(;;) // 死循环
每种循环的特点:
while、do…while:适用于不明确次数循环。
for:适用于明确次数循环。
3.循环练习
3.1 计算1~n的阶乘
- 阶乘:1*2*3*4…*n
package com.txw.test;
public class TestFor2 {
public static void main(String[] args) {
int n = 20;
// 计算n的阶乘
int r = 1;
// 1*2*3*4*5
for (int i = 1; i <= n; i ++) {
r *= i;
System.out.println(i + "的阶乘:" + r);
}
}
}
3.2 打印n的所有因子
- 能被n整除的数字就是n的因子
穷举法:先找到结果的所在范围, 在该范围内对数据逐一验证,直至满足条件找到结果。
演示的代码如下:
package com.txw.test;
public class Test {
public static void main(String[]args) {
int n = 12;
for(int i = 1; i <= n; i ++){
// 判断n%i是否为0,如果为0则证明i是n的因子
if( n % i == 0 )
System.out.println(i+"是"+n+"的因子");
}
}
}
3.3 求四叶玫瑰数
- 四叶玫瑰树,是指一个四位数abcd 满足 a^4 +b4+c4+d^4 == abcd 。
演示的代码如下:
public class Test{
public static void main(String[]args) {
// 明确答案所在范围:1000~9999
for(int abcd = 1000; abcd <= 9999; abcd ++){
int a = abcd/1000; // 千位
int b = abcd/100%10; // 百位
int c = abcd/10%10; // 十位
int d = abcd%10; // 个位
if(a * a * a * a + b * b * b * b + c * c * c * c + d * d * d * d == abcd){
System.out.println(abcd +" 是四叶玫瑰树");
}
}
}
}
4 套循环
演示的代码如下:
public class Test{
public static void main(String[]args) {
for(int j = 1; j <= 3; j ++){
System.out.println("外层循环:"+ j);
for(int i = 1; i <= 5; i ++){
System.out.println("\t内层循环:"+ i);
}
}
}
}
执行的流程如图所示:
嵌套循环执行流程:外层循环执行一次,内层循环执行n次。如图所示:
4.1 计算1*1~5 + 2*1~5 + 3*15…n*15
1.分析结果如下:
1*1*2*3*4*5
+
2*1*2*3*4*5
+
3*1*2*3*4*5
....
2.演示的代码如下:
public class Test{
public static void main(String[]args) {
int sum = 0;
int n = 6;
for(int i = 1; i<= n; i ++){
//1 *1*2*3*4*5
for(int j = 1; j <= 5; j ++){
// i=1 j=1 i=2 j=1
// j=2 j=2
// j=3 j=3
// j=4 j=4
// j=5 j=5 .....
sum += i * j;
// 打印每次i与j值查看结果
System.out.print( i + "*" + j + " " );
}
// 每轮计算结束后换行
System.out.println();
}
// 打印结果
System.out.println( sum );
}
}
4.2 打印图形
- 规律:内层循环控制列,外层循环控制行。
比如:正方形
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
演示的代码如下:
public class Test{
public static void main(String[]args) {
for(int i = 1; i <= 5; i ++){
for(int j = 1; j <= 5; j ++){
// 内层循环控制每一行要打印的内容
System.out.print("* ");
}
// 换行语句在外层循环中,由外层循环控制行
System.out.println();
}
}
}
比如:三角形
*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
* * * * * * * *
* * * * * * * * *
演示的代码如下:
public class Test{
public static void main(String[]args) {
/* 外层循环控制行i 内层循环控制列j
i=1 * j1~1 1次
i=2 * * j1~2 2次
i=3 * * * j1~3 3次
i=4 * * * * j1~4 4次
i=5 * * * * * j1~5 5次
*/
for(int i = 1; i <= 9; i ++){
// 打印*号
for(int j = 1; j <=i ; j ++){
System.out.print("* ");
}
System.out.println();
}
}
}
5. 流程控制语句(关键字)
5.1 break
- 作用:跳出switch结构与循环结构
演示的代码如下:
public class Test{
public static void main(String[]args) {
System.out.println("循环开始");
for(int i = 1; i <= 10; i ++){
if(i == 5) break; // 跳出循环
System.out.println("HelloWorld"+ i);
}
System.out.println("循环结束");
}
}
演示:求阶乘结果超过100000当前数。
public class Test{
public static void main(String[]args) {
int i = 1;
int r = 1; // 存储阶乘结果
// 求阶乘结果超过100000当前数
while(true){
r *= i; // 计算阶乘结果
System.out.println(i + "\t" + r);
if(r >= 100000) {
break; // 跳出循环
}
i ++;
}
}
}
5.2 continue
- 作用:跳出本次循环执行下一次循环。
演示的代码如下:
public class Test{
public static void main(String[]args) {
System.out.println("循环开始");
for(int i = 1; i <= 10; i ++){
if(i == 5){
continue; // 跳出循环
}
System.out.println("HelloWorld"+ i);
}
System.out.println("循环结束");
}
}
演示:百钱买百鸡的代码如下:
package com.txw.test;
public class Test {
public static void main(String[]args) {
// 10钱买10鸡
// 公鸡3 文 母鸡2文 小1文3只
// 穷举法
// 母鸡 0 小鸡0 验证 10只 10文
// 母鸡 0 小鸡1 验证 10只 10文
// 母鸡 0 小鸡2 验证 10只 10文
// 母鸡 0 小鸡3 验证 10只 10文
// 母鸡 0 小鸡4 验证 10只 10文
// 母鸡 0 小鸡5 验证 10只 10文
// 母鸡 0 小鸡6 验证 10只 10文
// 母鸡 0 小鸡7 验证 10只 10文
// 母鸡 0 小鸡8 验证 10只 10文
// 母鸡 0 小鸡9 验证 10只 10文
// 母鸡 0 小鸡10 验证 10只 10文
// 母鸡 1 小鸡0 验证 10只 10文
// 母鸡 1 小鸡1 验证 10只 10文
// 母鸡 1 小鸡2 验证 10只 10文
// 母鸡 1 小鸡3 验证 10只 10文
// 母鸡 1 小鸡4 验证 10只 10文
// ...
// 母鸡 10 小鸡10 验证 10只 10文
int count = 0;
for(int i = 0 ; i <= 33; i ++){ // 公鸡
int max = (100 - i * 3) / 2;
for(int j= 0; j <= max; j ++){ // 母鸡
// j = 1 k 0~10
// j = 2 k 0~10
count++;// 统计循环次数
int k = 100 - i - j; // 计算小鸡数量
// 如果k不能被3整除跳过后续运算
if(k % 3 != 0)continue;
// 数量 钱
if(i + j + k == 100 && i * 3 + j * 2 + k / 3 == 100){
System.out.println("公鸡:"+ i +" 母鸡:"+ j +" 小鸡:"+ k);
}
}
}
System.out.println( count );
// 6 74 20钱小鸡 61/3 60/3 20
}
}
6 习题
- 以下描述正确的是(A)
A. 循环分为 while 循环、for 循环 、do…while 循环 。
B. while 循环是先执行,再判断。
C. 所有循环的循环体,一定会被执行。
D. break 只能应用于循环结构中,代表终止、跳出本层循环。
原因:while循环和for循环先判断再执行,不满足条件不执行,满足条件才会执行。 break代表跳出switch和循环结构。 - 仔细阅读以下程序代码,对结果分析正确的是(D)
public class Test{
public static void main(String[]args) {
int i = 0;
while (i < 10){
System.out.println("HelloWorld");
}
}
}
A. 程序编译报错
B. 程序运行报错
C. 程序打印 10 遍 HelloWorld
D. 不断打印 HelloWorld
原因:循环变量没有迭代部分造成死循环。
3. 仔细阅读以下程序代码,对结果分析正确的是©
public class Test{
public static void main(String[]args) {
int i = 0;
while (i < 5 && i % 2 == 0){
System.out.println("HelloWorld" + i);
i ++;
}
}
}
A. 编译报错。
B. 运行结果为:死循环。
C. 运行结果为:HelloWorld0。
D. 运行结果为:HelloWorld0 HelloWorld2 HelloWorld4。
4. 仔细阅读以下程序代码,如果正确则写出程序打印输出的结果;不正确,解释原因。
public class Test{
public static void main(String[]args) {
int i = 1;
do {
int sum = 0;
sum += i;
i ++;
}while (i < 5);
System.out.println( "sum= " + sum);
}
}
答:原因:sum定义在do{}中,在do{}外面访问sum,报错。
5. 仔细阅读以下程序代码,如果正确则写出程序打印输出的结果;不正确,解释原因。
public class Test{
public static void main(String[]args) {
for (int i = 1; ; i ++){
if (i == 5){
break;
}
System.out.println("HelloWorld" + i);
}
}
}
答:正确:
打印结果为:
HelloWorld1
HelloWorld2
HelloWorld3
HelloWorld4
6. 编程:计算 1+2+3+…+100 的和。(要求至少两种循环结构实现)。
演示的代码如下:
public class Test{
public static void main(String[]args) {
int i = 1, sum =0;
while (i <= 100){
sum += i ;
i ++;
}
System.out.println("sum= " + sum);
}
}
第二种演示的代码如下:
public class Test{
public static void main(String[]args) {
int sum = 0;
for (int i = 1; i <= 100; i ++){
sum += i;
}
System.out.println("sum= " + sum);
}
}
- 编程:计算 1+3+5+…+99 的和。(要求至少两种循环结构实现) 。
演示的代码如下:
public class Test{
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("sum= " + sum);
}
}
第二种演示的代码如下:
public class Test{
public static void main(String[]args) {
int sum = 0,i =1;
while (i <= 100){
if (i % 2 != 0){
sum += i;
}
i ++;
}
System.out.println("sum= " + sum);
}
}
- 编程:读入一个小于 10 的整数 n,输出它的阶乘 n。(for 循环) .
演示的代码如下:
import java.util.Scanner;
public class Test{
public static void main(String[]args) {
System.out.println("请输入一个小于10的整数:");
Scanner s = new Scanner(System.in);
int n = s.nextInt();
double result = 1;
for (int i =1; i <= n ; i ++){
result *= i;
}
System.out.println(result);
}
}
- 编程:求 100 以内所有能被 3 整除但不能被 5 整除的数字的和。(for 循环) 。
演示的代码如下:
public class Test{
public static void main(String[]args) {
int result = 0;
for (int i = 0; i <=100; i++) {
if (i % 3 == 0 && i % 5 != 0){
result +=i;
}
}
System.out.println(result);
}
}
- 编程:本金 10000 元存入银行,年利率是千分之三,每过 1 年,将本金和利息相加作为新的 本金。计算 5 年后,获得的本金是多少打印输出。
演示的代码如下:
public class Test{
public static void main(String[]args) {
double result = 10000;
for(int i = 1; i <= 5;i ++){
result += (result * 0.003);
}
System.out.println(result);
}
}
- 编程:找出四位整数 abcd 中满足 (ab+cd)(ab+cd)=abcd 的数。
演示的代码如下:
public class Test{
public static void main(String[]args) {
for(int i = 1000;i <= 9999;i ++){
int ab = i / 100;
int cd = i % 100;
int x = (ab + cd) * (ab + cd);
if(x == i){
System.out.println(i);
}
}
}
}
12… 编程:求水仙花数。所谓水仙花数,是指一个三位数 abc,如果满足 a³+b³+c³=abc,则 abc 是水仙花数。
演示的代码如下:
public class Test{
public static void main(String[]args) {
for(int i = 100;i <= 999;i ++){
int a = i / 100;
int b = i / 10 % 10;
int c = i % 10;
int x = a * a * a + b * b * b + c * c * c;
if(x == i){
System.out.println(i);
}
}
}
}
- 编程:实现输出 99 乘法表。
演示的代码如下:
public class Test{
public static void main(String[]args) {
for(int i = 1; i <= 9;i ++){
for(int j = 1; j <= i;j ++){
System.out.print(j + "*" + i + "=" + j * i +"\t");
}
System.out.println();
}
}
}
- 编程:“百钱买百鸡”是我国古代的著名数学题。
题目描述:3 文钱可以买 1 只公鸡,2 文钱可以买一只母鸡,1 文钱可以买 3 只小鸡。
用 100 文钱买 100 只鸡,那么各有公鸡、母鸡、小鸡多少只?
演示的代码如下:
public class Test{
public static void main(String[]args) {
for(int x = 0; x <= 33; x ++){
int n = (100 - 3 * x) / 2;
for(int y = 0;y <= n; y ++){
int z = 100 - x - y;
if(z % 3 != 0){
continue;
}
if(3 * x + 2 * y + z / 3 == 100){
System.out.println(x + "只公鸡," + y + "只母鸡," + z +"只小鸡");
}
}
}
}
}
15.编程:输入一个整数 n,打印输出以下正方形:
思路:
(1) 读入一个整数 n,代表正方形的行数。
(2) 对于每一行需要打印的数字内容:
A. 控制每行数字 1 的个数。
B. 控制每行除 1 以外的数字内容。
C. 换行。
演示的代码如下:
import java.util.Scanner;
public class Test{
public static void main(String[]args) {
System.out.println("请输入一个正整数:");
Scanner s = new Scanner(System.in);
int n = s.nextInt();
for(int i = 1; i <= n; i ++){
for(int j = 1; j<= n - (i - 1); j ++){
System.out.print(j + "\t");
}
System.out.println();
}
}
}
- 编程:读入一个整数 n,输出如下图形:
思路:
(1) 读入的整数 n,就是外层循环的循环次数。
(2) 对于每一行,要做的事情:
A. 输出若干个空格 。
B. 输出若干个星。
C. 换行。
演示的代码如下:
import java.util.Scanner;
public class Test{
public static void main(String[]args) {
System.out.println("请输入一个正整数:");
Scanner s = new Scanner(System.in);
int n = s.nextInt();
for(int i = 1; i <= n; i ++){
for(int j = 1; j <= n - i; j++){
System.out.print(" ");
}
for(int j = 1; j <= 2 * i - 1; j ++){
System.out.print("*");
}
System.out.println();
}
}
}
总结如图所示: