【天天Java系列】03_流程控制语句_for、while循环语句

文章目录

  • 1.for循环
    • 1.1 基本语法
    • 1.2 应用举例
    • 练习
  • 2.while循环
    • 2.1 基本语法
    • 2.2 应用举例
    • 练习
  • 3.do-while循环
    • 3.1 基本语法
    • 3.2 应用举例
  • 4 对比三种循环结构
  • 5.无限循环
    • 5.1 基本语法
    • 5.2 应用举例
    • 练习
  • 4.关键字break和continue的使用
    • 4.1 break和continue的说明
    • 4.2 应用举例
    • 经典案例
    • 练习
  • 5.Scanner:键盘输入功能的实现
    • 5.1 各种类型的数据输入

循环结构分类:

  • for循环
  • while循环
  • do-while循环

循环结构四要素

  1. 初始化部分
  2. 循环条件
  3. 循环体部分
  4. 迭代部分

1.for循环

1.1 基本语法

语法格式:

for(①初始化部分②循环条件部分④迭代部分){
	③循环体部分;
}

【天天Java系列】03_流程控制语句_for、while循环语句_第1张图片

说明:

  • for(;;)中的两个;不能多也不能少
  • ①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
  • ②循环条件部分为boolean类型表达式,当值为false时,退出循环
  • ④可以有多个变量更新,用逗号分隔

1.2 应用举例

案例1:使用for循环重复执行某些语句
题目:输出5行hello world

public class ForTest1{
	public static void main(String[] args){
		for(int i = 0;i <= 5;i++){
			System.out.println("hello world:");
		}
	}
}

案例2:格式多样式
题目:写出输出的结果

public class ForTest2{
	public static void main(String[] args){
		int num = 1;
		for(System.out.print("a");num < 3;System.out.print("c"),num++){
			System.out.print("b");
		}
	}
}

案例 3:累加的思想
题目:遍历 1-100 以内的偶数,并获取偶数的个数,获取所有的偶数的和

public class ForTest3{
	public static void main(String[] args){
		int count = 0;//记录偶数个数
		int sum = 0; //记录偶数的和
		for(int i = 1;i <= 100;i++){
			if (i % 2 == 0){
				System.out.println(i);
				count++;
				sum += i;
			}
		}
		System.out.println("偶数的个数为:" + count);
		System.out.println("偶数的总和为:" + sum);
	}
}
	 

案例 4:结合分支结构使用
题目:输出所有的水仙花数,所谓水仙花数是指一个 3 位数,其各个位上数字
立方和等于其本身。例如: 153 = 111 + 333 + 555

public class ForTest4{
	public static void main(String[] agrs){
		int count = 0;//记录个数
		for(int i = 100;i <= 999;i++){
			 int bai = i / 100;
			 int shi = (i % 10) / 10;
			 int ge = i % 10
			 if(bai * bai * bai + shi * shi * shi + ge * ge * ge = i){
			 	System.out.println(i + "为水仙花数");
			 	count++;
			 }
			 
		}
		System.out.println("水仙花数共有" + count + "个");
	}
}

案例 5:结合 break 的使用
说明:输入两个正整数 m 和 n,求其最大公约数和最小公倍数。
比如:12 和 20 的最大公约数是 4,最小公倍数是 60

public class ForTest5{
	public static void main(String[] agrs){
		int m = 12,n = 20;
		//求最大公约数
		int min = (m < n) ? m:n;//取出两个数中较小值
		for(int i = min;i >= 1;i--){
			if(m % i == 0 && n % i == 0){
				System.out.println("最大公约数是:" + i);
				break;
			}
		}
		//求最小公倍数
		int max = (m > n) ? m : n;
		for(int i = max;i <= m * n;i++){
			if(i % m == 0 && i % n == 0){
				System.out.println("最小公倍数" + i);
				break;
				}
		}
	}
}

说明:
1、我们可以在循环中使用 break。一旦执行 break,就跳出当前循环
结构。
2、小结:如何结束一个循环结构?
结束情况 1:循环结构中的循环条件部分返回 false
结束情况 2:循环结构中执行了 break。
3、如果一个循环结构不能结束,那就是一个死循环!我们开发中要避
免出现死循环。

