Java-03流程控制

Java-03流程控制

  • 多写(代码),多写(笔记),多写(文章)
  • 多练(交流),多练(思维),多练(技能)
  • 多分享(知识),多分享(怎么了),多分享(为什么)
  • 最重要(坚持)
  • 每个牛B人物背后都有一段苦B的岁月,只要像傻B一样坚持,终将牛B!

1. 用户交互Scanner

java.util.Scanner 是Java 5 的新特征,我们可以通过Scanner类来获取用户的输入

1.1 基本语法

Scanner scanner = new Scanner(System.in);

1.2 常用的API函数

  • useDelimiter(Pattern pattern):将此扫描器的分隔模式设置为指定模式
  • useDelimiter(String pattern):将此扫描器的分隔模式设置为从指定 String 构造的模式
  • delimiter():返回此 Scanner 当前正在用于匹配分隔符的 Pattern
  • hasNext():判断扫描器中当前扫描位置后是否还存在下一段
  • hasNextLine():如果在此扫描器的输入中存在另一行,则返回 true
  • next():查找并返回来自此扫描器的下一个完整标记
  • nextLine():此扫描器执行当前行,并返回跳过的输入信息
public void testDemo01() {
    Scanner scanner = new Scanner(System.in);
    System.out.println(scanner.delimiter().toString()); // \p{javaWhitespace}+

    scanner.useDelimiter("、");
    System.out.println(scanner.delimiter().toString()); // 、

    scanner.useDelimiter(Pattern.compile("\t"));
    System.out.println(scanner.delimiter().toString()); // 制表符
}

public void testDemo02() {
    Scanner scanner = new Scanner(System.in);

    System.out.println("请输入你需要输入的字符串:");
    if (scanner.hasNext()) {
        String strFirst = scanner.next(); // 输入:Hello World
        System.out.println("你输入的字符串为:" + strFirst); // 输出:Hello
    }

    scanner.close();
}

public void testDemo03() {
    Scanner scanner = new Scanner(System.in);

    System.out.println("请输入你需要输入的字符串:");
    if (scanner.hasNextLine()) {
        String strSecond = scanner.nextLine(); // 输入:Hello World
        System.out.println("你输入的字符串为:" + strSecond); // 输出:Hello World
    }

    scanner.close();
}
重点讲一下next()和nextLine()的区别:
  • next():只读取输入直到空格。它不能读两个由空格或符号隔开的单词。此外,next()在读取输入后将光标放在同一行中。(next()只读空格之前的数据,并且光标指向本行)
  • nextLine():读取输入,包括单词之间的空格和除回车以外的所有符号(即。它读到行尾)。读取输入后,nextLine()将光标定位在下一行

1.3 具体实例

题目要求:我们可以输入多个数字,并求其计总数、合计数与平均数,通过输入非数字来结束。

public void testDemo04() {
    double dSum = 0;
    int iCount = 0;

    Scanner scanner = new Scanner(System.in);

    System.out.println("请输入任意个数字:");
    while (scanner.hasNextDouble()) {
        double dTemp = scanner.nextDouble();
		iCount ++;
		dSum += dTemp;
    }

    System.out.println("计总数:" + iCount);
    System.out.println("合计数:" + dSum);
    if (iCount == 0) {
        System.out.println("平均数:0");
    } else {
        System.out.println("平均数:" + (dSum / iCount));
    }

    scanner.close();
}

2. 顺序结构

  • Java的基本机构就是顺序结构,除非特别指明,否则就按照顺序依次执行
  • 顺序结构是最简单的算法结构
  • 语句与语句之间、框与框之间是按照从上到下的顺序执行的,它是由若干个依次执行的处理步骤组成的
  • 它是任何一个算法都离不开的一种基本算法结构

3. 选择结构

3.1 if单选择结构

我们很多时候需要去判断一个事情是否可行,然后我们才去执行,这样一个过程在程序中用if语句来表示

语法

if (布尔表达式) {
    // 如果布尔表达式为true将执行的语句
}

例如:

public void structDemo01() { 
    Scanner scanner = new Scanner(System.in);
    int iResult = scanner.nextInt();

    if (iCount == 0) {
        System.out.println("你输入的数字为:0");
    }
    
    scanner.close();
}

3.2 if双选择结构

当条件成立时,则执行 if 部分的代码块; 条件不成立时,则进入 else 部分

语法

if (布尔表达式) {
    // 如果布尔表达式为true将执行的语句
} else {
    // 如果布尔表达式为false将执行的语句
}

例如:

