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);
        }
    }
}
posted @ 2021-03-07 19:08  dongye95  阅读(98)  评论(0编辑  收藏  举报