开发者社区> 村雨遥> 正文

【Java 从入坑到放弃】No 5. 控制流程

简介: 【Java 从入坑到放弃】No 5. 控制流程
+关注继续查看

前言

我们在 上一篇文章 中讲了各种操作符的使用技巧,接上一篇文章中的内容,本次文章主要将流程控制,文章主要内容安排如下:

  • 输入输出
  • 条件判断
  • 控制循环

输入输出

输入

要实现从控制台输入并读取到我们的程序中时,我们先来看一个实例:

import java.util.Scanner;

/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/15 13:53
 * @description : 输入
 */

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入整型");
        int num = scanner.nextInt();
        System.out.println("输入的整型:" + num);

        System.out.println("输入字符型");
        String name = scanner.next();
        System.out.println("输入的字符型:" + name);

        System.out.println("输入浮点型");
        float floatNum = scanner.nextFloat();
        System.out.println("输入的字符型:" + floatNum);
        double doubleNum = scanner.nextDouble();
        System.out.println("输入的字符型:" + doubleNum);


    }
}

image.png要实现从控制台输入,我们需要借助 Scanner 类,它属于标准输入流,其步骤总结如下:


首先,需要导入 Scanner 类。即 import java.util.Scanner,其中 import 表示导入某个类,并且只能放在程序的开头;

然后创建 Scanner 对象。这里需要注意,创建时需要传入 System.in,表示标准输入流,与之对应的 System.out 则代表标准输出流;

最后就是读取用户输入即可。这里读取时,调用不同的方法 Scanner 会自动转换数据类型,不用我们去进行手动转换;

从控制台获取不同类型的输入,其常用方法如下:


返回值 方法名 描述

boolean hasNext() 如果还有输入,则返回 true,否则返回 false

String next() 返回输入的字符串,以空格为分隔符

String nextLine() 返回输入的字符串,以换行为分隔符

int nextInt() 输入整型数

long nextLong() 输入长整型数

float nextFloat() 输入单精度数

double nextDouble 输入双精度数

输出

其实从一开始的 hello world 到目前的代码中,我们已经接触过输出了,也就是我们的 System.out.println()。


其中 println 表示输出并换行,如果我们不想换行,则使用 print 就可以了。


通过上述方式所输出的内容都是挤在一起的,十分不方便我们阅读。为了更加清晰的打印出我们所需要的结果,可以使用格式化输出。


要使用格式化输出,需要使用 System.out.printf() 或者 System.out.format() 搭配占位符,然后在后面的参数格式化成指定格式即可,两者达成的效果是等价的。常见的占位符如下:


占位符 描述

%d 格式化输出整数

%f 格式化输出浮点数

%s 格式化输出字符串

%x 格式化输出十六进制整数

%e 格式化输出科学计数法表示的浮点数

此外,我们还可以使用各种转义字符来使得我们的输出更为简洁,常见的转义字符及意义如下表所示。


转义字符 描述

\n 换行

\t 水平制表符

\\ 表示一个反斜杠

\' 表示一个单引号

\" 表示一个双引号


/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/15 14:48
 * @description : 输出
 */

public class Main {
    public static void main(String[] args) {
        int num1 = 10;
        double num2 = 34.9;
        float num3 = 3.34f;
        String name = "村雨遥";

        //        换行及不换行输出
        System.out.println("公众号:" + name);
        System.out.print("公众号:" + name);
        System.out.println(num1);

        //        格式化输出
        System.out.println("格式化输出:");
        System.out.printf("num1 = %d\n", num1);
        System.out.format("num2 = %f\t num3 = %f\n", num2, num3);
        System.out.printf("name = %s\n", name);
        System.out.format("name = %s\n", name);
    }
}

image.png条件判断

if

单次判断

当我们只进行一次判断时,可以使用一个 if 语句包含一个条件表达式,其语法格式如下;


if(条件表达式){

   执行语句;

}


其执行逻辑如下图所示,如果条件表达式的值为 true,则执行 if 语句块中的执行语句,否则就执行 if 语句块后边的代码;


image.png

  1. 多次判断

要进行多次判断时,可以使用 if…else 的形式,其语法格式如下;

if(条件表达式 1){
    执行语句 1;
} else if(条件表达式 2){
    执行语句 2;
} else if(…){
}…

其执行逻辑如下图所示,如果条件表达式 1 为 true,则执行执行语句 1,否则接着判断条件表达式 2,若为 true,则执行执行语句 2,以此类推,直到完成最后一个条件表达式的判断。

