Java中的循环语句
作者:韩茹
任务
1. 循环的功能
2. 循环的分类
3. for循环
4. while循环
5. do/while 循环
6. 多层循环嵌套
7. 特殊的流程控制
一、循环语句
循环语句有哪些功能?为什么要使用循环语句。
1.1 循环的作用
在循环条件满足的情况下,反复执行特定代码
1.2 为什么要使用循环
当我们要打印100次helloworld
或者我们想实现1-10的加和
1+2+3+4+5....
int sum = 0;
sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
sum = sum + 4;
sum = sum + 5;
可以发现有一些是相同的内容。这些相同的内容我们就可以采用循环的方式来实现
1.3 循环的分类
- for 循环
- while 循环
- do/while 循环
1.4 循环的组成部分
- 初始化部分:对循环变量赋初值
- 循环条件部分:判断循环变量是否超出某个界限
- 循环体部分:要循环执行的具体逻辑.
- 迭代部分:修改循环变量的值
二、while循环
while循环是比较简单的 一种循环语句。
2.1 语法格式:
while (boolean表达式) {语句块}
2.2 执行过程
先判断表达式的值。若=true.则执行其后面的语句,然后再次判断条件并反复执行,直到条件不成立为止
示例代码:
public class Demo29While {
public static void main(String[] args) {
/*
* while (boolean表达式) {语句块}
*
* 示例:
* while(活着){
* 心脏跳一下
* }
*/
//使用while循环,打印1-100的 数字
int i = 1;
while(i <= 100){
System.out.println(i);//1,2,3,4...100
i++;
}
System.out.println("i--->"+i);
}
}
运行结果:
2.3 练习题
课堂练习1:打印输出5次helloworld
// 初始化部分
int count = 0;
// 2循环条件
while(count<5){// 1 2 3
// 3 循环体
System.out.println("hello world");
count++;
}
课堂练习2:打印输出 1–10
int i =1;
while(i<=10){
System.out.println(i);
i++;
}
课堂练习3:打印10-1的数字
//1.打印10-1的数字
int i = 10;
while(i > 0){
System.out.println(i);//10,9,8,7...1
i--;
}
System.out.println("-----------------");
课堂练习4:求 100以内的 偶数的和
int z = 2;
while(z<=100){
System.out.println(z);
z+=2;
}
课堂练习5:求10 的阶乘
int sum = 1;
int j = 1;
while(j<=10){
sum=sum*j;
j++;
}
System.out.println("1-10的加和"+sum);
课堂练习6:打印1-100内,能够被3整除,但是不能被5真出的数字。统计个数。每行打印5个数。
int i = 1;
int count = 0;//计数器
while(i <= 100){
if(i % 3 == 0 && i % 5 != 0){
System.out.print(i+"\t");//\t一个制表符
count++;//5,10,15,20...
if(count % 5 == 0){
System.out.println();//换行
}
}
i++;
}
System.out.println();
System.out.println("count--->"+count);
三、do-while循环
3.1语法格式
do {语句块}while(表达式) ;
3.2 执行过程
先执行语句,再判表达式的值,若为true,再执行语句,否则结束循环
示例代码:
public class Demo30DoWhile {
public static void main(String[] args) {
/*
* do{
* 语句块;
*
* }while (boolean表达式);
*
*/
//使用do-while循环,打印1-10的 数字
int i = 1;
do{
System.out.println(i);
i++;
}while(i<=10);
System.out.println("i--->"+i);
}
}
运行结果:
3.3 练习题
课堂练习1:打印三次helloworld
// 1 初始化部分
int i = 0;
do{
// 2 循环体
System.out.println("Hello World!");
// 4 迭代部分
i++;
}while(i<3);// 3 循环条件
课堂练习2:用do/while实现打印100以内的奇数
int j = 1;
do{
/*if(j%2==1){
System.out.println(j);
}
j++;*/
System.out.println(j);
j+=2;
}while(j<100);
课堂练习3:100 以内 能够被3整除 但是不能被5整除的数 打印输出
int z = 3;
do{
if(z%3==0 && z%5!=0){
System.out.println(z);
}
z++;
}while(z<100);
课堂练习4:猜数游戏
import java.util.Scanner;
public class GuessNumber {
public static void main(String[] args) {
/*
* 猜数游戏:
* 1.程序中先产生一个随机数:[1,100] 55
*
* 2.用户键盘输入:30 80 50 70 60 55
*
* String类:字符串
* System类:系统类,
* System.out.println();
* Scanner类:键盘输入
* Math类:数学类
*
*
*/
//step1:系统产生随机数:
// double d = Math.random();//[0.0,1.0),包含0,但是不包含1。
// System.out.println(d);
// System.out.println((int)(d*100)+1);//[0,100)-->[1,100]
int ranNum = (int)(Math.random()*100+1);
System.out.println(ranNum);
//step2:循环,键盘输入,猜数
Scanner scan = new Scanner(System.in);
int n = 0;//玩家猜测的数字
int count = 0;//表示猜测的次数
do{
System.out.println("请输入猜测数字的大小[1,100]:"+"第"+(++count)+"猜测:");
n = scan.nextInt();
//判断猜测
if (n < ranNum) {
System.out.println("猜小了,下次大点。。。");
}else if(n > ranNum){
System.out.println("猜大了,下次小点。。");
}else{
// System.out.println("猜对了,哈哈哈哈哈哈哈。。。。");
// break;
}
}while(n != ranNum);
System.out.println("猜对了,哈哈哈哈哈哈哈。。。。");
System.out.println("随机数是:"+ranNum);
}
}
3.4 对比while和do-while
while 和 do/while 的区别:
while 先执行 循环条件 然后在执行 循环体
do/while 先执行 循环体 然后在执行 循环条件
当第一次 就不满足循环条件的情况下 while循环不能执行循环体, dowhile 可以执行一次
四、 for循环
4.1 语法格式
for (表达式1 [循环变量初始值设定]; 表达式2 [循环条件判断]; 表达式3 [改变循环变量的值]){
循环体
}
4.2 执行过程
首先计算表达式1,接着计算表达式2,若表达式2的值=true,则执行循环体,接着计算表达式3,再判断表达式2的值.依此重复下去,直到表达式2的值=false。
示例代码:
public class Demo31For {
public static void main(String[] args) {
/*
* for (表达式1 [循环变量初始值设定]; 表达式2 [循环条件判断]; 表达式3 [改变循环变量的值]){
循环体//4
}
先执行表达式1:只执行1次。习惯用于变量的初始化。
表达式2:作为循环的条件,必须是boolean类型:true,false
为true,执行循环体
再执行表达式3:跟在循环体之后执行的,习惯用于变量的变化。步长。
1-->2-->4-->3-->2-->4-->3-->2-->4-->3-->2...
*/
//1.打印10次helloworld
for ( int i = 1;i<=10 ; i++){
//循环体//4
System.out.println("Hello World..--->"+i);//i:1,2,3,4...10
}
System.out.println("over...");
// System.out.println(i);//11
}
}
运行结果:
4.3 练习题
课堂练习1:打印三次helloworld
for(int i = 0;i<3;i++){
System.out.println("Hello World!");
}
课堂练习2: 打印100以内 能被4整除不到能被7整除的数据,每行打印6个
int count = 0;
for(int i = 1; i<=100; i++){
if(i%4==0 && i%7!=0){
System.out.print(i+"\t");
count++;// 6
if(count%6==0){
System.out.print("\n");
}
}
}
课堂练习3: 行酒令
public class Loop {
public static void main(String[] args) {
/*
* 行酒令:逢7过
*
* 打印1-100内的数字:但是如果这个数字包含了7,或者是7的倍数,就不打印。
*
* 7的倍数:7,14,21,28,35.。。。
*
* 包含了7:17,27,37,47.。。70,71,72.。。。78,79,87,97
* 个位数字,十位数字,不能是7
*
* 个位数字:i % 10 --->个位数字
* 十位数字:i / 10 --->十位数字
*/
for (int i = 1; i <= 100; i++) {
// if (i % 7 == 0 || i % 10 == 7 || i / 10 == 7) {
// System.out.println("-------过");
// } else {
// System.out.println(i);
// }
if (i % 7 == 0 || i % 10 == 7 || i / 10 == 7) {
continue;
}
System.out.println(i);
}
}
}
4.4 for循环的特殊形式
1. 表达式2一般不可省略,否则为无限循环
for (i=1; ; i++) sum=sum+i;
// 相当于条件永真、永不为false
2. 表达式3亦可省略,但在循环体中须有语句修改循环变量;以使 表达式2在某一时刻为false而正常结束循环。
for (int sum=0,i=1 ;i<=100; ){
sum=sum+i;
i++;
}
3. 若同时省略表达式1**,**表达式3,则相当于while(表达式2)语句
for ( ; i<=100; ) {sum+=i; i++;}
4. 三个表达式均省略 即for(;;)语句,此时相当于while(true)语句.
示例代码:
public class Demo32For {
public static void main(String[] args) {
/*
* for循环
* 标准的写法for循环:
* for(表达式1;表达式2;表达式3){
* 循环体;
* }
*
* for循环还有特殊的写法:
* 1、表达式2如果省略:永真,死循环
* 循环条件默认是true。
*
* 2、表达式3如果省略:
* 本来是在循环体之后执行的,通常用于控制循环变量的变化。
*
* 3、表达式1如果省略:
*
* 4、表达式1,2,3全都省略不写
* for(;;){}
* while(true){}
*
* 5、for循环里,如果只有一行代码,{}也可以省略不写的。不建议。
*/
int i = 1;
for(; i <= 10;i++)
System.out.println(i);
System.out.println("helloworld");
// System.out.println("--->"+i);
}
}
4.5 几种循环的比较
1. 对于同一问题, 三种循环可相互替代
2. for循环功能强于while, do…while.但若不是明显地给出循环变量初终值(或修改条件),则可以用while 或do …while.以增强程序的结构化和可读性。
3. 要防止无限循环––死循环。
五、多循环嵌套
5.1 循环嵌套
多重循环就是循环中嵌套其他循环。
特点:外层循环执行一次,内层循环执行一遍。
示例代码:
public class Demo07Loop {
public static void main(String[] args) {
/*
* 多层循环嵌套:
*
* 外层循环i的值,每变化一次,里层j的循环,完整的执行1遍。
*/
for (int i = 1; i < 5; i++) {
for (int j = 1; j < 5; j++) {
System.out.println("i:" + i + ", j:" + j);
}
}
}
}
课堂画图:
5.2 练习题
课堂练习1:使用*号打印矩形。
// 外层循环控制行 内层循环 控制列
// *******
// *******
// *******
// *******
for (int j = 0;j<4 ; j++)
{
for(int i = 0; i< 7 ; i++){
System.out.print("*");
}
System.out.println();
}
课堂练习2:打印直角三角形
/*
找规律
* 1 1
** 2 2
***
****
***** 5 5
*/
for (int i = 1;i<=5 ;i++ )
{
// 1 2 3 4 5
for (int j = 1;j<=i ;j++ )
{
System.out.print("*");
}
System.out.println();
}
课堂练习3:输出九九乘法表
/*
* 九九乘法表
* 分析:
* 1*1=1
* 1*2=2 2*2=4
* 1*3=3 2*3=6 3*3=9
* 1*4=4 2*4=8 3*4=12 4*4=16
* 。。。
* 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 。。。9*9=81
*
* i*j
*
* 行: i j
* 1行 1 1
* 2行 2 1,2
* 3行 3 1,2,3
* 4行 4 1,2,3,4
* 5行 5 1,2,3,4,5
* 。。。
* 9行 9 1,2,3,4,5,6,7,8,9
*
*/
for(int i = 1;i<10;i++){//行
for(int j = 1;j<=i;j++){
System.out.print(j+"*"+i+"="+i*j+"\t");
}
System.out.println();//换行
}
课堂练习4:累乘2
/* 2 5
2 2*10的0次方
22 2*10的1次方 + 2
222 2*10的2次方 + 22
2222 2*10的3次方 + 222
22222
*/
// 求 10 的2次方
int num5 = (int)(Math.pow(10,4))*2;
// 固定的 10
// 几次方 上一次的结果
// 要求 把所有的 数据求和
int result = 0;
int sum = 0;
for (int i = 0;i<5 ;i++ )
{
int num = (int)(Math.pow(10,i))*2+result;
sum = sum+num;
System.out.println(num);
result = num;
}
System.out.println("加和是"+sum);
课堂练习4:输出等腰三角形
分析:此题只需打印上三角即可。
for (int i = 1;i<=5 ;i++ ){
//空格
for(int k=1;k<=5-i;k++){
System.out.print(" ");
}
// 1 2 3 4 5
for (int j = 1;j<=i*2-1 ;j++ ){
System.out.print("*");
}
System.out.println();
}
六、特殊流程控制语句
用于控制程序流程结构的两个语句,一个是break,另一个是continue。
6.1 break语句
**break:**语句用于终止某个语句块的执行
默认跳出离自己最近的循环
- 使用场合
- switch结构中:跳出(终止)switch语句
- 循环结构中:跳出(终止)循环
- 作用:退出switch和循环结构(如果有多重循环,默认跳出离自己最近的循环)。
示例代码:
public class Demo34BreakContinue {
public static void main(String[] args) {
/*
* 循环如何结束?
*
* 正常情况下,循环条件不成立,循环就自动结束了。
*
* break:词义“打破,破坏”
*
* 用法一:在switch-case语句中,用于结束switch语句
*
* 用法二:在循环语句中,一个循环中,一旦执行了break语句,那么该循环就彻底的结束了,无论循环条件是否满足。
*
* continue:词义"继续"
* 循环中,用于结束某一次循环,下次继续执行。
* "跳过"的意思
*
*/
for (int i = 1; i <= 10; i++) {
if(i == 5){
// break;//强制结束循环
continue;
}
System.out.println(i);
}
System.out.println("over...");
}
}
使用Lable标签实现跳出指定的循环。(了解)
out : for (int i = 1; i <3 ; i++ ){//定义一个标签out
for (int j = 1;j<3 ;j++ ){
if(j == 2){
break out;// 可以指定 跳出的循环
}
System.out.println(i+" "+j);
}
}
上机练习1:
打印1到10个数,遇到4的倍数程序自动退出
提示:如果i%4==0,则执行break命令
6.2 continue
**continue:**语句用于跳过某个循环语句块的一次执行,继续下一次执行
- 使用场合
- continue只能用在循环结构中
- 作用: 跳过本次循环,执行下一次循环(如果有多重循环,默认继续执行离自己最近的循环)。)
使用Label标签改变继续执行的循环
out: for (int i = 1;i<4 ;i++ ){
for (int j = 1;j<4 ;j++ ){
if(j==2){
continue out ;
}
System.out.println("i="+i + " j="+j);
}
}
System.out.println("Hello World!");
踩坑:while和dowhile中使用continue,要小心,不要写入死循环。
示例代码:
public class Demo35{
public static void main(String[] args) {
int i = 1;
/*
while(i <= 10){
if(i == 5){
continue;
}
System.out.println(i);
i++;
}
*/
do{
if(i == 5){
continue;
}
System.out.println(i);
i++;
}while(i<=10);
}
}