public void structDemo02() { 
    Scanner scanner = new Scanner(System.in);
    int iResult = scanner.nextInt();

    if (iCount == 0) {
        System.out.println("你输入的整数为:0");
    } else {
        System.out.println("你输入的整数不为0");
    }
    
    scanner.close();
}

3.3 if多选择结构

在布尔表达式 1 不满足的情况下,才会进行布尔表达式2 的判断;当前面的布尔表达式均不成立时,才会执行 else 块内的代码

语法

if (布尔表达式1) {
    // 如果布尔表达式1为true将执行的语句
} else if (布尔表达式2) {
    // 如果布尔表达式2为true将执行的语句
} else {
    // 当前面的布尔表达式均不成立时,才会执行 else 块内的代码
}

例子

public void structDemo03() { 
    Scanner scanner = new Scanner(System.in);
    int iResult = scanner.nextInt();

    if (iCount <= 100 && iCount >= 90) {
        System.out.println("优秀");
    } else if (iCount <= 89 && iCount >= 79) {
        System.out.println("良好");
    } else if (iCount <= 79 && iCount >= 60) {
        System.out.println("及格");
    } else {
        System.out.println("成绩不合法");
    }
    
    scanner.close();
}

3.4 嵌套的if结构

只有当外层 if 的条件成立时,才会判断内层 if 的条件

语法

if (布尔表达式) {
    // 如果布尔表达式为true将执行的语句
    if (布尔表达式) {
    // 如果布尔表达式为true将执行的语句
    } else {
        // 如果布尔表达式为false将执行的语句
    }
} else {
    // 如果布尔表达式为false将执行的语句
}

例子

public void structDemo04() { 
    String strToday = "周末";
    String strWeather = "天晴";
    
    if ("周末".equals(strToday)) {
        if ("天晴".equals(strToday)) {
        	System.out.println("去室外游乐场玩耍!");
        } else {
            System.out.println("去室内篮球场打球!");
        }
    } else {
        System.out.println("去上班!");
    }
}

3.5 switch多选择结构

多选择结构还有一个实现方式就是switch case 语句
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支

语法

switch (expression) {
    case value1 : 
        // 如果value1为true将执行的语句;
        break; // 可选
    case value2 : 
        // 如果value2为true将执行的语句;
        break; // 可选
    case value3 : 
        // 如果value3为true将执行的语句;
        break; // 可选
    default : // 可选
        // 如果前面value的值都为false将执行的语句;
}

例子

public void structDemo04() { 
    String strWeek = "周一";
    
    switch (strWeek) {
        case "周一" :
            System.out.println("今天是周一,要去上班!");
            break;
        case "周二" :
            System.out.println("今天是周二,要去上班!");
            break;
        case "周三" :
            System.out.println("今天是周三,要去上班!");
            break;
        case "周四" :
            System.out.println("今天是周四,要去上班!");
            break;
        case "周五" :
            System.out.println("今天是周五,要去上班!");
            break;
        case "周六" :
            System.out.println("今天是周六,可以出去放肆玩耍!");
            break;
        case "周日" :
            System.out.println("今天是周日,可以玩耍但要注意节制!");
            break;
        default : 
            System.out.println("非法数据!");
    }
}

switch case 语句中的变量类型:

  • byte、short、int、char
  • 从Java SE 7 开始,支持字符串String类型
  • 同时case标签必须为字符串常量或字面量
  • case 匹配后,执行匹配块里的程序代码,如果没有遇见 break会继续执行下一个的 case 块的内容(case 穿透),直到遇到 break 语句或者 switch 语句块结束
  • default 块可以出现在任意位置,也可以省略

4. 循环接口

4.1 while 循环

语法

while (布尔表达式) {
    // 循环体
}

例子

public void whileDemo() { 
    int iCount = 0;
    int iSum = 0;
    
    while (iCount <= 100) {
        iSum += i;
        i++;
    }
    System.out.println("计算1+2+3+……+100的值为:" + iSum);
}

// 递归算法
public class Plus {
    public int sum(int i) {
        if (i == 1) {
            return 1;
        }
        return i + sum(i - 1);
    }
    
    public static void main(String[] args) {
        Plus plus = new Plus();
        System.out.println("计算结果:" + plus.sum(100) + "!");
    }
}
  • 只要布尔表达式为true,循环就会一直执行下去
  • 大多数情况是会让循环停止运行,我们需要一个让循环停止失效的方式来结束运行
  • 少部分情况需要循环一直执行,比如服务器的请求响应监听……
  • 循环条件一直为true就会造成无限循环(死循环),我们正常的业务编程中应该尽量避免无限循环的产生,会影响程序性能或者造成程序卡死崩溃

