Java知识总结-for循环


在流程控制语句(条件语句和循环语句)中,对我造成最多困扰和模糊的就是for循环的多层嵌套,本篇文章通过实例分析嵌套式for循环。增强自己对for循环的理解。

一,for语句概述

for语句的功能是为了重复执行某些语句,直到某个条件得到满足。

for语句格式如下:

for(表达式1;表达式2;表达式3)

{

循环体语句块……

}

表达式1:初始化表达式,一般用来完成变量的初始化;

表达式2:循环条件表达式,结果为boolean型,用于判断是否要继续执行语句块;

表达式3:执行完循环语句块后操作的表达式。

*注意1:以上三个表达式和语句块都可以为空。由此可得最简单的for语句:

for(;;){}

该语句是一个无线循环语句。

当表达式2为空时,其值默认为true,表示可以继续执行循环语句。

*注意2:在循环体语句块内创建的变量,作用范围只在循环体内,也不能作用于表达式1、2、3.

例如:

for (;a<10 ;a++ ) {
<span style="white-space: pre;">	</span>int a=0;
}
是错误的,因为在语句块中创建的变量a无法作用到表达式中。

同时,每次循环的时候,a都会被重新创建一次,所以每次循环中a不存在互相联系;

如:

for (int i=0;i<5 ; i++) {
	int x=0;
	System.out.println(x++);
}
输出结果为:

0
0
0
0
0

*注意3:表达式1内初始化的变量可以作用于循环体语句内,但是不能作用于for语句外。

for语句执行顺序:

1)在执行for循环时,首先执行表达式1,完成变量初始化;

2)下一步,判断表达式2的值,若为true,则进入循环体,否则跳出循环;

3)在执行完循环体后,接着执行表达式3,此时一轮循环结束;

4)第二轮循环从表达式2开始,重复2)3)的过程;

二,for举例

下面通过例子实现for循环的基本应用

2.1需求:按顺序打印0-9:

思路:由于需要打印的数是从零开始,所以在表达式1中初始化变量时,可以将变量值i定位0,int i=0;

           要打印的最大数为9,所以表达式2的条件语句可以为 i<10,或者i<=9;

           因为徐打印数i在递增,所以表达式3可以写作i++;

代码如下:

for (int i=0;i<10 ; i++) {
	System.out.println(i);
}
结果:

0
1
2
3
4
5
6
7
8
9
2.2需求:打印100至200之间所有能被11整除的数:

思路:首先由于被循环数从100开始,所以表达式1的初始化变量可以定义为int 1=100;

            因为循环至200结束,所以表达式2可以写成i<201,或者i<=200;

            因为被遍历数是随着循环次数在递增,所以很明显表达式3为i++;

            通过以上3个表达式我们可以对100至200的数进行遍历,在遍历的同时,根据需求,要对每一个被遍历的数进行判断是否能被11整除,这里就需要用到if语句了;

下面是代码实现:

for (int i=100;i<201 ; i++) {
	if(i%11==0)
	System.out.println(i);
}
输出结果:

110
121
132
143
154
165
176
187
198
顺便说一句,计算机确实可以提高很大的效率,要是手动计算100到200之间能被11整除的数,确实挺复杂的。

2.3需求:求1至100之间所有奇数的和

思路:首先对1至100之间的奇数进行遍历,这里可以通过对1-100之间的数进行逐一遍历的同时进行判断是否为奇数。也可以同过将初始化变量的值定为1,每次循环将变量的值加2,以实现每次被遍历的数都是奇数。

           再遍历奇数的同时,对获得的奇数进行累加操作。

代码如下:

int num=0;
for (int i=1;i<100 ; i+=2) {
	num=num+i;	
}
System.out.println(num);
结果为:

2500
三,for循环嵌套

当循环

for(表达式1;表达式2;表达式3)

{

循环体语句块……

}

中的循环体语句块被执行一次时需要对某些代码进行重复执行时,这就涉及到多重循环的嵌套。

for循环嵌套由于涉及到多层循环结构,并且个循环结构间经常存在互相影响,所以容易造成逻辑混乱。

正确处理多层for循环问题的核心在于分辨每层循环的功能和作用范围,其次是控制每层循环的判断条件。

举例;

3.1需求:用嵌套for循环打印

******

******

******

******

思路:上面的图形中,涉及到两个重复的操作,1循环:将同一行的内容重复打印多次。2循环:在每一行内对*进行重复打印;

            所以需要通过两个for循环对他们分别进行循环,1循环行的整体内容,循环的控制条件为行数;

           2循环每一行内的*,循环的控制条件是每一行*的个数,也就是该行的列数。

           而且由于1循环的行是由2循环的*组成的,所以2循环的结果是1循环的一部分,由此,我们可以确定1循环为外循环,2循环为内循环.

下面为代码实现:

for(int x=0;x<4;x++){                          //外循环控制行数
	for(int y=0;y<6;y++){                  //内循环控制列数
		System.out.print('*');
	}
	System.out.println();                  //换行
}

3.2需求:打印

*****
****
***
**
*

思路:同样根据3.1我们知道外循环控制行数,内循环控制列数,

           与3.1不同的是:3.1中行数与列数不互相影响,而本题中列数会随着行数的增加而减少;

           这说明控制行数的变量同样对列数有影响。

下面我们通过代码实现;

for(int x=0;x<5;x++){                         //外循环控制行数,
	for(int y=5-x;y>0;y--){        //内循环控制列数,同时列数收到行数的影响,随着行数增加而减少
		System.out.print('*');
	}
	System.out.println();                 //换行
}

3.3需求:打印下图

   *
  ***
 *****
*******
 *****
  ***
   *

思路:与3.2不同的是本题的列数受到多个因素控制,第一:每行的*个数;第二:每行*的初始位置,即每行开头的空格数量。第三:前面两个变量都同时收到行数的影响。

           根据归纳发现:当行数小于等于4时,随着行数增加,*个数增加,空格数在减少;

          当行数大于4的时候,随着行数增加,*个数减少,空格数增加。

          根据这个规律,可以将内循环通过if语句分为两种情况,并分别进行列数的控制

代码实现:

for(int x=0;x<7;x++){                                 //外循环控制行数
	if(x<=3){                                     //当行数为前4行
		for(int i=3-x;i>0;i--){               //空格数随着行数增加而减少
			System.out.print(" "); 
		} 
		for(int y=0;y<2*x+1;y++){             //*个数随着行数增加而增加
			System.out.print('*');
		}
	}
	else{                                         //当行数超出4行
		for(int i=x-3;i>0;i--){               //空格数随着行数增加而增加
			System.out.print(" ");
		}
		for(int y=0;y<2*(7-x)-1;y++){         //*个数随着行数增加的减少
			System.out.print('*');
		}
	}
	System.out.println();                         //换行
}


四,
最后,补充几个流程控制语句中易犯的问题

1.

if(条件表达式){
代码块……
}else if(条件表达式){
代码块……
}else if(条件表达式){
代码块……
}else{
代码块……
}
在如上格式的if…else if语句中,该整体表示一句代码。程序会从上往下,依次判断if后的条件表达式是否满足,如果满足,则执行该if语句内的代码块,当执行完代码块后,程序会直接跳出该if…else if语句,不会再去判断后面的条件表达式是否满足,当所有条件表达式判断完毕都不满足条件后,则执行else语句。

2:在流程控制语句中,如果有单独的break;语句或continue;语句存在,则在该代码块内后面不能有其他语句,因为后面的语句永远不会被执行到。

如:

for(int i=0;i<10;i++){
	break;
	System.out.println(i);        //编译器报错, 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值