练习

练习 1:打印 1~100 之间所有奇数的和

public class ForExer1{
	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);
		
	}
}

练习 2:打印 1~100 之间所有是 7 的倍数的整数的个数及总和(体会设置计数
器的思想)

public class ForExer2{
	public static void main(String[] agrs){	
		int count = 0;//记录个数
		int sum = 0;//记录总和
		for(int i = 1;i <= 100;i++){
			if(i % 7 == 0){
				count++;
				sum += i;
			}
		}
		System.out.println("7的倍数的整数个数为:" + count + "总和为:" + sum);
	}
}

练习 3:
编写程序从 1 循环到 150,并在每行打印一个值,另外在每个 3 的倍数行上打
印出“foo”,在每个 5 的倍数行上打印“biz”,在每个 7 的倍数行上打印输出“baz”

public class ForTest3{
	public static void main(String[] args){
		for(int i = 1;i <= 150;i++){
			System.out.print(i + "\t");
			if(i % 3 == 0)
				System.out.print("foo\t");
			if(i % 5 == 0)
				System.out.print("biz\t");
			if(i % 7 == 0)
				System.out.print("baz\t");
			
			System.out.println();
		}
	}
}
		

2.while循环

2.1 基本语法

语法格式:

①初始化部分
while(②循环条件部分){
	③循环体部分;
	④迭代部分;
}

【天天Java系列】03_流程控制语句_for、while循环语句_第2张图片

说明:

  • while(循环条件)中循环条件必须是boolean类型。
  • 注意不要忘记声明④迭代部分。否则,循环将不能结束,变成死循环
  • for循环和while循环可以相互转换。二者没有性能上的差别。实际开发中,根据具体结构的情况,选择哪个格式更合适、美观
  • for循环与while循环的区别:初始化条件的作用域不同

2.2 应用举例

案例 1:输出 5 行 HelloWorld!

