Day04

Day 04 流程控制

 

选择结构(switch语句)

switch语句格式

/*
案例:键盘录入一个数据,根据这个数据,输出对应的星期几
键盘录入1,对应输出星期一
键盘录入2,对应输出星期二
...
键盘录入7,对应输出星期日
分析:
1.Scanner实现键盘输入
2.判断既可以用if也可以用switch
注意:
A:遇到左大括号缩进一个tab
B:关联不是很大的语句之间空行
*/
import java.util.Scanner;

class SwitchDemo {
   public static void main(String[] args) {
       //创建键盘录入对象
       Scanner sc = new Scanner(System.in);
       
       //控制键盘录入数据
       System.out.println("请输入一个数据(1-7):");
       int week = sc.nextInt();
       
       //switch判断语句
       switch(week) {
           case 1:
               System.out.println("星期一");
               break;
           case 2:
               System.out.println("星期二");
               break;
           case 3:
               System.out.println("星期三");
               break;
           case 4:
               System.out.println("星期四");
               break;
           case 5:
               System.out.println("星期五");
               break;
           case 6:
               System.out.println("星期六");
               break;
           case 7:
               System.out.println("星期日");
               break;
           default:
               System.out.println("你输入的数据有误");
               break;
      }
  }
}

 

格式的解释

  • switch:表示这是switch选择结构

  • 表达式:这个地方的取值是有限定的

    byte,short,int,char

    JDK5以后可以是枚举

    JDK7以后可以是字符串

  • case:后跟的是要和表达式进行比较的值

  • 语句体:要执行的代码

  • break: 表示中断、结束的意思,可以控制switch语句的结束

  • default:当所有的值都和表达式不匹配的时候,就执行default控制的语句。相当于if语句的else.

 

执行流程

  1. 先计算出表达式的值

  2. 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。

  3. 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。

 

switch语句的注意事项

  • case后面只能是常量,不能是变量,而且多个case后面的值不能出现相同的。

  • default可以省略吗?

    可以省略,但不建议,因为它的作用是对不正确的情况给出提示,除非判断的值是固定的(单选题)。

  • break可以省略吗?

    可以省略,但不一定能得到想要的结果,会出现case穿透的现象,不建议省略。

  • default可以放在任意位置吗?

    可以,但建议在最后。

  • switch语句的结束条件

    • 遇到break结束

    • 执行到末尾结束

 

练习

根据键盘录入的字符串,判断是否有满足要求的

/*
根据键盘录入的字符串,判断是否有满足要求的,如果有就输出,否则提示有误。

String s = sc.nextLine();
*/
import java.util.Scanner;

class SwitchText3 {
   public static void main(String[] args) {
       //创建键盘录入对象
       Scanner sc = new Scanner(System.in);
       
       //录入数据
       System.out.println("请输入你要判断的字符串:");
       String s = sc.nextLine();
       
       switch(s) {
           case "hello":
               System.out.println("你输入的是hello");
               break;
           case "world":
               System.out.println("你输入的是world");
               break;
           case "java":
               System.out.println("你输入的是java");
               break;
           default:
               System.out.println("没有找到你输入的数据");
               break;
      }
  }
}

 

if语句和switch语句的区别

  • if语句的使用场景

    • 针对结果是boolean类型的判断

    • 针对一个范围的判断

    • 针对几个常量值的判断

  • switch语句的使用场景

    • 针对几个常量值的判断

 


 

循环结构

循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。

 

循环语句的组成

  • 初始化语句

    一条或者多条语句,这些语句完成一些初始化操作。

  • 判断条件语句

    这是一个boolen表达式,这个表达式能决定是否执行循环体。

  • 循环体语句

    要做多次的事情。

  • 控制条件语句

    这个部分是在一次循环结束后,下一次循环判断条件执行前执行,通过用于控制循环条件中的变量,使得循环在合适的时候结束。

 

循环结构(for循环语句)

for循环语句格式

for(初始化语句;判断条件语句;控制条件语句) {
   循环体语句;
}

 