image.png

import java.util.Scanner;

/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/15 15:45
 * @description : 条件判断
 */

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入分数:");
        double score = scanner.nextDouble();

        if (score < 0 || score > 100) {
            System.out.println("输入的分数不在0-100之间,不符合要求");
        } else if (score >= 90) {
            System.out.println("A");

        } else if (score >= 80) {
            System.out.println("B");

        } else if (score >= 60) {
            System.out.println("C");
        } else {
            System.out.println("D");

        }
    }
}

image.png

switch

当我们需要使用 if 进行判断时,难免显得有些繁琐。此时,我们就可以使用 switch 来进行替代,通过判断一个变量所属范围,从而划分出不同的分支。

switch 分支的语法格式如下:

switch(表达式){
    case value1:
        执行语句1;
        break;
    case value2:
        执行语句2;
        break;
    ……
    default:
        执行语句;
        break;
}   

通过判断表达式的值,然后执行对应值下的执行语句,而 default 下的执行语句表示如果 switch 表达式未匹配到对应的值时所执行的语句;

一个 switch 的实例如下:

import java.util.Scanner;

/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/15 15:49
 * @description : switch
 */

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入该学生成绩:");
        int grade = input.nextInt();//定义grade且获取键盘输入的整数
        if (grade < 0 || grade > 100) {//输入的整数范围应为0-100
            System.out.println("输入的成绩有误");
            return;
        }
        switch (grade / 10) {
            case 10:
            case 9:
                System.out.println("该学生成绩优秀");
                break;
            case 8:
                System.out.println("该学生成绩良好");
                break;
            case 7:
                System.out.println("该学生成绩中等");
                break;
            case 6:
                System.out.println("该学生成绩基本合格");
                break;
            default:
                System.out.println("该学生成绩不合格");
                break;
        }
    }
}

而在使用 switch 分支语法时,需要遵循一定的规则:


switch 中的变量类型可以是:byte、short、int、char、String (自 JDK 1.7 开始);

switch 语句根据表达式的结果跳转到对应的 case 结果,然后执行其后跟着的语句,知道遇到 break 才结束执行;

默认情况下,一般都会跟着一个 default 的分支,用于未匹配到对应情况时的执行情况;

控制循环

while

假设我们现在有一个题目,需要你计算 1 + 2 + 3 + …… + 50 的结果,你会怎么办呢?


这么写么:


/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/16 9:35
 * @description : while
 */

public class Main {
    public static void main(String[] args) {
        int sum = 1 + 2;
        sum += 3;
        sum += 4;
        ……
        sum += 50;
        System.out.println("1 + 2 + 3 + …… + 50 = " + sum);
    }
}

这么写就太麻烦了,计算到 50 的值就已经很多了,假如有 1000,10000 甚至更大,那我们岂不是写个好久才能写完。这个时候我们就得找找有没有简单的方法,能够只写几句就实现相同的效果呢?答案是:Yes,这就是我们这一小节将要讲到的循环。

/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/16 9:35
 * @description : while
 */

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        int num = 1;
        while (num <= 50) {
            sum += num;
            num++;
        }
        System.out.println("1 + 2 + 3 + …… + 50 = " + sum);
    }
}

image.png从上面的实例,利用 while 循环,我们就能轻易达成循环的效果。其语法格式如下:


while(表达式){

   执行语句;

}


只要表达式为 true,就会不断循环执行其中的执行语句,直到表达式为 false,此时便跳出循环,不再执行其中的执行语句。


除开上面的形式之外,还有另一种 while 形式:


do{

   执行语句;

}while(表达式);


两者的最大区别在于:do……while 无论 表达式 是否为 true,都至少会执行一次。


/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/16 9:35
 * @description : while
 */

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        int num = 10;
        while (num <= 9) {
            sum += num;
            num++;
        }
        System.out.println("sum = " + sum);
    }
}

image.png

/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/16 9:35
 * @description : while
 */

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        int num = 10;
        do {
            sum += num;
            num++;
        } while (num < 10);
        System.out.println("sum = " + sum);
    }
}

image.png观察以上两个实例,在 while 程序中,我们定义 num = 10,然后假设 num <= 9 时就进入循环体,而 10 > 9 10 > 910>9,所以不进入循环体,直接打印 sum 的值为 0。而在 do…while 程序中,我们同样定义 num = 10,然后假设 num < 10 时继续循环,很明显不满足该情况,理应跳出循环,打印出 sum 的值为 10,说明此时还是进行了一次循环。


