#大数据学习笔记第4天# 流程控制

## 回顾

## 作用

## 大纲
– Switch结构
– 循环结构
– for循环
– while循环
– do…while循环
– 循环嵌套
– 2个案例:猜数字、循环输入成绩进行判断

## 第一节课 ##
– 回顾、作业
– Switch结构
– Switch练习

## 第二节课 ##
– for循环
– for循环练习

## 第三节课 ##
– while循环
– do…while循环
– 循环嵌套

## 第四节课 ##
– 案例:循环嵌套之九九乘法表
– 案例:猜数字
– 案例:循环输入成绩进行判断

## 分支结构:switch

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
switch(表达式或变量){
	case 取值1:
		语句体1;
		break;
	case 取值2:
		语句体2;
		break;
	...
	default:
		语句体n+1;
		break;
}

### switch注意事项:

  • switch语句表达式的类型有:byte,short,int,char,String(1.7之后才支持)和枚举类型;
  • case之间与default没有顺序,case相当于入口点,没有匹配的case将执行default,default也不是必须的;
  • 结束switch语句的情况:遇到break或执行到switch语句结束;
  • 如果匹配的case或者default没有对应的break,那么程序会继续向下执行,运行可以执行的语句,直到遇到break或者switch结尾;

## 循环结构:概述
循环语句可以在满足循环条件的情况下,反复执行某一段代码;被反复执行的代码称为循环体;需要在适当的时候,把循环条件改为假,从而结束循环,否则循环将一直执行下去,形成死循环;

完整的循环应该包含以下四个部分:

  • 初始化语句:初始化工作,在循环体开始之前执行;
  • 循环条件:一个boolean表达式,决定是否执行循环体;
  • 循环体:反复执行的部分;
  • 迭代语句:在循环体执行完之后执行,然后再去判断循环条件,一般用来控制循环条件中的变量,使循环在合适的时候结束;

## 循环结构:for
格式:

Select Code
1
2
3
for(初始化表达式;条件表达式;循环变量控制语句){
循环体语句;
}

格式说明:for运行的顺序

1. 执行初始化表达式,只执行一次,通常是定义循环变量语句;
2. 判断循环条件,为真就往下执行,为假就结束循环;
3. 执行循环体语句;
4. 执行循环变量控制语句,一般是循环变量的自增或自减;
5. 回到第2步,重复这个过程,直到为假时结束;

## 10个练习题
1. 在控制台上依次打印1-10;
2. 在控制台上依次打印10-1;
3. 求1-10所有数之和;
4. 求出1-100之间的所有偶数之和;
5. 求出1-100之间的所有奇数之和;
6. 求出5的阶乘;
7. 求水仙花数;
8. 列出5位数中的回文数;
9. 统计1000以内,同时是3,5,7的倍数的数有多少个?
10. 在1-100之间,若是3的倍数,则在它之后输出中文“三”,若是5的倍数,则在它之后输出中文“五”,若是7的倍数,则在它之后输出中文“七”

答案:

01题:

Select Code
1
2
3
4
5
6
7
public class Demo01{
	public static void main(String[] args){
		for(int i=1;i<=10;i++){
			System.out.println(i);
		}
	}
}

02题:

Select Code
1
2
3
4
5
6
7
public class Demo02{
	public static void main(String[] args){
		for(int i=10;i>0;i--){
			System.out.println(i);
		}
	}
}

03题:

Select Code
1
2
3
4
5
6
7
8
9
public class Demo03{
	public static void main(String[] args){
		int sum = 0;
		for(int i=1;i<=10;i++){
			sum += i;
		}
		System.out.println("求1-10所有数之和:" + sum);
	}
}

04题:

Select Code
1
2
3
4
5
6
7
8
9
10
11
public class Demo04{
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("求出1-100之间的所有偶数之和:" + sum);
}
}

05题:

Select Code
1
2
3
4
5
6
7
8
9
10
11
public class Demo05{
public static void main(String[] args){
	int sum = 0;
	for(int i=1; i<=100; i++){
		if(i%2==1){
			sum += i;
		}
	}
	System.out.println("求出1-100之间的所有奇数之和:"+sum);	//2500
}
}

06题:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
/*
求出5的阶乘;
公式:n!=n*(n-1)! 阶乘的计算方法 阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。 
*/
public class Demo06{
	public static void main(String[] args){
		int res = 1;
		for(int i=1; i<=5; i++){
			res = res * i;
		}
		System.out.println("5的阶乘:" + res);
	}
}

07题:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
求水仙花数;
所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。
*/
public class Demo07{
	public static void main(String[] args){
		for(int i=100; i<1000; i++){
			int ge = i%10;		// 个位数
			int shi = i/10%10;	// 十位数
			int bai = i/100;	// 百位数
		
			if(ge*ge*ge+shi*shi*shi+bai*bai*bai==i){
				System.out.println(i);
			}
		}
	}
}

08题:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
	列出5位数中的回文数
	回文数的概念:即是给定一个数,这个数顺读和逆读都是一样的。例如:121,1221...
