• Java基础系列(3)- 程序流程控制


    程序流程控制

    流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
    
    其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:
    
    1. 顺序结构
    2. 分支结构
    3. 循环结构

    顺序结构:程序从上到下逐行地执行,中间没有任何判断和跳转

    分支结构:根据条件,选择性地执行某段代码。有 if...else 和 switch-case 两种分支语句

    循环结构:根据循环条件,重复性的执行某段代码。有while、do...while、for三种循环语句。JDK1.5提供了foreach循环,方便的遍历集合、数组元素

    调用Scanner从键盘获取数据

    具体实现步骤:

    1. 导包:import java.util.Scanner;
    2. Scanner 的实例化:Scanner scan = new Scanner(System.in);
    3. 调用 Scanner 类的相关方法(next() / nextXxx()),来获取指定类型的变量
    import java.util.Scanner;
    class HelloWorld{
        public static void main(String[] args){
            Scanner scan = new Scanner(System.in);
    
            System.out.println("请输入你的姓名:");
            String name = scan.next();
            System.out.println(name);
    
            System.out.println("请输入你的芳龄:");
            int age = scan.nextInt();
            System.out.println(age);
    
            System.out.println("请输入你的体重:");
            double weight = scan.nextDouble();
            System.out.println(weight);
            
            System.out.println("你是否相中我了呢(true/false)");
            scan.nextBoolean();
        }
    }
    

    一、顺序结构

    java 中定义成员变量时采用合法的 前向引用。

    public class Test{
        int num1 = 12;
        int num2 = num1 +2;
    }
    

    不能写成

    public class Test{
        int num2 = num1 + 2;
        int num1 = 12;
    }
    

    二、分支语句

    2.1 if-else 结构

    1. 语句块只有一条执行语句时,一对 {} 可以省略,但建议保留
    2. 当 if-else 结构是”多选一“时,最后的 else 是可选的,根据需要可以省略。(但是不建议省略
    3. 当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓。当多个条件是“包含”关系时,“小上大下/子上父下”

    三种结构

    第一种
        if(条件表达式){
            执行表达式
        }
    第二种:二选一
        if(条件表达式){
            执行表达式1
        }else{
            执行表达式2
        }
    
    第三种:多选一
        if(条件表达式){
            执行表达式1
        }else if(条件表达式){
            执行表达式2
        }else if(条件表达式){
            执行表达式3
        }
    	...
        else{
            执行表达式n
        }
    

    例子

    /*
    编写程序:由键盘输入三个整数分别存入变量num1、num2、num3,
    对它们进行排序(使用 if-else if-else),并且从小到大输出。
    */
    class HelloWorld {
    	public static void main(String[] args) {
    
    		Scanner scanner = new Scanner(System.in);
    
    		System.out.println("请输入第一个整数:");
    		int num1 = scanner.nextInt();
    		System.out.println("请输入第二个整数:");
    		int num2 = scanner.nextInt();
    		System.out.println("请输入第三个整数:");
    		int num3 = scanner.nextInt();
    
    		if (num1 >= num2) {
    			if (num3 >= num1) {
    				System.out.println(num2 + "," + num1 + "," + num3);
    			} else if (num3 <= num2) {
    				System.out.println(num3 + "," + num2 + "," + num1);
    			} else {
    				System.out.println(num2 + "," + num3 + "," + num1);
    			}
    		} else {
    			if (num3 >= num2) {
    				System.out.println(num1 + "," + num2 + "," + num3);
    			} else if (num3 <= num1) {
    				System.out.println(num3 + "," + num1 + "," + num2);
    			} else {
    				System.out.println(num1 + "," + num3 + "," + num2);
    			}
    
    		}
    	}
    }
    

    2.2 switch-case 结构

    1. 根据 switch 表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构末尾结束为止
    2. switch(表达式)中表达式的值必须是下述几种类型之一:byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0)
    3. case子句中的值必须是常量,不能是变量名或不确定的表达式值;
    4. 同一个switch语句,所有case子句中的常量值互不相同;
    5. break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到switch结尾
    6. default子句是可任选的(可以写在最前面)。同时,位置也是灵活的。当没有匹配的case时,执行default。
    switch(表达式){
    case 常量1:
    	语句1;
    	// break;
    case 常量2:
    	语句2;
    	// break;
    case 常量N:
    	语句N;
    	// break;
    default:
    	语句;
    	// break;
    }
    

    实际例子

    String season = "summer";
    switch (season) {
    case "spring":
        System.out.println("春暖花开");
        break;
    case "summer":
        System.out.println("夏日炎炎");
        break;
    case "autumn":
        System.out.println("秋高气爽");
        break;
    case "winter":
        System.out.println("冬雪皑皑");
        break;
    default:
        System.out.println("季节输入有误");
        break; 
    }
    

    2.3 循环结构

    2.3.1 for 循环

    语法格式

    for (1初始化部分; 2循环条件部分; 4迭代部分){
        3循环部分; 
    }
    
    执行过程:
    1-2-3-4-2-3-4-2-3-4-……
    

    应用举例

    public class ForLoop {
        public static void main(String args[]) {
            int result = 0;
            for (int i = 1; i <= 100; i++) {
                result += i; 
            }
            System.out.println("result=" + result);
        } 
    } 
    

    2.3.2 while 循环

    语法格式

    1初始化部分
    while(2循环条件部分){
        3循环体部分; 
        4迭代部分; 
    }
    
    执行过程:
    1-2-3-4-2-3-4-2-3-4……
    

    应用举例

    public class WhileLoop {
        public static void main(String args[]) {
            int result = 0;
            int i = 1;
            while (i <= 100) {
                result += i; i++;
            }
            System.out.println("result=" + result);
        } 
    }
    

    2.3.3 do-while 循环

    do-while循环至少执行一次循环体

    语法格式

    1初始化部分;
    do{
        3循环体部分
        4迭代部分
    }while(2循环条件部分);
    
    执行过程
    1-3-4-2-3-4-2-3-4……
    

    循环例题1:从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入

    为0时结束程序。

    class PositiveNegative {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int positiveNumber = 0;//统计正数的个数
            int negativeNumber = 0;//统计负数的个数
            for(;;){ //while(true){
                System.out.println("请输入一个整数:");
                int z = scanner.nextInt();
                if(z>0)
                    positiveNumber++;
                else if(z<0)
                    negativeNumber++;
                else
                    break; 
            }
            System.out.println("正数的个数为:"+ positiveNumber);
            System.out.println("负数的个数为:"+ negativeNumber); 
        } 
    }
    

    循环例题2:99乘法表

    class NineNineTable {
        public static void main(String[] args) {
            
            for(int i = 1; i <= 9; i++){
                for(int j = 1; j <= i; j++){
                    System.out.print(i + " * " + j + " = " + (i * j) + " ");
                }
    
                System.out.println();
            }
        }
    }
    

    循环例题3:100以内的所有质数

    class PrimeNumberTest {
        public static void main(String[] args){
            boolean isFlag = true; //标识i是否被j除尽,一旦除尽,修改其值
            for(int i = 2; i <= 100; i++){//遍历100以内的自然数
    
                for(int j = 2; j < i; j++)//j:被i去除
    
                    if(i % j == 0){ //i被j除尽
                        isFlag = false;
                    }
                
                    if(isFlag == true){
                        System.out.println(i);
                    }
    
                    //重置isFlag
                    isFlag = true;
            }
        }
    }
    

    循环例题3优化:

    class PrimeNumberTest {
        public static void main(String[] args){
            boolean isFlag = true; //标识i是否被j除尽,一旦除尽,修改其值
            for(int i = 2; i <= 100; i++){//遍历100以内的自然数
    
                for(int j = 2; j < Math.sqrt(i); j++)//j:被i去除   优化二
    
                    if(i % j == 0){ //i被j除尽
                        isFlag = false;
                        break; //优化一:只对本身非质数的自然数是有效的
                    }
                
                    if(isFlag == true){
                        System.out.println(i);
                    }
    
                    //重置isFlag
                    isFlag = true;
            }
        }
    }
    

    2.4 特殊流程控制语句(break、continue)

    1. break只能用于switch语句循环语句中。
    2. continue 只能用于循环语句中。
    3. 二者功能类似,但continue是终止本次循环,break是终止本层循环。
    4. break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
    5. 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
    6. 很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但使程序容易出错。Java中的break和continue是不同于goto的。

    带标签的使用方式

    label:for(int i = 1; i <= 4; i++){
        for(int j = 1; j <= 10; j++){
            if(j % 4 == 0){
                //break label;//结束指定标识的一层循环结构
                continue label;//结束指定标识的一层循环结构当次循环
            }
            System.out.print(j);
        }
        System.out.println();
    }
    

    循环例题3优化:

    class PrimeNumberTest {
        public static void main(String[] args){
            label:for(int i = 2; i <= 100; i++){//遍历100以内的自然数
    
                for(int j = 2; j < Math.sqrt(i); j++){//j:被i去除   优化二
    
                    if(i % j == 0){ //i被j除尽
                        continue label;
                    }
                }
                //凡是走到这的都是质数
                System.out.println(i);
            }
        }
    }
    
  • 相关阅读:
    函数嵌套,层级嵌套函数就是闭包,包就是一层的意思,闭就是封装的意思封装的变量
    高阶函数
    装饰器=高阶函数+函数嵌套+闭包
    生产者和消费者模型
    【HDOJ】Power Stations
    【HDOJ】5046 Airport
    【HDOJ】3957 Street Fighter
    【HDOJ】2295 Radar
    【HDOJ】3909 Sudoku
    【POJ】3076 Sudoku
  • 原文地址:https://www.cnblogs.com/dongye95/p/14495873.html
Copyright © 2020-2023  润新知