public class WhileTest1{
	public static void main(String[] args){
		int i = 1;
		while(i <= 5){
			System.out.println("hello world");
			i++;
		}
		
}

案例 2:遍历 1-100 的偶数,并计算所有偶数的和、偶数的个数(累加的思
想)

class WhileTest2{
	public static void main(String[] agrs){
		int sum = 0;//总和
		int count = 0;//记录个数
		int i = 1;
		while(i <= 100){
			if(i % 2 == 0){
				sum += i;
				count++;
			}
			i++;
		}
		System.out.println("  1-100 的偶数,所有偶数的和: " + sum + "、偶数的个数:" + count)
	}
}
			

案例 3:猜数字游戏
随机生成一个 100 以内的数,猜这个随机数是多少?
从键盘输入数,如果大了,提示大了;如果小了,提示小了;如果对了,就不再猜
了,并统计一共猜了多少次。
提示:生成一个[a,b] 范围的随机数的方式:(int)(Math.random() * (b - a +

    • a)
public class GueessNumber{
	public static void main(String[] args){
		int random = (int)(Math.random() * 100) + 1;//获取随机数
		int count = 0; //记录猜的次数
		Scanner scan = new Scanner(System.in);
		int guess = scan.nextInt();
		boolean flag = true;
		while(guess != random){
			if(guess > random){
				System.out.println("大了");
			}
			if(guess < random){
				System.out.println("小了");
			}
			System.out.println("请输入一个整数(1-100):");
			guess = scan.nextInt();
			count++;
		}
		System.out.println("猜中了");
		System.out.println("一共猜了" + count + "次");
	}
}
			
		

案例 4:折纸珠穆朗玛峰
世界最高山峰是珠穆朗玛峰,它的高度是 8848.86 米,假如我有一张足够大的纸,它
的厚度是 0.1 毫米。
请问,我折叠多少次,可以折成珠穆朗玛峰的高度?

public class ZFTest{
	public static void main(String[] args){
			//定义一个计算器,初始值为0;
		int count = 0;
		int zf = 8848860;
		double paper = 0.1;
		while(paper < zf){
			count++;
			paper *= 2;
		}
		System.out.println("需要折叠:" + count + "次");
		System.out.println("折纸的高度为:" + paper / 1000 + "米,超过珠峰的高度");
	}
		
}

练习

练习:从键盘输入整数,输入 0 结束,统计输入的正数、负数的个数

public class Test05While{
	 public static void main(String[] args){

        Scanner scan = new Scanner(System.in);
        int positive= 0; // 统计整数
        int negative = 0; //统计负数
        System.out.println("请输入整数:");
        int num = scan.nextInt();
        while(num != 0){
            if(num > 0){
                positive++;
            }else if(num < 0){
                negative++;
            }
            System.out.println("请输入整数:");
            num = scan.nextInt();
        }
        System.out.println("正数个数为:" + count1);
        System.out.println("负数个数为:" + count2);
		scan.close();
    }
}

3.do-while循环

3.1 基本语法

语法格式:

①初始化部分;
do{
	③循环体部分;
	④迭代部分;
	
}while(②循环条件部分);

【天天Java系列】03_流程控制语句_for、while循环语句_第3张图片
说明:

  • 结尾while(循环条件)中循环条件必须是boolean类型
  • do{}while();最后有一个分号
  • do-while结构的循环体语句是至少执行一次,这个和for和while是不一样的
  • 循环的三个结构for、while、do-while三者是可以相互转换的

3.2 应用举例

案例 3:ATM 取款
声明变量 balance 并初始化为 0,用以表示银行账户的余额,下面通过 ATM 机程序实
现存款,取款等功能。
=ATM
1、存款
2、取款
3、显示余额
4、退出
请选择(1-4):

public class ATM{
	public static void main(Stirng[] args){
		
		int balance = 0; //余额
		Scanner scan = new Scanner(System.in);
		boolean isFlag = true;
		do{
			System.out.println("=========ATM========");
			System.out.println(" 1、存款");
			System.out.println(" 2、取款");
			System.out.println("3、显示余额");
			System.out.println(" 4、退出");
			System.out.print(" 请选择(1-4):  ");
			int selection = scan.nextInt();

			switch(selection){
			case 1:
				System.out.print("请输入存款金额:");
				int addMoney = scan.nextInt();
				if(addMoney > 0){
					balance += addMoney;
				}
				break;
			case 2:
				System.out.print("请输入取款的额度:");
				int minusMoney = scan.nextInt();
				if(minusMoney > 0 && balance >= minusMoney){
					balance -= minsMoney;
				}else{
					System.out.println("您的输入数据有误或余额不足");
				}
				break;
			case 3:
				System.out.println("当前余额为: " + balance);
				break;
			case 4:
				System.out.println("欢迎下次进入系统");
				isFlag = false;
				break;
			}
		}while(isFlag);
		scan.close();
				
		}
				
		}while(isFlag);
		




}

4 对比三种循环结构

三种循环结构都具有四个要素:

  • 循环变量的初始化条件
  • 循环条件
  • 循环体语句块
  • 循环变量的修改的迭代表达式

从循环次数角度分析

  • do-while循环至少执行一次循环体语句
  • for和while循环先判断循环条件语句是否成立,然后决定是否执行循环

如何选择

  • 遍历有明显的循环次数的需求,选择for循环
  • 遍历没有明显的循环次数的需求,选择while循环
  • 如果循环体语句块至少执行一次,可以考虑使用do-while循环
  • 本质上:三种循环之间完全可以互相转换,都能实现循环的功能

5.无限循环

5.1 基本语法

语法格式:

  • 最简单无限循环格式:while(true),for(;

使用场景:

  • 开发中,有时并不确定要循环多少次,需要根据循环体内部某些条件,来控制循环的结束(使用break)
  • 如果此循环结构不能终止,则构成了死循环,开发中要避免出现死循环

5.2 应用举例

案例1:

public class EndlessFor1 {
 public static void main(String[] args) {
 for (;;){
 System.out.println("我爱你!");
 }
// System.out.println("end");//永远无法到达的语句,编译报错
 } }
public class EndlessFor2 {
 public static void main(String[] args) {
 for (; true;){ //条件永远成立,死循环
 System.out.println("我爱你!");
 }
 } }
public class EndlessFor3 {
 public static void main(String[] args) {
 for (int i=1; i<=10; ){ //循环变量没有修改,条件永远成立,死循环
 System.out.println("我爱你!");
 }
 } }```
 案例 2:从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输
入为 0 时结束程序

```java
import java.util.Scanner;
class PositiveNegative {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
 
int positiveNumber = 0;//统计正数的个数
int negativeNumber = 0;//统计负数的个数
for(;;){ //while(true){
System.out.println("请输入一个整数:(输入为 0 时结束程序)");
int num = scanner.nextInt();
if(num > 0){
positiveNumber++;
 }else if(num < 0){
negativeNumber++;
 }else{
 System.out.println("程序结束");
break;
 }
 }
System.out.println("正数的个数为:"+ positiveNumber);
System.out.println("负数的个数为:"+ negativeNumber); 
 
 scanner.close();
} }```

#  6 嵌套循环(或多重循环)
## 6.1 使用说明
**所谓嵌套循环:**
是指一个循环结构 A 的循环体是另一个循环结构 B。比如,for 循环里面
还有一个 for 循环,就是嵌套循环。其中,for ,while ,do-while 均可以作为外层循环或内
层循环。
– 外层循环:循环结构 A
– 内层循环:循环结构 B
  
实质上,嵌套循环就是把内层循环当成外层循环的循环体。只有当内层循环的循环条
件为 false 时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的外层
循环。
设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次。
技巧:从二维图形的角度看,外层循环控制行数,内层循环控制列数。
开发经验:实际开发中,我们最多见到的嵌套循环是两层。一般不会出现超过三层的嵌
套循环。如果将要出现,一定要停下来重新梳理业务逻辑,重新思考算法的实现,控制
在三层以内。否则,可读性会很差。
例如:两个 for 嵌套循环格式
for(初始化语句①; 循环条件语句②; 迭代语句⑦) {
 for(初始化语句③; 循环条件语句④; 迭代语句⑥) {
 循环体语句⑤;
 } }
//执行过程:① - ② - ③ - ④ - ⑤ - ⑥ - ④ - ⑤ - ⑥ - ... - ④ - ⑦ - ② - ③ - ④ 
---..
执行特点:外层循环执行一次,内层循环执行一轮
## 6.2 应用举例
案例 1:打印 56*

```java
class ForForTest1{
	public static void main(Stirng[] agrs){
		for(int i = 1;i <= 5;i++){
			for(int j = 1; j <= 6;j++){
				System.out.print("*");
			}
			System.out.println();
		}
	}
		 
				
}

案例 2:打印 5 行直角三角形
*
**




public class ForForTest2{
	public static void main(String[] args){
		for(int i = 1;i <= 5;i++){
			for(int j = 1; j <= i;j++){
				System.out.print("*");
			}
			System.out.println();
		}
	}
}

案例 3:打印 5 行倒直角三角形




**
*

public class ForForTest2{
	public static void main(String[] args){
		for(int i = 1;i <= 5;i++){
			for(int j = 5; j >= i;j--){
				System.out.print("*");
			}
			System.out.println();
		}
	}
}

案例 5:九九乘法表

public class ForForTest5{
	public static void main(String[] args){
		for(int i = 1;i <= 9;i++){
			for(int j = 1; j <= i;j++){
				System.out.print(i + "*" + j + "= " + (i * j) + "\t");
		}
		System.out.println();
	}
}

l

练习

练习 1:将一天中的时间打印到控制台

public class ForForDemo{
 public static void main(String[] args){

        for(int hour = 0;hour < 24;hour++){
            for(int min = 0;min < 60;min++){
                System.out.println(hour + "时" + min + "分");
            }
        }
    }
}

4.关键字break和continue的使用

4.1 break和continue的说明

break

  • 使用范围:switch、循环结构
  • 在循环结构中使用的作用:一旦执行,就结束当前循环结构
  • 相同点:此关键字后面,不能声明语句

continue