执行流程

  1. 执行初始化语句

  2. 执行判断条件语句,false → 循环结束,true → 继续执行

  3. 执行循环体语句

  4. 执行控制条件语句

  5. 回到 2 继续

 

 

注意事项

  • 判断条件语句的结果是一个boolean类型。

  • 循环体语句如果是一条,大括号可以省略,循环体语句如果是多条,大括号不可以省略。建议永远不要省略。

  • 一般来说,有左大括号就没有分号,有分号就没有左大括号。

 

案例

输出十次"HelloWorld"
/*
需求:请在控制台输出十次"HelloWorld"
*/
class ForDemo {
   public static void main(String[] arge) {
       for(int x=1; x<=10; x++) {
           System.out.println("HelloWorld");
      }
  }
}

 

1-10求和
/*
需求:求出1-10之间数据之和
分析:
0+1=1
1+2=3
3+3=6
6+4=10
10+5=15
...
由此可见我们要定义两个变量:
一个变量用于存储第一个加数,第一个加数保存的是以前的所有数据和,默认初始化值应该是0.
一个变量用于存储第二个加数,第二个加数就是每次数据变化的值。

--求和思想--
*/
class ForDemo3 {
   public static void main(String [] args) {
       //定义第一个加数
       int sum = 0;
       
       for(int x=1 ;x<=10; x++) {
           //这里的x其实是第二个加数
           sum += x;
      }
       
       System.out.println("sum:"+sum);
  }
}

 

1-100求偶数和
/*
需求:求出1-100之间偶数和(奇数和同理)
*/
class ForDemo4 {
   public static void main(String[] args){
       //方式1
       int sum = 0;
       
       for(int x=1; x<=100; x++) {
           if(x%2 == 0) {
               sum += x;
          }
      }
       
       System.out.println("sum:"+sum);
       
       //方式2
        int sum1 = 0;
       
       for(int x=0; x<=100; x+=2) {
           sum1 += x;
      }
       
       System.out.println("sum1:"+sum1);
  }
}

 

求5的阶乘
/*
需求:求5的阶乘

--求阶乘思想--
*/
class ForDemo5 {
   public static void main(String[] args) {
       //定义最终结果变量
       int jc = 1;
       
       for(int x=1; x<=5; x++) {
           jc *= x;
      }
       
       System.out.println("1-5的阶乘是:"+jc);
  }
}

 

输出所有"水仙花数"
/*
需求:在控制台输出所有的"水仙花数"
分析:
"水仙花数":是指一个三位数,其各位数字的立方和等于该数本身。如:153(153 = 1*1*1 + 5*5*5 + 3*3*3)

A:三位数其实是告诉了我们范围。
B:通过for循环我们就可以实现获取每一个三位数,但是麻烦是如何获取这个三位数的个、十、百位上的数据。

如何获取一个数据的个、十、百位?
假设有一个数据:153
ge: 153%10 = 3
shi: 153/10%10 = 5
bai: 153/10/10%10 = 1
qian:x/10/10/10%10
wan:x/10/10/10/10%10
...

C:让ge*ge*ge+shi*shi*shi+bai*bai*bai和该数据比较,如果相同,就把该数据在控制台输出。
*/
class ForDemo6 {
   public static void main(String[] args) {
       //三位数告诉了我们范围
       for(int x=100; x<1000; x++) {
           int ge = x%10;
           int shi = x/10%10;
           int bai = x/10/10%10;
           
           //让ge*ge*ge+shi*shi*shi+bai*bai*bai和该数据比较
           if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)) {
               //如果相同,就把该数据在控制台输出。
               System.out.println(x);
          }
      }
  }
}

 