*/
public class Demo08{
	public static void main(String[] args){
		int count = 0;
		for(int i=10000; i<100000; i++){
			// 个十百千万
			int ge = i%10; // 12345
			int shi = i%100/10;
			int qian = i%10000/1000;
			int wan = i/10000;
			
			if(ge==wan && shi==qian){
				count++;
				System.out.println(i);
			}
		}
		System.out.println("5位数中一共有"+count+"个回文数");	// 900
	}
}

09题:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
	统计1000以内,同时是3,5,7的倍数的数有多少个?
*/
public class Demo09{
	public static void main(String[] args){
		int count = 0;
		for (int i=0; i<1000; i++){
			if(i%3==0 && i%5==0 && i%7==0){
				System.out.println(i);
				count++;
			}
		}
		System.out.println("统计1000以内,同时是3,5,7的倍数的数有多少个?" + count);
	}
}

10题:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
在1-100之间,若是3的倍数,则在它之后输出中文“三”,若是5的倍数,则在它之后输出中文“五”,若是7的倍数,则在它之后输出中文“七”
*/
public class Demo10{
	public static void main(String[] args){
		for(int i=1; i<=100; i++){
			System.out.print(i);

			if(i%3==0){
				System.out.print("三");
			}else if(i%5==0){
				System.out.print("五");
			}else if(i%7==0){
				System.out.print("七");
			}

			System.out.println();
		}
	}
}

## 循环结构:while
while语句格式:

Select Code
1
2
3
4
5
[初始化部分]
while(条件表达式){
	循环体语句;
	[循环变量控制语句]
}

执行流程:

1. 执行初始化语句(如果有的话);
2. 判断条件表达式真假;如果真,往下执行;如果假,结束循环;
3. 执行循环体语句;
4. 执行循环变量控制语句(如果有的话);
5. 返回第2步,重复执行,直到条件为假,结束循环;

### 循环变量的使用问题:
for循环的循环变量,一般情况下在循环外是不能访问到的,因为它的作用域是在for循环的{}之内,但是可以通过把循环变量定义在循环之外来实现这个功能;或者定义计数器;

Select Code
1
2
3
4
5
6
7
8
9
10
for(int i=0;i<10;i++){
		...
	}
	System.out.println(i);	//error

	int i=0;
	for(;i<10;i++){
		...
	}
	System.out.println(i);	//ok

while循环本身就是把循环变量定义在循环之外,所以没有这个问题;

Select Code
1
2
3
4
5
6
int i=0;
	while(i<10){
		...
		i++;
	}
	System.out.println(i);

### for 和 while 的使用场景
1. 当明确知道循环的范围的时候,通常使用for;
2. 当不明确循环次数的时候,for和while都可以,通常使用while;

### 案例:
已知珠穆朗玛峰的高度是8848米,假设有一张足够大的纸,厚度是0.01米,请问:这张纸折叠多少次可以保证厚度不低于珠穆朗玛峰的高度?

答案:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
public class ZhuMuLangMa2{
		public static void main(String[] args){
			double h=0.01;
			double all_height = h;
			int count=0;
			while(all_height<=8848){
				all_height *= 2;
				count++;
			}
			System.out.println("需要折叠的次数是:"+count);
		}
	}

另外一种方法:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ZhuMuLangMa{
		public static void main(String[] args){
			double h=0.01;
			double all_height = h;
			int count=0;
			while(true){
				all_height *= 2;
				count++;
				if(all_height>8848){
					break;
				}
			}
			System.out.println("需要折叠的次数是:"+count);
		}
	}

## 循环结构:do-while
do while语句格式:

Select Code
1
2
3
4
5
[初始化部分]
	do{
		循环体语句;
		[循环变量控制语句]
	}while(条件表达式);

执行流程:

1. 执行初始化部分(如果有)
2. 执行循环体语句
3. 执行循环变量控制语句(如果有)
4. 判断条件表达式,如果为真,返回第2步;如果为假,结束循环

特点:循环体至少被执行1次;

### 三种循环的比较和死循环
– while和for可以互换;
– do-while循环的循环体语句至少执行一次;
– 优先选择使用for循环;
– 死循环:条件表达式永远为true;

## 循环的嵌套
外层循环表达式为真时,进入内层循环条件的判断,内层循环结束时,跳到外层循环继续判断外层循环的条件;

代码实例:

Select Code
1
2
3
4
5
6
7
8
9
10
public class QianTao{
		public static void main(String[] args){
			for(int i=0; i<5; i++){ //外层循环
				for(int j=0; j<5; j++){	//内层循环
					System.out.println(i+"*"+j);
				}
				System.out.println("-------");
			}
		}
	}

### 案例
循环嵌套打印正三角形、倒三角形;

代码:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
	打印三角形:第n行打印n次星号
	*/
	import java.util.Scanner;

	public class SanJiaoXing{
		public static void main(String[] args){
			Scanner s = new Scanner(System.in);
			System.out.println("请输入一个数字,表示三角形的行数:");
			int num = s.nextInt();
			
			for(int i=1; i<=num; i++){
				for(int j=i; j>0; j--){
					System.out.print("*");
				}
				System.out.println();
			}
		}
	}


备注:可以试试输出一个倒三角形。