  • 适用范围:循环结构
  • 在循环结构中的作用:一旦执行,就结束当次循环结构
  • 相同点:此关键字后面,不能声明语句

4.2 应用举例

class BreakContinueTest1{
	public static void main(String[] args){
		for(int i = 1;i <= 10;i++){
			if(i % 4 == 0){
				break;//123
				continue;//1235678910
				//如下的语句不可能被执行,编译不通过
				System.out.println("hello world");
			}
		}
		for(int i = 1;i <= 4;i++){
			for(int j = 1;j <= 10;j++){
				if(j % 4 == 0){
					break;//结束的是包裹break的最近一层循环
					continue;//结束的是continue关键字的最近的一层循环的当次
				}
			}
		}
	}
}

经典案例

题目:找出 100 以内所有的素数(质数)?100000 以内的呢?
目的:不同的代码的实现方式,可以效率差别很大。
实现方式1:

public PrimeNumberTest{
	public static void main(String[] args){
		
		long start = System.currentTimeMillis();//记录当前时间距离1970-1-1 00:00:00的毫秒数
		int count = 0;//记录质数的个数
		
		
		for(int i = 2;i <= 100000;i++){
			boolean isFlag = true; //用于标识i是否除尽过
			for(int j = 2;j < i;j++){
				if(i % j == 0){//表明i有约数
					isFlag = false;
					break;
				}
			}
			if(isFlag){//如果isFlag变量没有给修改过值,就意味着i没有被j除尽过。则i是一个质数
				System.out.println(i);
				count++;
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("质数的个数为:" + count);
		System.out.println("执行此程序花费的毫秒数:" + (end -start));
		
	}
}
		
}

练习

练习 1:
生成 1-100 之间的随机数,直到生成了 97 这个数,看看一共用了几次?
提示:使用 (int)(Math.random() * 100) + 1

public class NumberGuessTest{
	public static void main(String[] args){
		int count = 0;//记录次数
		
		while(true){
			
			int random = (int)(Math.random() * 100) + 1;
			count++;
			if(random == 97){
				break;
			}
		}
		System.out.println("一共用了" + count + "次");
	}
}

5.Scanner:键盘输入功能的实现

键盘输入代码的四个步骤:

  1. 导包:import.java.util.Scanner;
  2. 创建Scanner类型的对象:Scanner scan = new Scanner(System.in);
  3. 调用Scanner类的相关方法(next() / nextXxx()),来获取指定的类型变量
  4. 释放资源:scan.close();

注意:
需要根据相应的方法,来输入指定类型的值。如果输入的数据类型与要求的类型不匹配时,会报异常,程序终止

5.1 各种类型的数据输入

案例:小明注册某交友网站,要求录入个人相关信息。如下:
请输入你的网名、你的年龄、你的体重、你是否单身、你的性别等情况。

//① 导包
import java.util.Scanner;
public class ScannerTest1{
	public static void main(String[] args){
		//②创建Scanner对象
		//Scanner是一个引用数据类型,全称名是java.util.Scanner
		//scan就是一个引用数据类型的变量了,赋给它的值是一个对象
		//new Scanner(System.in)是一个new表达式,该表达式的结果是一个对象
		//引用数据类型 变量 = 对象;
		//这个等式的意思可以理解为用一个引用数据类型的变量代表一个对象,所以这个变量的名称又称为对象名
		Scanner scan = new Scanner(System.in);
		System.out.print("请输入你的网名:");
		 String name = scanner.next();
		 System.out.print("请输入你的年龄:");
		 int age = scanner.nextInt();
		 System.out.print("请输入你的体重:");
		 double weight = scanner.nextDouble();
		 System.out.print("你是否单身(true/false):");
		 boolean isSingle = scanner.nextBoolean();
		 System.out.print("请输入你的性别:");
		 char gender = scanner.next().charAt(0);//先按照字符串接收,然后
		再取字符串的第一个字符(下标为 0System.out.println("你的基本情况如下:");
		 System.out.println("网名:" + name + "\n 年龄:" + age + "\n 体
		重:" + weight +
		 "\n 单身:" + isSingle + "\n 性别:" + gende
		r);
		 
		 //④ 关闭资源
		 scanner.close();
 } }
		

你可能感兴趣的:(Java,java,开发语言,算法)