循环语句概述
反复执行的代码片段,本质就对重复代码的一种简化解决方案。
循环语句四要素
1.初始化语句
2.循环条件语句
3.循环体语句
4.控制条件语句
循环分类
1.while循环语句
格式:
1.初始化语句;
while(2.循环条件语句) {
3.循环体语句;
4.控制条件语句
}2.for循环语句
格式:
for(1.初始化语句; 2.循环条件语句; 4.控制条件语句) {
3.循环体语句;
}3.do-while循环
格式:
1.初始化语句;
do {
3.循环体语句;
4.控制条件语句
} while(2.循环条件语句);
4.嵌套循环语句: 前三者语句结合使用
for循环
格式
for(1.初始化语句; 2.循环条件语句; 4.控制条件语句) {
3.循环体语句;
}
执行流程
执行步骤
1.首先执行初始化语句
2.执行循环条件语句,判断条件是否成立
成立
执行循环体语句
执行控制条件语句
回到第二步
不成立
退出循环体
执行流程图
for循环语句特点
1.初始化语句在整个循环过程中只能够执行一次
2.循环变量只能够在循环体内有效,循环体外无法访问
3.表达式一可以省略,也可以放在循环体的外面,作用于全局
4.表达式二也可以省略,表示死循环
5.表达式三也可以省略,表示死循环
6.表达式一二三都可以省略,分号不能省略,这种写法就是标准的for循环死循环格式
7.表达式一可以定义多个循环变量,表达式三也可以是多个控制条件语句
8.表达式二必须是boolean类型的结果,所以可以用多个逻辑运算符连接而成的表达式
for循环语句应用
循环的解题思路:
遵循一个本质: 循环的本质就是用来解决重复性问题,如果代码出现了重复就用循环改进
思路:
1.怎么想的就怎么写,如果代码出现了重复,用循环改进
2.确定循环的次数
(1)如果可以确定选择for循环
(2)如果不能够确定选择while循环或者do-while循环
①如果循环条件是先执行选择while循环
②如果循环体先执行就选择do-while循环
3.找相同,找不同
(1)找相同
相同的话就将重复的代码直接扔入到循环体中
(2)找不同
结合循环变量: 找出数列变化情况和循环变量的规律
结合自定义变量: 如果数列和循环变量找不到关系,你需要自己定义变量来找关系
for循环经典习题解析
控制台输出数据1-10
public class LoopDemo02 {
public static void main(String[] args) {
System.out.println("hello: " + 1);
System.out.println("hello: " + 2);
System.out.println("hello: " + 3);
System.out.println("hello: " + 4);
System.out.println("hello: " + 5);
System.out.println("hello: " + 6);
System.out.println("hello: " + 7);
System.out.println("hello: " + 8);
System.out.println("hello: " + 9);
System.out.println("hello: " + 10);
/*
* i = 1 1
* i = 2 2
* i i
* 数列和循环变量的规律是一致
*/
for(int i = 1; i <= 10; i++) {
System.out.println("hello: " + i);
}
}
}
求n的阶乘 5 * 4 * 3 * 2 * 1
/*
* 求n的阶乘 5 * 4 * 3..*1
*
* 1 * 2 * 3 * 4 * 5;
*
* 1 * 1 = 1
* 1 * 2 = 2
* 2 * 3 = 6
* 6 * 4 = 24
* 24 * 5 = 120
* 第 i次 i
*/
public class LoopDemo05 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入阶乘数: ");
int n = input.nextInt();
long jc = 1;
for (int i = 1; i <= n; i++) {
jc = jc * i;
/*
* jc = 1 * 1 = 1
* jc = 1 * 2 = 2
* jc = 2 * 3 = 6
*/
}
System.out.println(n + "的阶乘是: " + jc);
}
}
在控制台输出所有5位的回文数
/*
* 在控制台输出所有5位的回文数
* 注:回文数如12321,13531等等 11111
* 回文数: 正着念和反着念是同一个数
*
* 思路:
* 1.遍历10000~99999之间的每一个数
* 2.获取到每一个数,分离个位,十位,千位,万位
* 3.判断个位 == 万位的同时千位 == 十位条件是否成立 【单if】
* 成立
* 输出这个数
* 不成立
* 不处理
* 细节: 循环遍历每一个数
*/
public class LoopDemo07 {
public static void main(String[] args) {
for (int i = 10000; i <= 99999; i++) {
int ge = i / 1 % 10;
int shi = i / 10 % 10;
int qian = i / 1000 % 10;
int wan = i / 10000 % 10;
if (ge == wan && shi == qian)
System.out.println(i);
}
}
}
while循环
引入
需求: 一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)?
针对这个需求,我们不知道循环的次数,我们可以考虑使用while循环
格式
1.初始化语句;
while(2.循环条件语句) {
3.循环体语句;
4.控制条件语句
执行流程图
while循环经典习题解析
一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)?
public class LoopDemo01 {
public static void main(String[] args) {
// 定义变量保存折纸的厚度
double h = 0.08;
// 定义变量保存折纸的次数
int count = 0;
// 怎么想的就怎么写,如果代码出现了重复,用循环改进
// 第一次对折
// h *= 2;
// count ++;
// 第二次对折
// h *= 2;
// count ++;
// ....
while (h < 8848130) {
h *= 2;
count ++;
}
System.out.println("对折的次数: " + count);
}
}
do-while循环
引入
需求: 驾照科目二考试,考试结束后根据成绩选择是否继续补考
这里是先执行一次考试,再判断成绩是否通过,所以可以考虑使用do-while循环
格式
1.初始化语句;
do {
3.循环体语句;
4.控制条件语句
} while(2.循环条件语句);
执行流程图
do-while循环经典习题解析
驾照科目二考试,考试结束后根据成绩确定是否继续补考`
public class DoWhileDemo01 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double score = 0.0;
do {
System.out.println("正在科目二考试中,请稍后...");
// 线程休眠 此段代码暂时不用去学习
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("从考场开心地出来了");
System.out.print("请输入考试成绩...");
score = input.nextDouble();
} while(score < 80);
System.out.println("考试通过,准备考科目三!!!");
}
}
三种循环的区别和应用场景
区别
for循环和(while循环、do-while循环)的区别?
1.for循环针对循环次数确定的情况,while循环、do-while循环针对次数不确定的情况 【重点】
2.for的循环变量只在循环体内有效,while循环、do-while循环在全局有效,其实for循环也可以将初始化语句放入到循环体外,作用于全局。
3.while循环能够实现的,for循环一定可以实现,但是反之不成立,在循环次数不确定的情况下,while循环的可读性更强
4.while循环和do-while循环的区别?
while循环是先判断循环条件是否成立,再执行循环体
do-while循环是先执行一次循环体语句,再判断循环条件是否成立
5.do-while循环能够使用for循环改进? – 不可以,因为for循环必须要先判断
应用场景
其实就是通过确定循环次数以及循环体是先否执行一次来选择哪一种格式的循环语句
1.如果可以确定选择for循环
2. 如果不能够确定选择while循环或者do-while循环
①如果循环条件是先执行选择while循环
②如果循环体先执行就选择do-while循环
嵌套循环
引入
需求: 请在控制台输入如下图形【要求一次性只能够输出一颗*】
*******
*******
*******
这里我们需要使用到嵌套for循环
概述
本质就是前三种循环格式的互相嵌套
格式
没有固定格式
执行流程图
嵌套循环特点
1.外层循环执行一次,内层循环执行一轮
2.外层循环控制行数,内层循环控制列数 【双重循环】
3.循环一共执行的次数 = 外层循环的次数 * 所有内层循环的次数。
4.解决嵌套循环的主要思路就是一层一层分解来解决问题, 一旦进入内层循环,不要考虑外层
嵌套循环经典习题解析
** 打印如下图案 直角三角形**
*
*** 提示:
***** 外层循环控制行数
******* 内层循环控制每行的*号数
*********
/*
* 1、打印如下图案 直角三角形
*
*** 提示:
***** 外层循环控制行数
******* 内层循环控制每行的*号数
*********
i = 1 1个*
i = 2 3个*
i = 3 5个*
i = 4 7个*
i = 5 9个*
i 打印
等差数列
an: 第i项的值 ai
a1: 表示第一项 1
n: 项数 i
d: 公差 2
ai = 1 + (i - 1) x 2 = 1 + (2i - 2) = 2*i - 1
*/
public class DoubleLoopDemo02 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 2 * i - 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
打印九九乘法表。
/*
*打印九九乘法表
* i = 1 1个表达式
* i = 2 2个表达式
* i = 3 3个表达式
* i i个表达式
*
* 表达式等号左边第一个因子是从1递增到i
* 表达式等号左边第二个因子就是i
* 表达式等号右边的结果就是 乘积
*/
public class DoubleLoopDemo05 {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "x" + i + "=" + (i*j) + "\t");
}
System.out.println();
}
}
}
输入一个大写字母,如F
比如:
输入:F
输出:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
ABCDEFEDCBA
/*
* 输入一个大写字母,如F
比如:
输入:F
输出:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
ABCDEFEDCBA
i = 0 65+0
i = 1 65 65+1 65
i = 2 65 65+1 65+2 65+1 65
i = 3 65 65+1 65+2 65+3 65+2 65+1 65
外层循环控制行数
内层循环分为两个并列for循环
一个循环打印 65~65+i,另外一个循环打印 65+i-1 ~ 65
65 打印 1 行
66 打印 2 行
n 打印 c - 65
*/
public class DoubleLoopDemo07 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("输入一个大写字母在ASCII码表上对应的数值: ");
int num = input.nextInt();
char ch = (char) num;
// 外层循环控制行数
for (int i = 0; i <= ch - 65; i++) {
// 一个循环打印 65~65+i
for (int j = 65; j <= 65 + i; j++) {
System.out.print((char)j);
}
// 另外一个循环打印 65+i-1 ~ 65
for (int k = 65 + i - 1; k >= 65; k--) {
System.out.print((char)k);
}
// 换行
System.out.println();
}
input.close();
}
}
break关键字
引入
假设小明去操场跑步,一共要跑10圈,跑到第6圈跑不动了不想跑了怎么办?
可以考虑使用break关键字退出循环
应用场景
表示退出循环或者switch语句体
由于循环有多层循环,所以如果需要退出多层循环,可以使用break 标签名
示例代码
public class BreakDemo01 {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println("正在跑第" + i + "圈");
if (i == 6) {
break;
}
}
}
}
break 标签名 退出多层循环或者switch语句
public class BreakDemo01 {
public static void main(String[] args) {
outLoop: for (int i = 0; i < 3; i++) {
innerLoop: for (int j = 0; j < 7; j++) {
if (j == 3) {
break outLoop;
}
System.out.print("*");
}
System.out.println();
}
outSwitch: switch (10) {
case 10:
outLoop: for (int i = 0; i < 3; i++) {
innerLoop: for (int j = 0; j < 7; j++) {
if (j == 3) {
break outSwitch;
}
System.out.print("*");
}
System.out.println("outLoop");
}
System.out.println("outSwitch");
break;
default:
break;
}
System.out.println("哈哈,完了");
}
}
break关键字经典习题解析。
打印1到10个数,遇到4的倍数程序自动退出。
/*
* 打印1到10个数,遇到4的倍数程序自动退出。
*/
public class BreakDemo02 {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
if (i % 4 == 0) {
break;
}
System.out.println(i);
}
}
}
循环录入学生成绩,求和,如果输入的成绩为负数,则停止输入,给出错误提示。
/*
* 循环录入学生成绩,求和,如果输入的成绩为负数,则停止输入,给出错误提示。
*/
public class BreakDemo03 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int sum = 0;
// 死循环格式写法
while (true) {
System.out.print("请输入您的成绩: ");
double score = input.nextDouble();
if (score < 0) {
System.out.println("输入有误!!!");
break;
}
sum += score;
}
System.out.println("总成绩为: " + sum);
input.close();
}
}
continue关键字
引入
小明在学校学习,一共有四个级别,由于小明天资聪慧,所以就想跳过第一级从第二级别开始学怎么办呢?
这里小明并不是希望退出学习,而是希望跳过第一级可以考虑使用continue关键字
应用场景
只能够作用于循环体中,可以通过continue 标签名 来跳出指定的循环体,如果不指定默认表示跳出当层循环体,继续执行下一次循环
public class ContinueDemo01 {
public static void main(String[] args) {
for (int i = 1; i <= 4; i++) {
if (i == 1) {
continue;
}
System.out.println("正在学习第" + i +"级!!!");
}
System.out.println("学完了");
outLoop: for (int i = 0; i < 3; i++) {
innerLoop: for (int j = 0; j < 7; j++) {
if (j == 3) {
continue outLoop;
}
System.out.print("*");
}
System.out.println();
}
System.out.println("over");
}
}
continue关键字经典习题解析
循环录入Java课的5个学生的成绩,统计分数大于等于80分的学生比例
package com.sxt.looppractice;
import java.util.Scanner;
// 1.计算 n+(n-1)+(n-2)+....+3+2+1的值
public class Practice01 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入n的值: ");
int n = input.nextInt();
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
System.out.println(sum);
}
}
End~