Java的for循环

来自CloudWiki
跳转至: 导航搜索

什么是循环语句

循环语句就是让计算机根据条件做循环计算,在条件满足时继续循环,条件不满足时退出循环。

程序是为了解决实际问题的,实际问题中存在着重复动作,那么程序中也应该有相应的描述,这就是循环。

软件中有许多重复的动作:

(1)音乐软件循环播放某一首歌

(2)社交软件向多人发送同一条信息

(3) 数学软件累加求和,累加求积。

循环语句就是程序语言解决这种重复性计算的一种手段。

比方说,案例:计算1+2+3+……+10

除了用数列公式外,完全可以让计算机做100次循环累加。因为计算机的特点是计算速度非常快,我们让计算机循环一亿次也用不到1秒,所以很多计算的任务,人去算是算不了的,但是计算机算,使用循环这种简单粗暴的方法就可以快速得到结果。

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int sum=0;
		sum =sum+1;
		sum =sum+2;
		sum =sum+3;
		sum =sum+4;
		sum =sum+5;
		
	}

但是这样写法太麻烦,在程序语言中我们更愿意这样写:

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        for (int i=1; i<=5; i++) {
            sum = sum + i;
        }
        System.out.println(sum);
    }
}

这就是一个循环语句。它表示:。。。。

它能够很快速的循环执行5个加法运算,从而获得结果。

练习:计算1+2+3+...+10000的和

练习:计算1*2*3*....*10的积

for 循环

语法格式

  • for循环是更加简洁的循环语句。for循环的基本语法格式如下:
for ([变量初始化]; [循环条件]; [变量更新]) 
{ 
循环体语句块
}

语句组成

循环语句一般包含如下4个部分:

  • 初始化语句:一条或多条语句,这些语句用于完成一些初始化工作,初始化语句在循环开始之前执行,比如这里的int i=1;
  • 循环条件:这是一个boolean表达式,这个表达式能决定是否执行循环体,比如这里的i<=100
  • 循环体:这个部分是循环的主体,如果循环条件允许,这个代码块将被重复执行, 比如这里的sum = sum +i
  • 变量更新:这个部分在每次循环体执行结束后,对循环条件求值之前执行。通常用于控制循环条件中的变量,使得循环在合适的时候结束,比如这里的i++

这四个部分只是一般性的分类,并不是每个循环中都非常清晰地分出了这四个部分。

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        for (int i=1; i<=5; i++) {
            sum = sum + i;
        }
        System.out.println(sum);
    }
}

执行顺序

为了描述方便,我们把初始化语句、循环条件语句、变量更新语句 分别命名为 A,B,C

for(语句A; 语句B; 语句C){
 
   //循环体
 
}

其中,语句A在整个循环过程中,只会执行一次;语句B必须是布尔类型的表达式(当然也可以不写,如果写就必须是布尔类型表达式),通过该布尔表达式去判断是否继续执行循环体;语句C会在每次循环结束后执行,也就是说,循环体执行多少次,语句C就会执行多少次。

那么语句的执行顺序是:

   语句A→(语句B → 循环体 → 语句C)→(语句B → 循环体 → 语句C)→ ... →退出循环
  • 也可以通过下面这个图看出来 ?
  • Java2-18.png
  • 图2-16 for循环流程图
  • 程序执行for循环时,先执行循环的初始化语句,初始化语句只在循环开始前执行一次。每次执行循环体之前,先计算判断条件(也就是循环条件)的值,如果循环条件返回true,则执行循环体,循环体执行结束后执行循环迭代语句。因此,对于for循环而言,循环条件总是比循环体要多执行一次,因为最后一次执行循环条件返回false,将不再执行循环体。
  • 摇一摇:程序是怎样在for语句里执行的

实例:for 循环简单应用

循环播放歌曲

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
       for(int i=0;i<5;i++) {
    	   System.out.println("世上有朵美丽的花");
    	   System.out.println("那是青春吐芳华");
    	   System.out.println("。。。");
       }
	}

}


群发拜年短信

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String [] menu = {"同学甲","同学乙","同学丙","好友A","好友丙"};
		for(int i=0;i <5;i++){
		    System.out.println(menu[i]+" 新年快乐 !小王给您拜年了 !");
		}
	}

}
  • 面馆程序:打印面馆里的每一种面
public class test02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        //String a ="hello";
		String [] menu = {"阳春面","油泼面","鸡汤面","火鸡面","安徽板面"};
		for(int i=0;i <5;i++){
			System.out.println(menu[i]);
		}
		
	}

}