因此,当我们需要在 while 和 do……while 之间做出选择时,如果我们最少需要进行一次循环,则选择 do……while,其他情况下选用两者都可以。


for

普通 for 循环

除开 while 和 do……while 之外,我们还有 for 循环来达成同样的结果,只是表达方法不一样。同样以上面计算 1 + 2 + …… + 50 为例,可以写成如下的形式:

/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/16 10:20
 * @description : for 循环
 */

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        for (int num = 1; num <= 50; num++) {
            sum += num;
        }

        System.out.println("1 + 2 + …… + 50 = " + sum);
    }
}

image.pngfor 循环的语法形式如下:


for(初始条件;终止条件;更新语句){

   循环语句;

}

1

2

3

for 循环的执行步骤如下:


首先执行初始条件,可以声明一种类型,但可以初始化一个或多个循环控制变量,甚至可以放空;

接着判断终止条件,如果为 true,则进入循环体执行循环语句;如果为 false,则终止循环,执行循环体后面的语句;

一次循环完成后,执行更新语句来更新循环控制变量;

最后再次判断终止条件,循环以上三个步骤;

for 和 while 最大的区别就在于 for 循环一般都是事先知道需要循环的次数的,而 while 循环则不需要。


增强 for 循环

自 Java 5 后,引入了一种增强型 for 循环,主要用于数字遍历,其语法格式如下:


for(声明语句:表达式){

// 循环语句

}

/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/16 10:39
 * @description : 增强 for 循环
 */

public class Main {
    public static void main(String[] args) {
        int[] numbers = {1, 4, 5, 6, 9, 10};
        for (int number : numbers) {
            System.out.print(number + "\t");
        }
    }
}

image.png其中,声明语句一般是声明一个同数组数据类型相同的局部变量,而表达式则是要访问的数组名或者返回值是数组的方法。


continue & break

break

主要用在循环语句或者 switch 语句中,表示跳出最里层的循环,然后继续执行该循环下的语句。


break 在 switch 语句中的用法已经见识过了,我们就来看看它在循环中的应用。


/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/16 10:51
 * @description : break & continue
 */

public class Main {
    public static void main(String[] args) {
        for (int i = 1; i < 10; i++) {
            System.out.println("i = " + i);
            if (i == 5) {
                break;
            }
        }
    }
}

image.pngimage.png

/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2021/4/16 10:51
 * @description : break & continue
 */

public class Main {
    public static void main(String[] args) {
        for (int i = 1; i < 10; i++) {
            if (i == 5) {
                continue;
            }
            System.out.println("i = " + i);
        }
    }
}

image.png观察上述结果可知,当 i == 5 时,我们执行了 continue 语句,此时便跳出了当次循环,不再进行后边的打印语句,然后继续下一次的循环,所以最终打印的结果没有 5.


总结

今天的内容到此就结束了,老规矩,如果大家觉得有用的话,就给个点赞关注吧!


其次就是对于文中遗漏或者存在欠缺的知识点,还请大家不吝赐教,在评论区给我指出来!


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
手撸一款简单高效的线程池(五)
在之前的内容中,我们给大家介绍了 C++实现线程池过程中的一些常用线优化方案,并分析了不同机制使用时的利弊。这一篇,是线程池系列的最后一章。我们会介绍一下 CGraph 中的 threadpool 如何使用,给出性能对比,并对接下来的工作做一些展望。让我们在线程池性能优化和功能提升的道路上,越走越远。
5 0
心中有“树”!图文并茂介绍数据结构中常见的树(一)
提到数据结构中的树(Tree) ,大家应该都不陌生,相关书籍中都有大段篇幅的介绍,刷 Leetcode 的时候会遇到很多相关问题。很多人往往会用 “手写红黑树” 来形容面试难度很高。
10 0
这个开源项目绝绝子,一键生成好玩的矢量风格头像!
最近逛 GitHub,发现了一个非常好玩的开源项目——头像生成器,给大家分享一下~
6 0
JSP - 起源、执行过程、运行原理、生命周期
JSP - 起源、执行过程、运行原理、生命周期
5 0
心中有“树”!图文并茂介绍数据结构中常见的树(三)
在前面两篇文章中,我们简要介绍了数据结构中的各种【树】在搜索、数据库等领域的使用场景,希望对大家有所帮助。
11 0
+关注
村雨遥
CSDN 博客专家及 Java 领域优质创作者,华为云云享专家。 获取资料,请关注我的公众号(村雨遥)。个人博客:https://cunyu1943.site
263
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载