输出满足如下条件的五位数
/*
	需求:请在控制台输出满足如下条件的五位数
			个位等于万位
			十位等于千位
			个位+十位+千位+万位=百位
	
	分析:
		A:五位数告诉了范围
		B:分解每一个五位数的个、十、百、千、万位上的数据
		C:按照要求进行判断即可
*/
class ForDemo7 {
    public static void main(String[] args) {
        //五位数告诉了范围
        for(int x=10000; x<100000; x++) {
            //分解每一个五位数的个、十、百、千、万位上的数据
            int ge = x%10;
        	int shi = x/10%10;
        	int bai = x/100%10;
            int qian = x/1000%10;
            int wan = x/10000%10;
            
            //按照要求进行判断即可
            if(ge==wan && shi==qian && (ge+shi+qian+wan==bai)) {
                System.out.println(x);
            }
        }
    }
}

 

统计"水仙花数"个数
/*
	需求:统计"水仙花数"有多少个
	分析:
		A:水仙花数指一个三位数,其各位数字的立方和等于该数本身
		B:定义统计变量,初始化值为0
		C:三位数告诉了范围,用for循环解决
		D:获取每一个三位数的个、十、百的数据
		E:按照要求判断
		F:若满足要求就计数
		
	--统计思想--
*/
class ForDemo8 {
	public static void main(String[] args) {
        //定义统计变量,初始化值为0
        int count = 0;
        
		for(int x=100; x<1000; x++) {
            //将三位数拆开成个、十、百的数据
            int ge = x%10;
            int shi = x/10%10;
        	int bai = x/100%10;
            
            //按要求判断
            if((ge*ge*ge + shi*shi*shi + bai*bai*bai) == x) {
                //满足要求就计数
                count++;
            }
        }
        
        System.out.println("水仙花数共有:"+count+"个");
	}
}

 

统计1-1000之间同时满足以下条件的数据
/*
	需求:统计1-1000之间同时满足以下条件的数据有几个
			对3整除余2
			对5整除余3
			对7整除余2
	分析:
		A:1-1000给了范围,用for循环解决
		B:定义统计变量,初始化值为0
		C:满足要求的进行计数
*/
class ForDemo9 {
    public static void main(String[] args) {
        //定义统计变量,初始化值为0
        int count = 0;
        
        for(int x=1; x<=1000; x++) {
            //满足要求的进行计数
            if(x%3==2 && x%5==3 && x%7==2) {
                count++;
            }
        }
        
        System.out.println("符合条件的数据有:"+count+"个");
    }
}

 

 

循环结构(while循环语句)

while循环语句格式

  • 基本格式:

while(判断条件语句) {
    循环体语句;
}
  • 扩展格式:

初始化语句;
while(判断条件语句) {
    循环体语句;
    控制条件语句;
}

注意:for循环和while循环是可以互相转换的

初始化语句;
while(判断条件语句) {
 循环体语句;
 控制条件语句;
}

for(初始化语句;判断条件语句;控制条件语句) {
 循环体语句;
}

 

 

 

案例

1-100求和
/*
	需求:用while循环求出1-100之和
	分析:
		思路和for循环基本一致
*/
class WhileDemo2 {
    public static void main(String[] args) {
        //定义一个存储加和的变量
        int sum = 0;
        
        //用while语句实现加和思想
        int x = 1;
        while(x<=100) {
            sum += x;
            x++;
        }
        
        System.out.println(sum);
    }
}

 

统计"水仙花数"的个数
/*
	需求:统计"水仙花数"的个数
	分析:
		思路与for循环基本一致
*/
class WhileDemo3 {
    public static void main(String[] args) {
        //定义一个统计变量,初始值为0
        int count = 0;
        
        //已知为三位数,且各位数字的立方和等于该数本身,用while语句实现
        int x = 100;
        while(x<1000) {
            //将三位数拆开成个、十、百位的数据
            int ge = x%10;
            int shi = x/10%10;
            int bai = x/100%10;
            
            //按照要求判断,若符合则计数
            if((ge*ge*ge + shi*shi*shi + bai*bai*bai) == x) {
                count++;
            }
            
            //注意x++应在while大括号内,而不是if大括号内
            x++;
        }
        
        System.out.println("水仙花数的个数为:"+count+"个");
    }
}

 