执行科学计算

  • 求1~1000所有偶数的和
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int sum=0;
		for(int i=0;i<1001;i++) {
			if(i%2 ==0) {
				sum +=i;
			}
		}
		System.out.println("sum="+sum);
		
	}

}

写法2:

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int sum=0;
		for(int i=0;i<1001;i=i+2) {
			sum +=i;
		}
		System.out.println("sum="+sum);
		
	}

  • 输出1~100之间的被7整除但不能同时被5整除的所有整数。
  • 圆周率π可以使用公式计算,请利用for循环计算π:

Java2020-5-2.png

public class Main {
    public static void main(String[] args) {
        double pi = 0;
        for (???) {
            // TODO
        }
        System.out.println(pi);
    }
}

循环输入信息

  • 例如:当循环变量count小于10时,执行循环体。
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
      int score;int sum=0;
         
     Scanner input = new Scanner(System.in);
     System.out.print("输入学生姓名:");
     String name = input.next();
     for(int i = 0; i < 5; i++) {
             System.out.println("请输入5门课中第"+(i+1)+ "门的成绩:");
             score=input.nextInt();
             System.out.println("5门课中第"+(i+1)+"门的成绩为:"+score);
	 }

     System.out.println("循环结束");
     input.close();
	}

}

头脑风暴:上述这些循环都有一个什么特点?

头脑风暴:上述循环输入有一个什么缺点?

  • 练习:编写程序,求101+102+...+200的值
  • 练习:编写程序,求1+2+4+...+64的值
  • 练习:编写程序:求1-2+3-4+5-...+99-100的值
  • 练习:输出100到999之间的水仙花数。

深入:关于for循环的几点讨论

初始化语句可以变吗?

答案:可以。

  • 求1+2+3+...+100
package task4;

public class For {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int sum=0;
		for(int i=100;i>0;i--){
			sum +=i;
		}
		 System.out.println("sum="+sum); 
	}

}
  • 求1+2+3+...+100
package task4;

public class For {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1+100)+(2+99)+……(50+51)=?
		 int sum = 0;
		 for(int i=1,j=100;i<j;i++,j--){
		      sum+=i+j;
		 }
		 System.out.println("sum= "+sum);
	}

}

循环条件可以变吗?

答案:可以

循环条件可以是任意的布尔表达式的组合。

  • 求1~100的前10个偶数:
package task4;

public class For {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int count=0;
		 for(int i=1;i<101 &&count<5;i++){
			 if(i%2==0) {
				 System.out.println(i);
				 count++;
			 }
		 }
		
	}

}

变量迭代语句可以变吗 ?

答案:可以

任何使变量得到改名的式子都可以。

  • 求1+2+4+...+ 64
int sum=0;
for(int i=1;i<=64;i=i*2){
   sum +=i;
}
System.out.println("sum="+sum);
  • 头脑风暴:迭代语句可有可无吗 ?试试把i=i*2去掉。

灵活的for循环

  • 在上面的循环语句中,for循环的初始化语句只有一个,循环条件也是一个简单的boolean表达式。实际上,for循环允许同时指定多个初始化语句,循环条件也可以是一个包含逻辑运算符的表达式。例如:
public class ForTestTwo {
	public static void main(String[] args) {
		//原while语句:
                //int count = 1,sum=0;
		//当count小于10时,执行循环体
		//while(count <11) {
			//sum += count;
			//迭代语句
			count++;
		//}
		
                for(int count=1,sum=0; count<10; sum += count,count++){
                    ;
                }
		System.out.println("1~10累加的结果为:"+sum);
	}
}
  • 上面代码中初始化变量有两个个,但是只能有一个声明语句,因此如果需要在初始化表达式中声明多个变量,那么这些变量应该具有相同的数据类型。
  • for循环圆括号中只有两个分号是必须的,初始化语句、判断条件、迭代语句部分都是可以省略的,如果省略了循环条件,则这个循环条件默认为true,将会产生一个死循环。例如:
public class ForTestThree {
	public static void main(String[] args) {
		// 省略了for循环三个部分,循环条件将一直为true
		for(; ; ) {
			System.out.println("******");
		}
		// 下面的语句不能到达,所以书写后有语法错误
		//System.out.println("循环结束");
	}
}
  • 运行上面程序,将看到程序一直输出******字符串,这表明此程序是一个死循环。


参考文档:https://www.liaoxuefeng.com/wiki/1252599548343744/1259540152578912