4.2 do……while 循环

do……while 循环和while 循环相似,不同的是,do……while 循环至少会执行一次

语法

do {
    // 循环体
} while (布尔表达式);

例子

public void doWhileDemo() { 
    int iCount = 0;
    
    while (iCount < 0) {
        System.out.println(iCount);
        iCount++;
    }
    
    System.out.println("==========华丽的分割线==========");
    
    do {
        System.out.println(iCount);
        iCount++;
    } while (a < 0);
}

while 循环和do……while 循环的区别:

  • while 循环先判断后执行,而do……while 循环是先执行后判断
  • do……while 循环总是保证循环体会被至少执行一次(类似i++和++i的区别)

4.3 for 循环

for 循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构

在Java SE 5 中引入了一种主要用于数组的增强型for循环

语法

for (循环变量初始化; 布尔表达式; 循环变量变化) {
    // 循环体
}

例子

public void forDemo() { 
    int iSum = 0;
    for (int i = 1;i <= 100; i++) {
        iSum += i;
    }
    
    System.out.println("计算结果:" + iSum);
}

练习:用for 循环输出1-1000之间能被5整除的数,并且每行输出3个

public class ForDemo {
    public static void main(String[] args) {
        // 练习:用for 循环输出1-1000之间能被5整除的数,并且每行输出3个
        for (int i = 1; i <= 1000; i++) {
            if (i % 5 == 0) {
                System.out.print(i + " ");
            }
            if (i % 15 == 0) {
                System.out.println();
            }
        }

        // 打印九九乘法表
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(i + " * " + j + " = " + i * j + "\t");
            }
            System.out.println();
        }
    }
}

4.4 增强for 循环

语法

/**
 * 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配,其作用域限定在循环语句块,其值与此时数组元素的值相等
 * 表达式:表达式是要访问的数组名,或者是返回值为数组的方法
 */
for (声明语句 : 表达式) {
    // 循环体
}

例子

public class ForiDemo {
    public static void main(String[] args) {
        int[] numbers = {10, 20, 30, 40, 50};
        
        for (int i : numbers) {
            System.out.println(i);
        }
    }
}

5. break、continue和goto

5.1 break

break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句(break语句也可用于switch语句中使用)

例子

public class BreakDemo {
    public static void main(String[] args) {
        int i = 0;
        while (i <= 10) {
            i++;
            System.out.println(i);
            if (i == 5) {
                break;
            }
        }
    }
}

5.2 continue

continue 语句用于循环体中,用于终止某次循环,即跳过当次循环语句,接着进行下一次知否执行循环的判定

例子

public class ContinueDemo {
    public static void main(String[] args) {
        int i = 0;
        while (i <= 10) {
            i++;
            if (i % 2 == 0) {
                continue;
            }
            System.out.print(i + "\t"); // 1 3 5 7 9 11
        }
    }
}

5.3 关于goto关键字

  • goto 关键字很早就在程序设计语言中出现。尽管goto仍然是Java的一个保留字,但并未在语言中得到正式使用,Java没有goto;然而在break和continue这两个关键字的身上,我们仍能看出一些goto的影子(带标签的break和continue)
  • 标签是指后面跟一个冒号的标识符,例如:label:
  • 对Java来说,唯一用到标签的地方是在循环语句之前,而在循环之前设置标签的唯一理由:我们希望在其中嵌套另一个循环,由于break和continue关键字通畅只能中断当前循环,但若随同标签使用,他们就会中断到存在标签的地方

例子

public class LabelDemo {
    public static void main(String[] args) {
        /* 
        	打印101~150之间所有的质数
        	质数:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数
        */
        
        int count = 0;
        outer : for (int i = 101; i <= 150; i++) {
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    continue outer;
                }
            }
            System.out.print(i + "\t"); // 101	103	107	109	113	127	131	137	139	149	
        }
    }
}

6. 练习

打印一个三角形

/*
     *
    ***
   *****
  *******
 *********
*/
private static void printTriangle() {
    for (int i = 1; i <= 5; i++) {
        for (int j = 5; j >= i; j--) {
            System.out.print(" ");
        }
        for (int j = 1; j <= 2 * i - 1; j++) {
            System.out.print("*");
        }
        System.out.println();
    }
}
posted @ 2021-06-03 11:13  爱Ni说不出口  阅读(52)  评论(0)    收藏  举报