循环结构(for循环和while循环的区别)

  • 使用区别:

    如果想在循环结束后,继续使用控制变量的那个变量,用while循环,否则用for循环。

    若不知道则用for循环,因为变量及早的从内存中消失,可以提高内存的使用效率。

  • 另一种场景的理解:

    如果是一个范围的需求,用for循环(如1-100求和)。

    如果不明确要做多少次,用while循环较为合适(如吃葡萄——有就吃,不数几个)。

/*
	分别在for循环体和while循环体的外面输出控制变量,有什么不同的结果?
*/
class WhileDemo4 {
    public static void main(String[] args) {
		//for循环实现
        for(int x=0; x<10; x++) {
            System.out.println("HelloWorld");
        }
       //这里不能继续访问x,因为x包含在for语句的大括号中,for循环结束后,x已消失。
        //System.out.println(x);
        
        //while循环实现
        int y = 0;
        while(y<10) {
            System.out.println("HelloWorld");
            y++;
        }
        //这里的y可以继续访问,因为y包含在main方法的大括号中,while循环结束后,仍存在。
        System.out.println(y);
	}
}

 

练习

纸折几次厚度不低于珠穆朗玛峰
/*
	需求:
		我国最高山峰是珠穆朗玛峰高8848m,我现在有一张足够大的纸张,厚度为0.01m。
		请问:我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?
	分析:--统计思想--
		A:定义一个统计变量,默认值为0
		B:峰高8848m为最终的厚度,纸厚0.01m为初始厚度
		C:折叠一次的变化:厚度*2
		D:只要每次变化的厚度没有超过峰高8848m,就折叠,统计变量++
		E:输出统计变量
*/
class WhileDemo5 {
    public static void main(String[] args) {
        //定义一个统计变量,默认值为0
        int count = 0;
        
        //为了简单,我把0.01变为1,8848变为884800
        int end = 884800;
        int start = 1;
       
        //因为不明确次数,故用while循环
        while(start 
 

 

循环结构(do...while循环语句)

do...while循环语句格式

  • 基本格式:

do {
    循环体语句;
}while(判断条件语句);
  • 扩展格式:

初始化语句;
do {
    循环体语句;
    控制条件语句;
}while(判断条件语句);

 

 

 

练习

输出10次HelloWorld;1-100求和
class DoWhileDemo {
    public static void main(String[] args) {
        //在控制台输出10次HelloWorld
        int x = 0;
        do {
            System.out.println("HelloWorld");
            x++;
        }while(x<10);//此处为0-9,故"="不成立
        
        System.out.println("--------------------");
        
        //1-100求和
        int sum = 0;
        int y = 1;
        do {
            sum += y;
            y++;
        }while(y<=100);//100要加到sum中,故"="成立
        
        System.out.println("1-100的和为:"+sum);
    }
}

 

循环语句(区别及注意事项)

  • 三种循环语句都可以完成一样的功能,可以等价转换,但还是有一点去别的:

    • do...while循环至少执行一次循环体。

    • for循环、while循环先判断条件是否成立,再确定是否执行循环体。

  • 注意事项:

    • 写程序优先考虑顺序:for → while → do...while

    • 如下代码是死循环:

DOS中遇到死循环按ctrl + C可强行停止

/*
	注意死循环:
		A:一定不要忘记控制条件语句,否则容易死循环
		B:两种最简单的死循环格式
			while(true) {...}
			for(;;) {...}
*/
class DoWhileDemo3 {
    public static void main(String[] args) {
        int x = 0;
        while(x<10) {
            System.out.println(x);
            //x++; ↓ 忘记会导致死循环
        }
        System.out.println("--------------------");
        
        // ↓ 判断条件语句永远成立
        while(true) {
             System.out.println("今天很高兴,学习了死循环");
        }
         System.out.println("--------------------");
        
        // ↓ 三个条件不一定都有,可能只有一部分
        for(;;) {
            System.out.println("今天很高兴,学习了死循环");
        }
    }
}

 

循环嵌套的使用

输出4行5列的星星

/*
	需求:请输出一个4行5列的星星(*)图案
	结果:
		*****
		*****
		*****
		*****
	分析:
		A:考虑如何实现一次输出1个*
			输出语句的另一种格式:
				System.out.print(); ← 不换行
			如:
				System.out.print("*");
				System.out.print("*");
				输出结果为:**
		B:如果要在一行上打出多个*,可以用循环实现,但是不会换行,可以用空的输出语句实现换行
		C:以上代码复制4次能够满足需求,但如果多次出现同样的代码,说明程序写的不好,可以用循环嵌套改进
			- 循环嵌套:循环语句的循环体本身是一个循环语句。
	结论:
		外循环控制行数
		内循环控制列数
*/
class ForForDemo {
    public static void mian(String[] args) {
        for(int x=0; x<5; x++) {
            System.out.print("*");
            //但是这种无论输出多少个*都不会换行
        }
        System.out.print(); //通过空的输出语句实现换行
        //上面的代码重复4次可以满足需求,但不够好,可以用循环嵌套改进
       System.out.println("--------------------");
        
        //用循环嵌套改进
        for(int y=0; y<4; y++) {
            for(int x=0; x<5; X++) {
                System.out.print("*");
            }
        }
    }
}

 

输出直角三角形星星

/*
	需求:请输出如下图形
		*
		**
		***
		****
		*****	
*/
class ForForDemo2 {
    public static void main(String[] args) {
        //通过观察,这是一个行是5,列是变化的形状
        //我们先打印出一个5行5列的形状
        for(int x=0; x<5; x++) {
            for(int y=0; y<5; y++) {
                System.out.print("*");
            }
            System.out.println();
            
            System.out.println("--------------------");
            
        //实现了一个5行5列的形状,但需要的列数是变化的
        //如何变化:
        	//第一行:1列	y=0,y<=0,y++
        	//第二行:2列	y=0,y<=1,y++
        	//第三行:3列	y=0,y<=2,y++
        	//第四行:4列	y=0,y<=3,y++
        	//第五行:5列	y=0,y<=4,y++
        	//外循环x的变化,恰好是x=0,1,2,3,4
        //则最终版的程序如下
        for(int x=0; x<5; x++) {
            for(int y=0; y<=x; y++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

 

输出九九乘法表

/*
	需求:请输出九九乘法表
	分析:
		首先写出九九乘法表
			1*1=1
			1*2=2	2*2=4
			1*3=3	2*3=6	3*3=9
			...
			1*9=9	2*9=18	3*9=27	4*9=28	... 9*9=81
		
		可以把九九乘法表看成如下形状
			*
			**
			***
			****
			*****
			******
			*******
			********
			*********
	注意:
		'\x'	x表任意,这种叫做转义字符
	如:
		'\t'	tab键的位置
		'\r'	回车
		'\n'	换行
*/
class ForForDemo3 {
    public static void main(String[] args) {
        for(int x=0; x<9; x++) {
            for(int y=0; y<=x; y++) {
                System.out.print("*");
            }
            System.out.println();
		}
            
            System.out.println("--------------------");
            
            //为了使用数据,从1开始
		for(int x=1; x<=9; x++) {
			for(int y=1; y<=x; y++) {
			System.out.print(y+"*"+x+"="+y*x+"\t");
            }
            System.out.println();
        }
    }
}

 

 

控制跳转语句

控制跳转语句(break)

break的使用场景

  • 在选择结构switch语句中

  • 在循环语句中(加入了if判断的情况)

注意:离开使用场景的存在是没有意义的

break的作用

  • 跳出单层循环

  • 跳出多层循环

    • 带标签的跳出

    • 格式:标签名:循环语句

    • 标签名要符合Java的命名规则

class BreakDemo {
    public static void main(String[] args) {
        //跳出单层循环
        for(int x=0; x<10; x++) {
            if(x == 2) {
                break;
            }
            System.out.println("HelloWorld");
        }
		System.out.println("over");
		//输出结果:
		//HelloWorld
		//HelloWorld
		//over ← 不受break影响,break仅表示中断当前循环
        System.out.println("--------------------");
        
        //跳出多层循环
        wc:for(int x=0; x<3; x++) {
           nc:for(int y=0; y<4; y++) {
               if(y == 2) {
                   break nc; //输出3行4列*
                   //break wc; 输出1行2列*
               }
               System.out.print("*");
           }
            System.out.println();
        }
    }
}

 

控制跳转语句(continue)

continue的使用场景

  • 循环中

注意:离开使用场景的存在是没有意义的

continue的作用

  • 单层循环对比break,区别如下

    • break 退出当前循环,不再执行

    • continue 退出本次循环,继续执行下一次循环

  • 带标签的使用

class ContinueDemo {
   public static void main(String[] args) {
       for(int x=0; x<10; x++) {
           if(x == 3) {
               //break; 输出结果0,1,2
               continue; //输出结果0,1,2,4,5,6,7,8,9
          }
           System.out.println(x);
      }
       
       System.out.println("-------------------");
       
       //练习题
       for(int x=1; x<=10; x++) {
if(x%3==0) {
               break; //输出2次"Java"
               //continue; 输出7次"Java"
               //System.out.println("Java"); 输出13次"Java"
}
System.out.println("Java");
}
  }
}

 

控制跳转语句(return)

  • return关键字不是为了跳转出循环体,更常用的功能是结束一个方法,也就是退出一个方法,跳转到上层调用的方法。这个在方法的使用那里会在详细的讲解。

  • 演示案例

    class ReturnDemo {
       public static void main(String[] args) {
           for(int x=0; x<10; x++) {
               if(x == 2) {
                   System.out.println("退出");
                   //break; 输出0,1,退出,over
                   //continue; 输出0,1,退出,3,4,5,6,7,8,9,over
                   return; //输出0,1,退出 此处return退出的是main方法,故后面的代码也不再生效
              }
               
               System.out.println(x);
          }
           
           System.out.println("over");
      }
    }

 

循环语句结合break的练习

/*
需求:小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱,请问,经过多少天,小芳才可以存到100元钱。

分析:
A:小芳的妈妈每天给她2.5元
double dayMoney = 2.5;
B:她都会存起来
double daySum = 0;
C:从第一天开始存
int dayCount = 1;
D:经过多少天,小芳才可以存到100元钱
double result = 100; (int,double均可)
E:每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱
说明要判断dayCount的值,如果被5整除,就减去6元
daySum -= 6;
由此还隐含了一个问题,如果不是5的倍数的天数的话,钱要累加
daySum += dayMoney;
F:因为不知道是多少天,所以用死循环,一旦超过100元就退出循环

--统计思想--
*/
class WhileDemo {
   public static void main(String[] args) {
       //每天要存的钱是2.5元
       double dayMoney = 2.5;
       
       //存钱的初始化值是0
       double daySum = 0;
       
       //从第一天开始存
       int dayCount = 1;
       
       //最终存储不小于100元就停止存储
       int result = 100;
       
       //因为不知道是多少天,所以用死循环,一旦超过100元就退出循环
       while(true) {
           //累加钱
           daySum += dayMoney;
           
           //判断,一旦超过100元就退出循环
           if(daySum >= result) {
               System.out.println("共用了"+dayCount+"天存储了100元");
               break;
          }
           
           if(dayCount%5 == 0) {
               //花去6元钱
               daySum -= 6;
               System.out.println("第"+dayCount+"天花了6元钱");
          }
           
           //天数变化
           dayCount++;
      }
  }
}

 

 

总结

switch语句(掌握)

循环语句(掌握)

控制跳转语句(掌握)

 

> 转载请注明来自MANCOCHINA的博客园博客:https://www.cnblogs.com/mancochina/

你可能感兴趣的:(Day04)