# 大数据学习笔记第4天-流程控制 #
## 回顾
## 作用
## 大纲
- Switch结构
- 循环结构
- for循环
- while循环
- do...while循环
- 循环嵌套
- 2个案例:猜数字、循环输入成绩进行判断
## 第一节课 ##
- 回顾、作业
- Switch结构
- Switch练习
## 第二节课 ##
- for循环
- for循环练习
## 第三节课 ##
- while循环
- do...while循环
- 循环嵌套
## 第四节课 ##
- 案例:循环嵌套之九九乘法表
- 案例:猜数字
- 案例:循环输入成绩进行判断
## 分支结构:switch
switch(表达式或变量){
case 取值1:
语句体1;
break;
case 取值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
![](./img/04/01.jpg)
### 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
格式:
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题:
public class Demo01{
public static void main(String[] args){
for(int i=1;i<=10;i++){
System.out.println(i);
}
}
}
02题:
public class Demo02{
public static void main(String[] args){
for(int i=10;i>0;i--){
System.out.println(i);
}
}
}
03题:
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题:
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题:
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题:
/*
求出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题:
/*
求水仙花数;
所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。
*/
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题:
/*
列出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题:
/*
统计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题:
/*
在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语句格式:
[初始化部分]
while(条件表达式){
循环体语句;
[循环变量控制语句]
}
执行流程:
1. 执行初始化语句(如果有的话);
2. 判断条件表达式真假;如果真,往下执行;如果假,结束循环;
3. 执行循环体语句;
4. 执行循环变量控制语句(如果有的话);
5. 返回第2步,重复执行,直到条件为假,结束循环;
### 循环变量的使用问题:
for循环的循环变量,一般情况下在循环外是不能访问到的,因为它的作用域是在for循环的{}之内,但是可以通过把循环变量定义在循环之外来实现这个功能;或者定义计数器;
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循环本身就是把循环变量定义在循环之外,所以没有这个问题;
int i=0;
while(i<10){
...
i++;
}
System.out.println(i);
### for 和 while 的使用场景
1. 当明确知道循环的范围的时候,通常使用for;
2. 当不明确循环次数的时候,for和while都可以,通常使用while;
### 案例:
已知珠穆朗玛峰的高度是8848米,假设有一张足够大的纸,厚度是0.01米,请问:这张纸折叠多少次可以保证厚度不低于珠穆朗玛峰的高度?
答案:
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);
}
}
另外一种方法:
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语句格式:
[初始化部分]
do{
循环体语句;
[循环变量控制语句]
}while(条件表达式);
![](./img/04/02.jpg)
执行流程:
1. 执行初始化部分(如果有)
2. 执行循环体语句
3. 执行循环变量控制语句(如果有)
4. 判断条件表达式,如果为真,返回第2步;如果为假,结束循环
特点:循环体至少被执行1次;
### 三种循环的比较和死循环
- while和for可以互换;
- do-while循环的循环体语句至少执行一次;
- 优先选择使用for循环;
- 死循环:条件表达式永远为true;
## 循环的嵌套
外层循环表达式为真时,进入内层循环条件的判断,内层循环结束时,跳到外层循环继续判断外层循环的条件;
![](./img/04/03.jpg)
代码实例:
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("-------");
}
}
}
![](./img/04/04.png)
### 案例
循环嵌套打印正三角形、倒三角形;
代码:
/*
打印三角形:第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();
}
}
}
![](./img/04/05.png)
备注:可以试试输出一个倒三角形。